Skip to content

job-grade-deliverable.yaml ​

このページは docs/ja/projects/prj-0001/jobs/job-grade-deliverable.yaml から生成された表示用ページです。正本は YAML ファイルであり、このページは再生成できます。

yaml
# yaml-language-server: $schema=../../../../specdojo/schemas/v1/job.schema.yaml
id: job-grade-deliverable
name: 成果物の継続品質評価
description: 成果物を文書単位の agy 単段評価へ流し、最新の品質と done_criteria 充足状況を更新する。
inputs:
  period:
    type: string
    required: true
  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 deliverable --project {{project_id}}
        else
          if [ "{{inputs.dependency_changed}}" = "true" ]; then
            {{specdojo}} grade list --target deliverable --project {{project_id}} --dependency-changed || exit $?
          fi
          if [ "{{inputs.rulebook_changed}}" = "true" ]; then
            {{specdojo}} grade list --target deliverable --project {{project_id}} --rulebook-changed || exit $?
          fi
          if [ "{{inputs.unreviewed}}" = "true" ]; then
            {{specdojo}} grade list --target deliverable --project {{project_id}} --unreviewed || exit $?
          fi
          if [ "{{inputs.changed_only}}" = "true" ]; then
            {{specdojo}} grade list --target deliverable --project {{project_id}} --changed-only || exit $?
          fi
          if [ "{{inputs.ungraded}}" = "true" ]; then
            {{specdojo}} grade list --target deliverable --project {{project_id}} --ungraded || exit $?
          fi
          if [ "{{inputs.incomplete}}" = "true" ]; then
            {{specdojo}} grade list --target deliverable --project {{project_id}} --incomplete || exit $?
            # 上限到達成果物は処理対象外だが、report-only Job を起動するため precondition に含める。
            {{specdojo}} grade state --target deliverable --project {{project_id}} --exhausted || exit $?
          fi
          if [ "{{inputs.rubric_outdated}}" = "true" ]; then
            {{specdojo}} grade list --target deliverable --project {{project_id}} --rubric-outdated || exit $?
          fi
        fi
      )
      printf '%s\n' "$selection" | LC_ALL=C sort -u | awk -v limit="{{inputs.limit}}" '
        NF && (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 --target deliverable --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` の段があるか。ある場合は agent 側の失敗、`grade apply` による executor の
        marker の機械変換の拒否、done_criteria の過不足のいずれかへ切り分ける。
      - Run が `partial` の場合は、`passed` の成果物が1件以上あり、各 `failed` の成果物と
        失敗段が pipeline state に記録されて次の Run の `--incomplete` で選択できるかを確認する。
      - `retry_exhausted` の成果物があるか。ある場合は失敗段と連続失敗回数を示し、人手での
        原因解消または state の再開判断を促す。
      - agy 単段の verdict と score に、評価設定の見直しを要する偏りがあるか。
      - 未充足の done_criteria がある成果物と、その確認担当ロールを特定する。

      選択された成果物が0件の場合は no-op と判断する。判断できない事象は推測で埋めず、
      観測した事実と未確認の範囲を分けて報告する。
  paths:
    - docs/ja/projects/prj-0001
  # 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:
  idempotency_key: "{{job_id}}:command-v8:{{scheduled_at}}:{{inputs.limit}}:{{inputs.dependency_changed}}:{{inputs.rulebook_changed}}:{{inputs.unreviewed}}:{{inputs.changed_only}}:{{inputs.ungraded}}:{{inputs.incomplete}}:{{inputs.rubric_outdated}}"