本文へ移動
cccskills
無料GitHub で公開

eval

Use this skill to run an honest session-process evaluation (Standard v1, aiat-llm-eval/1.0) — score the last completed orchestrator session against the pre-registered rubric-v3 dimensions, run /eval, evaluate this session, produce an eval report, or re-verify a stored eval run for reproducibility. Deterministic-first with an optional advisory LLM judge; never produces a global score.

日本語の概要は準備中です。原文の説明を表示しています。

Kanevry/session-orchestratorスター 52(GitHub 52 + cccskills 0)

実行スコア 未検証

インストール方法を見る

含まれるファイル(4)

  • SKILL.md15.7 KB
  • rubric-v1.md12.8 KB
  • rubric-v2.md26.2 KB
  • rubric-v3.md30.3 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Platform Note: State files use the platform's native directory: .claude/ (Claude Code), .codex/ (Codex CLI), or .cursor/ (Cursor IDE). Shared metrics + the eval journal live in .orchestrator/metrics/. See skills/_shared/platform-tools.md.

Eval Skill — Session-Process Evaluation (aiat-llm-eval/1.0)

On-demand, honest measurement of ONE completed orchestrator session against the pre-registered rubric-v3 check set. The deterministic engine (scripts/eval-session.mjs → scripts/lib/eval/engine.mjs) reads only local metrics files (sessions.jsonl + events.jsonl), scores the six deterministic dimensions, appends a session-eval record to the journal, and optionally renders an HTML report. An opt-in LLM judge overlays ONE advisory dimension (instruction-adherence; report-quality was retired in rubric-v2, #1381).

The standard this skill implements is docs/eval/aiat-llm-eval-v1.md; the frozen, content-hashed check set is skills/eval/rubric-v3.md (stored records carry the version they were scored under: before 2026-09-19 rubric-v1 → rubric-v1.md, 2026-09-19 to 2026-10-05 rubric-v2 → rubric-v2.md; neither is edited again).

Invocation

Invoked as /eval [--session <id>] [--no-write] [--verify <run-id>] with arguments: $ARGUMENTS (parsed in Phase 1.2).

  • /eval — evaluate the last completed session (resolution cascade), append the record, render the report.
  • /eval --session <id> — evaluate a specific session_id.
  • /eval --no-write — evaluate + report without appending to the journal (dry-run).
  • /eval --verify <run-id> — re-score a stored run and diff for drift (the reproducibility proof; exit 1 on drift).

On-demand /eval runs regardless of eval.enabled — that flag gates only the automatic session-end eval phase (see Phase 1.1).

Seams used: scripts/eval-session.mjs (deterministic CLI) · runEvalJudge / mergeJudgeDimensions (scripts/lib/eval/judge.mjs, opt-in) · writeEvalReport (scripts/lib/eval/report.mjs) · appendEvalRecord (scripts/lib/eval/sink.mjs) · the eval config block · skills/eval/rubric-v3.md (frozen check set).

Posture Contract (load-bearing — read before executing)

  • No global score, by construction. The record has no overall/total/mean field, and this skill never derives one. Report per-dimension verdicts only.
  • Never guess. Missing source data yields cannot-determine (a first-class, non-error verdict) with an honest reason — never a fabricated pass/fail. Do NOT "fill in" a missing KPI or infer a gate result the events do not show.
  • Deterministic before judge. The six deterministic dimensions are complete on their own. The judge (Phase 3) is opt-in, ADVISORY, and uncalibrated — never blend a judge verdict into the deterministic tally.
  • Journal is SSOT; the report is a derived view. The append-only .orchestrator/metrics/eval.jsonl is authoritative. The HTML report is rebuildable from any stored record and is never authoritative over the journal.
  • --verify is the reproducibility proof. Re-scoring stored source data reproduces the stored dimensions byte-for-byte (exit 0) or reports drift (exit 1). This proves the SCORING replays — NOT that the model is deterministic.
  • Self-evaluation is labelled as such. The orchestrator scoring its own session is a self-evaluation, not an independent audit.

Phase 0: Bootstrap Gate

Read skills/_shared/bootstrap-gate.md and execute the gate check. If the gate is CLOSED, invoke skills/bootstrap/SKILL.md and wait for completion before proceeding. If the gate is OPEN, continue to Phase 1.

<HARD-GATE> Do NOT proceed past Phase 0 if GATE_CLOSED. There is no bypass. Refer to `skills/_shared/bootstrap-gate.md` for the full HARD-GATE constraints. </HARD-GATE>

Phase 1: Config & Argument Loading

1.1 Read Session Config

Read and parse Session Config per skills/_shared/config-reading.md. Extract the eval block (scripts/lib/config.mjs returns it as config.eval, parsed by scripts/lib/config/eval.mjs):

enabled:  boolean  (default false)
mode:     'warn' | 'off'            (default 'warn')
judge:    'off' | 'haiku' | 'sonnet' (default 'off')
report:   'html' | 'none'           (default 'html')
handle:   string | null             (default null)

On-demand /eval runs regardless of eval.enabled. The enabled flag gates the AUTOMATIC session-end eval phase only — it does NOT gate this command (same posture as /reconcile vs reconcile.enabled). mode: off is honoured as a kill-switch only for the automatic phase; on-demand invocation still runs. If eval.judge is off, skip Phase 3 entirely.

Parser gotcha: the eval: key-line itself MUST NOT carry an inline comment (strict /^eval:\s*$/); a trailing # comment on that exact line makes the parser skip the whole block and silently apply ALL defaults. Sub-key lines tolerate inline comments.

1.2 Parse Arguments

Inspect $ARGUMENTS:

  • --session <id> → pass through to --session.
  • --no-write → evaluate without appending to the journal (dry-run).
  • --verify <run-id> → verification mode: skip Phases 2–4, run the CLI --verify path (see Phase 6), report MATCH/DRIFT, done.

1.3 Capture the Model Id (honest provenance)

The record's model.source records HOW the model id was captured, precisely because self-report is unreliable:

  • If $ANTHROPIC_MODEL is set in the environment, the engine reads it automatically with source: env — env wins over the flag (precedence env > flag). Do not pass --model-id in that case; let the engine resolve it.
  • Otherwise the coordinator passes its own self-reported model id: --model-id <self-reported-model-id> --model-source self-report.

Phase 2: Deterministic Run

Run the deterministic engine via its CLI. Default target is the last completed session (resolution cascade); --session overrides.

node scripts/eval-session.mjs [--session <id>] --json \
  [--model-id <self-reported-id> --model-source self-report] \
  [--no-write]
  • Do NOT pass --metrics-dir for a real run — the engine defaults to the live .orchestrator/metrics, the session being evaluated.
  • The CLI captures the eval timestamp (the one sanctioned clock read) and hands it to the engine as a parameter, so the scoring path stays clock-free and --verify-reproducible.
  • Exit codes: 0 success · 1 user error (session not found) · 2 system error. On exit 1 (e.g. "no completed session found"), surface the message and stop — do not retry with fabricated inputs.

Parse the emitted JSON record. It carries dimensions[] (6 deterministic entries — the two reported-only ones, guard-friction and efficiency-kpis, are always not-applicable), kpis{}, provenance.rubric_sha256 (the sha256 of rubric-v3.md; null means the rubric file was not found and the append will fail validation), model, harness, and run_id. Unless --no-write was passed, the record is already appended to .orchestrator/metrics/eval.jsonl by the CLI.

Contamination check: if the human-render/summary reports a peer-overlapped window, note it — verification-evidence and gate-health will read cannot-determine for that reason (attribution is unsafe), which is correct, not a defect.


Phase 3: Judge Overlay (ONLY when eval.judge != off)

The judge runs coordinator-side — AskUserQuestion and the Agent tool are not available inside a dispatched subagent, so the judge is dispatched from the coordinator thread using the read-only agent session-orchestrator:eval-judge (model = eval.judge). Reference the API; do not reimplement scoring here:

import { runEvalJudge, mergeJudgeDimensions } from '$PLUGIN_ROOT/scripts/lib/eval/judge.mjs';
import { appendEvalRecord } from '$PLUGIN_ROOT/scripts/lib/eval/sink.mjs';
import { resolveLedgerPath } from '$PLUGIN_ROOT/scripts/lib/ledger-path.mjs';

// dispatchAgent = the coordinator's Agent-tool dispatch closure targeting
// subagent_type 'session-orchestrator:eval-judge'.
const { status, dimensions } = await runEvalJudge({
  dispatchAgent,
  record,                       // the deterministic record from Phase 2
  model: EVAL_JUDGE_MODEL,      // eval.judge ('haiku' | 'sonnet')
  budget: JUDGE_BUDGET_TOKENS,  // optional
});

// mergeJudgeDimensions appends the advisory judge dimensions to the record.
const merged = mergeJudgeDimensions(record, dimensions);

// The COORDINATOR appends the enriched record (subagents never write the journal).
// In a linked worktree the main checkout's journal when it is gitignored there (#1722).
appendEvalRecord(merged, { path: resolveLedgerPath('.orchestrator/metrics/eval.jsonl', process.cwd()) });
  • The judge dimension arrives advisory: true + calibration_status: "uncalibrated" (the schema firewall rejects any other shape). Keep it visibly separated from the deterministic six in the summary.
  • runEvalJudge pre-computes a facts block (computeRecordFacts) from the deterministic evidence strings and hands it to the judge OUTSIDE the untrusted-data fence — anything countable is counted in code, never inferred by the model. Do not reimplement that here.
  • If runEvalJudge returns a non-ok status (e.g. dispatch failed), keep the deterministic record as-is and note the judge was unavailable — the deterministic evaluation is complete without it.
  • When --no-write was passed in Phase 2, do NOT append the merged record either.

The judge merge re-writes the record with the SAME run_id/timestamp, so a later --verify <run-id> re-scores the deterministic dimensions from source and diffs them; judge dimensions are advisory and excluded from the drift diff.


Phase 4: Report (ONLY when eval.report == html)

Render the derived HTML view from the record:

import { writeEvalReport } from '$PLUGIN_ROOT/scripts/lib/eval/report.mjs';

const res = writeEvalReport(record, { generatedAt: new Date().toISOString() });
// res.ok === true → res.path === .orchestrator/eval/reports/<run_id>.html
  • Output path: .orchestrator/eval/reports/<run_id>.html (gitignored — a derived view, rebuildable from the journal).
  • writeEvalReport NEVER throws; on res.ok === false surface the WARN reason and continue (the journal record is unaffected — the report is derived).
  • Name the report path in the chat so the operator can open it.
  • When eval.report == none, skip this phase.

Phase 5: Chat Summary

Emit a compact, honest per-dimension summary. Status lines only — no global score.

## /eval — <session_id>  (self-evaluation, aiat-llm-eval/1.0 · rubric-v3 · n=1, no CI)

Deterministic:
  verification-evidence   PASS   <one-line evidence>
  plan-fidelity           PASS   completion_rate=1.0 (score)
  gate-health             PASS   <one-line evidence>
  process-safety          PASS   <one-line evidence + both guard disclosures>
  guard-friction          N/A    (reported: blocked=… warned=… loop.warning=… <attribution>)
  efficiency-kpis         N/A    (reported: duration=…s waves=… agents=… tok_in=… tok_out=… carryover=…)

Judge (advisory, uncalibrated)  [only when eval.judge != off]:
  instruction-adherence   <verdict>   advisory   (rule <n> applied)

cannot-determine: <k> of 6 deterministic dimensions (<reasons>)
Report:  .orchestrator/eval/reports/<run_id>.html
Journal: .orchestrator/metrics/eval.jsonl  (appended: <yes|--no-write>)
Re-verify: node scripts/eval-session.mjs --verify <run_id>

Always report the cannot-determine share explicitly — a high abstention count is an honest signal about missing telemetry, not a failure to hide. Always print the --verify command as the reproducibility handle.


Phase 6: Verification Mode (--verify <run-id>)

When Phase 1.2 detected --verify, run ONLY:

node scripts/eval-session.mjs --verify <run-id> --json
  • Exit 0 + { match: true } → the stored record re-scores identically across all deterministic dimensions. Report MATCH with the dimension count.
  • Exit 1 + { match: false, diffs } → scoring drift. Report the per-dimension diff (id.field: stored=… fresh=…). Drift means the source data or the engine changed since the record was written — investigate, do not overwrite.
  • --verify reproduces the stored model + timestamp verbatim (no env override), so a MATCH is a real reproducibility proof of the scoring, not of model output.
  • A record from another rubric version is not re-scored. --verify reports VERSION-MISMATCH (exit 3) when the stored rubric_version differs from the engine's (#1400), so a v1 or v2 record never reads as a regression under v3.

Cross-Platform (Codex CLI / Cursor / Pi) — FA4

The deterministic core is pure Node CLIs (scripts/eval-session.mjs) plus Node library modules (report.mjs, sink.mjs) — they run identically on every platform. Only the judge phase needs harness-specific tooling.

  • Codex CLI / Cursor / Pi: the Agent tool (and AskUserQuestion) are unavailable, so Phase 3 (judge) is SKIPPED with a one-line note ("judge phase skipped: requires the Agent tool, unavailable on <platform>"). Phases 2, 4, 5, 6 run unchanged — they are Node-only. See skills/_shared/platform-tools.md § Agent Dispatch Pattern.
  • harness.platform on the record is resolved from $SO_PLATFORM (falls back to claude-code) inside the engine — no skill action needed.
  • The deterministic six dimensions + the HTML report + --verify are fully available on all platforms; the judge overlay is a Claude-Code-only enrichment.

Anti-Patterns

  • DO NOT derive, print, or imply a global/overall/aggregate score — the record forbids one by construction and so does every report.
  • DO NOT guess or "fill in" missing data — a missing gate result, KPI, or completion_rate is cannot-determine/null, never a fabricated pass or 0.
  • DO NOT present the judge's advisory verdict as a measurement — it is uncalibrated in v1 and must stay visibly separated from the deterministic tally.
  • DO NOT treat the HTML report as authoritative — the journal is the SSOT; the report is a rebuildable derived view.
  • DO NOT skip --verify when reproducibility is in question — it is the executable proof, and its MATCH/DRIFT exit code is the source of truth.
  • DO NOT pass --metrics-dir for a real run — that points the engine at fixture data instead of the live session metrics.
  • DO NOT call runReconcile-style writes from a subagent — the coordinator owns every eval.jsonl append (PSA-007).

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

Use when the user asks to improve architecture, find refactoring opportunities, surface deepening opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable. Surfaces shallow modules and hypothetical seams using a precise vocabulary (Module / Interface / Implementation / Depth / Seam / Adapter / Leverage / Locality from LANGUAGE.md).

日本語の概要は準備中です。原文の説明を表示しています。

Kanevry/session-orchestrator522026年10月26日 更新

autopilot

無料

Use this skill when running an autonomous session-orchestration loop. Chains session-start → session-plan → wave-executor → session-end for N iterations with all 10 kill-switches (SPIRAL, FAILED wave, carryover > 50%, max-hours, max-sessions, resource-overload, token-budget, stall-timeout, sub-threshold confidence, user-abort). Reads Mode-Selector output (Phase B) to decide auto-execute vs. fallback. Writes one autopilot.jsonl record per loop run. Phase C scaffold (issue #277); implementation lives in scripts/lib/autopilot.mjs (Phase C-1 follow-up).

日本語の概要は準備中です。原文の説明を表示しています。

Kanevry/session-orchestrator522026年10月26日 更新

bootstrap

無料

Use this skill when scaffolding the minimum repository structure required by session-orchestrator. Invoked automatically by the Bootstrap Gate when CLAUDE.md, Session Config, or bootstrap.lock is missing. Also available as /bootstrap for manual invocation. Three intensity tiers: fast (demos/spikes), standard (MVPs), deep (production/team).

日本語の概要は準備中です。原文の説明を表示しています。

Kanevry/session-orchestrator522026年10月26日 更新

Use when you have a feature idea but the scope or UX is still ambiguous — runs a lightweight Socratic design dialogue (3-5 AUQ rounds) and writes a spec markdown file. Use BEFORE /plan feature when product intent needs validation; skip to /plan feature when scope is already clear. HARD-GATE prevents any code work until the design is user-approved.

日本語の概要は準備中です。原文の説明を表示しています。

Kanevry/session-orchestrator522026年10月26日 更新

Use when detecting drift between CLAUDE.md (or AGENTS.md, the Codex CLI alias) / _meta narrative and live repository state. Ten checks: absolute-path resolution, 01-projects/ count claims, issue-reference freshness, session-file existence, command-count sync, session-config-parity (mandatory template keys = error, opt-in gaps = note, unknown local keys = warning), vault-dir-parity (CLAUDE.md vs AGENTS.md), generated-rule-staleness (WARN-only), rule-scoping (paths:/globs: frontmatter defects, dangling rule citations, zero-match globs), and docs-parity (docs/components.md count-claims vs on-disk counts, template-vs-reference config-key parity, stale .claude/metrics/ paths). Full per-check spec in the body table. Invoked as an opt-in session-end phase; mirrors vault-sync's lean JSON+exit-code contract.

日本語の概要は準備中です。原文の説明を表示しています。

Kanevry/session-orchestrator522026年10月26日 更新

close

無料

End session with verification, commits, and documentation

日本語の概要は準備中です。原文の説明を表示しています。

Kanevry/session-orchestrator522026年10月26日 更新

Kanevry のスキルをすべて見る

このスキルの問題を報告する