Repository navigation
Description
Grilled 2026-10-27 with the maintainer, against
origin/developat579b4ef4(plugin 0.31.0).
Every criterion that touchesevidence,reportoropen-pris written against
#439's criteria, not against today's
tree. #439 merges first:evidencewritesevidence.jsonon every verdict, and a verdict other
thanpasscancels the run before any pull request opens. Read #439's body before this one.
Observed
Run 3 build c283e296. implement-review-precheck found 11 defects, one a documented standard breached (an invented icon glyph frozen into three snapshot baselines) and three acceptance criteria broken (13 snapshot on the wrong element, 24 focus ring missing a bound token, 25 no hover story). Five minutes later goals-check marked all 30 criteria COVERED, including those three: it counts that something exists that answers the criterion; the precheck reads what it contains. evidence.json certifies from verification and goals-check only, by the Box's own design ("a prompt that both judges and certifies grades its own homework"), so the run completed with verdict: pass and two empty failure lists. report.md § 5 carries the precheck's findings, marked "not posted — /pr-review posts".
Evidence: findings register § G row G8 at https://github.com/unic/unic-agents-plugins/blob/bcf688a/docs/research/2026-08-31-dlc-run-2-findings.md, and the dispatch record on #457.
The decision
A precheck finding that contradicts a claim the run makes turns the verdict to fail. A precheck that could not review the code turns it to unresolved. A judgement call is a note: it reaches evidence.json and the pull request description, and changes no verdict.
goals-check stays a presence counter. evidence is the only node that reads the precheck's verdict fields, so the fact has one source.
The vendored code-review Method already separates the classes this uses. Step 4 asks the Standards sub-agent to "distinguish hard violations from judgement calls", and says baseline smells are always judgement calls. The Spec sub-agent reports (a) missing or partial requirements, (b) scope creep and (c) requirements implemented wrong. What is missing is a structured field. Today the precheck emits one prose string, findings.
Acceptance criteria
-
The precheck emits structured fields beside
findings. Itsoutput_formatgains:status, an enum ofranandblocked;blocked_reason, a string, empty whenstatusisran;hard_findings, an array of objects{ axis, category, citation, summary }, wherecategoryis one ofdocumented-standard,spec-missingandspec-wrong;notes, an array of strings.
All four are required by the schema.
findingsstays as it is, andreportstill folds it in verbatim. -
The precheck's prompt states the classification inline. A Standards finding that breaches a documented standard, citing the standard's file and rule, is
documented-standard. A Spec finding of kind (a) isspec-missing, and of kind (c) isspec-wrong. Eachhard_findingsentry quotes its citation: the standard's file and rule, or the spec line. A baseline smell and a Spec finding of kind (b) go innotes, never inhard_findings. The vendored Method is not edited; the rule lives in the node's prompt. -
The precheck reports
blockedwhenever it reviewed nothing. That covers the three cases its prompt names today: no merge-base resolves, theAgenttool is unavailable, and the diff against the base is empty.blocked_reasoncarries the sentence the prompt already prints for each, andfindingsstill carries it too. A blocked precheck still emits every required field, withhard_findingsandnotesas empty arrays, so the schema does not abort the run. -
evidencereads the precheck, and depends on it by name.implement-review-precheckis inevidence'sdepends_on.evidencereadsstatus,hard_findingsandnotesfrom it. The comment block's warning about dollar-prefixed tokens stays (bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439 criterion 15 holds it too). -
The verdict counts hard findings, and stays red when in doubt. On top of bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439's rule:
- A non-empty
hard_findingsmakes the verdictfail. An entry with an emptycitation, or acategoryoutside the enum, still counts as a hard finding. It is never dropped. statusblocked, or any value other thanran, makes the verdictunresolvedwhen nothing else isfail.- The precedence is the one
evidencealready uses:failoverunresolved,unresolvedoverpass. - No
whenexpression changes. bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439's siblings compare with'pass'only, so both new outcomes take the cancel branch.
- A non-empty
-
evidence.jsoncarries what the precheck reported. Beside bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439's fields it carriesprecheck_status,precheck_blocked_reason,hard_findingsandprecheck_notes, on every verdict. A reader of a cancelled run learns from this file which hard finding turned it. -
report.mdnames the hard findings where a reader looks first. Section 2 leads with a warning naming the number of hard findings when there are any, as it does today for uncovered criteria. Section 3 says in one sentence thatCOVEREDmeans a test and an implementation exist, not that either is correct, and points to the hard findings. Section 5 keeps the precheck's prose and its label. -
The pull request description carries the notes. The node that opens the pull request, as bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439 leaves it, adds a
## Pre-check notessection listingprecheck_notesfromevidence.json, or "none". It reads the file, not the precheck's prose.hard_findingsis empty by construction when a pull request opens, so the section does not list it. -
Every sentence that describes the old contract is rewritten. Find each by its claim, not by a line:
evidence's header comment, and theverificationandgoals-checkprompts where they name whatevidencereads; the precheck's prompt where it says its output only informs the report and the human atbuild-pr-gate;docs/boxes/unic-dlc-build.mdwhere it describes the precheck andevidence. -
The build-pipeline diagram shows the new edge.
docs/architecture/20260925-unic-dlc-build-pipeline.jsongains the edge fromimplement-review-prechecktoevidence, on top of bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439's changes, and both its PNGs are exported again. -
ADR
0034-evidence-gate-deterministic-writeris revised inline by the convention in the plugin'sdocs/adr/README.md. It states that the precheck is now a gate input, that itshard_findingsandstatusare self-reported by a prompt exactly aspassedis forverificationandgoals-check, and thatevidencetreats a malformed entry as hard rather than dropping it. -
CHANGELOG.mdrecords the change under### Breaking. A/buildrun whose precheck reports a hard finding, or cannot run, used to endpasswith a pull request open. It now endscancelledwith none. -
No precheck text can stop
evidencefrom running. A node-output reference substitutes raw intoevidence's script source, and only booleans and arrays land as valid literals. So no precheck value reachesevidence's source as a quoted free-text string. Ablocked_reason, a note, a citation or a summary that holds a quote, a backslash, a backtick, a newline or${leavesevidencerunning and writingevidence.json. So does astatusoutside its enum. A precheck output thatevidencecannot read makes the verdictunresolvedorfail, and never crashes the node. The proving case is the blocked precheck with no merge-base: its sentence today iscannot resolve base branch '$BASE_BRANCH' via origin or local — no merge-base found, with single quotes, and that run must endunresolved, notfailed.
What this does not prove
A Box change is unproven in the Consumer until a Consumer run reads it. A run in this repository does not prove it. Run 4 on #498 is the first read.
The bar for that run:
- Run 3's case: a build whose precheck reports a broken acceptance criterion ends with
verdictStatefail, and itsevidence.jsonlists the finding. - A build whose precheck is blocked with no merge-base ends with
verdictStateunresolved, andevidence.jsoncarries the blocked sentence intact. - A build whose precheck reports nothing hard and ran ends exactly as it does after bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439, with any notes in the pull request description.
Out of this ticket
- A fix loop inside
/buildthat lets the build repair what the precheck finds. Decided 2026-10-27: a separate Feature, after run 4. It would rest on this ticket's verdict for the case where its attempts run out, and it must not mark a finding fixed because a second precheck stopped mentioning it (#482's defect). build-pr-gate'son_rejectpass pushes a fix without running the precheck orevidenceagain. That is older than this ticket and not changed here.
Related
- #439: lands first. Same file, same node, same diagram.
- #488: also edits
unic-dlc-build.yaml. - #465: same family. A run that found a breach looks like one that found nothing.
- #430: the
unresolvedstate this ticket reuses for a blocked precheck.
Filed 2026-09-17 by wayfinder-orchestrator-10 from run 3's measurements.
Activity
orioltf commentedon Oct 27, 2026
Stale — do not follow. Superseded on 2026-10-28 by the
/afk-loop 498opener below.Opener — How to start this session (written 2026-10-27 by
unic-sdlc-orchestrator-7, at dispatch)What this session produces
Approved acceptance criteria in this ticket's body, then the label
ready-for-agent. Nothing else. The fix runs later under/afk-loop 498. This ticket blocks #502, run 4.Start: the maintainer types
/wayfinder 498 #483. This ticket's parent is #498. When the grilling starts, the maintainer types/grill-with-docs. Both carrydisable-model-invocation, so the session cannot invoke them itself.Do not close this ticket. This overrides
/wayfinderstep 4. This stream grills a ticket into its own criteria and implements it under the same number. Do not invoke/implement,/tddor/to-tickets. Keepneeds-specsuntil the maintainer approves.Read in this order
ready-for-agentand runs tonight under/afk-loop 498, before this ticket. It rewrites theevidencenode.apps/claude-code/unic-archon-dlc/.archon/workflows/unic-dlc-build.yamlonorigin/develop:implement-review-precheck,goals-check,evidence,reportandopen-pr.evidence.jsoncertifies "every criterion covered" from a check that counts presence.The trap that costs an hour
Grilling against the
evidencegate ondevelop. This ticket's body asks whetherevidence_policyshould read the precheck's findings. Butevidence_policychecks only that the file exists, never what it holds. And #439, which merges before this ticket runs, changesevidenceto writeevidence.jsonon every verdict, and makes a verdict other thanpasscancel the run before any pull request opens. So the real question is whetherevidence'sverdictStatecounts the precheck's findings. A criterion written against today's withhold-on-redevidencewill fight #439's merged tree. Write every criterion that touchesevidence,reportoropen-pragainst #439's criteria, and say so in the body.What this ticket does not decide yet
Each of these is a question for the maintainer. None is yours to settle with a plausible default.
evidencereads the precheck's findings, orgoals-checkreads the precheck before it marks a criterionCOVERED, or both. Todayevidencedepends onverificationandgoals-checkonly.implement-review-precheckemits one prose string,findings, with no severity and no structure. The body says "hard findings", but no such field exists. In run 3 the precheck found 11 defects: one breached a documented standard, and three broke acceptance criteria. Decide which of these turns the verdict, and whether the precheck must emit a structured field for it. A structured field is still self-reported by a prompt.evidence's own header comment names that limit forverificationandgoals-check.passcancels the run before a pull request opens, so/pr-reviewnever sees the code. Decide whether a precheck finding should befail, a separate state, or a note that leavespassstanding but must appear in the PR description.PRECHECK BLOCKED: …today ends up asfindingstext and changes no verdict. Decide whether a blocked precheck isunresolved, the way bug(unic-archon-dlc): the config maps commands to nodes and the Boxes name tools, so a check runs by luck or not at all #430 treats a check that could not run.open-prdescription. This is the body's second "Not decided" point: whether the pull request must carry the precheck's findings.Other traps
unic-dlc-build.yaml. If this ticket goesready-for-agent, ask the maintainer for a nativeblocked_byedge bug(unic-archon-dlc):goals-checkcounts, the precheck reads, and only the counter reachesevidence.json#483 ← bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439, so the two runs never edit the file at once.evidence's verdict states arepass,failandunresolved. Never write "green" or "red" in a criterion.evidencedepending onimplement-review-precheck, makesapps/claude-code/unic-archon-dlc/docs/architecture/'s build-pipeline diagram stale. If the criteria add one, they require its JSON updated and both PNGs exported again. bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439 changes the same diagram.The bar that proves it
Run the four reads from
docs/agents/dispatching-and-learning.md§ Before you post one on the criteria as a set. Then check:verdictStatepass, or, if the maintainer chooses the note, the pull request description carries that finding.output_formatafter the change.A false pass is
goals-checktold to "consider" the precheck in prose: the counter still reachesevidence.json, nothing structured changes, and run 3 repeats.On landing
unic-sdlc-orchestrator-7with the link. The orchestrator reads the criteria as one set and replies.needs-specswithready-for-agent, removewayfinder:grilling(the decision is made, and this stream does not close the ticket), keepp1unless the maintainer moves it, and leave it unassigned for/afk-loop 498.Report back
Review and handover
There is no pull request. The maintainer approves the criteria in the session. The orchestrator reads them as one set before the label goes on. Implementation runs under
/afk-loop 498, which this seat records as unproven in the Consumer until a Consumer run reads it.orioltf commentedon Oct 27, 2026
Grilled 2026-10-27 with the maintainer. The body now holds 13 acceptance criteria, written against #439's criteria. The two "Not decided" points are answered.
What changed:
fail. Hard means a documented-standard breach, a missing or partial requirement, or a requirement implemented wrong. Smells and scope creep are notes only. They reachevidence.jsonand the pull request description.evidencereads them and treats a malformed hard entry as hard.unresolved.evidenceonly.goals-checkstays a presence counter, andreport.mdsays whatCOVEREDdoes not mean.evidence's script, so a quote in the blocked sentence would crash the gate. The criterion requires that no precheck text can do that./buildis out of this ticket. It becomes a separate Feature, after run 4.Native dependency added: this ticket is blocked by #439, which edits the same file, node and diagram.
2 remaining items
docs(unic-archon-dlc): drop a mid-sentence colon in ADR-0034
docs(unic-archon-dlc): draw the pre-check edge into evidence
fix(unic-archon-dlc): bind the four pre-check fields and name read fa…
docs(unic-archon-dlc): label the pre-check edge as its verdict
fix(unic-archon-dlc): record every pre-check read that gives the wron…
docs(unic-archon-dlc): correct the pre-check claims in the docs
fix(unic-archon-dlc): name an object as an object in precheck_read_error
docs(unic-archon-dlc): label the pre-check edge with the fields it ca…
fix(unic-archon-dlc): keep the text of a pre-check array that does no…
fix(unic-archon-dlc): keep the other axis's findings when one axis re…