diff --git a/.abcd/work/decisions/dcn-2611101302520880-the-autonomous-run-of-7-nov-orders-its.md b/.abcd/work/decisions/dcn-2611101302520880-the-autonomous-run-of-7-nov-orders-its.md new file mode 100644 index 000000000..425454b43 --- /dev/null +++ b/.abcd/work/decisions/dcn-2611101302520880-the-autonomous-run-of-7-nov-orders-its.md @@ -0,0 +1,6 @@ +--- +id: dcn-2611101302520880 +slug: the-autonomous-run-of-7-nov-orders-its +date: 2026-11-10 +--- +2026-11-10 — The autonomous run of 7 Nov orders its build lanes by one rule, tried as a candidate principle for abcd. This record is the public statement of the rule; the run folder's SCHEDULING.md is a working copy of it. The rule: priority work that shares files runs as one stacked chain, each step starting on the previous step's branch once both reviewers pass it; lower-priority work is either confined to the record folders (no test slot) or collected on one side branch per chain cycle that takes a single test run and pull request, started only when the slot is free just after a chain run passes; a side lane in the chain's way or in a third review round is parked. Grounds: the person asked on 10 Nov for a recorded way to fill spare capacity without slowing priority work; a plan review of the first draft showed from the run log that review rounds and the 65 to 95 minute wait to merge, not the test slot, hold the chain. Reverse by recording a new decision that returns the run to one lane per item. diff --git a/.abcd/work/issues/open/iss-2609012020476120-four-test-sites-now-assert-elapsed-wall.md b/.abcd/work/issues/open/iss-2609012020476120-four-test-sites-now-assert-elapsed-wall.md index da59ba1cc..78e05baad 100644 --- a/.abcd/work/issues/open/iss-2609012020476120-four-test-sites-now-assert-elapsed-wall.md +++ b/.abcd/work/issues/open/iss-2609012020476120-four-test-sites-now-assert-elapsed-wall.md @@ -32,3 +32,5 @@ Two records-only branches failed `make preflight` on wall-clock assertions alone - `TestTheForgeIsAskedAboutEveryBranchInTurn` and `TestPeersListsALanesStageAndItsHoldersRecentHandBacks`: running when their packages (claim, implement/loop, surface/cli) hit the 20-minute timeout. The load gate admits one preflight's test stage at a time, but tests run outside a preflight (a session's own `go test -run …`) are not gated, so an admitted stage still runs on a saturated machine. + +2026-11-09: met again at 19:25 in the autonomous run of 7 Nov: #1474 failed CI's race stage because two new tests bounded a linear read at 15 seconds; under sharded race on CI each took 15.0 to 15.5 seconds, against 0.14 seconds locally without race. Neither review pair nor the local preflight, whose race stage passed, caught it. diff --git a/.abcd/work/issues/open/iss-2610230059199116-a-build-run-renders-each-lane-s-brief.md b/.abcd/work/issues/open/iss-2610230059199116-a-build-run-renders-each-lane-s-brief.md index 95ac442c3..5e391db50 100644 --- a/.abcd/work/issues/open/iss-2610230059199116-a-build-run-renders-each-lane-s-brief.md +++ b/.abcd/work/issues/open/iss-2610230059199116-a-build-run-renders-each-lane-s-brief.md @@ -13,3 +13,5 @@ remedy: "Render a lane's brief from the run's own checkout when its record diffe --- A build run renders each lane's brief from the intent and spec as they stand at the lane's base on the default branch, so a refinement recorded during the run (a narrowed footprint, a new requirement or test line on a later step, a decision citing the spec) never reaches the run's own later lanes until it is merged to the default branch by some other change. On 2026-10-23 the merge gate's run (run-2610222359421510, itd-2610150602547271) recorded step-4 security requirements and step-wise footprint decisions on the orchestrating branch; lanes 2-6 would have been briefed without them, and a separate records pull request had to be cut to carry them to main ahead of lane 2. + +2026-11-08: met again at 15:15 in the autonomous run of 7 Nov, on an issue lane: abcd build cut the lane from the default branch, not from the head of the run's checkout, so two decision records and a capture committed in the run's worktree, meant to land with the fix, were missing from the lane; the brief named no decision records for the issue, and the records commit was cherry-picked into the lane by hand. diff --git a/.abcd/work/issues/open/iss-2610230839002949-an-intent-s-build-reserves-its-spec-s.md b/.abcd/work/issues/open/iss-2610230839002949-an-intent-s-build-reserves-its-spec-s.md index 8ab3be165..5bc53ca2a 100644 --- a/.abcd/work/issues/open/iss-2610230839002949-an-intent-s-build-reserves-its-spec-s.md +++ b/.abcd/work/issues/open/iss-2610230839002949-an-intent-s-build-reserves-its-spec-s.md @@ -13,3 +13,5 @@ remedy: "Make the reservation rule a per-repository setting with two values, as --- An intent's build reserves its spec's whole Footprint packages line once, for every lane of the run, and never reads a step's own packages line, so the reservation cannot start at the first step's files and widen step by step. Building that needs a reservation per open lane (the union of the steps in flight, since steps marked needs: none run beside each other), a widening act as each lane opens (a reserve with the union and the tip's term, as widenReservation already does, since claim.Request.Narrow refuses to widen), and a narrowing as each step lands. That is more than the directory-warning fix for iss-2610230016544142 could carry, so it is filed on its own. + +2026-11-09 and 2026-11-10: seen again in the autonomous run of 7 Nov. On 9 Nov at 08:27 a build of itd-2610240922461281 was refused at its reservation because the spec's footprint names the whole internal/core/implement/loop package and another holder had reserved one test file in it; by 12:27 that one-file hold, renewed twice at the same stage, had blocked the whole-package footprint for four hours, and the step's own files were reserved by hand instead. Later on 9 Nov two lanes of one run blocked each other because the checklist spec names the whole internal/surface/cli package, and one lane was narrowed to its step under a hand reservation. On 10 Nov at 12:23 a one-package step collided with lanes in other packages for the same reason. diff --git a/.abcd/work/issues/open/iss-2610230856272073-a-dependent-build-lane-waits-for-its.md b/.abcd/work/issues/open/iss-2610230856272073-a-dependent-build-lane-waits-for-its.md index d4cf4de37..885e1cb18 100644 --- a/.abcd/work/issues/open/iss-2610230856272073-a-dependent-build-lane-waits-for-its.md +++ b/.abcd/work/issues/open/iss-2610230856272073-a-dependent-build-lane-waits-for-its.md @@ -14,3 +14,5 @@ related_intents: [itd-2610230856403803] --- A build run's dependent lane cannot start until its predecessor has merged into the default branch: readiness reads a predecessor as landed only when its lane is done, its pull request an ancestor of the default branch, so a step that needs another waits a whole preflight and merge-queue cycle (about one to two and a half hours each on 2026-10-22) before it opens. Stacked changes are standard practice for dependent work (Graphite, Sapling and ghstack stacks, and merge queues taking a stack in order), and on 2026-10-22/23 that shape was rolled by hand twice: merge-gate steps 2 and 3, and model-matrix step 2 stacked on the route branch. Building it is more than a fix: the dependent lane's pull request is based on the predecessor's branch, the stack merges in order, and a lane rebases (and re-stamps what it resolved) when the predecessor changes. + +2026-11-07 and 2026-11-08: seen again in the autonomous run of 7 Nov. At 19:41 on 7 Nov a two-step intent cost two preflights of two to five hours' wait each, and its second lane was cut from main rather than stacked on the first, though both edit the same file, so it had to merge main after the first landed. At 01:55 on 8 Nov a step could not be stacked on a lane held back until after a tag, so the spec's later steps waited for days; the only verb that closes a lane stuck off its reviewed head is --discard. diff --git a/.abcd/work/issues/open/iss-2610280032429024-abcd-reserve-refuses-a-footprint-whose.md b/.abcd/work/issues/open/iss-2610280032429024-abcd-reserve-refuses-a-footprint-whose.md index 9833f6280..5345828f7 100644 --- a/.abcd/work/issues/open/iss-2610280032429024-abcd-reserve-refuses-a-footprint-whose.md +++ b/.abcd/work/issues/open/iss-2610280032429024-abcd-reserve-refuses-a-footprint-whose.md @@ -13,3 +13,5 @@ remedy: "Let reserve derive the footprint from a branch diff and compact it to f --- abcd reserve refuses a footprint whose reservation message passes the 4096-byte cap, and takes only an explicit list of paths, so a large stacked build cannot name its whole diff: renewing the worktree store's reservation after a rebase with its 83 changed paths was refused at 4740 bytes, and the renewal had to fall back by hand to the store's original 50 paths, leaving the rebased-in paths unreserved. + +2026-11-08: seen again at 12:14 in the autonomous run of 7 Nov: reserve refused a lane's 65-path footprint because the reservation message came to 4160 bytes, and the lane collapsed internal/core/matrix to a directory, which the verb warned holds peers off 17 files the lane did not change. diff --git a/.abcd/work/issues/open/iss-2610280910566850-an-intent-build-re-widens-its.md b/.abcd/work/issues/open/iss-2610280910566850-an-intent-build-re-widens-its.md index f3e4e1c63..03aca0218 100644 --- a/.abcd/work/issues/open/iss-2610280910566850-an-intent-build-re-widens-its.md +++ b/.abcd/work/issues/open/iss-2610280910566850-an-intent-build-re-widens-its.md @@ -13,3 +13,5 @@ remedy: "Reserve per lane: at each step the run reserves the open lanes' own pac --- An intent build re-widens its reservation to the spec's whole footprint at every step, instead of reserving only the packages of the lanes it has open. A spec footprint that names whole packages (or the whole of commands/) then overlaps peers' narrow file reservations, so the build's renewal at land is refused until the peer releases by hand, and a hand-narrowed reservation is widened again at the next step. Seen 26-28 Oct on run-2610252354599453: a peer's commands/land.md and commands/guard.md reservations blocked lane 1's renewal. + +2026-11-09: seen again in the autonomous run of 7 Nov: two lanes of the same run blocked each other through the spec-wide footprint, the checklist spec naming the whole internal/surface/cli package while one lane held one file in it, and build could not tell a holder from the same run from a peer's; the second lane was narrowed to its step under a hand reservation. iss-2610230839002949 lists the other sightings. diff --git a/.abcd/work/issues/open/iss-2610311514162877-on-2026-10-31-abcd-build.md b/.abcd/work/issues/open/iss-2610311514162877-on-2026-10-31-abcd-build.md index f2e3e97e9..d0c199335 100644 --- a/.abcd/work/issues/open/iss-2610311514162877-on-2026-10-31-abcd-build.md +++ b/.abcd/work/issues/open/iss-2610311514162877-on-2026-10-31-abcd-build.md @@ -13,3 +13,5 @@ remedy: "Teach the safe backup in the SHELL hazard registry: before git rebase, --- On 2026-10-31 abcd build itd-2610170638184486 was refused at the peers check by backup/sota-open-intents-pre-rebase, a local branch an agent made as a safety copy before rebasing research/sota-open-intents onto main; it held the intent's old drafts/ copy, while main and the rebased branch held it in planned/. The peers check reads every local branch under refs/heads/ (internal/core/peers/read.go) and cannot tell a safety copy from live work, and the guard then refused the branch's deletion (git-delete-unproven) because a rebase that squashed and resolved conflicts leaves no ancestry or patch-equivalence for it to prove, so the build stayed blocked until the person allowed the delete by hand. abcd teaches no safe form of the backup: a tag, or a ref outside refs/heads/, would have kept the copy and blocked nothing. + +2026-11-10: a related case at 12:23 in the autonomous run of 7 Nov: build's peers check gave a stale unpushed branch, whose only edit was to a superseded drafts copy of the intent, the weight of a live hold. Showing the hold's age and whether it is on origin, and flagging a copy in a status folder the record has since left, would have told it apart. It still counted after a2a584caf, which stops a branch checked out nowhere from holding a record, because this branch was checked out in a live worktree of its own, which the check counts by design. diff --git a/.abcd/work/issues/open/iss-2610312044511316-in-facilitator-mode-auto-the-landing-s.md b/.abcd/work/issues/open/iss-2610312044511316-in-facilitator-mode-auto-the-landing-s.md index 46d2f35c5..5423a3ae1 100644 --- a/.abcd/work/issues/open/iss-2610312044511316-in-facilitator-mode-auto-the-landing-s.md +++ b/.abcd/work/issues/open/iss-2610312044511316-in-facilitator-mode-auto-the-landing-s.md @@ -17,3 +17,5 @@ In facilitator.mode auto the landing's merge gate waits for a review receipt nam Seen again on 2026-11-01: three build lanes under facilitator.mode auto (PRs #1313, #1314 and #1315) each stopped at their land stage with the records commit as head and no review receipt naming it, and each armed only after a second review pair over that one-line delta was recorded by hand with land --record-review; an unattended run stalls at every such lane. The closing lane, whose records commit also closes the spec, ingests the audit and adds Delivers:, and any lane that resolves a capture, carry model-composed text no reviewer read, so they stay on the hand path. Bounds a security review on 2026-11-01 set for a self-minted receipt, which covers only a mark-only lane: the commit's own diff against its parent is exactly one modified path, the open spec, with exactly one added '- landed:' line on the lane's step and nothing else added, removed, renamed or re-moded (decided from that diff, never from the lane's state flags, and catching anything swept in by git add -A or a hook); require exactly one parent, equal to the full validated sha in the lane's state, with the landed line's value a prefix of it; apply the same check to a records commit found after a killed call; and have the receipt cite the validated head's passing review pair, written only when that evidence exists. + +2026-11-07: a related case at 19:33 in the autonomous run of 7 Nov: a lane passed four reviewers, then the land stage made its own one-line commit marking the spec step landed and sent the lane back to validate for a second round of up to four reviewers on that line. A records commit the landing composes from its own facts could ride on the review that already passed. diff --git a/.abcd/work/issues/open/iss-2611011155419019-abcd-land-announces-merging-id-for-every.md b/.abcd/work/issues/open/iss-2611011155419019-abcd-land-announces-merging-id-for-every.md index 9abf13502..9e402ecbe 100644 --- a/.abcd/work/issues/open/iss-2611011155419019-abcd-land-announces-merging-id-for-every.md +++ b/.abcd/work/issues/open/iss-2611011155419019-abcd-land-announces-merging-id-for-every.md @@ -13,3 +13,5 @@ remedy: "Announce merging only for items named in Resolves: or Delivers: trailer --- abcd land announces 'merging ' for every issue or intent a branch's commits name in a Refs: trailer, as well as Resolves: and Delivers: (internal/core/landing/announce.go, per dcn-2610170704191129). Refs: means the change touches a record without fixing it, but the announcement reads as that record's work merging. On 2026-10-31 a peer session read a build session's records-PR announcements for Refs-only issues as competing work on those issues, and the two sessions spent a round of messages confirming nobody else was on them. A colleague reading abcd status cannot tell a fix that is merging from a record that is merely cited. + +2026-11-07: seen again at 21:35 in the autonomous run of 7 Nov: land announced merging for two issues that the lane's commit named only under Refs and left unbuilt, and peers read it as those issues merging. diff --git a/.abcd/work/issues/open/iss-2611011943357182-the-implement-loop-s-land-stage-refuses.md b/.abcd/work/issues/open/iss-2611011943357182-the-implement-loop-s-land-stage-refuses.md index 909d3e380..4dcc42d27 100644 --- a/.abcd/work/issues/open/iss-2611011943357182-the-implement-loop-s-land-stage-refuses.md +++ b/.abcd/work/issues/open/iss-2611011943357182-the-implement-loop-s-land-stage-refuses.md @@ -15,3 +15,5 @@ remedy: "Have the land stage first check whether its landing head, or a descenda The implement loop's land stage refuses a lane whose branch has moved past the loop's own records commit, and offers no path for a reviewed follow-up. On 2026-11-01, lane 2 of run-2610312053537139 passed validation round 2. The land stage then wrote its records commit (0030dea82), and a reviewer's note then had to be fixed before the change merged. That fix went on top as two commits, with its own preflight and a delta review pair (SHIP and APPROVE). implement step then refused: the branch is at 764bc6a8dcc3, not at the head 0030dea82032 the landing lands, so restore the branch to that head. Following that remedy would have thrown the reviewed fix away. The lane was pushed and its pull request (#1333) opened by hand with abcd land and gh pr create, outside the run's record. The run's landing state (body_checked, armed) no longer describes the pull request. The refusal outlives the merge. #1333 merged at 21:28 with both 0030dea82 and 764bc6a8d on origin/main. implement step still refused at land, saying the branch is at 764bc6a8dcc3, not at the head 0030dea82032 the landing lands. Moving the local branch back to 0030dea82, as that remedy asks, produced a second refusal: waiting for its full check, because no preflight receipt names the lane's head 0030dea82032. So recognising an already-merged lane would have cost a full preflight of a records commit, one to two hours on the loaded machine. The preflight was not run, and run-2610312053537139's record stays at land while its work is on main. + +2026-11-08: seen again several times in the autonomous run of 7 Nov. At 00:23 and 00:31 a lane 39 commits behind main could not have main merged in by hand before precheck, because the push step refuses a branch moved off its reviewed head (internal/core/implement/loop/land.go). At 00:45 and 11:54 precheck at land failed an audit after every review round had passed, and with no move from land back to a fix round each fix went outside the loop, through a hand review pair, a preflight and a plain abcd land. At 13:55 three faults found after validation left a lane at land off its judged head. A correction logged at 06:13: the land stage does merge main into the lane itself and send the merged head back to validate, so the gap stands for a branch moved by hand after validation. diff --git a/.abcd/work/issues/open/iss-2611022247147314-a-merge-queue-drop-is-silent-in-abcd.md b/.abcd/work/issues/open/iss-2611022247147314-a-merge-queue-drop-is-silent-in-abcd.md index de574ff40..ee4ceb902 100644 --- a/.abcd/work/issues/open/iss-2611022247147314-a-merge-queue-drop-is-silent-in-abcd.md +++ b/.abcd/work/issues/open/iss-2611022247147314-a-merge-queue-drop-is-silent-in-abcd.md @@ -13,3 +13,5 @@ remedy: "Have land (bare, on the branch) and peers name a pull request that left --- A merge-queue drop is silent in abcd: #1347 left the queue twice on 2026-11-02, once when its merge-group macOS job was cancelled and once on a flaky test, and neither land, peers nor status said the entry had left or why; the coordinator learned it only by polling the forge and reading the run's jobs. + +2026-11-08: seen again at 09:56 in the autonomous run of 7 Nov: when #1465 merged ahead of it, the merge queue dropped #1466 once as unmergeable, though the two share no file, and nothing in abcd said so; it was re-armed by hand. diff --git a/.abcd/work/issues/open/iss-2611030744325032-a-loop-run-whose-lane-was-landed-outside.md b/.abcd/work/issues/open/iss-2611030744325032-a-loop-run-whose-lane-was-landed-outside.md index 2555b7e35..91343a7af 100644 --- a/.abcd/work/issues/open/iss-2611030744325032-a-loop-run-whose-lane-was-landed-outside.md +++ b/.abcd/work/issues/open/iss-2611030744325032-a-loop-run-whose-lane-was-landed-outside.md @@ -15,3 +15,5 @@ remedy: "Have the land stage accept a lane whose pull request merged with a head A loop run whose lane was landed outside the loop can never be finished: run-2611030127507347's lane merged as #1367 at 85ed321d2 after a hand landing, and implement step now refuses on every call because the branch is not at the records commit 0c466ccb1 the landing pinned, with a remedy to restore the branch, which would rewind a merged branch. Nothing else ends the run, so it keeps its lane worktree (prune keeps it as held by the run) and held its reservation until it was released by hand. iss-2610142233473049 covers the unmerged case. 2026-11-04: the same hold from a run left at its land stage. run-2611031131030791 kept its reservation on whole directories (internal/surface/cli and internal/core/implement/loop) until 15:08 on 2026-11-04, about fourteen hours after its pull request merged, with nothing running, and two cloud sessions worked around it. + +2026-11-09: seen again three times in the autonomous run of 7 Nov. At 07:20 and 11:15 build opened a run for an issue that the lane then worked by hand, leaving the run unstepped; at 09:50 run-2611090624263180 still read as in progress, driven by the host, after its issue's fix had merged. No verb closes or abandons a run whose record is already resolved. diff --git a/.abcd/work/issues/open/iss-2611031146244351-abcd-land-opens-no-pull-request-for-a.md b/.abcd/work/issues/open/iss-2611031146244351-abcd-land-opens-no-pull-request-for-a.md index 3c29b8d3f..4cc43987c 100644 --- a/.abcd/work/issues/open/iss-2611031146244351-abcd-land-opens-no-pull-request-for-a.md +++ b/.abcd/work/issues/open/iss-2611031146244351-abcd-land-opens-no-pull-request-for-a.md @@ -13,3 +13,5 @@ remedy: "Have land open the pull request from the body it composed when none is --- abcd land opens no pull request for a branch made outside the build loop: it composes the body, pushes, and stops with 'no open pull request ... open it with the command, then run abcd land again'. On 2026-11-03 the coordinator opened eight pull requests that way by hand (gh pr create from the composed body, a re-read for footers, then land --record-review twice and land again to arm), in a helper script, so a CLI-only run cannot land a hand fix without a forge command of its own. + +2026-11-09: seen again in the autonomous run of 7 Nov: land --record-review recorded the receipt and exited, a second land pushed, and a third armed only after the pull request had been opened by hand, so one landing took three land calls and a hand-opened pull request. diff --git a/.abcd/work/issues/open/iss-2611031146255825-no-abcd-verb-drives-an-intent-build-to.md b/.abcd/work/issues/open/iss-2611031146255825-no-abcd-verb-drives-an-intent-build-to.md index 967611a91..656075bf5 100644 --- a/.abcd/work/issues/open/iss-2611031146255825-no-abcd-verb-drives-an-intent-build-to.md +++ b/.abcd/work/issues/open/iss-2611031146255825-no-abcd-verb-drives-an-intent-build-to.md @@ -14,3 +14,5 @@ related_intents: [itd-2611031342011261] --- No abcd verb drives an intent build to done unattended: implement step takes one stage and exits, so a build of several steps needs something outside abcd to re-run it after each stage, wait out the merge queue, step again once the lane's pull request merges, and open the next lane. On 2026-11-03 the coordinator did this with a polling helper script (drive-run.sh) and timed wake-ups; drain --drive (itd-2610222215485265) covers drain lanes only, and itd-2610240933025076 starts a build but does not carry it through. + +2026-11-06: met again before the autonomous run of 7 Nov: with no route that drives a build walled (drain --drive covers drain lanes only), the run's coordinating session ran under a recorded exception. diff --git a/.abcd/work/issues/open/iss-2611032348360959-a-spec-footprint-naming-a-whole.md b/.abcd/work/issues/open/iss-2611032348360959-a-spec-footprint-naming-a-whole.md index e3117cf9b..c201ee564 100644 --- a/.abcd/work/issues/open/iss-2611032348360959-a-spec-footprint-naming-a-whole.md +++ b/.abcd/work/issues/open/iss-2611032348360959-a-spec-footprint-naming-a-whole.md @@ -13,3 +13,5 @@ remedy: "Reserve each lane by its own step's paths rather than the whole spec's --- A spec footprint naming a whole directory collides with a peer holding one file in it: run-2611031640393520's footprint has internal/core/lint, a cloud session holds internal/core/lint/prosecitations.go, and the run's renewal is refused although the lane changes none of that session's files. + +2026-11-09: seen again on 9 Nov at 08:27 and 12:27 in the autonomous run of 7 Nov: a spec footprint naming the whole internal/core/implement/loop package was refused because another holder had reserved one test file in it, and the step's own files were reserved by hand instead; on 10 Nov at 12:23 the same collision stopped a one-package step. iss-2610230839002949 lists the other sightings. diff --git a/.abcd/work/issues/open/iss-2611051719381143-an-armed-pull-request-blocked-or-dropped.md b/.abcd/work/issues/open/iss-2611051719381143-an-armed-pull-request-blocked-or-dropped.md index 1aed65968..f338ce358 100644 --- a/.abcd/work/issues/open/iss-2611051719381143-an-armed-pull-request-blocked-or-dropped.md +++ b/.abcd/work/issues/open/iss-2611051719381143-an-armed-pull-request-blocked-or-dropped.md @@ -13,3 +13,5 @@ remedy: "The status board names an armed pull request whose required check faile --- An armed pull request whose required check failed before it reached the queue stays armed and blocked. `abcd land` names the failed check only when it is run again, and the status board never does, so nothing says so between land runs and a queue watch sees an empty queue either way. This is the part before the queue. A drop from the queue is iss-2611022247147314, and retrying a drop that is not the pull request's own fault is iss-2610110401224302. + +2026-11-09: seen again at 18:53 in the autonomous run of 7 Nov: the required external-review check failed to start on #1473 and on #1474 (startup_failure, no jobs, no change to main's workflows), and both sat armed and not queued while land reported them armed; it was noticed an hour later, only by comparing main's required checks with those the pull requests reported. #1474's run re-ran clean; a startup failure cannot be re-run, so #1473 was closed and reopened and land re-armed it, restarting every check, about 45 minutes lost. diff --git a/.abcd/work/issues/open/iss-2611061656052853-the-implement-loop-package-takes-2189-s.md b/.abcd/work/issues/open/iss-2611061656052853-the-implement-loop-package-takes-2189-s.md index f6c8f38ae..c9a9591b5 100644 --- a/.abcd/work/issues/open/iss-2611061656052853-the-implement-loop-package-takes-2189-s.md +++ b/.abcd/work/issues/open/iss-2611061656052853-the-implement-loop-package-takes-2189-s.md @@ -14,3 +14,5 @@ remedy: "Read more runs to find why the package ran slower on its own leg, cut t --- The implement loop package takes 2189 s and then 2137 s on its own macOS leg against a 2400 s limit, slower than the 1173 s and 1504 s it took on a shared leg. The cause is not yet found, and runners vary about twofold, so the own leg itself is not shown to be the reason. Its ten slowest tests spend about 600 s in real-time waits. Every drive test added to the package eats the same margin, and a slow runner fails the release gate with no failing test. + +2026-11-09: seen again at 04:25 on the narrow gate, in the autonomous run of 7 Nov: the implement loop package's test took 2001 s against a 40-minute timeout at a load of about 7, one more loaded machine away from a timeout failure that says nothing about the code. diff --git a/.abcd/work/issues/open/iss-2611070736543143-a-routine-update-of-git-make-or-gh-on.md b/.abcd/work/issues/open/iss-2611070736543143-a-routine-update-of-git-make-or-gh-on.md index 44fcbebb3..5d1cde382 100644 --- a/.abcd/work/issues/open/iss-2611070736543143-a-routine-update-of-git-make-or-gh-on.md +++ b/.abcd/work/issues/open/iss-2611070736543143-a-routine-update-of-git-make-or-gh-on.md @@ -13,3 +13,5 @@ remedy: "Treat a change to those tools' binaries the way a harness update is tre --- A routine update of git, make or gh on the machine ends a running drive with 'binary changed while the drive ran'. The behaviour is documented and sits outside the re-prove, but a drive meant to run for weeks with no stops cannot survive an ordinary package update of a tool it merely calls. + +2026-11-07: met at 14:25 in the autonomous run of 7 Nov: a lane working this issue stopped at the check, as it should, and the fix is queued for a ruling. diff --git a/.abcd/work/issues/open/iss-2611070737217776-the-verdict-rule-reads-a-hex-run.md b/.abcd/work/issues/open/iss-2611070737217776-the-verdict-rule-reads-a-hex-run.md index 2cfe72149..edc7cbb78 100644 --- a/.abcd/work/issues/open/iss-2611070737217776-the-verdict-rule-reads-a-hex-run.md +++ b/.abcd/work/issues/open/iss-2611070737217776-the-verdict-rule-reads-a-hex-run.md @@ -13,3 +13,5 @@ remedy: "Say in the brief and the request that such naming goes on a line of its --- The verdict rule reads a hex run containing a digit on the result line as another head, so a reviewer who names a file's blob id or a similar path on that line is refused and asked again. + +2026-11-07 and 2026-11-08: seen again in the autonomous run of 7 Nov with a bare short sha of another commit on the verdict line, each time costing a fresh reviewer or a rewritten verdict line. At 19:41 on 7 Nov a return was refused, twice that day, for quoting another commit on its verdict line inside prose; at 00:21 on 8 Nov a verdict line named the head and then the spec's landed short sha, and the reader took the second as the head. The sightings in the same run where a record id's digits were read as a commit are fixed under iss-2611101222229613. diff --git a/.abcd/work/issues/open/iss-2611080546086771-with-the-person-away-a-session-the.md b/.abcd/work/issues/open/iss-2611080546086771-with-the-person-away-a-session-the.md index 1eac2b0fb..06fa06ad7 100644 --- a/.abcd/work/issues/open/iss-2611080546086771-with-the-person-away-a-session-the.md +++ b/.abcd/work/issues/open/iss-2611080546086771-with-the-person-away-a-session-the.md @@ -13,3 +13,5 @@ remedy: "Give a session a way to mark an owed item as handed to a live peer sess --- With the person away, a session the coordinator tells to leave an owed item to a peer has no way to record that it handed the item over, so the stop check keeps naming the item to it. The worktree case is already covered: a branch checked out in a worktree a live peer started in reads as that peer's. Uncovered is a peer that works from the shared copy, or holds no worktree, record or lane for the item: nothing the session can write marks the item as handed over, so it is named on every stop until the wake cap no longer releases the stop. This is the half of iss-2611070830056851 that run-2611080159059570 did not build. + +2026-11-09: seen again in the autonomous run of 7 Nov. At 22:22 one session's stop check listed another session's lane branch as owed to it, and the lane's session had to send a message to keep it off the branch; at 22:40 the stop check pinned a stopped session on a peer's unpushed lane branch while that lane's preflight and review ran, and after two wakes no wake released the stop, the only move it offered being an act on the peer's branch. The hooks ran the installed release, which carries neither 2fe25c2e3 nor 05dfe5816, so part of this may be the half of iss-2611070830056851 already fixed; recheck once a release carries both. diff --git a/.abcd/work/issues/open/iss-2611101258315374-the-command-line-updater-asks-the-person.md b/.abcd/work/issues/open/iss-2611101258315374-the-command-line-updater-asks-the-person.md new file mode 100644 index 000000000..0273ec295 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101258315374-the-command-line-updater-asks-the-person.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101258315374" +slug: "the-command-line-updater-asks-the-person" +severity: "minor" +category: "ux" +source: "user-observation" +found_during: "person's own terminal, 10 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/update/update.go" +remedy: "Compare the installed binary with the resolved release before asking; when it is already current and verified, say so and exit 0 without a question. Ask only when a swap would happen." +--- + +The command-line updater asks the person to confirm before it has checked whether there is anything to do. Run with the installed binary already at the latest release, it resolves the latest release, asks whether to proceed, and only after a yes reports that the binary is already current. The question is wasted: nothing would have changed either way. diff --git a/.abcd/work/issues/open/iss-2611101302324425-the-prompt-hook-redacts-and-stores.md b/.abcd/work/issues/open/iss-2611101302324425-the-prompt-hook-redacts-and-stores.md new file mode 100644 index 000000000..d5f12172f --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101302324425-the-prompt-hook-redacts-and-stores.md @@ -0,0 +1,17 @@ +--- +schema_version: 1 +id: "iss-2611101302324425" +slug: "the-prompt-hook-redacts-and-stores" +severity: "major" +category: "bug" +source: "user-observation" +found_during: "coordinating session, 10 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "hooks/user-prompt-submit.sh" +remedy: "Give the transcript step its own small time budget inside the hook and stop at it, keeping what was done so the next prompt continues instead of restarting; or move redaction of a large staged transcript out of the prompt hook to session end or a detached worker. The rules and notices are written first, so a slow transcript can never discard them." +--- + +The prompt hook redacts and stores staged session transcripts on every prompt, inside the hook's 120-second limit. On 10 Nov 2026 one large staged transcript needed about three minutes of processor time, so the host ended the hook at 120 seconds on every prompt, discarded its output (the rules and the away notice with it), and the next prompt started the same work from the beginning. The person saw a timed-out line under every message until one run was let finish outside the host (187 seconds; the run after it took 13). Work that cannot finish inside the limit is never finished and is paid for again at each prompt. + +This refines iss-2610161555125041, where the same hook overran the same limit under machine load: the cause here is the transcript step, which starts again at each prompt, and that record's remedy (one deadline for the whole hook, a slow stage skipped and named) would cover it too. diff --git a/.abcd/work/issues/open/iss-2611101316053555-with-the-person-away-the-stop-check.md b/.abcd/work/issues/open/iss-2611101316053555-with-the-person-away-the-stop-check.md new file mode 100644 index 000000000..baa557ea0 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316053555-with-the-person-away-the-stop-check.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316053555" +slug: "with-the-person-away-the-stop-check" +severity: "major" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/autonomy/judge.go" +remedy: "Count an owed item as waiting, not stuck, while a live load-gate waiter, preflight, race run or lane agent of this session works on its head, and let a scheduled wake release the stop for it however many wakes have passed; a test holds a preflight running for the head over three wakes and finds the stop released each time." +--- + +With the person away, the stop check treats an owed item as stuck when its next step is a test or an agent that is still running. After two wakes with the owed set unchanged it stops letting a scheduled wake release the stop (row 4 of the plan in internal/core/autonomy/judge.go), although the item can only move once a preflight, a load-gate wait or a lane agent finishes. On 7 Nov at 08:05 six paid turns in a row each said only that the session was still waiting while a 45-minute preflight ran for the item named; the same was seen on 7 Nov at 20:05 and 21:35 with a branch waiting at the load gate for its receipt, on 9 Nov at 22:44 with a push waiting on its preflight, and on 10 Nov at 04:58 with a background lane agent working the branch's fix round. Sessions held turns open with foreground waits to get past it. diff --git a/.abcd/work/issues/open/iss-2611101316145184-with-the-person-away-the-stop-check-does.md b/.abcd/work/issues/open/iss-2611101316145184-with-the-person-away-the-stop-check-does.md new file mode 100644 index 000000000..05c3f1714 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316145184-with-the-person-away-the-stop-check-does.md @@ -0,0 +1,17 @@ +--- +schema_version: 1 +id: "iss-2611101316145184" +slug: "with-the-person-away-the-stop-check-does" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/autonomy/wake.go" +remedy: "Accept a recurring timer whose next run falls before the deadline as the look without adding the lateness allowance past it, count a one-shot wake that fired after its deadline as the look it was set for, and say when a one-shot wake has been overtaken by a later one; a test holds an hourly recurring timer due in ten minutes against a twenty-minute deadline and finds the stop released." +--- + +With the person away, the stop check does not take a recurring session timer as the scheduled look it asks for, and does not count a one-shot wake that fired late. qualifyingWake (internal/core/autonomy/wake.go) adds up to 30 minutes of assumed host lateness to a recurring task's next run, so a recurring timer whose next run falls before the deadline is refused once that allowance passes it. On 10 Nov at 12:23 a recurring timer with its next run inside the limit was not accepted and a one-off had to be set; the recurring timer had also survived a session resume, so re-arming it made two. On 7 Nov the one-shot wakes set between 20:04 and 21:35 to meet the check's deadlines did not fire while the session was mid-turn, and by 23:32 seven were queued to fire together at the next idle moment and were deleted by hand. Holding wakes queued while a turn runs appears to be the host's behaviour and outside this record's remedy. + +Already fixed, and not part of this record: the past deadlines named on 7 Nov at 20:10 and on 8 Nov at 05:27. The clamp in 2fe25c2e3 fixed them under iss-2611011332417169, landed with 05dfe5816; no release tag yet carries it, so those deadlines came from an installed release without the fix. diff --git a/.abcd/work/issues/open/iss-2611101316214880-nothing-lets-a-person-or-a-session-mark.md b/.abcd/work/issues/open/iss-2611101316214880-nothing-lets-a-person-or-a-session-mark.md new file mode 100644 index 000000000..1c021ef77 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316214880-nothing-lets-a-person-or-a-session-mark.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316214880" +slug: "nothing-lets-a-person-or-a-session-mark" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/autonomy/owedread.go" +remedy: "Waits on a ruling first: then add one hold state, land after a named tag, that the build loop and land honour by not arming, that the stop check reads as waiting rather than owed, that keeps its reservation renewed, and that the queue and the board report." +--- + +Nothing lets a person or a session mark a run, lane or pull request as held until a release tag, so a change held back on purpose is treated as live work everywhere. Under auto the build loop arms its own landing, so keeping a schema change out of v0.17.0 on 7 Nov at 20:30 meant stepping the land stage one move at a time and stopping before the arm. The stop check then named the held lane and the held draft pull request #1459 as owed work in every session for days (7 Nov at 22:57, 8 Nov at 03:30 and 15:10); the reservation kept for the waiting draft had nothing to renew it (8 Nov at 06:50); and closing #1459 on 8 Nov at 15:15 moved the owed item instead of clearing it, so its holder released the reservation and relied on a plan note to keep peers off the intent. A person must choose where the hold lives (on the run, the pull request or the record) and which verb sets and lifts it. diff --git a/.abcd/work/issues/open/iss-2611101316306145-the-stop-check-reads-a-branch-as-holding.md b/.abcd/work/issues/open/iss-2611101316306145-the-stop-check-reads-a-branch-as-holding.md new file mode 100644 index 000000000..6625b5053 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316306145-the-stop-check-reads-a-branch-as-holding.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316306145" +slug: "the-stop-check-reads-a-branch-as-holding" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/autonomy/owedread.go" +remedy: "Have land set the branch's upstream to the remote branch it pushed, and have the owed read (unpushed in internal/core/autonomy/owedread.go) count a branch as pushed when the same-named remote branch holds its head, whatever its upstream says; a test cuts a branch tracking the default branch, pushes it by name and finds it not owed." +--- + +The stop check reads a branch as holding unpushed commits by comparing it with its configured upstream, so a branch cut tracking origin/main stays owed after land has pushed it under its own name, and land pushes without setting the upstream. On 10 Nov at 07:09 the check still named lane-p-checklist as having commits not pushed after land had pushed it, until the upstream was set to origin/lane-p-checklist by hand. diff --git a/.abcd/work/issues/open/iss-2611101316317556-abcd-build-of-an-issue-judges-it-from.md b/.abcd/work/issues/open/iss-2611101316317556-abcd-build-of-an-issue-judges-it-from.md new file mode 100644 index 000000000..8adbd3c9a --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316317556-abcd-build-of-an-issue-judges-it-from.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316317556" +slug: "abcd-build-of-an-issue-judges-it-from" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/check.go" +remedy: "Have build judge an issue from origin's default branch after a fetch, as the drain's own move does, and when the local ledger disagrees say that the checkout is behind and by how many commits; a test builds an issue present only on origin and is not refused." +--- + +abcd build of an issue judges it from the ledger of the checkout it runs in, without fetching and without saying that the checkout is behind origin, so it refuses an issue that origin's default branch holds. issueCheck (internal/core/implement/loop/check.go) plans the drain from the working tree unless a drain handed it origin's snapshot. On 10 Nov at 08:54 build from the main checkout refused iss-2611100548341325 as not an open issue, because that checkout's ledger was behind origin/main and the record had arrived in #1478. The same happened on 7 Nov at 14:25 and on 8 Nov at 04:35, when the main checkout was 104 commits behind and could not be fast-forwarded while drives might run from it. Each time the issue was reserved by hand. iss-2611010953085251 covers the same stale read at the land stage only. diff --git a/.abcd/work/issues/open/iss-2611101316403474-abcd-build-of-a-named-issue-applies-the.md b/.abcd/work/issues/open/iss-2611101316403474-abcd-build-of-a-named-issue-applies-the.md new file mode 100644 index 000000000..3ace2b6a5 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316403474-abcd-build-of-a-named-issue-applies-the.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316403474" +slug: "abcd-build-of-a-named-issue-applies-the" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/capture/eligible.go" +remedy: "Waits on a ruling first: then give build an explicit opt-past for a named issue that sets aside the category and severity rules only, keeping the security, waits-on, decision-needed and deferral rules, and record in the run that it was used." +--- + +abcd build of a named issue applies the drain's eligibility rule in full, so a coordinator who names one issue to build is refused for its category or its severity. eligibility (internal/core/capture/eligible.go) hands back a category outside the fixable set and a severity above the drain's, and build's issue check uses that verdict unchanged. On 7 Nov at 14:25 build refused a major issue, at 14:40 a process-category issue whose remedy was a code change, on 8 Nov at 04:35 a major issue again, and on 9 Nov at 06:45 another process-category issue; each lane was reserved by hand outside the build. A person must choose whether a named build may pass the drain's category and severity bars, and whether that takes an explicit flag. diff --git a/.abcd/work/issues/open/iss-2611101316419989-abcd-build-of-an-issue-cannot-reserve-a.md b/.abcd/work/issues/open/iss-2611101316419989-abcd-build-of-an-issue-cannot-reserve-a.md new file mode 100644 index 000000000..dd9eef2a0 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316419989-abcd-build-of-an-issue-cannot-reserve-a.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316419989" +slug: "abcd-build-of-an-issue-cannot-reserve-a" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/capture/foundat.go" +remedy: "Take a single token with no slash and no extension as a path when that file exists at the root of the checkout (Makefile, LICENSE, Dockerfile), at capture and at build; a test builds an issue whose found_at is Makefile and finds it reserved." +--- + +abcd build of an issue cannot reserve a found_at that names a file at the repository root with no extension. foundAtPath (internal/core/capture/foundat.go) takes a value as a path only when it holds a slash or ends in a file extension, so Makefile reads as a conceptual location and build refuses the issue as having no found_at path. Seen on 7 Nov for an issue whose found_at was Makefile; the rule is unchanged at this branch's head. diff --git a/.abcd/work/issues/open/iss-2611101316537446-a-lane-s-reservation-does-not-follow-the.md b/.abcd/work/issues/open/iss-2611101316537446-a-lane-s-reservation-does-not-follow-the.md new file mode 100644 index 000000000..ca12373ff --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316537446-a-lane-s-reservation-does-not-follow-the.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316537446" +slug: "a-lane-s-reservation-does-not-follow-the" +severity: "major" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/widen.go" +remedy: "Grow the reservation with the lane: at each step and before the push, reserve the paths the lane's commits change beyond the held footprint, cover the run's own record paths (decision records, the spec's landed line, the issue record) by default, and let an intent lane widen the same way with its spec's footprint updated for it; a test commits a file outside the found_at and finds it reserved before the push." +--- + +A lane's reservation does not follow the files the lane changes. An issue's build reserves only its found_at path; implement widen works only at the implement or validate stage and refuses an intent's run, whose footprint grows only by editing its spec; and the decision records and the spec's landed line that every lane writes are not covered. So lanes change files they never reserved, and a coordinator widens the hold by hand. On 9 Nov at 07:20 and 11:15 build reserved one file of five and one file of eight, and each hold was widened with a hand reserve naming every path; on 8 Nov at 10:40 a lane had changed four loop files its reservation never covered, and widening that intent lane meant a spec edit inside the lane; on 9 Nov at 13:50 a lane could not record its judgement calls with abcd decide because the new decision file sat outside its reservation; on 10 Nov at 08:54 build reserved internal/core/claim/view.go alone though the remedy named five packages. diff --git a/.abcd/work/issues/open/iss-2611101316548201-a-reservation-that-names-a-shared-index.md b/.abcd/work/issues/open/iss-2611101316548201-a-reservation-that-names-a-shared-index.md new file mode 100644 index 000000000..54b4ae2d5 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316548201-a-reservation-that-names-a-shared-index.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316548201" +slug: "a-reservation-that-names-a-shared-index" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/claim/crowd.go" +remedy: "Waits on a ruling first: then let a repository declare shareable files whose overlap does not refuse a reservation, and have the overlap check in internal/core/claim/crowd.go warn for them instead of refusing." +--- + +A reservation that names a shared index file holds off every other change to that file, so builds that only add a line to it are refused. On 8 Nov at 06:15 build refused an intent because a live reservation named internal/README.md, the package map that most changes touching a new package edit. A person must choose whether some files may be shared between footprints, and how such a file is declared (a list in the repository's configuration, or a mark in the footprint). diff --git a/.abcd/work/issues/open/iss-2611101316559868-abcd-build-has-no-mode-that-runs-its.md b/.abcd/work/issues/open/iss-2611101316559868-abcd-build-has-no-mode-that-runs-its.md new file mode 100644 index 000000000..b516fc8b3 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101316559868-abcd-build-has-no-mode-that-runs-its.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101316559868" +slug: "abcd-build-has-no-mode-that-runs-its" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/surface/cli/build.go" +remedy: "Add a dry run to build that runs every start check (key, readiness, eligibility, peers, footprint overlap) and prints the rows it would act on, reserving, writing and pushing nothing; a test runs it on a buildable record and finds no reservation and no run made." +--- + +abcd build has no mode that runs its start checks without reserving or starting anything, so finding out what build would decide about a record takes a real build, which reserves it, or a throwaway program. On 9 Nov at 02:50 a lane wrote a throwaway program to prove the peers check against the real checkout, because a real build would have reserved the intent. diff --git a/.abcd/work/issues/open/iss-2611101317242315-renewing-or-widening-a-reservation-by.md b/.abcd/work/issues/open/iss-2611101317242315-renewing-or-widening-a-reservation-by.md new file mode 100644 index 000000000..cfcf55887 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101317242315-renewing-or-widening-a-reservation-by.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101317242315" +slug: "renewing-or-widening-a-reservation-by" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/surface/cli/reserve.go" +remedy: "Waits on a ruling first for the other-copy half; the rest needs none: have a renewal keep the held footprint when none is given, add the paths given rather than replacing the held ones, and take several paths in one flag; a test renews with no footprint and with one new path and finds the held paths kept." +--- + +Renewing or widening a reservation by hand repeats what the hold already knows. abcd reserve takes the footprint again on every renewal and writes the paths given in place of the held ones (since iss-2610290507512835 it warns about the paths it drops), and a renewal from any copy but the one that took the reservation is refused with exit 3, even for the same person on the same machine (since iss-2610250013552001 the refusal names the sibling worktree). On 7 Nov at 10:47 and 12:46 a renewal was refused without its footprint; on 9 Nov at 06:45 six calls with one footprint each left one path reserved; on 9 Nov at 22:22 and 10 Nov at 09:14 a build started in one worktree could be renewed only from there, and a renewal had to name the whole spec footprint again plus two files the lane changed outside it. iss-2610231004012419 declined renewal from another copy under dcn-2610311539024848, which removes hand reservations of issues and intents, but until that removal is built (iss-2610311539091723) lanes still renew by hand. A person must choose whether a renewal from another copy of the same holder is allowed after all. diff --git a/.abcd/work/issues/open/iss-2611101317363963-an-automatic-reservation-renewal-can.md b/.abcd/work/issues/open/iss-2611101317363963-an-automatic-reservation-renewal-can.md new file mode 100644 index 000000000..87bbfcd3c --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101317363963-an-automatic-reservation-renewal-can.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101317363963" +slug: "an-automatic-reservation-renewal-can" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/claim/renewdue.go" +remedy: "Never write a renewal whose end is earlier than the live tip's, and on a refused push refetch and report success when this copy's live reservation already covers the footprint and term asked for; a test races a hand renewal against a waiter's renewal and finds both exit 0, and a test renews with a shorter term and keeps the later end." +--- + +An automatic reservation renewal can move a lease's end earlier, and a renewal that loses a race reads as an error though the hold it wanted stands. On 7 Nov at 20:16 the load gate's automatic renewal set a reservation to end at 21:17:52Z, though a hand renewal at 19:41 had set it to end at 21:41:07Z. On 7 Nov at 11:12 a hand renewal and the run's own renewal from the same copy, 11 seconds apart, raced: the second push was refused as non-fast-forward and exited 2 with a raw git error. iss-2610270659564789 fixed the race between two load-gate waiters in one copy with a per-copy lock; a hand reserve does not take that lock. diff --git a/.abcd/work/issues/open/iss-2611101317370074-a-reservation-made-by-hand-stays-live.md b/.abcd/work/issues/open/iss-2611101317370074-a-reservation-made-by-hand-stays-live.md new file mode 100644 index 000000000..9f046a764 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101317370074-a-reservation-made-by-hand-stays-live.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101317370074" +slug: "a-reservation-made-by-hand-stays-live" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/claim/release.go" +remedy: "Have land, or the next peers scan, release a reservation whose branch's pull request has merged into the default branch, logging the release; a test merges a reserved branch's pull request and finds the reservation released at the next scan." +--- + +A reservation made by hand stays live after the pull request carrying its work merges, until someone releases it or it lapses. On 9 Nov a lane's hand reservation ran until 01:54Z on 10 Nov after its pull request merged at 20:25Z, holding peers off its files for more than five hours; it was noticed at 20:50. diff --git a/.abcd/work/issues/open/iss-2611101317395313-a-build-lane-s-definition-of-done-runs.md b/.abcd/work/issues/open/iss-2611101317395313-a-build-lane-s-definition-of-done-runs.md new file mode 100644 index 000000000..7393ebe28 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101317395313-a-build-lane-s-definition-of-done-runs.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101317395313" +slug: "a-build-lane-s-definition-of-done-runs" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/validate.go" +remedy: "Have the validate stage's definition of done run precheck's audit packages and the secret scan for the packages the lane touches, from the default branch's current recipe, before the reviewers are asked; a test changes an exported function so the reach audit fails and finds validation refusing." +--- + +A build lane's definition of done runs only the tests of the packages it changed, so the repository-wide audits, the secret scan and other packages' tests that exercise the changed rule first run at precheck or preflight after validation, when the loop has no route back to a fix round. On 8 Nov at 00:36 and 00:45 precheck at land failed the export reach audit, because the spec exported a function only tests reached; on 8 Nov at 11:54 it failed a gitutil audit, because a package ran rev-parse --show-toplevel itself; on 8 Nov at 13:55 CI's secret scan failed a token fixture that no review and no lane gate had scanned; on 7 Nov at 14:40 a lane branch cut before #1444 lost a 40-minute preflight to an audit precheck now runs; on 9 Nov at 02:50 a preflight failed a CLI test the lane never ran. Each miss cost a preflight and pushed the fix outside the loop. diff --git a/.abcd/work/issues/open/iss-2611101317500649-implement-step-and-implement-record.md b/.abcd/work/issues/open/iss-2611101317500649-implement-step-and-implement-record.md new file mode 100644 index 000000000..96d52b44b --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101317500649-implement-step-and-implement-record.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101317500649" +slug: "implement-step-and-implement-record" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/loop.go" +remedy: "Read a run with no live driver and no state change for a set number of days as stale, so it no longer counts as in progress, have step pick the run whose lane worktree it is run in, and list stale runs with a way to close them; a test leaves an old run idle and steps a newer one without --run." +--- + +implement step and implement record refuse to pick a run when more than one run in the checkout reads as in progress, and runs abandoned weeks ago still read so, so every step needs --run. On 7 Nov at 09:45 and 10:12, 11 and then 12 runs from October were listed as in progress, and on 9 Nov at 22:22 there were 14; each lane had to name its run. The selection is in internal/core/implement/loop/loop.go. This refines iss-2610101659347329, where implement receipt is refused the same way although its path names the run. diff --git a/.abcd/work/issues/open/iss-2611101317510356-when-a-lane-s-pull-request-has-merged.md b/.abcd/work/issues/open/iss-2611101317510356-when-a-lane-s-pull-request-has-merged.md new file mode 100644 index 000000000..b34f24b36 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101317510356-when-a-lane-s-pull-request-has-merged.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101317510356" +slug: "when-a-lane-s-pull-request-has-merged" +severity: "major" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/resume.go" +remedy: "Close a lane in its run once its pull request has merged, releasing its worktree and branch, and have the next build of the intent start a new lane and branch from origin's default branch; a test merges a lane, builds the intent again and finds a new branch name based at the merged tip." +--- + +When a lane's pull request has merged, abcd build of the same intent resumes the run and reuses the merged lane's worktree, branch name and stale range instead of starting a fresh lane. On 10 Nov at 00:45 build resumed a stopped run and reused the branch of a lane whose pull request (#1475) had merged, and the stop check then named that branch as owed; by 01:25 the reused branch held four new unpushed commits; at 04:05 build resumed the same run a third time, planned a step already landed, and reported the lane's range as f3d98814de19..f3d98814de19 while the worktree sat at a4ffe1dc7. iss-2610150827113191 covers the loop's merged check after a squash or rebase merge. diff --git a/.abcd/work/issues/open/iss-2611101318039706-abcd-build-plans-an-intent-s-next-step.md b/.abcd/work/issues/open/iss-2611101318039706-abcd-build-plans-an-intent-s-next-step.md new file mode 100644 index 000000000..43f09fda7 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318039706-abcd-build-plans-an-intent-s-next-step.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318039706" +slug: "abcd-build-plans-an-intent-s-next-step" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/spec/steps.go" +remedy: "Have build read a step as landed when the default branch's history holds a merged pull request or commit the loop composed for it, and offer to write the missing mark; a test lands a step with no mark and finds build plans the next one." +--- + +abcd build plans an intent's next step from the spec's landed marks alone, so a step that landed without a mark is planned again. On 9 Nov at 22:22 build planned step 1 of the checklist spec, which had already landed, and the lane agent stopped the run and wrote the mark by hand; on 10 Nov at 00:56 steps 1, 2, 3 and 5 carried no mark and build planned step 1 for the second time. The marks were backfilled by hand in 1f06043c5, but nothing keeps it from happening again. diff --git a/.abcd/work/issues/open/iss-2611101318042398-abcd-build-reads-a-spec-as-ready-from.md b/.abcd/work/issues/open/iss-2611101318042398-abcd-build-reads-a-spec-as-ready-from.md new file mode 100644 index 000000000..5469c3bcd --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318042398-abcd-build-reads-a-spec-as-ready-from.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318042398" +slug: "abcd-build-reads-a-spec-as-ready-from" +severity: "major" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/check.go" +remedy: "Have record-lint refuse a spec that states it is not ready or asks an open question outside its Open Questions section, and have build refuse a step whose spec names a prerequisite intent that has not shipped, naming it; a test builds a spec with a not-READY sentence in its summary and finds it refused." +--- + +abcd build reads a spec as READY from its Open Questions section only, so a spec that says in its own prose that it is not READY passes, and a step whose named prerequisite has not shipped is not checked. On 7 Nov at 15:41 and 15:50 build reported itd-2611031342011261 READY, reserved it and made a lane, though spc-2611050023402644's summary says it is not READY until one question is ruled; a session found it before any code was written and released it. On 7 Nov at 16:00 another lane turned out to wait on itd-2610222215485265 shipping, found only by reading. iss-2610312234315875 covers a related gap in intent ready. diff --git a/.abcd/work/issues/open/iss-2611101318042677-nothing-checks-that-the-commit-a-spec-s.md b/.abcd/work/issues/open/iss-2611101318042677-nothing-checks-that-the-commit-a-spec-s.md new file mode 100644 index 000000000..db71bc0cb --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318042677-nothing-checks-that-the-commit-a-spec-s.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318042677" +slug: "nothing-checks-that-the-commit-a-spec-s" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/lint/specstepsserial.go" +remedy: "Have record-lint refuse a landed value naming a commit the checked range cannot reach, as RS003 does for resolutions, accepting a pull request number as it stands; a test rewrites a landed commit away and finds record-lint refusing." +--- + +Nothing checks that the commit a spec's landed line names is reachable from the branch. On 9 Nov two commit subjects on a lane were reworded with filter-branch, and the spec's step-4 landed line still named the commit from before the rewrite, 0c9d9721a, which the branch no longer reached; a reviewer caught it and the fix round repointed it to 904e2a8f5. RS003 makes the same check for an issue's resolved_by.commit. diff --git a/.abcd/work/issues/open/iss-2611101318271021-a-record-that-waits-on-a-person-s-ruling.md b/.abcd/work/issues/open/iss-2611101318271021-a-record-that-waits-on-a-person-s-ruling.md new file mode 100644 index 000000000..920714cae --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318271021-a-record-that-waits-on-a-person-s-ruling.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318271021" +slug: "a-record-that-waits-on-a-person-s-ruling" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/capture/eligible.go" +remedy: "Waits on a ruling first: then carry one hold on a record that build and reserve refuse with its reason, and that the status board and abcd show." +--- + +A record that waits on a person's ruling carries no mark that build, reserve and the status board all show, so a coordinator or a lane can start it by mistake. The drain hands back an issue whose remedy opens with Waits on, but reserve takes such an issue by hand, the board does not show it, and a record whose ruling is noted only in its prose carries nothing at all. On 8 Nov at 06:05 a coordinator sent a lane to iss-2611051719381143, which waits on a ruling about what the board may read, and the lane reserved it by hand and started an implementer before the mistake was caught. A person must choose where the hold lives: the existing remedy prefix, a field of its own, or both. diff --git a/.abcd/work/issues/open/iss-2611101318284897-the-hand-back-line-implement-step-and.md b/.abcd/work/issues/open/iss-2611101318284897-the-hand-back-line-implement-step-and.md new file mode 100644 index 000000000..e90384dc9 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318284897-the-hand-back-line-implement-step-and.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318284897" +slug: "the-hand-back-line-implement-step-and" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/surface/cli/build.go" +remedy: "Name what stopped the lane (stuck, design finding, closed) whenever the verdict is empty, and never print an empty field; a test renders a hand-back with no verdict and finds a kind named." +--- + +The hand-back line implement step and implement receipt print leaves the hand-back's kind blank when the hand-back carries no verdict. renderStepResult (internal/surface/cli/build.go) prints the verdict field where the kind belongs, so on 7 Nov a lane's hand-back read stopped as, then two spaces, then after 0 fix round(s). diff --git a/.abcd/work/issues/open/iss-2611101318290371-an-intent-lane-that-is-waiting-on-its.md b/.abcd/work/issues/open/iss-2611101318290371-an-intent-lane-that-is-waiting-on-its.md new file mode 100644 index 000000000..168ace679 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318290371-an-intent-lane-that-is-waiting-on-its.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318290371" +slug: "an-intent-lane-that-is-waiting-on-its" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/handback.go" +remedy: "Let --discard take an intent lane at its implement stage that has no commits beyond its base, removing its worktree and branch and leaving its step unlanded; a test discards a fresh lane at implement and finds it closed with nothing else changed." +--- + +An intent lane that is waiting on its implementer cannot be released when no work has been done: implement step --discard takes only a held lane or one handed back as stuck or closed, so a person who finds the lane should not run has to write a hand-back receipt by hand. On 7 Nov at 15:41 and 16:00 a lane built on a spec that turned out not to be READY could be released only by handing it back as a design finding. diff --git a/.abcd/work/issues/open/iss-2611101318415625-a-lane-s-receipt-cannot-declare-a.md b/.abcd/work/issues/open/iss-2611101318415625-a-lane-s-receipt-cannot-declare-a.md new file mode 100644 index 000000000..410599c5d --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318415625-a-lane-s-receipt-cannot-declare-a.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318415625" +slug: "a-lane-s-receipt-cannot-declare-a" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/receipt.go" +remedy: "Have the landing resolve only what the lane's latest receipt declares, add a partial form that lands the change under Refs: and leaves the issue open with the delivered part noted, and let a sync receipt name the issues it resolves with the commit that delivered each; a test withdraws a resolution in a second receipt and finds the landing leaves the issue open." +--- + +A lane's receipt cannot declare a partial fix, withdraw a resolution an earlier receipt declared, or name issues a sync finds delivered. recordReceipt (internal/core/implement/loop/receipt.go) replaces or appends a resolution and never removes one, and the landing resolves every issue any receipt named. On 8 Nov at 05:44 a fix receipt left out an issue that round 1 had ruled out of the resolutions, the landing still listed it, and both round-2 reviewers blocked on that; on 8 Nov at 06:50 a part-delivered issue had to be resolved whole and its unbuilt half captured again; on 7 Nov at 09:45 an issue lane landed half its issue with no way to say so; on 7 Nov at 23:25 the sync brief's receipt had no resolves field, so an issue an intent's audit found delivered was resolved by hand. diff --git a/.abcd/work/issues/open/iss-2611101318428532-no-verb-hands-a-live-build-run-from-its.md b/.abcd/work/issues/open/iss-2611101318428532-no-verb-hands-a-live-build-run-from-its.md new file mode 100644 index 000000000..f921df246 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318428532-no-verb-hands-a-live-build-run-from-its.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318428532" +slug: "no-verb-hands-a-live-build-run-from-its" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/control.go" +remedy: "Add a handover the live driver runs, naming the receiving session, that moves the driver claim to it and has the reservation follow, so the receiver's take-over is accepted on the holder's own release; a test hands a live run over and steps it from the receiver." +--- + +No verb hands a live build run from its driver to another session, so the run state is edited by hand. implement leave refuses a session that never joined with --session, and implement resume refuses a take-over while the driver lives. On 8 Nov between 08:19 and 08:25, when a coordinating session ran out of context mid-run, the driving session removed its own entry from the run's control.json by hand, kept a backup copy and checked that the entry named its session and process, and the reservation was renewed by hand for the receiving session. iss-2610121528179959 covers a shared place for handover notes. diff --git a/.abcd/work/issues/open/iss-2611101318517814-a-lane-implementer-started-as-a-host.md b/.abcd/work/issues/open/iss-2611101318517814-a-lane-implementer-started-as-a-host.md new file mode 100644 index 000000000..cbd5207d3 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318517814-a-lane-implementer-started-as-a-host.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318517814" +slug: "a-lane-implementer-started-as-a-host" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/receipt.go" +remedy: "Have the loop take the report from the agent's final reply when report.md is missing and say in the receipt that it did, or move the report to a path the agent can write; a test hands in a receipt with no report.md and a reply and finds the report saved." +--- + +A lane implementer started as a host sub-agent cannot write report.md in its lane directory, though it can write receipt.json and dod.log there, so the coordinator saves the report from the agent's reply by hand. Seen on 7 Nov at 19:22 and 20:16 and on 8 Nov at 00:40 and 08:20. diff --git a/.abcd/work/issues/open/iss-2611101318528163-the-build-loop-s-pull-request-title.md b/.abcd/work/issues/open/iss-2611101318528163-the-build-loop-s-pull-request-title.md new file mode 100644 index 000000000..f8082a2f8 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318528163-the-build-loop-s-pull-request-title.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318528163" +slug: "the-build-loop-s-pull-request-title" +severity: "minor" +category: "bug" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/land.go" +remedy: "Compose the title from the step's plain text: strip markdown emphasis and code marks and drop a trailing parenthetical note; a test titles a step whose text holds bold markers and finds none in the title." +--- + +The build loop's pull-request title copies the spec step's title as written, markdown included. prTitle (internal/core/implement/loop/land.go) puts the lane's step title into the title unchanged, so on 7 Nov at 21:35 the title of #1451 carried bold markers and a trailing parenthetical note from the spec step, and a person had to rewrite it. See also the different fault in the same composer, iss-2610080546203039: a title that names a record id with no Refs: line for it. diff --git a/.abcd/work/issues/open/iss-2611101318535279-once-a-lane-s-pull-request-is-armed.md b/.abcd/work/issues/open/iss-2611101318535279-once-a-lane-s-pull-request-is-armed.md new file mode 100644 index 000000000..40d69d730 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101318535279-once-a-lane-s-pull-request-is-armed.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101318535279" +slug: "once-a-lane-s-pull-request-is-armed" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/land.go" +remedy: "Have step say the lane is waiting on its pull request's checks, naming the ones still pending, and exit with the waiting code rather than repeating the instruction; a test steps an armed lane with pending checks and finds a waiting line." +--- + +Once a lane's pull request is armed, implement step keeps printing the same instruction to take the lane's land stage, with no change in state and no word that it is waiting on checks. Seen on 7 Nov at 21:35 on a build lane while its pull request's checks ran. diff --git a/.abcd/work/issues/open/iss-2611101319036237-when-the-build-s-landing-refuses-to.md b/.abcd/work/issues/open/iss-2611101319036237-when-the-build-s-landing-refuses-to.md new file mode 100644 index 000000000..2037bc4b3 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319036237-when-the-build-s-landing-refuses-to.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319036237" +slug: "when-the-build-s-landing-refuses-to" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/land.go" +remedy: "Have the refusal list, for each open issue, the moves that settle it (resolve with the lane's commit, unlink, or move the link to another intent), and let a decision record written for that settlement ride in the landing's records commit; a test refuses a close, settles an issue by the offered move and finds the decision in the commit." +--- + +When the build's landing refuses to close a spec because the intent's related_issues hold open issues, it names the issues but offers none of the moves that settle them, and a decision record that settlement needs cannot enter the landing's commit, which takes only records the landing's own moves made. On 8 Nov at 01:02 the links were settled by hand (two issues resolved, four unlinked, one gap captured), and the decision record for that judgement was refused and held in the main checkout's scratch until a follow-up landed it. iss-2611030450356845 covers the related case where a shipped intent's open issues fail issue-drift at preflight. diff --git a/.abcd/work/issues/open/iss-2611101319040361-land-record-review-refuses-review.md b/.abcd/work/issues/open/iss-2611101319040361-land-record-review-refuses-review.md new file mode 100644 index 000000000..ac8de8680 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319040361-land-record-review-refuses-review.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319040361" +slug: "land-record-review-refuses-review" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/landing/review.go" +remedy: "Have abcd hand out the review brief with the exact return shape it reads (head line, verdict line naming the head), count only headings as sections, and list every fault of a return in one refusal; a test records a return with two faults and finds both named." +--- + +land --record-review refuses review returns in forms its own brief allows, counts a bold bullet label that begins with Verdict as a second Verdict section, and names one missing part per refusal, so each fault costs another reviewer round trip. On 8 Nov at 03:39 a verdict line that opened with APPROVE and named the head was refused as not one a validator writes; on 9 Nov at 18:18 a SHIP return was refused because a bold bullet label began with the word Verdict; on 9 Nov at 20:04 round-two returns were refused twice, first for a missing Reviewed head line and then for a verdict line that did not name the head, because hand-written fix-round briefs had dropped the return shape. iss-2611040712384537 fixed one such case on 4 Nov. diff --git a/.abcd/work/issues/open/iss-2611101319307663-a-review-pair-that-passes-only-after-a.md b/.abcd/work/issues/open/iss-2611101319307663-a-review-pair-that-passes-only-after-a.md new file mode 100644 index 000000000..dd6fdda3d --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319307663-a-review-pair-that-passes-only-after-a.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319307663" +slug: "a-review-pair-that-passes-only-after-a" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/landing/delta.go" +remedy: "Waits on a ruling first: then accept a bounded delta review receipt for a small code change, scoped to the files it changed, citing the prior pair's receipts and taken from the same reviewer roles." +--- + +A review pair that passes only after a fix round cannot rest on the earlier full pair when the fix changes code: --rests-on takes a wording delta only, so each fix round's small code change needs a fresh full pair and a fresh preflight, about 1.5 to 2 hours a round. On 7 Nov at 22:20 the second fix round of #1452 needed a full pair rather than a delta; on 9 Nov at 04:20 a head needed a third full pair; on 9 Nov two lanes went through four and three fix rounds this way. A person must choose how large a code delta may rest on a prior pair and what the delta reviewers must be shown. diff --git a/.abcd/work/issues/open/iss-2611101319319204-the-build-loop-accepts-any-well-formed.md b/.abcd/work/issues/open/iss-2611101319319204-the-build-loop-accepts-any-well-formed.md new file mode 100644 index 000000000..de13070e7 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319319204-the-build-loop-accepts-any-well-formed.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319319204" +slug: "the-build-loop-accepts-any-well-formed" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/validate.go" +remedy: "Waits on a ruling first: then have a validator return state the files it read, and have the loop refuse a return naming fewer of the diff's files than the chosen floor." +--- + +The build loop accepts any well-formed validator return whatever it read, so a shallow review passes as a full one. On 7 Nov at about 20:40, on a lane of about 800 lines across 23 files, both Sonnet validators returned clean after 7 tool calls in about 30 seconds each, one of them skimming the tests, while the Opus pair took more than 16 calls each. A person must choose whether a return must state what it read, and what floor the loop holds it to. diff --git a/.abcd/work/issues/open/iss-2611101319324874-the-non-blocking-notes-of-a-passing.md b/.abcd/work/issues/open/iss-2611101319324874-the-non-blocking-notes-of-a-passing.md new file mode 100644 index 000000000..f38d3b2ee --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319324874-the-non-blocking-notes-of-a-passing.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319324874" +slug: "the-non-blocking-notes-of-a-passing" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/loop/validate.go" +remedy: "Have the receipt file each non-blocking note of a passing round as a capture, or offer one fix round for them before land; a test passes a round carrying one note and finds it captured." +--- + +The non-blocking notes of a passing review reach neither a fix round nor a capture. Since 904e2a8f5 the loop records each reviewer's located findings and hands a failing reviewer's findings to the fix brief, but a SHIP verdict ends validation and land refuses a head moved past the reviewed one, so a cheap defect that a passing reviewer names rides only in its return file. On 8 Nov at 11:38 a coordinator captured such a note by hand from another worktree. diff --git a/.abcd/work/issues/open/iss-2611101319445966-the-narrow-load-gate-refuses-a-race-run.md b/.abcd/work/issues/open/iss-2611101319445966-the-narrow-load-gate-refuses-a-race-run.md new file mode 100644 index 000000000..776000596 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319445966-the-narrow-load-gate-refuses-a-race-run.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319445966" +slug: "the-narrow-load-gate-refuses-a-race-run" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/machineload/narrow.go" +remedy: "Give the narrow gate a race route for a few named packages, kept apart from other race stages as the race gate requires, and let it split a long package into several test processes as preflight's sharding does; a test admits a narrow race run of one package while a whole run waits." +--- + +The narrow load gate refuses a race run and cannot split a long package, so a lane cannot get a race pass, or a full pass of a long package, without queuing behind whole preflights. The narrow rule (internal/core/machineload/narrow.go) reads any -race run as a whole run, and the implement loop package cannot finish on the narrow gate's two cores inside 40 minutes. On 7 Nov a lane's race pass sat more than 46 minutes behind other preflights; at 09:30 the loop package hit its limit twice, 40 minutes narrow and 25 under race; at 19:22 one step of a lane had spent about 7 hours at the gate. c27f0f793 changed the lane brief to run race tests as a gated whole run of their own; the gate itself is unchanged at this branch's head. diff --git a/.abcd/work/issues/open/iss-2611101319456608-implement-load-narrow-prints-nothing.md b/.abcd/work/issues/open/iss-2611101319456608-implement-load-narrow-prints-nothing.md new file mode 100644 index 000000000..975b08588 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319456608-implement-load-narrow-prints-nothing.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319456608" +slug: "implement-load-narrow-prints-nothing" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/load_narrow.go" +remedy: "Print a still-running line every few minutes with the elapsed time and the package in progress; a test runs a slow command through the gate and finds a progress line." +--- + +implement load --narrow prints nothing while its command runs, so an agent cannot tell a slow run from a hung one. On 9 Nov a lane's narrow gate run showed nothing for 33 minutes. diff --git a/.abcd/work/issues/open/iss-2611101319460145-the-narrow-gate-runs-only-go-test-so-the.md b/.abcd/work/issues/open/iss-2611101319460145-the-narrow-gate-runs-only-go-test-so-the.md new file mode 100644 index 000000000..8cf32a695 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319460145-the-narrow-gate-runs-only-go-test-so-the.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319460145" +slug: "the-narrow-gate-runs-only-go-test-so-the" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/load_narrow.go" +remedy: "Add a narrow form that runs the text and docs gates over the changed files only, in seconds; a test runs it on a change holding a curly apostrophe and finds it refused." +--- + +The narrow gate runs only go test, so the text and docs gates first see a lane's change at precheck. On 9 Nov a lane's narrow gate passed after 33 minutes, and make precheck then failed on two text rules in the change, a spelled-out home folder in a fixture and a curly apostrophe in a regular expression, costing a second precheck. diff --git a/.abcd/work/issues/open/iss-2611101319479162-no-command-runs-a-lane-s-new-tests.md b/.abcd/work/issues/open/iss-2611101319479162-no-command-runs-a-lane-s-new-tests.md new file mode 100644 index 000000000..1c47b58e4 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101319479162-no-command-runs-a-lane-s-new-tests.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101319479162" +slug: "no-command-runs-a-lane-s-new-tests" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/load_narrow.go" +remedy: "Add a red-check mode to the narrow gate that runs the named new tests on a copy of the base tree with only the test files applied, and passes only if they fail there; a test runs it on a test that already passes at the base and finds it refused." +--- + +No command runs a lane's new tests against the code of the head before the change, so watching a new test fail first is done by hand every round. On 9 Nov at 07:05 a fix-round agent saved its fixed scripts aside and restored the committed versions with git show; on 8 Nov at 00:40 watching a test fail at the judged head meant making a copy with git archive; on 9 Nov lane agents removed their change, ran the new tests and put it back. diff --git a/.abcd/work/issues/open/iss-2611101320131523-a-load-gate-waiter-is-told-neither-its.md b/.abcd/work/issues/open/iss-2611101320131523-a-load-gate-waiter-is-told-neither-its.md new file mode 100644 index 000000000..a1ebb1745 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101320131523-a-load-gate-waiter-is-told-neither-its.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101320131523" +slug: "a-load-gate-waiter-is-told-neither-its" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/implement/load_wait.go" +remedy: "Waits on a ruling first: then show each waiter its position and an estimate from past run times, drop a waiter whose holding process has ended, and read the race slot count from the person's own load settings." +--- + +A load-gate waiter is told neither its place in the queue nor when it may start, nothing notices a waiter whose session has ended, and race runs go one at a time per account. On 7 Nov at 12:58 five branches on one account had waited 2 to 4 hours while load sat near 10 against a limit of 32, and mapping waiters to their worktrees took a hand lsof pass; at 11:12 a pull request had waited three hours for a slot after a 40-minute run of its own; on 8 Nov at 08:46 seven preflights were queued at load 48. iss-2610230426248185 covers a waiter's misleading wait lines. A person must choose how many race runs an account may run at once, and whether the person can raise that number. diff --git a/.abcd/work/issues/open/iss-2611101320144587-abcd-capture-says-nothing-when-the.md b/.abcd/work/issues/open/iss-2611101320144587-abcd-capture-says-nothing-when-the.md new file mode 100644 index 000000000..a2b3f8b5a --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101320144587-abcd-capture-says-nothing-when-the.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101320144587" +slug: "abcd-capture-says-nothing-when-the" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/capture/workflow.go" +remedy: "Have capture print one line when it writes a major or critical record, saying it will hold the next cut until it is fixed, wontfixed or deferred; a test captures a major issue and finds the line." +--- + +abcd capture says nothing when the severity it writes will hold the next release cut, though the cut refuses any major or critical record that entered the ledger since the anchor tag and is still open. On 7 Nov a filing agent rated two follow-ups critical and six major from a list of follow-ups, and the coordinator lowered five to minor and two to major before they landed. diff --git a/.abcd/work/issues/open/iss-2611101320265526-abcd-capture-files-one-record-per-call.md b/.abcd/work/issues/open/iss-2611101320265526-abcd-capture-files-one-record-per-call.md new file mode 100644 index 000000000..8932abf2d --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101320265526-abcd-capture-files-one-record-per-call.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101320265526" +slug: "abcd-capture-files-one-record-per-call" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/capture/workflow.go" +remedy: "Add a batch form of capture that reads several records from one file, checks them all before writing any, and writes them under one lock; a test files three records from a file and finds all three, and a file with one bad record writes none." +--- + +abcd capture files one record per call, and the guard refuses a helper script that writes and runs calls to the record verb, so filing many records takes many calls. On 7 Nov filing 31 records took 31 calls, one per record. diff --git a/.abcd/work/issues/open/iss-2611101320485748-abcd-decide-takes-a-decision-s-slug-from.md b/.abcd/work/issues/open/iss-2611101320485748-abcd-decide-takes-a-decision-s-slug-from.md new file mode 100644 index 000000000..cd48dc845 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101320485748-abcd-decide-takes-a-decision-s-slug-from.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101320485748" +slug: "abcd-decide-takes-a-decision-s-slug-from" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/decide/decide.go" +remedy: "Give decide a --slug flag as capture has, and leave a leading role or date phrase out when deriving the slug; a test decides a text that opens with a role and finds the slug drawn from the subject." +--- + +abcd decide takes a decision's slug from the first words of its text and has no way to set it, so a text that opens with who decided gets a slug naming the role rather than the subject. On 9 Nov at 02:50 a decision whose text opened with the role got the slug technical-facilitator. diff --git a/.abcd/work/issues/open/iss-2611101320485997-abcd-ahoy-worktree-prune-reclaims-every.md b/.abcd/work/issues/open/iss-2611101320485997-abcd-ahoy-worktree-prune-reclaims-every.md new file mode 100644 index 000000000..de000eb0e --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101320485997-abcd-ahoy-worktree-prune-reclaims-every.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101320485997" +slug: "abcd-ahoy-worktree-prune-reclaims-every" +severity: "minor" +category: "ux" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/ahoy/worktree/prune.go" +remedy: "Waits on a ruling first: then scope prune to the calling session's worktrees, or to one named worktree, archiving its notes as it does now." +--- + +abcd ahoy worktree prune reclaims every merged, clean worktree in the repository's worktree store, other sessions' included, so a session told not to prune others' worktrees cannot clean up its own, and the guard refuses a plain removal while the worktree's local tier holds files. Seen on 8 Nov at 04:33. A person must choose whether prune is scoped to the calling session's own worktrees by default, or to one named worktree. diff --git a/.abcd/work/issues/open/iss-2611101320494180-abcd-embargo-has-no-form-for-a-finding.md b/.abcd/work/issues/open/iss-2611101320494180-abcd-embargo-has-no-form-for-a-finding.md new file mode 100644 index 000000000..23406b442 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101320494180-abcd-embargo-has-no-form-for-a-finding.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101320494180" +slug: "abcd-embargo-has-no-form-for-a-finding" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/embargo/intake.go" +remedy: "Waits on a ruling first: then add an embargo add form for an in-development finding, with a not-yet-reachable state and a fix-by step, that drafts the private advisory itself." +--- + +abcd embargo has no form for a finding raised during development, before any release carries the code: it takes in advisories that already exist on the forge, so the draft is made with the forge's own commands first. The version range such a draft carries then names releases in which the code is not reachable, which would read wrongly if it were ever published. Seen on 8 Nov at 11:55. A person must choose whether abcd adds an embargo entry for an in-development finding, and what state and fix-by step it carries. diff --git a/.abcd/work/issues/open/iss-2611101321028125-a-lane-cannot-check-before-review-that.md b/.abcd/work/issues/open/iss-2611101321028125-a-lane-cannot-check-before-review-that.md new file mode 100644 index 000000000..2b9195dfe --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101321028125-a-lane-cannot-check-before-review-that.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101321028125" +slug: "a-lane-cannot-check-before-review-that" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/docfidelity/docfidelity.go" +remedy: "Waits on a ruling first: then let a lane run the doc-fidelity review over its own diff before validation, or require each new behaviour claim in its docs to name the test that shows it." +--- + +A lane cannot check before review that the docs claims it writes are true of the code: precheck and lint docs pass prose that is false, and the doc-fidelity review runs only at a shipping spec close and at the release cut. On 10 Nov at 04:09 a lane wrote docs claims for two deadline routes but tested only one, and only the review pair caught it. A person must choose whether a lane runs a per-change doc-fidelity check, or a brief rule asks each new behaviour claim to name the test that shows it. diff --git a/.abcd/work/issues/open/iss-2611101321036534-a-release-cut-does-not-read-how-much.md b/.abcd/work/issues/open/iss-2611101321036534-a-release-cut-does-not-read-how-much.md new file mode 100644 index 000000000..9f2ec9268 --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101321036534-a-release-cut-does-not-read-how-much.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101321036534" +slug: "a-release-cut-does-not-read-how-much" +severity: "minor" +category: "process" +source: "agent-observation" +found_during: "autonomous run of 7 Nov 2026" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/launch/ship.go" +remedy: "Waits on a ruling first: then have launch read the usage left before a cut and set it against the cost of past cuts, and give a cut's handover a place abcd writes and the other account reads." +--- + +A release cut does not read how much usage the account has left before it starts, and nothing hands a cut to another account except a note written by hand. On 7 Nov the other account's usage ran out before it could cut v0.17.0, with about 5 per cent left until the following Wednesday, after a day of fixes in the release's scope; the handover was a note in a shared folder, and its follow-up list could not be written to from this account. A person must choose whether a cut refuses or warns on low usage, and where a cut's handover to another account lives. diff --git a/.abcd/work/issues/open/iss-2611101449088556-memory-recall-s-take-can-send-a-smaller.md b/.abcd/work/issues/open/iss-2611101449088556-memory-recall-s-take-can-send-a-smaller.md new file mode 100644 index 000000000..c0ad3500c --- /dev/null +++ b/.abcd/work/issues/open/iss-2611101449088556-memory-recall-s-take-can-send-a-smaller.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2611101449088556" +slug: "memory-recall-s-take-can-send-a-smaller" +severity: "minor" +category: "bug" +source: "impl-review" +found_during: "lane t review round 3, autonomous run 2026-11-07" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/recall/recall.go" +remedy: "Decide which holds, the ranking invariant or the fuller send, then either close the full phase when an over-budget candidate's line does not fit, or reword the comment and docs; add a test with over-budget pages ranked above a small item whose lines do not fit." +--- + +Memory recall's take can send a smaller candidate in full below one whose line did not fit. In take.next (internal/core/recall/recall.go) a candidate whose full block is larger than the whole turn budget skips the full phase without closing it; if its line then does not fit either, only the line phase closes, so a smaller candidate ranked below it still comes back in full. The comment above the take says no candidate comes back in a larger form than one ranked above it, which this breaks. It shows in the fresh and moderate rows when pages over the turn budget rank above a small item. No test covers it: the existing test of an over-budget item covers only the case where its line fits. Found by a reviewer of the memory docs on 10 Nov 2026; the docs were worded to match the code as it is.