Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
87604e6
chore: capture the ownerless drain and chat-only peer holds met by th…
REPPL Oct 10, 2026
fa09eae
chore: capture implement receipt refusing a path that already names i…
REPPL Oct 10, 2026
bf39e71
chore: capture the launch chapter's stale unfixed-finding table row
REPPL Oct 10, 2026
2d14e70
chore: capture the drain opening a lane on an issue already fixed und…
REPPL Oct 10, 2026
8ec03f9
chore: capture the unconditional hooksPath advice left in CONTRIBUTIN…
REPPL Oct 10, 2026
020fe6c
chore: widen the hooksPath sibling remedy to the detector's exact-str…
REPPL Oct 10, 2026
be1e710
chore: capture overlapping preflights and the interview load flake
REPPL Oct 10, 2026
6882615
chore: capture the bundled verifier-copy rule left behind the repo's own
REPPL Oct 10, 2026
5c2030e
chore: capture the guard reading an option value as a script
REPPL Oct 10, 2026
6b02bce
chore: capture armed pull requests landing through a record freeze
REPPL Oct 10, 2026
f2cbfa0
chore: capture the lifeboat mapping's stale personas prediction
REPPL Oct 10, 2026
bd211d4
Merge remote-tracking branch 'origin/main' into chore/records-drain-2…
REPPL Oct 11, 2026
c32d6d2
fix: cut the slugs of this branch's twelve captures to the 40-charact…
REPPL Oct 11, 2026
5a281e3
chore: capture a validated lane refusing a merge of main before landing
REPPL Oct 11, 2026
749b157
chore: widen the overlapping-preflight remedy with a load-derived -p
REPPL Oct 11, 2026
612ff1d
chore: capture gitutil's version probe running with no deadline
REPPL Oct 11, 2026
ef5b6bb
chore: capture the record-id redraw differing by family
REPPL Oct 11, 2026
7580bbe
chore: capture lane pull requests leaving the merge queue silently
REPPL Oct 11, 2026
0c21ace
chore: capture the question check failing open silently
REPPL Oct 11, 2026
963f280
chore: capture superseded merge-group runs holding CI runners
REPPL Oct 11, 2026
c4021d2
chore: sharpen the stale merge-group run remedy with the ref-derived key
REPPL Oct 11, 2026
efcd021
fix: cut the silent queue-drop capture's slug to the 40-character cap
REPPL Oct 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610101617040184"
slug: "peer-sessions-holds-on-open-issues"
severity: "minor"
category: "process"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/drain.md"
remedy: "When the drain's skip-for-now (iss-2610090642385898) lands, let a session add a hold from outside the drain (a held_by entry naming the session, the reason and an expiry) that every drain and build <iss> reads, and make build <iss-N> --session take a claim from its start, as build <itd-N> --session already does."
---

Peer sessions' holds on open issues reached this drain only as chat: on 2026-10-10 three sessions (abcd-0b, abcd-a5, abcd-49) named eleven issues to keep out of an abcd drain, none of them through implement claim, because their lanes were build runs or plans that take no claim until a lane opens. The drain cannot see any of them, so the only guard was the driving session hand-skipping each one when a lane opened on it. Evidence for iss-2610090642385898, which a peer is building as the drain's skip-for-now; filed apart because that record is being edited on the peer's lane.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610101617043118"
slug: "a-drain-left-in-progress-by-a-session"
severity: "minor"
category: "ux"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/drain.md"
remedy: "Record the starting session and the time of each move in drain.json; when a drain move comes from another session or after the working window has lapsed, say so in the payload (owner, last move, pace, ceiling) and refuse until --resume adopts it or --restart archives it and begins a new drain with the flags given."
---

A drain left in progress by a session that has ended stays in force with no owner. On 2026-10-10 a new session's bare abcd drain silently resumed a drain begun on 2026-10-07 (last move 2026-10-08 05:20, since when no session drove it), inheriting its --pace 10080/0 and --sub-agents 6. Nothing in the payload named who began it, when it last moved, or that its ceiling was set for another session's share of the machine's agents. Three live peer sessions were asked and none owned it. A second drain cannot start while it stands, and --pace or --sub-agents naming anything else is refused, so the only ways forward were to inherit it or move drain.json aside by hand, as an earlier session already had (drain-2026-10-07-paced.json).
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610101659347329"
slug: "abcd-implement-receipt-path-is-refused"
severity: "minor"
category: "ux"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/implement.md"
remedy: "Derive the run from the receipt path when it lies under .abcd/.work.local/run/<run-id>/, refusing only a path outside any run or a --run that disagrees with it; and have every next line the drain and implement step print name --run whenever more than one run is in progress."
---

