Skip to content

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}}"