Repository navigation
Closed
Labels
app:unic-archon-dlcbugSomething isn't workingSomething isn't workingclosedPR has been mergedPR has been mergedp1High priorityHigh prioritywayfinder:grillingWayfinder ticket: decide it by grillingWayfinder ticket: decide it by grilling
Description
Question
Act 1 of run 4 merges to a long-lived integration/dlc branch, by the two-act delivery decided while charting #498 and kept on 2026-09-17 (comment). No Box can target it. What changes so that one can, and how does the base rule end up stated once?
What is wrong today
Measured on develop at 38bef0de.
unic-dlc-build.yaml,unic-dlc-qa.yamlandunic-dlc-pr-review.yamleach computeexpected_baseinbootstrapfromproject.branching:developwhengitflow, elsemain. No value can name a third branch.unic-dlc-build.yamlalready reads a second answer. Its verify node diffs against Archon's$BASE_BRANCH, whileopen-prandcode-reviewin the same Box readexpected_base. Nothing checks that the two agree.unic-dlc-pr-review.yamltakes its review diff from the merge-base withexpected_base. A wrong base reads correctly untildevelopmoves, and then the review reads the wrong diff and reports nothing.integration/dlcdoes not exist on the Consumer's remote (measured 2026-10-21).
Decisions (maintainer, 2026-10-21)
- The one source of a run's base branch is Archon's
$BASE_BRANCH. No DLC config key. Archon resolves it fromarchon workflow run --base <branch>, thenworktree.baseBranchin.archon/config.yaml, then the codebase's stored default branch, then git (variables reference at v0.12.1).--baseexists since Archon 0.7.1 (coleam00/Archon#2203), so this holds on 0.10.1 and on 0.12.1. Run 4 dispatches every act-1 Box with--base integration/dlcand edits no committed file in the Consumer. project.branchingstops naming the base. It keeps one job in the Boxes: whether/qadeletes the mergedfeature/*branch after the merge.- The review diff reads the PR's own target branch when the tracker returns a PR, because that is the diff that will merge. With no queryable PR it reads
$BASE_BRANCH. When both exist and differ, it prints a warning naming both and carries on. /setupstays verify-only on.archon/config.yaml. It reports the base Archon will resolve and warns when it is missing or disagrees withbranching. It writes nothing there, ascommands/setup.mdalready rules for that file.- Who creates
integration/dlcstays with #502: cut by hand from thedevelopcommit frozen for run 4, before dispatch.--baserefuses a branch missing on the remote, so no Box can create it. - This ticket lands before #439. Here
open-prchanges by one token; bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439 restructuresopen-prand rebases onto this ticket, keeping$BASE_BRANCHas its target. bug(unic-archon-dlc): open-pr precedes its gate, and a config-value gate has no safe middle #439 carries a native "blocked by" relation on this ticket, so the order holds whoever is assigned. docs/boxes/unic-dlc-build.md's hard-coded "basedevelop" is fixed here, not in #499.
Acceptance criteria
All paths are under apps/claude-code/unic-archon-dlc/.
The measurement comes first
-
Before any Box changes, a spike on Archon 0.12.1, run by path with an isolated
ARCHON_HOMEin a throwaway repository, as #520's criterion 1 does, measures five things and posts the commands and their output as a comment on this ticket:- With
--base <branch>, a prompt node sees$BASE_BRANCHas that branch, and the worktree is cut from it. - After an approval gate is approved, the resumed run still sees the same
$BASE_BRANCH. - With a
--basebranch missing on the remote, the run fails before its first node with an error that names the branch. - With no queryable PR and a base branch that has diverged from
develop,unic-dlc-pr-reviewtakes the$BASE_BRANCHfallback of criterion 4, and its changed-file list holds only the feature branch's files. This measures the fallback only. The PR-target path is proven in the Consumer before run 4, under #502. - With
--from <feature-branch> --base <branch>together, Archon accepts both, a prompt node sees$BASE_BRANCHas the--basevalue, and the worktree is cut from the feature branch.
If 1, 2, 3 or 5 fails, the implementation stops and the ticket returns to grilling. If 4 fails, the fix for the review diff is wrong and is corrected before merge.
- With
The Boxes
- In
unic-dlc-build.yaml,unic-dlc-qa.yamlandunic-dlc-pr-review.yaml, no node computes, outputs or readsexpected_base. Every line that names the base reads$BASE_BRANCH, except the review diff in criterion 4. This covers lines the body does not list, such as thebootstrapfallback text, thecode-reviewfixed point and the post-merge checkout. - No Box states the rule "
developwhengitflow, elsemain", in any wording. unic-dlc-pr-review.yamltakes its review diff from the merge-base with the PR's target branch when the tracker returns a PR, from$BASE_BRANCHwhen it does not, and prints a warning naming both when both exist and differ.unic-dlc-qa.yaml'sverify-pr-basecompares the PR's target with$BASE_BRANCH, andmerge-gateandmergestill fail closed onbase_ok != 'true'. A/qadispatched without--baseagainst a PR that targetsintegration/dlctherefore refuses to merge.unic-dlc-qa.yamlstill readsproject.branching, and only to decide whether to delete the mergedfeature/*branch.- The
messageof eachbootstrapin the three Boxes names the base branch this run uses.
/setup and the documentation
commands/setup.mdreads the base Archon will resolve from.archon/config.yamland the codebase default, reports it in Step 8 next to the remote line, and warns, with the line to add, whenworktree.baseBranchis unset or disagrees with whatbranchingimplies. It writes nothing to.archon/config.yaml.- Outside
commands/setup.md, every statement of the base rule in the plugin is removed or points at$BASE_BRANCHandcommands/setup.md. This coversREADME.md'sproject.branchingrow,docs/boxes/unic-dlc-build.md,docs/boxes/unic-dlc-qa.mdanddocs/boxes/unic-dlc-pr-review.md, and any other place where it turns up. - A new plugin ADR, slug
base-branch-is-archons-base-branch, records decisions 1 to 4: why$BASE_BRANCHand not a DLC key, whatproject.branchingstill does, and why the review diff reads the PR's target. Its number is taken when it is written, because #520 also adds a plugin ADR. StatusAccepted (YYYY-MM-DD). It cites ADR-0023, whosecode-reviewrow namesexpected_base, and that row is revised inline under the convention indocs/adr/README.md. CHANGELOG.mdcarries a### Breakingentry: the Boxes read the base from Archon's$BASE_BRANCH, so a Consumer whose Archon base differs from whatbranchingimplied now targets the Archon base. The entry tells the Consumer to run/unic-archon-dlc:setupand read its base line. The plugin bumpsminor, nevermajor.
What does not change
- No diagram under
docs/architecture/goes stale. None of their JSON files names the base rule orexpected_base, and the/qaone says "checks the PR base", which stays true. An implementer satisfies this criterion by changing nothing, on purpose. commands/cleanup.mdandunic-dlc-explore.yamlkeep their reads ofproject.branching. One uses it as a hint for the main branch, the other for branch naming, and neither names a run's base.
Out of scope
- Creating
integration/dlc, dispatching run 4 with--base, and proving the review's PR-target path in the Consumer: #502. - A DLC config key, and the config layers of #647. This ticket adds no key, so it does not wait for Build the layered Practice Pack config: DLC defaults, pack defaults, Consumer overrides #647.
Metadata
Metadata
Assignees
Labels
app:unic-archon-dlcbugSomething isn't workingSomething isn't workingclosedPR has been mergedPR has been mergedp1High priorityHigh prioritywayfinder:grillingWayfinder ticket: decide it by grillingWayfinder ticket: decide it by grilling
Activity
orioltf commentedon Sep 17, 2026
The decision this ticket waited on is taken, 2026-09-17 23:35 CEST. The maintainer keeps act 1 on
integration/dlc, as an exception for now, so this ticket stays the seventh precondition of #502 and is grilled as such. Recorded on #498 § Decisions so far. The § Not decided items in this body are unchanged: config key or single source, and whetherbranchingis the right axis.orioltf commentedon Oct 21, 2026
Stale — do not follow. This opener was for the grilling, which is done. The implementation opener is posted below.
Opener — How to start this session (written 2026-10-21 by
unic-sdlc-orchestrator-6, at dispatch)What this session produces
Approved acceptance criteria in this ticket's body, then the label
ready-for-agent. Nothing else. The Box, command and documentation edits are implemented afterwards under/afk-loop, not here.Start: the maintainer types
/wayfinder 373 #505. 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, which closes a decision ticket. This stream grills a ticket into its own criteria and implements it under the same number (maintainer, 2026-09-29). Do not invoke/implement,/tddor/to-tickets.Read in this order
integration/dlc, as an exception for now. Do not reopen that decision.fd9739e. Ondevelopat38bef0dethe six Box lines still hold;README.md:172is now theproject.branchingrow near line 315. Read the files, not the line numbers.docs/research/2026-10-21-archon-workflow-extensibility.md§ 2. It lists$BASE_BRANCHas an engine variable fed byworktree.baseBranchin.archon/config.yaml.apps/claude-code/unic-archon-dlc/: thebootstrapnode ofunic-dlc-build.yaml,unic-dlc-qa.yamlandunic-dlc-pr-review.yaml;open-prand the verify node inunic-dlc-build.yaml;verify-pr-base,merge-gate,mergeand the post-merge cleanup step inunic-dlc-qa.yaml.The trap that costs an hour
Adding a
project.base_branchkey, threading it through the threebootstrapnodes, and calling the rule single-sourced. Archon already has a base-branch source.unic-dlc-build.yamluses it today: its verify node runsgit diff --name-only $BASE_BRANCH...HEAD, whileopen-prin the same Box targets$bootstrap.output.expected_base. So one Box already reads two answers to "what is the base", from two sources, and nothing checks that they agree. A new DLC key makes three. Whatever the criteria choose, they say which source every base-reading line in every Box reads, including the ones the body does not list.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.
$BASE_BRANCH, or a key thatbootstrapvalidates against$BASE_BRANCH. Each one changes who sets the base and how often.worktree.baseBranchis committed in the Consumer's.archon/config.yamland applies to every run there, and run 4 needsintegration/dlcfor one run only.--fromor a per-run--configsets$BASE_BRANCH. Unmeasured. If a criterion depends on it, it names a spike on Archon 0.12.1, run by path with an isolatedARCHON_HOME, the way #520's criterion 1 does. A measurement on 0.10.1 does not carry over.project.branchingkeeps the job of naming the base. The body's second question.unic-dlc-qa.yamlalso readsbranchingto decide whether to delete the mergedfeature/*branch after the merge, so the key does not go away even if it stops naming the base.integration/dlc, and from which commit. #502 owns it today. Measured 2026-10-21: the branch does not exist on the Consumer's remote.open-prinunic-dlc-build.yaml. The body asks for the order to be decided here and stated in the criteria.Other traps
docs/boxes/unic-dlc-pr-review.mdstates it in its config table, and thebootstrapfallback text inunic-dlc-qa.yamlandunic-dlc-pr-review.yamlhard-codesexpected_base "develop". Write a criterion that names the property ("every statement of the base rule outside the one source is removed or points at it"), not a list of lines. A list drifts the first time the surface changes; #521 is the precedent.unic-dlc-pr-review.yamltakes its diff from the merge-base with the base, so a wrong base reads correctly untildevelopmoves. A criterion for it needs a check that can fail: a base that has diverged fromdevelop.docs/boxes/unic-dlc-build.mdhard-codes "basedevelop". It is also a row for #499. Say which ticket fixes it.README.mdandcommands/setup.mdchange with any new key or enum value, and the plugin's ADR convention is inline revision,Accepted (YYYY-MM-DD, revised YYYY-MM-DD), perapps/claude-code/unic-archon-dlc/docs/adr/README.md.commands/setup.md, they name the diagram underapps/claude-code/unic-archon-dlc/docs/architecture/that the change makes stale, and require its JSON updated and both PNGs exported again. The pipeline diagrams name nodes, not the base rule, so a change inside a node may stale none. Say so in the criteria when that is the case, rather than leaving it unsaid.The bar that proves it
Before the label goes on, run the four reads from
docs/agents/dispatching-and-learning.md§ Before you post one on the criteria as a set. Then check three things:integration/dlcwithout editing a committed file in the Consumer that every later run also reads, or the criteria say that it does and why that is accepted.A false pass is a set where every criterion reads satisfied after a new key reaches the three
bootstrapnodes, while the verify node still diffs against$BASE_BRANCH.On landing
unic-sdlc-orchestrator-6with the link to the amended body. The orchestrator reads the criteria as one set and replies.needs-specswithready-for-agent, and leave the ticket unassigned so/afk-loopcan take it. If the maintainer wants to hold it back, assign it and say so in the comment.docs/research/in its own pull request, as Practice Packs must stack: /setup replaces .archon/methods/ wholesale, and the override tier was deleted #520's did.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 later under
/afk-loop, which this seat records as unproven in the Consumer until a Consumer run reads it.orioltf commentedon Oct 21, 2026
Body amended, 2026-10-21: grilled into acceptance criteria. The maintainer approved them in session.
What changed:
$BASE_BRANCHand nothing else, so no DLC key is added.project.branchingstops naming the base and keeps only/qa's branch cleanup.archon workflow run --base <branch>sets the base per dispatch. It has existed since Archon 0.7.1, so run 4 can targetintegration/dlcwithout editing a committed file in the Consumer. The fact is documented upstream, not measured, so criterion 1 is a spike on 0.12.1 that runs before any Box changes./setupstays verify-only on.archon/config.yaml. It reports the base and warns, and writes nothing.docs/boxes/unic-dlc-build.mdis fixed here, not in #499. Creatingintegration/dlcstays with #502.orioltf commentedon Oct 21, 2026
Body amended again, 2026-10-21, after the orchestrator's set-read. The maintainer approved items 2 and 3 in session.
--from <feature-branch>together with--base, the shape the review and/qalegs are dispatched in. It carries the same stop rule as 1 to 3.$BASE_BRANCHfallback only, since a throwaway repository has no PR. The PR-target path is proven in the Consumer before run 4, under #502.11 remaining items
docs(unic-archon-dlc): label /setup's base stand-in as approximate
docs(unic-archon-dlc): draw guard-no-diff-base in the /pr-review pipe…
fix(unic-archon-dlc): skip review when prep resolved no diff base
/qaends green on paths where nothing merged #652/setupassumes a non-Gitflow trunk is calledmain#653fix(unic-archon-dlc): block prep on a failed tracker query and fetch …
fix(unic-archon-dlc): let prep treat a tracker without pull requests …
orioltf commentedon Oct 21, 2026
Spike, sub-item 4 re-run on PR #650 at
f6bbdaf2The first run of sub-item 4 used the Box before
prepgained its fetch, its BLOCKED paths andguard-no-diff-base. This re-run usesunic-dlc-pr-review.yamlatf6bbdaf2, with the same setup as the first spike comment. That setup is the v0.12.1 release binary run by its path, withARCHON_HOMEin a scratch folder, and the same scratch repository and bare remote. Claude Code is 2.1.306.Result: pass. With no PR to query and
integration/dlcdiverged fromdevelop,prepfetched the base, resolved it throughorigin/integration/dlc, and the changed-file list holds only the feature branch's file.guard-no-diff-basewas skipped.1a6c902is the tip ofintegration/dlc. The gate was rejected afterwards, so nothing was posted, and the worktree was removed.Not measured here. This run does not exercise the guard's cancel path or the failed-query BLOCKED path. The cancel path needs a PR whose target branch does not resolve, and a scratch repository with no tracker cannot provide one. #502 proves both in the Consumer.
Afterwards,
/opt/homebrew/bin/archon --versionstill printsArchon CLI v0.10.1.~/.claude/settings.json,~/.archon/config.yaml,~/.archon/archon.dband~/.archon/archon.db-walare unchanged.docs(unic-archon-dlc): mark the guard path unmeasured and correct the…
Merge origin/develop into feature/unic-archon-dlc/505-base-branch-fro…
fix(unic-archon-dlc): fetch the diff base into origin/<branch> with a…
orioltf commentedon Oct 27, 2026
Criterion 4: the stricter reading is confirmed (maintainer, 2026-10-27, relayed by
unic-sdlc-orchestrator-7).PR #650 cancels
/pr-reviewwhen the tracker query fails. It falls back to$BASE_BRANCHonly when a query confirms that no PR exists, or when the tracker contract names no PR tool. ADR-0039 decision 3 and the 0.31.0 changelog record this, and they stand. No follow-up is needed.This matches #652: a PR state that cannot be read cancels the run with a message, and never falls back to a default.