Verify v1tamins
v1tamins is a plugin, not a server. Its user surface is a runtime session:
a user types a request or /v1-<skill> in Claude Code or Codex and the runtime
selects, loads, and follows one SKILL.md from plugins/v1tamins/skills/.
Static checks (scripts/validate-plugin.sh) prove the package parses. This
skill proves the real runtimes load and use it. Read
features/README.md before driving a feature.
All commands below run from the checkout root. $V is the helper:
V=.agents/skills/verify-v1tamins/scripts/verify-v1tamins.py
Launch
There is no long-lived process. Each drive is one headless turn that exits:
- Claude Code:
claude -p --plugin-dir plugins/v1tamins ...loads the checkout as pluginv1tamins@inline, which shadows any installedv1tamins@v1tamins. It is ready when the stream-jsonsystem/initevent listsv1taminswithpathequal to the checkout'splugins/v1tamins. - Codex:
codex exec --cd <checkout> --sandbox read-only --ephemeral --jsonhas no plugin-dir flag. It drives the installed cache$HOME/.codex/plugins/cache/v1tamins/v1tamins/<version>, so Doctor must prove that cache equals the checkout first. Each Codex drive rechecks parity before launching and records the result in its summary. Ready when the stream emitsthread.started.
Create one evidence directory for the whole run and export it so every command shares it:
export V1_VERIFY_RUN_DIR="$(python3 "$V" new-run)"
The helper strips API-key variables so both runtimes use the local login, never API billing. Both commands exit on their own; there is nothing to tear down except what Cleanup lists.
Doctor
One read-only check that says whether this machine is worth driving:
python3 "$V" doctor
It reports, and exits non-zero if any requested runtime fails: claude on
PATH and claude auth status logged in; codex on PATH and codex login status logged in; the installed Codex cache verification_status: match
against the checkout (via scripts/verify-installed-plugin.sh); the skill
count on disk. Use --runtime claude or --runtime codex to check one side.
Run it first whenever a drive looks wrong. The static validator needs a UTF-8
locale; from an agent shell with LANG unset, prefix it with
LC_ALL=en_US.UTF-8 or every frontmatter check fails. A stale Codex cache means Codex
results describe the old build: update the plugin in Codex before trusting
them.
Drive
Prompts are the user's own words. Stable handles are skill names
(v1-<name>), the /v1-<name> slash form, and routing fixture case_id
values from plugins/v1tamins/evals/skill-routing.jsonl.
-
Explicit invocation, Claude:
python3 "$V" claude --label menu --expect-skill v1-menu \ '/v1-menu which v1 skill fits: "review this branch for merge risk before I open the PR". Name one skill and the runner-up.'Add
--schema <file>to force a JSON answer (--json-schema), which turns the answer into fields instead of prose. The helper disallows Bash, Edit, Write, NotebookEdit, WebFetch, and WebSearch unless--allow-writesis set, so a drive can never mutate the checkout. -
Explicit invocation, Codex:
python3 "$V" codex --label menu \ '/v1-menu which v1 skill fits: "review this branch for merge risk before I open the PR". Name one skill and the runner-up.'Add
--schema <file>for--output-schema. Codex runs read-only and ephemeral; no session is persisted. -
Implicit routing (does the runtime pick the right skill from a natural request): delegate to the repo's live routing runner, which writes under the run directory:
python3 "$V" route --runtime claude --case-id v1-deep-review-mergerisk-positive --max-cases 1Any
scripts/run-skill-routing-live-eval.pyargument passes through.
Neither runtime emits a "skill loaded" event for a /v1-* prompt in headless
mode: the body is expanded into the turn before the model answers. Proof of
loading is therefore the init skill list (Claude) or installed-cache parity
(Codex) plus an answer that follows the skill's own contract.
Evidence
Everything lands in $V1_VERIFY_RUN_DIR (default
.v1tamins/verify/run-<utc-stamp>/, gitignored):
doctor.json: the Doctor report.<label>.claude.raw.jsonland<label>.codex.raw.jsonl: the full event stream, including the init plugin and skill listing. This is the proof the runtime loaded the checkout.<label>.<runtime>.summary.json: the command (schema redacted), exit code, duration, plugin entry,skills_loadedversus on-disk,tool_usesortool_calls,final_text,structured_output, andstatus.<label>.<runtime>.stderr.txt: runtime warnings.routing/run-*/results.jsonlandsummary.txt: live routing results, one JSON line per case withselected_skill,evidence_kind, andstatus.
Capture the action and the result: keep the prompt in the summary and judge
the answer against the invoked skill's own contract (for v1-menu: one
recommendation, one runner-up, explicit skills marked). A pass status requires
the expected skill inventory and a successful terminal answer (Claude), or
current installed-cache parity and a completed turn with an answer (Codex); it does not grade the prose.
Read final_text before claiming the skill behaved.
Cleanup
python3 "$V" cleanup
Completed drives retire their pids/ records. Cleanup signals a remaining
child only when its kernel process birth identity matches the recorded one;
legacy or unverifiable records are reported under unverified without
signalling. While the recorded leader is verified, cleanup captures and persists
its group members' birth identities. It signals those members individually,
rechecking birth identity and group membership before TERM or KILL, and bounds
the waits independently of leader exit. Final group enumeration must confirm
completion; new or unverifiable members are not signalled. Survivor and
unverified records retain their member identities in pids/, and cleanup exits
non-zero so another cleanup can resume safely. Captured-drive timeouts stop the
child process group and bound pipe cleanup. Cleanup deletes an empty pids/
and a scratch/ directory if present, and lists the evidence it kept. It never
deletes evidence. Proof survives in $V1_VERIFY_RUN_DIR; remove old .v1tamins/verify/run-*
directories by hand once a review is done, since raw streams contain model
output.
Run cleanup after every failed attempt as well, so recorded PIDs do not pile up across runs.
Helpers
scripts/verify-v1tamins.py(executable):new-run,doctor,claude,codex,route,cleanup.--helpon any subcommand.- The offline helper regressions run with
python3 scripts/test-verify-v1tamins.pyand are included in the static validator. They use local processes and fixture event streams, without launching logged-in runtimes. scripts/menu-recommendation.schema.json: structured answer shape for/v1-menudrives (recommended_skill,runner_up,reason).- The repo's own
scripts/verify-installed-plugin.shandscripts/run-skill-routing-live-eval.pydo the parity and routing work; this skill only points them at one evidence directory.