abcd implement receipt <path> is refused at the state stage when more than one run is in progress, asking for --run, although the receipt path it was given (.abcd/.work.local/run/<run-id>/lane-N/...) already names the run. On 2026-10-10 a drain lane's receipt was refused this way because 24 stale runs from an earlier drain were still in progress; the next the drain itself printed (run `abcd implement receipt <path>`) omitted --run too, so following it verbatim fails.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610101803326081"
slug: "the-brief-s-launch-chapter-s-refusal"
severity: "nitpick"
category: "drift"
source: "review-followup"
found_during: "abcd-60 drain run 2026-10-10, lane for iss-2610072347238476"
origin: researcher-authored
production_mode: hand-written
found_at: ".abcd/development/brief/04-surfaces/04-launch.md"
remedy: "Reword the unfixed-finding row of the refusal-kinds table in .abcd/development/brief/04-surfaces/04-launch.md to name both cases (a consequential finding open since the anchor, and an open issue record that differs from HEAD), once the verb split's launch step has landed or with its owner's word."
---

The brief's launch chapter's refusal-kinds table describes unfixed-finding as the consequential (major/critical) finding case only, while the guardrail list forty lines below now says it also fires for an open issue record that differs from HEAD (added by the drain lane for iss-2610072347238476, which left the table row alone because a peer's verb split edits nearby). The table and the list now disagree within one chapter.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610101900387053"
slug: "a-drain-opens-a-full-lane-on-an-issue"
severity: "minor"
category: "ux"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10, lane for iss-2610080546210831"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/drain.md"
remedy: "Before a drain opens a lane, list the commits on the default branch since the issue's capture that touch its found_at path; when any exists, open the lane with a first stage that checks whether the remedy already holds and, if so, resolves the issue against that commit instead of implementing."
---

A drain opens a full lane on an issue whose fix has already landed under another issue's id. On 2026-10-10 the drain took iss-2610080546210831 (prepare-this-repo's unconditional core.hooksPath step); commit afa6e7b16 had already made that step conditional while citing iss-2610081312364884, so the record stayed open. The lane spent about 35 minutes and 92k tokens to find nothing to fix, then added a guard test so the landing could resolve it. Neither the dry run nor abcd capture mentions sees this, because the fixing commit names a different issue.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610101903385281"
slug: "two-siblings-of-the-core-hookspath"
severity: "minor"
category: "inconsistency"
source: "review-followup"
found_during: "abcd-60 drain run 2026-10-10, lane for iss-2610080546210831"
origin: researcher-authored
production_mode: hand-written
found_at: ".github/CONTRIBUTING.md"
remedy: "Give CONTRIBUTING.md and the commit-msg hook's refusal the same three-way advice as commands/prepare-this-repo.md step 5 (unarmed: set core.hooksPath; foreign: have the global dispatcher call .githooks/; armed: nothing), and extend prepare_hookspath_test.go's check to both files, matching any core\\.hooksPath setting by pattern (a --local flag or an absolute .githooks path passes today's exact-string check)."
---

Two siblings of the core.hooksPath advice that prepare-this-repo now makes conditional still give it unconditionally. .github/CONTRIBUTING.md (around line 64) tells every clone to run git config core.hooksPath .githooks, and the commit-msg hook's 'no abcd source' refusal (.githooks/commit-msg around line 162) prints the same command. On a machine whose global hooks dispatcher is in force (ahoy's banlist.hooks_path reports foreign), either one overrides that dispatcher instead of having it call .githooks/. The 2026-10-10 drain lane's reviewer found them; that lane's remedy did not cover them.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610102020442624"
slug: "several-sessions-make-preflight-runs"
severity: "minor"
category: "process"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/implement.md"
remedy: "Give make preflight a machine-wide slot (a lock under the abcd home keyed on the root commit, or a ceiling of N concurrent preflights) that a run waits on and reports, so sessions' preflights queue instead of overlapping; give its test and race stages a go test -p derived from the online cores and the current load, since one -race run already starts about one test binary per core and two saturate the machine (load 199 on 16 cores at 01:46 on 2026-10-11 with three race runs of internal/surface/cli live); keep the warn-only extreme-load check for load the slot cannot see."
---

