Repository navigation
Description
Re-grilled 2026-10-26 with the maintainer, against
origin/developat579b4ef4(plugin 0.31.0).
The ticket is split. This one keeps the verdict half:/buildopens no pull request on a red
verdict, endscancelled, and keeps the work on the remote branch. The grouping-ticket half
(old criteria 7 to 13, 16 and 18, and the grouping part of 17) moved to
feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket, which waits for the Consumer's tracker to be
redefined. Each criterion below carries holds, amended, new or moved. The DAG shape,
the Archon version and #652 are ruled under § Rulings of 2026-10-26.
Amended 2026-09-04 after a grilling with the maintainer. The criteria below replace the
original body's two questions. Class ruling, under #456
§ Notes: this is a second variable — it changes what/buildproduces and what/tickets
creates, and neither effect separates from the mechanism checks run 3 measures. So #439 has left
#457's blockers and belongs to run 4's change set. The maintainer's words: "ok, espera a run 3".
What this is
Two claims were filed here. Both were measured during the grilling and neither survived as written.
The first claim, that open-pr running before its gate is what let run 2 ship a pull request. In
run 2 gates.build was afk, so build-pr-gate was skipped by its own when condition wherever it
sat in the DAG. Reversing the two nodes would have changed nothing about run 2. The ordering and the
run-2 outcome are unrelated.
The second claim, that a reject at /pr-review's review-gate destroys every finding. It does
not. synthesize writes the findings and the summary sections, and reconcile writes the composed
summary and the thread plan, all four to the Session dir and all four before the gate pauses. The
findings are on disk when a human rejects. What destroys them is archon complete <branch> --force
deleting the worktree, which is a cleanup defect and not a gate defect.
What is left, and it is the real defect: a build that fails its own acceptance criteria opens a
pull request. evidence withholds evidence.json on a red verdict, the engine refuses terminal
completed, and the run ends failed — with a complete, mergeable pull request already open. That
is ADR-0034
§ Decision item 4's deferred trade, reopened: "If that cost is judged too high, gate open-pr on the
verdict; that is a separate decision with its own blast radius."
And a second defect fell out of the measurement. The one artefact the engine demands is the only
one that carries no information. evidence_policy checks presence, never content; and the file,
when it exists, is { slug, verification_failures: [], goals_check_failures: [] } with both arrays
empty by construction, because the node returns before writing whenever either is non-empty. It can
never say what failed.
The decision
evidence always writes evidence.json and reports a verdict. A verdict other than pass stops the
run before any pull request exists. The run ends cancelled, and the work stays on the remote branch
with report.md inside it. The cancel: message tells the operator where to find it.
How a human who is not watching the run learns about a red build is not decided here. That is the
grouping ticket, moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket.
Rulings of 2026-10-26
- The DAG shape is the sibling idiom, not a chain. After the node that commits and pushes, two
siblings depend on it. Thecancel:node is a leaf withwhenon a verdict other thanpass. The
node that opens the pull request haswhenon a verdict equal topass, and notrigger_rule.
guard-not-readyin/buildandguard-no-diff-basein/pr-reviewalready use this idiom. The
pass-only comparison sendsunresolvedto the cancel side without a third branch. It also drops
thetrigger_rule: all_donethat the 2026-09-04 body called the criterion most easily satisfied
wrongly. Criterion 0 measures that the sibling never runs on red. - The Archon behaviours are measured on 0.12.1 before any Box YAML changes. Run 4 runs on 0.12.1.
The 2026-09-04 probe ran on 0.7.0, so its results are not evidence for this version. Criterion 0
runs the probe again. - #652 lands first. After this ticket a
red branch has no pull request. A/qarun on that branch would then meet bug(unic-archon-dlc):/qaends green on paths where nothing merged #652: no open pull
request,mergeruns, and the run ends green with nothing merged. bug(unic-archon-dlc):/qaends green on paths where nothing merged #652 blocks this ticket. - Criteria name properties a reader can confirm, never counts. The counts in old criteria 13 and
19 went stale between two readings.
Acceptance criteria
-
New. Before any Box YAML changes, a probe on Archon 0.12.1 measures the four behaviours the
criteria below rest on. Run it by path, with an isolatedARCHON_HOME, in a scratch repository
outside every clone, as #505's and
#520's criterion 1 did. The four:- A
script:node that prints a JSON object on stdout can be read field by field in awhen
expression, such as a fieldverdictcompared with'pass'. - A
cancel:node whosewhenholds sets terminal statuscancelled, and a sibling with the
inversewhendoes not run, nor does any node that depends on that sibling. - On the other branch, the skipped
cancel:leaf does not stop the run from reachingcompleted. - A
cancel:message substitutes node-output references.
Stop rule: if any of the four does not hold, stop and report what you measured. Do not adapt
the design in the implementation. The ADR records the probe's date, the Archon version and each
result. - A
-
Holds (checked at
579b4ef4:evidencestill callsprocess.exit(0)before writing on any
verdict other thanpass).evidencewritesevidence.jsonon every verdict, and the file
carries the verdict. The node no longer returns early. The file names the verdict it recorded and
lists the failures that produced it, so a reader learns what failed from the file the engine
demands. The Session-dir mirror is written on every verdict too. -
Amended (at
579b4ef4,evidencealready prints{ verdict, test_outcome, unresolved_needs }
on stdout, added by #430, and its comment
says nothing reads it yet). The verdictevidenceprints on stdout is what the two siblings'
whenexpressions read. Stdout stays JSON only, and every human line stays on stderr. The comment
that says nothing reads it yet is rewritten to name its readers. -
Holds (the enum
pass | fail | unresolvedexists at579b4ef4).unresolvedis not green.
Bothwhenexpressions compare with'pass'only, sounresolvedandfailtake the same branch.
No expression namesfailorunresolved. -
Holds. A verdict other than
passopens no pull request, and the run endscancelled. A
cancel:node fires on that verdict and sets terminal statuscancelled, distinct fromfailed. -
Amended (the chain with
trigger_rule: all_doneis replaced by the sibling idiom, see § Rulings).
The node that opens the pull request and thecancel:node are siblings. Both depend on the
node that commits and pushes. Thecancel:node is a leaf withwhenon a verdict other than
pass. The node that opens the pull request haswhenon a verdict equal topassand carries no
trigger_rule.build-pr-gatestill depends on the node that opens the pull request, so a green
build inhitlstill pauses there. A reader can confirm that no node in/buildcarries
trigger_rule. The green path is the one most easily broken: a green build must open its pull
request. -
Holds (at
579b4ef4,open-prstages, commits and opens the pull request in one node, and no
step pushes by name). Amended 2026-10-28 by the maintainer: committing and pushing are two nodes,
and both run on every verdict. A prompt node cannot fail by reporting, so one prompt node cannot
make a failed push fail the run. A bash node cannot tell the build's source files from scratch
files. So the work splits in two, and the implementation commits and the Session artefacts are
on the remote before the verdict decides anything:- A prompt node commits. It depends on
report, because the list it stages includes
report.md, and criterion 7 promises that file inside the pushed branch. It stages the same
named-path listopen-prstages at579b4ef4, now withevidence.jsonalways on it, and
commits. The staging rules move with the staging, inline in this node's prompt: named paths, one
git addper path, never a sweep, never$ARTIFACTS_DIR. It does not push. - A bash node pushes. It depends on the commit node. Before the push it exits non-zero when
HEAD is detached or on$BASE_BRANCH, and when any of the five Session artefacts (PRD.md,
issues.json,report.md,build-state.json,evidence.json) is missing at HEAD or differs
from the working tree. That check is how a commit the prompt node did not make fails the run.
It outputs the branch it pushed and the pushed commit as fields. Criterion 7'scancel:message
references them. - When the push or a check fails, the bash node fails, both siblings of criterion 5 are skipped,
and the run endsfailed, notcancelled. That is intended: no work reached the remote, which
is a different fact from a red verdict. - The node that opens the pull request keeps only opening it against
$BASE_BRANCH
(#505) and linking it to the slices'
tickets.
What this criterion does not decide. The bash node checks the five Session artefacts only. If
the prompt node leaves a source or test file out of the commit, the push succeeds and the branch
lacks it. One prompt node at579b4ef4had the same gap, so the split does not widen it. Whether
to close it is an open question for #667. - A prompt node commits. It depends on
-
New, replacing the old criterion 7, which moved. The
cancel:message tells the operator
where the work is. It names the verdict, the branch the commit-and-push node pushed (from that
node's output, criterion 6), and the path ofreport.mdinside that branch. It writes nothing to the tracker. -
Moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket.
-
to 13. Moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket. Old criterion 13 (the baton
becomes an object) existed only to carry the grouping ticket's id, so this ticket leaves the baton
as it is. -
Amended (claims re-found by what they say; several moved in No Box can target a base branch that is not the trunk, so run 4 cannot merge to integration/dlc #505). Every sentence that
describes the old mechanism is rewritten. Find each one by its claim, not by a line:verification's andgoals-check's prompts sayevidencewithholds the file unless both
verdicts are green, and thatevidence_policythen gates on it.evidence's header comment says it writes the file only on green.open-pr's staging list says to stageevidence.jsononly if it exists, becauseevidence
withholds it on red.open-pr's header comment says it always runs, even inafk, andbuild-pr-gate's says the
pull request is already open above.- The Box's
descriptionsays the Box gates a pull request after report. docs/boxes/unic-dlc-build.mdsays the run still continues toreportandopen-pron a
withheld verdict, and its step foropen-prdescribes staging and committing there.- The plugin
AGENTS.md§ Plugin doctrines saysbuild-state.jsonis committed once, at
open-pr. The rule and its reason stay. The sentence stops naming the node, so a rename cannot
falsify it again. The Box operator doc names the new node, because it describes nodes to someone
running them.
-
Holds. The
evidencenode's comment block keeps its warning about dollar-prefixed tokens.
The DAG loader reads every node-output token in that script body as a real edge, comments
included. This criterion is satisfied by changing nothing, and is here because rewriting the block
for criterion 2 is where the warning would be lost. -
Moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket.
-
Amended (grouping part moved). An ADR records the decision. It carries the always-write
rule, the verdict as the branch signal, the sibling shape and why the chain was not used,
evidence_policy's demotion to a backstop, and the four Archon behaviours from criterion 0 with
the probe's date and the Archon version. ADR0034-evidence-gate-deterministic-writer§ Decision
item 4 and ADR0023-build-generic-red-green-refactor-loop's sentence that the pull request is
still opened inafkare revised inline, by the convention in the plugin'sdocs/adr/README.md.
Take the next free ADR number when you write it, not one named here. -
Moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket.
-
Moved to #460. The
CONTEXT.md
entry for Baton sat here because old criterion 13 changed what the baton is. Without 13 this
ticket does not touch the baton, and chore(unic-archon-dlc):ticketis the plugin's word — sweepwork itemandissue, rename issues.json to tickets.json, reopen the Issues JSON entry #460 already carries the vocabulary sweep and the
issues.jsonrename. -
New. The diagrams that show the changed nodes are regenerated.
docs/architecture/20260925-unic-dlc-build-pipeline.jsongains the commit-and-push node and the
two siblings, and both its PNGs are exported again. The architecture and Box-set diagrams each
name one of these nodes: read them, and regenerate any whose content the change falsifies. -
New.
CHANGELOG.mdrecords the change under### Breaking. A red/buildrun used to
endfailedwith a pull request open. It now endscancelledwith none. An operator or a script
that waited for a red pull request sees a different outcome.
Two decisions that are not criteria
Both are satisfied by changing nothing. Writing them as criteria would buy coverage and cost an audit
round to discover.
- The order of
open-prandbuild-pr-gatedoes not change. The title of this ticket says it
should, and the measurement says otherwise. Once a red verdict opens no pull request, the gate no
longer authorises an effect that should not have happened. It reviews work that met its criteria. evidence_policy: { required: true }stays. With always-write it can no longer refuse a red
run. It now covers only the case thecancel:node cannot see, which isevidenceitself failing
before it writes. Say that in the ADR, or the next reader finds a config key that never fires and
deletes it.
What is still decided by a config value, after this
gates.build still decides whether a human sees a green pull request before the run ends. That is
intended. On green the pull request is legitimate, so skipping the pause is a tenant's choice rather
than a hole.
What this did not decide
Nothing is left open in this ticket. The two unknowns of 2026-09-04 both concern the grouping ticket
and moved with it: whether /qa's close of the grouping ticket deserves its own gate, and what a
Consumer whose tracker expresses no relationship should do.
Related
- #652: lands first.
/qaends green
without merging when no open pull request exists. - #505: landed.
open-prtargets
$BASE_BRANCH. Keep that target when the node is split. - feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket: the grouping-ticket half, split out on 2026-10-26.
Blocked by this ticket. - #460: takes the Baton entry.
- #459,
#437,
#458,
#440: siblings. Absorb nothing.
ADRs this revises
Plugin-local, in apps/claude-code/unic-archon-dlc/docs/adr/, revised inline by slug:
0034-evidence-gate-deterministic-writer: § Decision item 4 in full.0023-build-generic-red-green-refactor-loop: the sentence saying the pull request is still opened
inafk.
Activity
orioltf commentedon Sep 3, 2026
How to start this session
Written 2026-09-03 19:10 by
wayfinder-orchestrator-6. This is the grilling opener. It produces criteria on thisticket, not code. The implementation comes later, in one fresh session that implements
#430 first and this ticket second; that session gets its
own opener once the grilling closes.
What it produces, and which skill
An amended body on this ticket: acceptance criteria that pass the four reads, a What this did not decide list,
and the ADRs the fix will revise, named by slug. Nothing in
.archon/workflows/changes in this session. A BoxYAML edit here is a defect, not initiative.
Enter with
/wayfinder 456 439, typed by the maintainer. It claims the ticket by assigning it, which nothingelse does. Check the assignee first. If it is already set, report "already claimed" and go on. Then leave the
skill at its step 4 and do not close this issue. This stream works a bug under its own number; the decisions
go into this body, the maintainer closes after the implementation merges, and the orchestrator writes #456's
Decisions-so-far line then. Said again under § On landing.
The grilling is
/grill-with-docs, typed by the maintainer. Its frontmatter carriesdisable-model-invocation: true, so you cannot invoke it, and/grillingalone is the wrong tool: #441 ran it forsix rounds and settled decisions had nowhere durable to land.
/grill-with-docscomposes/domain-modeling,which will want to write an ADR. Write no ADR file in this session. Put the decision text in this ticket
under a heading the implementer can lift, and name the ADR by slug. #430's implementation writes an ADR in the
same directory, and two sessions taking
0037is how numbers collide./writing-for-agentsfor every criterionyou draft: an implementer agent reads them.
Measure the premise first, both halves
The ticket alleges two things. Both are true as measured, and neither is what the ticket implies.
Half one, the ordering.
open-pr(unic-dlc-build.yaml:590) depends onreportand runs beforebuild-pr-gate(:671,when: gate == 'hitl',on_rejectwithmax_attempts: 3at:699). Verified on0b74117. But it is not an oversight. Three documents record it as a chosen cost:docs/adr/0034-evidence-gate-deterministic-writer.md§ 4: theevidencenode exits 0 on a red verdict so therun reaches
reportandopen-pr, "so a human gets the report and a PR-shaped surface showing what failed".Then, verbatim: "The cost of that choice is that a red build still opens a PR — in
gates.build == afkwith nobuild-pr-gatepause at all — soopen-prmust treat a missingevidence.jsonas expected and skip staging itrather than failing on
git add. If that cost is judged too high, gateopen-pron the verdict; that is aseparate decision with its own blast radius, not a byproduct of this one."
docs/adr/0023-build-generic-red-green-refactor-loop.md§ 6: the gate is skipped inafk"(the PR is stillopened by the preceding
open-prnode)".docs/boxes/unic-dlc-build.mdstep 6: "The run still continues toreportandopen-pron a withheldverdict, so you get the report and the PR. It is the run status the engine refuses."
So this ticket is the separate decision ADR-0034 deferred. The grilling reopens a recorded trade, and the
first question is whether the reason for the trade still holds: on 2026-08-10 the report existed only in the
worktree, so failing before
open-prdestroyed it. Ask what else would carry it now.Half two, the config gate. The Consumer's
.archon/unic-dlc.config.yamlonorigin/developsetsgates.build: afkandgates.pr-review: afk(:87–91), with the comment the ticket quotes at:85–86. So inrun 2
build-pr-gatewas skipped because the config saidafk, not because of the ordering. The two halvescompound rather than overlap: in
afkthere is no pause at all; inhitlthe pause comes after the side effect.Each half on its own would be a smaller ticket. Say in the criteria which half each one addresses.
Read order
This ticket's body, then register rows 39 and 40 in
docs/research/2026-08-31-dlc-run-2-findings.md(line 139 onward). Row 39's evidence column says"verified in the DAG"; the three documents above are the part it does not say.
ADR-0034 § 4 in full, then ADR-0023 § 6, then the build Box doc step 6 and step 8. These are the decision
you are reopening. Quote them in the body, do not paraphrase.
#456 § Notes, the class rule. Read it before you
draft one criterion; see § The decision the ticket does not make, item 1.
The engine's approval schema:
docs/adr/0011-archon-schema-target.md:43. Anapproval:node carriesmessage, optionalcapture_response, andon_reject { prompt, max_attempts }. There is noon_approve.No Box uses
capture_response(grep -rn capture_response apps/claude-code/unic-archon-dlc/.archon/workflows/returns nothing). A reject with no
on_rejectcancels the run; a reject pastmax_attemptscancels the run.The four gates, as they stand on
0b74117, inapps/claude-code/unic-archon-dlc/.archon/workflows/:/buildopen-pr(:590) →build-pr-gate(:671)on_rejectre-verifies and re-pauses,max_attempts: 3. The PR already exists./pr-reviewreview-gate(:536) →post(:560,trigger_rule: all_done)on_reject: a reject cancels and every finding is lost. Gate before side effect, and it is the one the maintainer could not use./qauat-gate(:211) →verify-pr-base→merge-gate(:320) →merge(:334,whenfail-closes at:337)uat-gate'son_reject(:220,max_attempts: 1at:267) files every finding on the tracker before the second reject halts. The one gate whose reject preserves work./explorespike-ticket(:356) →spike-branch-gate(:415) →preserve-spike:350–355, ADR-0029 § 4). Noon_reject; a reject cancels with the ticket already filed.Two Boxes already answer this ticket's second question for one artefact each. Neither answers it for a
pull request.
Archon facts that bound every answer, in the Consumer's
docs/agents/unic-archon-dlc.mdonorigin/develop(git show origin/develop:docs/agents/unic-archon-dlc.md, read the file there and never amaincheckout): § Three Archon defects that land here, and § Recovering a killed run. Terminalapproveapproves and resumes; a UI approve parks the run forever;
resumewalks through an unresolved gate andposts;
abandonis the kill;archon complete <branch> --forcedeletes worktree and branch, so a/buildrun abandoned beforeopen-prloses its commits unless someone pushed them. Tool inputs survivein
~/.archon/archon.db, so a killed run is recoverable by hand. Whether a design may lean on that is agrilling question, not a given.
The gate vocabulary, two surfaces:
gates.<box>: hitl | afkfor the four Boxes (commands/setup.md:271,README.md:183, ADR-0017 § Consequences), andspecs.gate/tickets.gate: open-pr | stage-onlyfor the twocommands (
README.md:179–180). The ticket's "no safe middle" is about the first. Ask whether the secondalready has one, and whether
stage-onlyis the shape.apps/claude-code/unic-archon-dlc/AGENTS.md§ Plugin doctrines, the/qaand/pr-reviewbullets (lines92–93), and
CONTEXT.mdfor Evidence gate, Evidence set, Holds. If the grilling coins a term forthe thing that must survive a stop, it goes into
CONTEXT.mdin the implementation, and the body names it now.Root
AGENTS.md§ Acceptance criteria are prose. The four reads, run on your criteria before you post them.The one trap that costs an hour
"Reverse the order" is not one change, and it recreates the loss it is meant to prevent. Put
build-pr-gatebefore
open-prand the run's whole product, the commits on the branch,report.md,evidence.json, exists onlyin an Archon worktree until a human approves. A reject cancels the run.
archon complete <branch> --force, thesanctioned cleanup, then deletes the worktree and the branch. That is the #438 shape of loss, on a leg that
took six points of a week to produce, and ADR-0034 chose the current order to avoid exactly it. So the grilling
has to separate the durable output (commits pushed to a branch;
report.md) from the outward-facing sideeffect (a pull request a client can see and a
/qarun can merge), and decide the order for each./exploredid that split for a ticket and a branch. Nobody has done it for a PR.
The decision the ticket does not make
Five places where two competent people diverge. The grilling decides each, or lists it as undecided.
variable changes what the chain produces. A fix that stops a red build from opening a PR changes what run 3's
build leg produces, and its effect on the run is not separable from the mechanism checks under test. If the
grilling lands there, this ticket leaves run 3's map: Dispatch run 3, read both legs against sealed predictions, and write it up #457 loses a blocker, the fix joins run 4's set, and
ADO 43036 moves with it. A fix that only changes what
survives a stop, and what the human at the gate can read, stays an instrument. Rule this first; every
criterion depends on it.
hitlgate who wants to read before deciding: every finding and every commit must survive, and the gate must not
be a choice between "post it" and "destroy it". An operator killing an
afkrun: the side effect may alreadyexist, so the answer is what the run leaves behind, not what it withholds. The engine failing the run after
the side effect, run 2's shape: whether
evidence_policymay refusecompletedon a run whose PR is alreadyopen, or whether a withheld verdict gates
open-pritself, which ADR-0034 named and did not take.reviewable or mergeable. If it counts as durable output and not as a side effect, the
/exploresplitapplies to
/builddirectly: push before the gate, open the PR after. If it counts as a side effect, nothingdurable can precede the gate and item 6 in the read order decides how much loss the design accepts.
on_approve. A gate that pauses and lets a human readwithout a destroy-on-reject needs an
on_rejectwhose prompt does nothing but re-pause, bounded bymax_attempts, or acapture_responsenobody has used. Both are workarounds dressed as design. A thirdgates.<box>value is the other route, and the ticket's own claim is that a config value cannot be themiddle. Test that claim against
specs.gate: stage-only, which is a config value and is a middle./buildand the pr-review config comment.review-gatehas no
on_rejectand destroys findings on reject;uat-gatealready preserves them. Say whether thecriteria cover one Box, the two with a pull-request side effect, or all four, and say why the ones left out
are left out. A criterion that says "every Box" and names one is the vacuous shape.
Other traps
/qa'smergewhen:(
unic-dlc-qa.yaml:337) and add anunresolvedstate toevidence(unic-dlc-build.yaml:472–560). Themaintainer's plan is one session implementing 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 then bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439. Write bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439's criteria against the tree 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
leaves, not
0b74117, and say so in the body: "after 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,merge'swhen:reads …". A criterion writtenagainst today's line numbers is stale before it is dispatched.
/specsgate approves an artefact nobody reads; it is a command gate,not an Archon
approval:node, and it was blocked by fix(unic-archon-dlc): /specs skips the grilling its config requires and reports halts that never fired #441, which merged on 2026-09-03. Name it in § Relatedand leave its criteria alone.
/qa's orphan outputs and is outside run 3. If the grilling finds that "what survives a stop"in
/qadepends one2e.summaryoruat-prep.criteriareaching a file, that is bug(unic-archon-dlc): three /qa nodes emit prose that nothing reads and nothing keeps #458's finding. Point at it,do not absorb it.
gh" or "push withgit push" fails the doctrine atAGENTS.md:61. Name a role and a file; the node reads the tracker contract.> **Amended**blockquote is retired since docs(unic-archon-dlc): ADR-0020 states superseded claims below three amendment blocks #452. The ADRsthis fix revises:
0034-evidence-gate-deterministic-writer§ 4,0023-build-generic-red-green-refactor-loop§ 6,
0025-qa-pipeline-onramp§ 3–4,0026-pr-review-generic-archon-harvest§ 6,0029-explore-research-spike-onramp§ 4, and the
gatesline in0017-container-follows-structural-need§ Consequences if the value set changes.The body lists them; the implementation edits them.
cddoes not persist between calls here. Never a foregroundsleep.You edit no repository file in this session, so no worktree is needed; if
/domain-modelinginsists onwriting one, stop and put the text in the ticket instead.
develops are current at0b74117(plugin) ande74778e(Consumer) as of 19:00. Re-rungit fetchandgit log -1 origin/developin each before quoting a line number.The bar that proves it
The false pass: a body with criteria that reorder two nodes in
unic-dlc-build.yaml, plus one that says"a gate value has a safe middle", plus nothing about what happens on reject, abandon or engine failure. That
set reads as coverage. It would ship a
/buildwhose reject destroys six points of work, and it answers neitherof the ticket's two questions.
The real bar: for each of the three stoppers in item 2, the body says what survives and where it lives after
the stop, in one sentence each, and at least one criterion is able to act: it names a thing a node must do
(file, push, write, re-pause) rather than a thing that must not happen. Then the four reads, as one set: is there
a gap between two criteria an implementer fills with a defensible choice; what is still decided by a config value
after the fix; which criterion passes on the current tree unchanged; and what did the grilling not decide. Write
the last list into the body under What this did not decide, numbered, so the implementation opener can point
at it.
On landing
this did not decide, and the class ruling from item 1 in one sentence at the top. Say on the ticket that the
body was amended and when.
needs-specstoready-for-agentwhen he approves the criteria, or asks for another round. The orchestrator writes wayfinder: run 3 — do mechanisms carry the knowledge where documents did not? #456'sDecisions-so-far line only when the implementation merges.
that is the orchestrator's edit, not yours.
Report back
BEFORE YOU FINISH, AND WHENEVER YOU LEARN SOMETHING THAT WOULD HAVE CHANGED THIS PROMPT,
SendMessagetothe live orchestrator seat.
ListAgentsnames it — the seats arewayfinder-orchestrator-<n>and thenumber rises with each restart; it was
wayfinder-orchestrator-7when this line was last checked, on2026-09-05. Read the name from
ListAgents, never from this line. If no orchestrator seat is live, commentthese four things here instead:
Send it when you learn it, not only at the end. A session that dies unreported takes its learnings with it.
orioltf commentedon Sep 4, 2026
Body amended 2026-09-04 21:30 CEST, after a grilling with the maintainer under
/grill-with-docs. The two original questions are replaced by seventeen acceptance criteria, two decisions recorded as decisions rather than criteria, and aWhat this did not decidelist of five items.Three things a reader of the old body should know before reading the new one.
Both original claims failed measurement. The node ordering did not cause run 2's outcome —
gates.buildwasafk, so the gate was skipped by its own condition wherever it sat. And a reject at/pr-review'sreview-gatedoes not destroy the findings: four files are on disk before the gate pauses. What is left is the real defect, that a build failing its own acceptance criteria opens a pull request, which is ADR-0034 § Decision item 4's deferred trade.Three Archon behaviours were measured rather than assumed, in a throwaway repository outside every clone, six runs, worktrees removed afterwards. A
cancel:node sets terminal statuscancelled, distinct fromfailed, and stops the DAG between layers. A node after a conditionalcancel:is skipped on the non-cancelled branch unless it carriestrigger_rule: all_done— so without that rule a green build would open no pull request. And ascript:node'soutput_formatis ignored, its stdout returned raw, soevidencemust print JSON for anything to branch on its verdict. Criteria 2 to 5 depend on all three.Class ruling: second variable. This changes what
/buildproduces and what/ticketscreates, and neither effect separates from the mechanism checks run 3 measures. #439 has left #457's blockers.Two spin-outs were approved and are not filed yet: one for
/pr-review's missingon_rejectplus thecleanup.prune_slug_dirsdefault, one for the vocabulary ruling inWhat this did not decideitem 3. The label staysneeds-specsuntil the maintainer approves the criteria.orioltf commentedon Sep 4, 2026
Four reads on the seventeen criteria, 2026-09-04 21:40,
wayfinder-orchestrator-6. Two findings, both applied to the body inline; the rest holds.cancel:node stops the DAG between layers; criterion 7 named no node for the pointer and no position. A pointer node beside or aftercancel:never runs and the red path passes 4 to 6 with 7 failing silently. Criterion 7 now names the node and its edges: after commit-and-push, beforecancel:.build-state.jsonis committed once, atopen-pr" lives in the pluginAGENTS.mdstaging doctrine and in the build Box's operator doc. Criterion 14 now names the claim./qa,/pr-reviewand/exploredo not readissues.json, andcommands/triage.mdnames the file twice without asserting its shape, so criterion 13's six files are the whole set. Criteria 8 and 15 pass on an unchanged tree and the body already says so.Spin-outs filed: #459 (
review-gatere-pause, unresolved gate path,prune_slug_dirsdefault) and #460 (the vocabulary question). Label staysneeds-specsuntil the maintainer approves the set.orioltf commentedon Sep 4, 2026
Second grilling pass, 2026-09-04 22:45. Four of the five
What this did not decideitems were ruled and the criteria now run to nineteen./qacloses the grouping ticket when it merges, and gains a baton read inbootstrap. Measured while writing it:/qa,/pr-reviewand/exploreread no baton today; only/builddoes.CONTEXT.mdgains an entry for Baton. The word appears 32 times across the plugin andCONTEXT.mddefines it nowhere, which makes the most-used structural term also the most-used undefined one. Its_Avoid_line nameshandoff contract, becauseAGENTS.mdalready calls one baton exactly that — and says in the same breath that/handoffandHANDOFF.mdkeep their names, so a later sweep does not rename one of Matt's skills./ticketsaccepts the grouping ticket as an optional argument. Work often already lives under a ticket a human made; this repository's own effort is four stories under one Azure DevOps feature, created by hand before any Box ran.AGENTS.mdkeeps thebuild-state.jsonrule and its reason and stops naming the node. The rule survives a rename;at open-prdoes not, which is the only reason criterion 6 falsified it. The Box operator doc names the new node, because it describes nodes to someone running them.The word is ruled:
ticket.work itemis Azure DevOps's,issueis GitHub's and Jira's, andticketis the one no host in front of us claims. #460 carries the sweep, the argumentCONTEXT.mdneeds against its current_Avoid_: ticketsline, and theissues.json→tickets.jsonrename.Two items remain undecided, both honest unknowns rather than unasked questions: whether
/qa's close deserves its own gate, and what a Consumer whose tracker expresses no relationship at all should do — criterion 11 stops there, which is correct and untested, no such tracker having been met.22 remaining items
docs(unic-archon-dlc): record that the build verdict decides the pull…
docs(unic-archon-dlc): name the evidence_policy backstop as ADR-0040 …
docs(unic-archon-dlc): draw the verdict siblings in the build pipelin…
fix(unic-archon-dlc): refuse to push uncommitted or base-branch work …
docs(unic-archon-dlc): export the build pipeline PNGs again
/buildthat cannot open its pull request endscompleted#666fix(unic-archon-dlc): check every Session file and name the resume ca…
docs(unic-archon-dlc): say push-branch refuses a resumed run only whe…
orioltf commentedon Oct 28, 2026
Criterion 6 amended, 2026-10-28 (maintainer decision, recorded by
unic-sdlc-orchestrator-8)Criterion 6 asked for one node that commits and pushes, and its 2026-10-26 amendment asked for a
failed push to end the run
failed. One prompt node cannot do both: a prompt node that reports afailure still finishes green. PR #665 splits
the work into
commit-session(prompt) andpush-branch(bash), and the maintainer accepts thatshape. The criterion now describes two nodes, so the ticket and the merged code agree.
The criterion now also names the one gap the split leaves:
push-branchdoes not check source ortest files. That gap existed before the change. See the criterion's last paragraph and #667.
Nothing else in the body changed.