Skip to content

bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439

Closed

Description

@orioltf

Re-grilled 2026-10-26 with the maintainer, against origin/develop at 579b4ef4 (plugin 0.31.0).
The ticket is split. This one keeps the verdict half: /build opens no pull request on a red
verdict, ends cancelled, 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 /build produces 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. The cancel: node is a leaf with when on a verdict other than pass. The
    node that opens the pull request has when on a verdict equal to pass, and no trigger_rule.
    guard-not-ready in /build and guard-no-diff-base in /pr-review already use this idiom. The
    pass-only comparison sends unresolved to the cancel side without a third branch. It also drops
    the trigger_rule: all_done that 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 /qa run on that branch would then meet bug(unic-archon-dlc): /qa ends green on paths where nothing merged #652: no open pull
    request, merge runs, and the run ends green with nothing merged. bug(unic-archon-dlc): /qa ends 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

  1. 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 isolated ARCHON_HOME, in a scratch repository
    outside every clone, as #505's and
    #520's criterion 1 did. The four:

    1. A script: node that prints a JSON object on stdout can be read field by field in a when
      expression, such as a field verdict compared with 'pass'.
    2. A cancel: node whose when holds sets terminal status cancelled, and a sibling with the
      inverse when does not run, nor does any node that depends on that sibling.
    3. On the other branch, the skipped cancel: leaf does not stop the run from reaching completed.
    4. 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.

  2. Holds (checked at 579b4ef4: evidence still calls process.exit(0) before writing on any
    verdict other than pass). evidence writes evidence.json on 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.

  3. Amended (at 579b4ef4, evidence already prints { verdict, test_outcome, unresolved_needs }
    on stdout, added by #430, and its comment
    says nothing reads it yet). The verdict evidence prints on stdout is what the two siblings'
    when expressions 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.

  4. Holds (the enum pass | fail | unresolved exists at 579b4ef4). unresolved is not green.
    Both when expressions compare with 'pass' only, so unresolved and fail take the same branch.
    No expression names fail or unresolved.

  5. Holds. A verdict other than pass opens no pull request, and the run ends cancelled. A
    cancel: node fires on that verdict and sets terminal status cancelled, distinct from failed.

  6. Amended (the chain with trigger_rule: all_done is replaced by the sibling idiom, see § Rulings).
    The node that opens the pull request and the cancel: node are siblings. Both depend on the
    node that commits and pushes. The cancel: node is a leaf with when on a verdict other than
    pass. The node that opens the pull request has when on a verdict equal to pass and carries no
    trigger_rule. build-pr-gate still depends on the node that opens the pull request, so a green
    build in hitl still pauses there. A reader can confirm that no node in /build carries
    trigger_rule. The green path is the one most easily broken: a green build must open its pull
    request.

  7. Holds (at 579b4ef4, open-pr stages, 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 list open-pr stages at 579b4ef4, now with evidence.json always on it, and
      commits. The staging rules move with the staging, inline in this node's prompt: named paths, one
      git add per 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's cancel: message
      references them.
    • When the push or a check fails, the bash node fails, both siblings of criterion 5 are skipped,
      and the run ends failed, not cancelled. 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 at 579b4ef4 had the same gap, so the split does not widen it. Whether
    to close it is an open question for #667.

  8. 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 of report.md inside that branch. It writes nothing to the tracker.

  9. Moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket.

  10. 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.

  11. 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 and goals-check's prompts say evidence withholds the file unless both
      verdicts are green, and that evidence_policy then gates on it.
    • evidence's header comment says it writes the file only on green.
    • open-pr's staging list says to stage evidence.json only if it exists, because evidence
      withholds it on red.
    • open-pr's header comment says it always runs, even in afk, and build-pr-gate's says the
      pull request is already open above.
    • The Box's description says the Box gates a pull request after report.
    • docs/boxes/unic-dlc-build.md says the run still continues to report and open-pr on a
      withheld verdict, and its step for open-pr describes staging and committing there.
    • The plugin AGENTS.md § Plugin doctrines says build-state.json is 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.
  12. Holds. The evidence node'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.

  13. Moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket.

  14. 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. ADR 0034-evidence-gate-deterministic-writer § Decision
    item 4 and ADR 0023-build-generic-red-green-refactor-loop's sentence that the pull request is
    still opened in afk are revised inline, by the convention in the plugin's docs/adr/README.md.
    Take the next free ADR number when you write it, not one named here.

  15. Moved to feat(unic-archon-dlc): a red /build run reaches a human through a grouping ticket.

  16. 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): ticket is the plugin's word — sweep work item and issue, rename issues.json to tickets.json, reopen the Issues JSON entry #460 already carries the vocabulary sweep and the
    issues.json rename.

  17. New. The diagrams that show the changed nodes are regenerated.
    docs/architecture/20260925-unic-dlc-build-pipeline.json gains 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.

  18. New. CHANGELOG.md records the change under ### Breaking. A red /build run used to
    end failed with a pull request open. It now ends cancelled with 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-pr and build-pr-gate does 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 the cancel: node cannot see, which is evidence itself 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

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
    in afk.

