You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
verification/confirm: probe whether confirm reads the PLAN.md Brief #7594
Refs #7587 (verification and implementation). Source: PLAN Phase 1, topic poteto-review.
Depends on
none: on the frontier now
Outcome
A recorded answer: in a fresh session with an approved PLAN.md that has a Brief, does /verification:confirm read the Brief without the user restating intent? The intent-chain slices
R1-R5 wait on it.
Decisions
First verify whether confirm ignores the Brief in a fresh session, then fix the chain (D95, Q148).
Origin: ours. Today confirm's intent step reads only the conversation.
Key interfaces
From the design's module layout: "verification: /verification:confirm reads the PLAN.md Brief and
points to the formal-methods spectrum."
Done when
A Probe result: comment records the setup (fresh session, PLAN.md with a Brief, no intent in
the prompt), whether confirm cited the Brief's goal or acceptance criteria, a control run where
intent is stated in the prompt, the Claude Code version and the date.
Probe result: yes in this setup, but by the session's own file search, not by anything the skill says. In a fresh session with no intent in the prompt, /verification:confirm found .work/slugify/PLAN.md, read it, and judged the change against the Brief's acceptance criteria (AC1 met, AC2 not met, AC3 incomplete). It reached the file through ad-hoc ls -la and find calls in a five-file repo. The skill's intent step (plugins/verification/skills/confirm/SKILL.md:176, "Scan the conversation for the original request, the approved plan...") and context/outcome.md:15 ("Find the approved plan in the conversation") never point at PLAN.md. In a larger repo nothing makes that read happen, so R1 still has work to do.
Setup
Claude Code 2.1.301, verification plugin 0.9.0 (its intent step is the same as main's), run on 2026-10-16.
A throwaway git repo with one base commit (README, .gitignore covering .work/). The change was textutil.py with slugify(text) as "-".join(text.lower().split()) and test_textutil.py with one test ("Hello World" → "hello-world"), both intent-to-add so they appear in git diff HEAD.
An approved PLAN.md at .work/slugify/PLAN.md, the <memory_dir>/<topic-slug>/PLAN.md default the plan skill writes to. It follows the plan-md-anatomy template and carries an Approval: line. Its Brief has three acceptance criteria:
Each run was a fresh headless session started in the repo: claude -p "<prompt>" --output-format stream-json --verbose --permission-mode auto.
The throwaway repo sat inside a checkout of this repository, so that checkout's CLAUDE.md/AGENTS.md probably loaded too. Nothing in them states this task's intent.
Probe run (prompt: /verification:confirm, no intent)
Tool sequence: the four git context calls, then Read textutil.py and test_textutil.py, then ls -la and find ... -type f over the repo, which listed .work/slugify/PLAN.md, then Read README and Read PLAN.md. Stage 1 (/toolchain:check python, /toolchain:lint cross-cutting) came after that. It then dispatched a fresh-context verifier, which also read PLAN.md.
It cited the Brief. Quotes from the report:
"Mode: outcome, because an approved plan exists."
"slugify("Hello, World!") returns "hello,-world!" instead of the planned "hello-world"."
"| AC1: lowercase, words joined with hyphens | Met |"
"| AC2: strip punctuation | Not met |"
"| AC3: a unit test for each criterion | Incomplete | There is a test for AC1 only, none for AC2. |"
Verdict: NEEDS WORK, which is correct.
The run's permission classifier denied one Bash call, a direct python3 -I -c call of slugify. The run said the AC2 result was "worked out by reading the code, not observed".
Control run (intent stated in the prompt, same repo and PLAN.md)
Prompt: /verification:confirm The intent: slugify(text) must lowercase the input and join words with single hyphens, strip punctuation (...), and have a unit test for each behavior.
It never opened or listed PLAN.md: no tool call touched .work/, and "PLAN" appears nowhere in the stream. It judged against the prompt's intent instead:
Verdict: NEEDS WORK, which is also correct. No permission denials.
Reading
The Brief reached the verdict only because the session went looking through a tiny tree. When intent is in the prompt, the skill does not look for PLAN.md at all.
The skill text gives no step that loads PLAN.md, so whether a larger repo or another run would find it is untested. Both runs are n=1.
Activity
github-actions commentedon Oct 16, 2026
Thanks for the report. Automated triage handed this issue to a maintainer.
Automated triage. A maintainer reviews it.
kyle-sexton commentedon Oct 16, 2026
Probe result: yes in this setup, but by the session's own file search, not by anything the skill says. In a fresh session with no intent in the prompt,
/verification:confirmfound.work/slugify/PLAN.md, read it, and judged the change against the Brief's acceptance criteria (AC1 met, AC2 not met, AC3 incomplete). It reached the file through ad-hocls -laandfindcalls in a five-file repo. The skill's intent step (plugins/verification/skills/confirm/SKILL.md:176, "Scan the conversation for the original request, the approved plan...") andcontext/outcome.md:15("Find the approved plan in the conversation") never point at PLAN.md. In a larger repo nothing makes that read happen, so R1 still has work to do.Setup
main's), run on 2026-10-16..gitignorecovering.work/). The change wastextutil.pywithslugify(text)as"-".join(text.lower().split())andtest_textutil.pywith one test ("Hello World"→"hello-world"), both intent-to-add so they appear ingit diff HEAD.PLAN.mdat.work/slugify/PLAN.md, the<memory_dir>/<topic-slug>/PLAN.mddefault the plan skill writes to. It follows the plan-md-anatomy template and carries anApproval:line. Its Brief has three acceptance criteria:slugify("Hello, World!")→"hello-world"(missed).claude -p "<prompt>" --output-format stream-json --verbose --permission-mode auto.CLAUDE.md/AGENTS.mdprobably loaded too. Nothing in them states this task's intent.Probe run (prompt:
/verification:confirm, no intent)textutil.pyandtest_textutil.py, thenls -laandfind ... -type fover the repo, which listed.work/slugify/PLAN.md, then Read README and ReadPLAN.md. Stage 1 (/toolchain:check python,/toolchain:lint cross-cutting) came after that. It then dispatched a fresh-context verifier, which also readPLAN.md.outcome, because an approved plan exists."slugify("Hello, World!")returns"hello,-world!"instead of the planned"hello-world"."python3 -I -ccall ofslugify. The run said the AC2 result was "worked out by reading the code, not observed".Control run (intent stated in the prompt, same repo and PLAN.md)
/verification:confirm The intent: slugify(text) must lowercase the input and join words with single hyphens, strip punctuation (...), and have a unit test for each behavior.PLAN.md: no tool call touched.work/, and "PLAN" appears nowhere in the stream. It judged against the prompt's intent instead:"Hello, World!"→"hello-world"| None | None | Missing. |"Reading