Several sessions' make preflight runs overlap on one machine with nothing to space them out, and the overlap fails gates on tests no lane touched. On 2026-10-10 evening, two other sessions' full test suites were running at once (two go-build trees, a dozen .test binaries at 40-80% CPU each) and the one-minute load reached 124 on 16 cores. Four drain lanes in a row then lost a preflight run to load-only timeouts: TestAnIssueLaneLandsOnePullRequestThatResolvesItsIssue and TestAClosedPullRequestIsRefusedAndNothingIsCleanedUp (internal/core/implement/loop), and two internal/core/interview tests ('WaitDelay expired'). Each passed alone. The preflight load check (implement load --site preflight) warns above four times the core count but never waits, so every lane pays a re-run of about 20 minutes, and a lane whose re-run also lands in a peak has its receipt refused.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610102020447522"
slug: "two-internal-core-interview-tests-fail"
severity: "minor"
category: "bug"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10, lane for iss-2610090642392144"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/interview"
remedy: "Find the interview tests' fixed exec WaitDelay / timeout budgets and derive them from the test's deadline (t.Deadline) or a scaled bound, as the openaiapi stream test now does with capWait, so a loaded runner slows them without failing them; reproduce under a CPU-bound sibling before and after."
---

Two internal/core/interview tests fail under machine load with 'WaitDelay expired' (a different test on each run), on 2026-10-10 in two consecutive make preflight runs of a drain lane at load averages of 31 to 57 on 16 cores; the package passes when run alone and under the race lane. The tests' subprocess wait is a fixed wall-clock budget that a loaded runner overruns, the same shape as the openaiapi stream test fixed for iss-2610080243367274.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610102021042657"
slug: "once-the-drain-lane-for-iss"
severity: "minor"
category: "inconsistency"
source: "review-followup"
found_during: "abcd-60 drain run 2026-10-10, lane for iss-2610090642392144"
origin: researcher-authored
production_mode: hand-written
found_at: "the bundled default rules (internal/core/rules/defaults)"
remedy: "Waits on a person's ruling: should managed repositories be taught the outside-every-working-tree rule too? If yes, update the bundled CONCURRENCY rule and the-users-directory-is-theirs.md to match AGENTS.md, and have the itd-193 and adr-2609091014087993 archive examples name the scratchpad or the abcd home's store as the target."
---

Once the drain lane for iss-2610090642392144 lands, this repository's AGENTS.md and .abcd/rules.json say a verifier's copy goes outside every working tree, never under .abcd/.work.local/scratch/. The bundled default CONCURRENCY rule every managed repository receives and the principle the-users-directory-is-theirs.md still allow it in the checkout's .abcd/.work.local/ tier, and itd-193 and adr-2609091014087993 quote the archive command without saying where the copy goes. Changing the bundled rule changes what every managed repository is taught, so that lane left it alone.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610102021189565"
slug: "the-shell-guard-s-hook-refused-an-abcd"
severity: "minor"
category: "bug"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/guard"
remedy: "Treat an operand as a script only in a position that executes it (bash f, source f, ./f, an interpreter's file argument, a startup-file variable), never an option value or a positional argument to a non-shell program; add a regression test with abcd capture --found-at naming a .json path after cd ... &&."
---

The shell guard's hook refused an abcd capture command as script-unread because one of its option values, the --found-at value, named a JSON file under internal/core/rules/defaults. The guard treated that file as a script the command runs and reported that it 'runs .abcd/docs-lint.json inside a chain of scripts deeper than the guard reads'. Nothing was executed: the path was a plain string argument to abcd capture, preceded by a cd and joined with &&. The same capture went through with the path reworded as prose (2026-10-10, abcd-60 drain run).
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610102142432879"
slug: "a-peer-s-announced-record-freeze-cannot"
severity: "minor"
category: "process"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-10"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/implement.md"
remedy: "Give a record freeze a form the merge path reads: a session announcing one runs a verb that lists every open PR armed for auto-merge that touches .abcd/ records, disarms them with a note naming the freeze, and re-arms them when the freeze lifts; the implement loop's landing checks for a live freeze before arming."
---

A peer's announced record freeze cannot hold pull requests that were armed for auto-merge before it began. On 2026-10-10 a session opened a freeze so it could rename every record with a long slug (#904), and the drain session parked its new lanes. But a drain lane PR (#901), armed by the implement loop's landing an hour earlier, merged through the queue during the freeze. Its record move under the old long name broke #904's queued tree, which dropped #904 from the queue and cost about an hour of re-merging and re-queueing. Nothing listed the PRs each session had armed, and nothing let the freeze disarm them.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610102343100369"
slug: "once-the-drain-lane-for-iss"
severity: "nitpick"
category: "drift"
source: "review-followup"
found_during: "abcd-60 drain run 2026-10-11, lane for iss-2610072347247487"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/lifeboat"
remedy: "Update the personas row's expected status in the lifeboat mapping Table and regenerate the brief's 00-meta.md mapping table, so the M0 prediction matches the probe (grounded from an authored brief file, partial from a stub, blank with none); or record why the prediction is kept as written."
---

Once the drain lane for iss-2610072347247487 lands, the lifeboat probe grounds the personas section from an authored brief file, as it does every other human-owned section. The design record still predicts the old ceiling: the personas row of the lifeboat mapping Table (internal/core/lifeboat mapping.go, around line 151) and the generated mapping table in the brief's 00-meta.md say 'only partial there'. The probe now exceeds that on abcd's own tree, which has about 859 bytes of personas prose. Both of that lane's reviewers noted it as outside its remedy.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610110012045504"
slug: "a-validated-lane-cannot-take-main-in"
severity: "minor"
category: "ux"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-11"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/implement/loop"
remedy: "Let the land stage accept a head whose only commits past the judged head are merges of the default branch that change no file the validators judged (or re-run only the definition of done over them), so a lane held across a default-branch change can sync before its resolve commit instead of after its PR opens."
---

A validated lane cannot take the default branch in before it lands. On 2026-10-11 three drain lanes held through a peer's record-rename freeze were validated against a base that the rename then moved. Merging origin/main into one lane branch before its landing made implement step refuse at land ('is at <merge>, not at the head <sha> its validators judged'). So the only order that works is to land on the stale base (the resolve commit moves the record under its old long name), push, open the PR, and only then merge main and run the rename tool on top. Each lane then pays a third full preflight, and its PR is conflicting until that second push.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610110253059544"
slug: "gitutil-version-probe-has-no-deadline"
severity: "minor"
category: "bug"
source: "agent-finding"
found_during: "abcd-60 drain run 2026-10-11, lane for iss-2610090642407850"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/gitutil"
remedy: "Run the git version probe under the caller's context (or a short fixed deadline) with the same kill-on-cancel handling every other gitutil call gets, release the lock on timeout without caching a result, and add a test with a fake git that hangs on 'version', proving the first call returns by its deadline and leaves no child behind."
---

gitutil's one-time git version probe (internal/gitutil lazyfetch.go) runs with no deadline and under a process-wide lock. So the first git call of a process whose git hangs blocks in that probe, and every other git call waits on the lock behind it. For the status line this means a hung git ends the verb at its 500ms overall limit with the wrong message, and the hanging git version child is never killed, so one is left behind on every refresh. Found by the 2026-10-11 drain lane for iss-2610090642407850: a test's hanging fake git, answering the probe, blocked every git in its test process for 30s.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610110359273529"
slug: "record-id-redraw-differs-by-family"
severity: "minor"
category: "inconsistency"
source: "review-followup"
found_during: "abcd-60 drain run 2026-10-11, lane for iss-2610092011131598"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/capture"
remedy: "Make mintRecordID redraw on any existing path (bounded, as the iss and reading-item allocators do under spc-33 ruling 2) and drop the in-process minted-path set, keeping refuseExistingRecord as the write-time guard; test a forced clash with a planted foreign record, watched fail first."
---

After the drain lane for iss-2610092011131598 lands, the surprise, admission, disposition and reframe records redraw a minted id only when it clashes with a record this same process wrote, and still refuse a clash with any other existing record. The issue and reading-item allocators redraw on any clash (spc-33 ruling 2). Both of that lane's reviewers noted the split. The retained refusal guards against overwriting, which a redraw never does, so it protects nothing a redraw would endanger, and it can still fail a same-second mint against a peer's committed record.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610110401224302"
slug: "a-lane-pr-leaves-the-merge-queue"
severity: "minor"
category: "ux"
source: "agent-observation"
found_during: "abcd-60 drain run 2026-10-11"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/implement/loop"
remedy: "While a lane waits at land for its merge, have implement step read the pull request's auto-merge and merge-queue state through gh; when it was armed and is no longer armed or queued, say so in the refusal (removed from the queue, with the queue run's conclusion) and re-arm once, recording the re-arm in the run record, rather than reporting only 'not merged yet'."
---

A lane's pull request can leave the merge queue without anyone being told, and its auto-merge falls off with it. On 2026-10-11 the queue removed two drain PRs. #906's queue CI was cancelled when a peer's PR was re-queued ahead of it. #903 was removed about 45 minutes after entry while its macOS check was still running. Both then sat open and unarmed. Meanwhile implement step went on reporting only 'pull request #N is not merged yet', because it reads merge state, never queue membership or the armed flag. They were found by hand an hour or more later.
Loading
Loading