job-grade-kata.yaml
このページは
docs/ja/projects/prj-0001/jobs/job-grade-kata.yamlから生成された表示用ページです。正本は YAML ファイルであり、このページは再生成できます。
yaml
# yaml-language-server: $schema=../../../../specdojo/schemas/v1/job.schema.yaml
id: job-grade-kata
name: 実践の型の品質評価
description: 文書単位の agy 単段評価を起動し、その実行結果に異常がないかを判断する。
inputs:
period:
type: string
required: true
kind:
type: string
default: rulebook
enum: [rulebook, recipe, sample, template, all]
limit:
type: integer
default: 0
minimum: 0
dependency_changed:
type: boolean
default: false
rulebook_changed:
type: boolean
default: false
unreviewed:
type: boolean
default: false
# 経過措置(PJR-N03W): changed_only・ungraded・incomplete は、review の中で grade を実行する
# PJR-KCMH の完了まで残す。KCMH の完了後に、この 3 入力と対応する routine の入力を外す。
changed_only:
type: boolean
default: false
ungraded:
type: boolean
default: false
incomplete:
type: boolean
default: false
# 保存済みの結果が現在の grade_rubric と異なる版(または版の記録なし)で付けられた文書を選ぶ
# (PJR-BVPS)。rubric を改めたとき、旧版の結果を limit の範囲で少しずつ評価し直す。
rubric_outdated:
type: boolean
default: false
task:
mode: command
owner: ARC
# run-per-document.sh は、完了した文書と失敗した文書が混在すると 2 を返す。
# runner はこの値だけを review 可能な partial とし、それ以外の非0は failed にする。
partial_exit_code: 2
precondition:
command: |
selection=$(
if [ "{{inputs.dependency_changed}}" = "false" ] && [ "{{inputs.rulebook_changed}}" = "false" ] && [ "{{inputs.unreviewed}}" = "false" ] && [ "{{inputs.changed_only}}" = "false" ] && [ "{{inputs.ungraded}}" = "false" ] && [ "{{inputs.incomplete}}" = "false" ] && [ "{{inputs.rubric_outdated}}" = "false" ]; then
{{specdojo}} grade list --target kata --project {{project_id}}
else
if [ "{{inputs.dependency_changed}}" = "true" ]; then
{{specdojo}} grade list --target kata --project {{project_id}} --dependency-changed || exit $?
fi
if [ "{{inputs.rulebook_changed}}" = "true" ]; then
{{specdojo}} grade list --target kata --project {{project_id}} --rulebook-changed || exit $?
fi
if [ "{{inputs.unreviewed}}" = "true" ]; then
{{specdojo}} grade list --target kata --project {{project_id}} --unreviewed || exit $?
fi
if [ "{{inputs.changed_only}}" = "true" ]; then
{{specdojo}} grade list --target kata --project {{project_id}} --changed-only || exit $?
fi
if [ "{{inputs.ungraded}}" = "true" ]; then
{{specdojo}} grade list --target kata --project {{project_id}} --ungraded || exit $?
fi
if [ "{{inputs.incomplete}}" = "true" ]; then
{{specdojo}} grade list --target kata --project {{project_id}} --incomplete || exit $?
# 上限到達文書は処理対象外だが、report-only Job を起動するため precondition に含める。
{{specdojo}} grade state --target kata --project {{project_id}} --exhausted || exit $?
fi
if [ "{{inputs.rubric_outdated}}" = "true" ]; then
{{specdojo}} grade list --target kata --project {{project_id}} --rubric-outdated || exit $?
fi
fi
)
printf '%s\n' "$selection" | LC_ALL=C sort -u | awk -v kind="{{inputs.kind}}" -v limit="{{inputs.limit}}" '
NF && (kind == "all" || index($0, "docs/ja/specdojo/" kind "s/") == 1) {
if (limit == 0 || selected < limit) {
print
selected++
}
}
'
skip_when: empty-output
command: |
if npm run build; then
:
else
build_status=$?
printf 'grade prerequisite build failed: exit_code=%s\n' "$build_status" >&2
exit 1
fi
if tools/grade/run-per-document.sh --run-id {{job_run_id}} --stages 1 --stage-1-executor agy-expert-executor --kind {{inputs.kind}} --limit {{inputs.limit}} --dependency-changed={{inputs.dependency_changed}} --rulebook-changed={{inputs.rulebook_changed}} --unreviewed={{inputs.unreviewed}} --changed-only={{inputs.changed_only}} --ungraded={{inputs.ungraded}} --incomplete={{inputs.incomplete}} --rubric-outdated={{inputs.rubric_outdated}}; then
cat logs/grade/runs/per-document/{{job_run_id}}/results.tsv
else
grade_status=$?
cat logs/grade/runs/per-document/{{job_run_id}}/results.tsv
if [ "$grade_status" -eq 2 ]; then
printf 'grade pipeline partial: run_id=%s exit_code=%s\n' '{{job_run_id}}' "$grade_status" >&2
else
printf 'grade pipeline failed: run_id=%s exit_code=%s\n' '{{job_run_id}}' "$grade_status" >&2
fi
exit "$grade_status"
fi
analysis:
agent: gemma-reporter
description: |
runner が記録した command evidence の終了コードと、stdout に出力された
`results.tsv` から次を判断して報告する。
- 終了コード75(rate limit)または中断で未完了の段が残っているか。残る場合は同じ
`--run-id` で再開できる状態かを確認する。
- `failed` の段があるか。ある場合は rate limit、agent 側の失敗、`grade apply` が
executor の marker を機械変換できず拒否したもの(executor を1回再実行しても
解消しなかったもの)のいずれかへ切り分ける。
- Run が `partial` の場合は、`passed` の文書が1件以上あり、各 `failed` の文書と
失敗段が pipeline state に記録されて次の Run の `--incomplete` で選択できるかを確認する。
- `retry_exhausted` の文書があるか。ある場合は失敗段と連続失敗回数を示し、人手での
原因解消または state の再開判断を促す。
- agy 単段の verdict と score の分布に、評価設定の見直しを要する偏りがあるか。
選択された文書が0件の場合は no-op と判断する。判断できない事象は推測で埋めず、
観測した事実と未確認の範囲を分けて報告する。
paths:
- docs/ja/specdojo/rulebooks
- docs/ja/specdojo/recipes
- docs/ja/specdojo/samples
- docs/ja/specdojo/templates
# PJR-MD3C: 出力は統合前に review する。起動元(routine・手動の exec run --job)によらず、
# exec の worktree で実行し、runner の commit、review、verdict による統合の流れで動く。
# review agent は自動選択に任せず、ここで指名する。
review:
agent:
executor: claude-expert-review-executor
reporter: claude-reporter
run:
# scheduled_at は routine の論理実行枠を表す。同じ枠の再試行は同じ Run、次の枠は別 Run にする。
idempotency_key: "{{job_id}}:command-v9:{{scheduled_at}}:{{inputs.kind}}:{{inputs.limit}}:{{inputs.dependency_changed}}:{{inputs.rulebook_changed}}:{{inputs.unreviewed}}:{{inputs.changed_only}}:{{inputs.ungraded}}:{{inputs.incomplete}}:{{inputs.rubric_outdated}}"