Activity

  1. added
    bugSomething isn't working
    needs-specsEnough info from reporter; ready to write a spec
    p1High priority
    on Sep 1, 2026
  2. orioltf commented on Sep 3, 2026

    @orioltf
    MemberAuthor

    STALE since 2026-09-17 23:05 CEST. Superseded by the re-grilling opener posted below by unic-sdlc-orchestrator-1. This one names map #456, seat wayfinder-orchestrator-6 and #430 as pending; all three have moved. Kept for the record of the 2026-09-04 grilling.

    How to start this session

    Written 2026-09-03 19:10 by wayfinder-orchestrator-6. This is the grilling opener. It produces criteria on this
    ticket, 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 Box
    YAML edit here is a defect, not initiative.

    Enter with /wayfinder 456 439, typed by the maintainer. It claims the ticket by assigning it, which nothing
    else 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 carries
    disable-model-invocation: true, so you cannot invoke it, and /grilling alone is the wrong tool: #441 ran it for
    six rounds and settled decisions had nowhere durable to land. /grill-with-docs composes /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 0037 is how numbers collide. /writing-for-agents for every criterion
    you 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 on report and runs before
    build-pr-gate (:671, when: gate == 'hitl', on_reject with max_attempts: 3 at :699). Verified on
    0b74117. But it is not an oversight. Three documents record it as a chosen cost:

    • docs/adr/0034-evidence-gate-deterministic-writer.md § 4: the evidence node exits 0 on a red verdict so the
      run reaches report and open-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 == afk with no
      build-pr-gate pause at all — so open-pr must treat a missing evidence.json as expected and skip staging it
      rather than failing on git add. If that cost is judged too high, gate open-pr on the verdict; that is a
      separate 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 in afk "(the PR is still
      opened by the preceding open-pr node)".
    • docs/boxes/unic-dlc-build.md step 6: "The run still continues to report and open-pr on a withheld
      verdict, 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-pr destroyed it. Ask what else would carry it now.

    Half two, the config gate. The Consumer's .archon/unic-dlc.config.yaml on origin/develop sets
    gates.build: afk and gates.pr-review: afk (:87–91), with the comment the ticket quotes at :85–86. So in
    run 2 build-pr-gate was skipped because the config said afk, not because of the ordering. The two halves
    compound rather than overlap: in afk there is no pause at all; in hitl the 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

    1. 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.

    2. 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.

    3. #456 § Notes, the class rule. Read it before you
      draft one criterion; see § The decision the ticket does not make, item 1.

    4. The engine's approval schema: docs/adr/0011-archon-schema-target.md:43. An approval: node carries
      message, optional capture_response, and on_reject { prompt, max_attempts }. There is no on_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_reject cancels the run; a reject past max_attempts cancels the run.

    5. The four gates, as they stand on 0b74117, in apps/claude-code/unic-archon-dlc/.archon/workflows/:

      Box Order Reject behaviour
      /build open-pr (:590) → build-pr-gate (:671) on_reject re-verifies and re-pauses, max_attempts: 3. The PR already exists.
      /pr-review review-gate (:536) → post (:560, trigger_rule: all_done) no on_reject: a reject cancels and every finding is lost. Gate before side effect, and it is the one the maintainer could not use.
      /qa uat-gate (:211) → verify-pr-base → merge-gate (:320) → merge (:334, when fail-closes at :337) uat-gate's on_reject (:220, max_attempts: 1 at :267) files every finding on the tracker before the second reject halts. The one gate whose reject preserves work.
      /explore spike-ticket (:356) → spike-branch-gate (:415) → preserve-spike Ticket filed before the gate "so the durable output survives a discard" (comment at :350–355, ADR-0029 § 4). No on_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.

    6. Archon facts that bound every answer, in the Consumer's docs/agents/unic-archon-dlc.md on
      origin/develop (git show origin/develop:docs/agents/unic-archon-dlc.md, read the file there and never a
      main checkout): § Three Archon defects that land here, and § Recovering a killed run. Terminal approve
      approves and resumes; a UI approve parks the run forever; resume walks through an unresolved gate and
      posts; abandon is the kill; archon complete <branch> --force deletes worktree and branch, so a
      /build run abandoned before open-pr loses its commits unless someone pushed them. Tool inputs survive
      in ~/.archon/archon.db
      , so a killed run is recoverable by hand. Whether a design may lean on that is a
      grilling question, not a given.

    7. The gate vocabulary, two surfaces: gates.<box>: hitl | afk for the four Boxes (commands/setup.md:271,
      README.md:183, ADR-0017 § Consequences), and specs.gate / tickets.gate: open-pr | stage-only for the two
      commands (README.md:179–180). The ticket's "no safe middle" is about the first. Ask whether the second
      already has one, and whether stage-only is the shape.

    8. apps/claude-code/unic-archon-dlc/AGENTS.md § Plugin doctrines, the /qa and /pr-review bullets (lines
      92–93), and CONTEXT.md for Evidence gate, Evidence set, Holds. If the grilling coins a term for
      the thing that must survive a stop, it goes into CONTEXT.md in the implementation, and the body names it now.

    9. 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-gate
    before open-pr and the run's whole product, the commits on the branch, report.md, evidence.json, exists only
    in an Archon worktree until a human approves. A reject cancels the run. archon complete <branch> --force, the
    sanctioned 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 side
    effect
    (a pull request a client can see and a /qa run can merge), and decide the order for each. /explore
    did 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.

    1. Which class this fix is, under wayfinder: run 3 — do mechanisms carry the knowledge where documents did not? #456's rule. An instrument changes whether a result can be read; a second
      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.
    2. Who stops the run, and what must survive each stop. Three stoppers, three answers. A human at a hitl
      gate 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 afk run: the side effect may already
      exist, 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_policy may refuse completed on a run whose PR is already
      open, or whether a withheld verdict gates open-pr itself, which ADR-0034 named and did not take.
    3. Whether a pushed branch without a pull request is a side effect. It is visible on the host and it is not
      reviewable or mergeable. If it counts as durable output and not as a side effect, the /explore split
      applies to /build directly: push before the gate, open the PR after. If it counts as a side effect, nothing
      durable can precede the gate and item 6 in the read order decides how much loss the design accepts.
    4. What "a safe middle" is, given the schema. No on_approve. A gate that pauses and lets a human read
      without a destroy-on-reject needs an on_reject whose prompt does nothing but re-pause, bounded by
      max_attempts, or a capture_response nobody has used. Both are workarounds dressed as design. A third
      gates.<box> value is the other route, and the ticket's own claim is that a config value cannot be the
      middle. Test that claim against specs.gate: stage-only, which is a config value and is a middle.
    5. Which Boxes the fix reaches. The ticket names /build and the pr-review config comment. review-gate
      has no on_reject and destroys findings on reject; uat-gate already preserves them. Say whether the
      criteria 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

    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 /build whose reject destroys six points of work, and it answers neither
    of 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

    Report back

    BEFORE YOU FINISH, AND WHENEVER YOU LEARN SOMETHING THAT WOULD HAVE CHANGED THIS PROMPT, SendMessage to
    the live orchestrator seat. ListAgents names it — the seats are wayfinder-orchestrator-<n> and the
    number rises with each restart; it was wayfinder-orchestrator-7 when this line was last checked, on
    2026-09-05. Read the name from ListAgents, never from this line. If no orchestrator seat is live, comment
    these four things here instead:

    1. what you expected
    2. what happened
    3. the command or file that proved it
    4. whether it changes only this ticket, or every session in this repository

    Send it when you learn it, not only at the end. A session that dies unreported takes its learnings with it.

  3. self-assigned this
    on Sep 3, 2026
  4. orioltf commented on Sep 4, 2026

    @orioltf
    MemberAuthor

    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 a What this did not decide list 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.build was afk, so the gate was skipped by its own condition wherever it sat. And a reject at /pr-review's review-gate does 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 status cancelled, distinct from failed, and stops the DAG between layers. A node after a conditional cancel: is skipped on the non-cancelled branch unless it carries trigger_rule: all_done — so without that rule a green build would open no pull request. And a script: node's output_format is ignored, its stdout returned raw, so evidence must print JSON for anything to branch on its verdict. Criteria 2 to 5 depend on all three.

    Class ruling: second variable. This changes what /build produces and what /tickets creates, 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 missing on_reject plus the cleanup.prune_slug_dirs default, one for the vocabulary ruling in What this did not decide item 3. The label stays needs-specs until the maintainer approves the criteria.

  5. orioltf commented on Sep 4, 2026

    @orioltf
    MemberAuthor

    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.

    • Gap between criteria 4 and 7. The cancel: node stops the DAG between layers; criterion 7 named no node for the pointer and no position. A pointer node beside or after cancel: 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, before cancel:.
    • A fourth surface criterion 6 falsifies. "build-state.json is committed once, at open-pr" lives in the plugin AGENTS.md staging doctrine and in the build Box's operator doc. Criterion 14 now names the claim.
    • Verified, no change: /qa, /pr-review and /explore do not read issues.json, and commands/triage.md names 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-gate re-pause, unresolved gate path, prune_slug_dirs default) and #460 (the vocabulary question). Label stays needs-specs until the maintainer approves the set.

  6. orioltf commented on Sep 4, 2026

    @orioltf
    MemberAuthor

    Second grilling pass, 2026-09-04 22:45. Four of the five What this did not decide items were ruled and the criteria now run to nineteen.

    • 18 — /qa closes the grouping ticket when it merges, and gains a baton read in bootstrap. Measured while writing it: /qa, /pr-review and /explore read no baton today; only /build does.
    • 19 — CONTEXT.md gains an entry for Baton. The word appears 32 times across the plugin and CONTEXT.md defines it nowhere, which makes the most-used structural term also the most-used undefined one. Its _Avoid_ line names handoff contract, because AGENTS.md already calls one baton exactly that — and says in the same breath that /handoff and HANDOFF.md keep their names, so a later sweep does not rename one of Matt's skills.
    • 12, extended — /tickets accepts 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.
    • 14, sharpened — AGENTS.md keeps the build-state.json rule and its reason and stops naming the node. The rule survives a rename; at open-pr does 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 item is Azure DevOps's, issue is GitHub's and Jira's, and ticket is the one no host in front of us claims. #460 carries the sweep, the argument CONTEXT.md needs against its current _Avoid_: tickets line, and the issues.json → tickets.json rename.

    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.

  7. added
    ready-for-agentFully specified, ready for an AFK agent
    and removed
    needs-specsEnough info from reporter; ready to write a spec
    on Sep 4, 2026
  8. 22 remaining items

  9. added
    resolvedImplemented; ready for a PR
    and removed
    ready-for-agentFully specified, ready for an AFK agent
    on Oct 28, 2026
  10. orioltf commented on Oct 28, 2026

    @orioltf
    MemberAuthor

    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 a
    failure still finishes green. PR #665 splits
    the work into commit-session (prompt) and push-branch (bash), and the maintainer accepts that
    shape. 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-branch does not check source or
    test files. That gap existed before the change. See the criterion's last paragraph and #667.

    Nothing else in the body changed.

  11. added
    closedPR has been merged
    and removed
    resolvedImplemented; ready for a PR
    on Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions