feat: glossary pointers, abcd lab, spec-tied reviews and the decisions gate in Go - #725
Merged
Merged
Conversation
Each glossary entry now carries a pointer at the one page that maps the record families (acceptance criterion 1 of itd-2609211913453478): a Related terms line linking the page, and a not_to_be_confused_with that names a family row on the page or the page itself. The field keeps the term each entry was already paired with and takes an inline list where the pair is not a family, so no existing confusion pair is lost. The entries that paired with the retired phase are repointed: version pairs with release (a family), release with version and the page, and loop with the page. The term template starts a new entry pointing at the map. The README moves not_to_be_confused_with to the required fields as string or array, states the constraint, adds superseded to the status enum the phase, milestone and roadmap entries already use, and names the two record-lint checks that read the directory. Assisted-by: Claude:claude-opus-5-5
…page Two record-lint rules read glossary/core/record-families.md's table as the closed set of record families (acceptance criterion 4 of itd-2609211913453478): - glossary_family_pointer refuses a glossary entry whose not_to_be_confused_with names nothing on the page: no family row and not the page itself. A retired word, a term with no row, null and an absent key all point nowhere. - record_family_key reports, pinned to warn so it never refuses, a record frontmatter key naming a family the page does not define. The family words come from the glossary alone: superseded entries' terms and aliases, and family entries' forbidden synonyms. On the live tree it reports grandfathered_at_phase on six intents. A missing or tableless page is a configuration error, never a green run. The rules live in their own file; lint.go gains only the two dispatch blocks beside record_provenance, the way every sibling is wired, placed away from the lines the fences lane changes in that file. Both are armed in .abcd/record-lint.json and registered in knownRules. Assisted-by: Claude:claude-opus-5-5
The phase-0 to phase-8 documents open with the line the phases README already carries: retired on 2026-09-21 by adr-2609212115255771, with sequencing as dependencies plus the lifecycle shelves and the derived release as the checkpoint. Each stays as history and is not maintained (acceptance criterion 2 of itd-2609211913453478). Assisted-by: Claude:claude-opus-5-5
The mental-model chapter opens with the three layers, the brief, the intent and the spec with its steps, and names the two groupings beside them: the bundle, which groups intents for delivery, and the derived release, which is the checkpoint (acceptance criterion 5 of itd-2609211913453478). The diagram drops the phase node and its audit edge, lands specs a step at a time and cuts reality into the release. The body's phase framing goes where it contradicted the ruling: the intent, spec and acceptance paragraphs, and the phased-intents paragraph, which claimed a spec_id state the bundle members no longer hold. The chapter no longer claims the unshipped surfaces as present: the Now / Next / Later block is itd-2609212103568351 and single-act bundle planning is itd-34, both planned. The heading is Mental Model, so the one inbound anchor, in spc-2609230613206890, is repointed to #mental-model; the chapter index and the superseded phase entry stop describing a four-layer model. Assisted-by: Claude:claude-opus-5-5
The record-families page's Moved by column named intent reclassify, abcd build, intent plan --bundle and drain, none of which the binary carries, and the bundle entry gave the --bundle form as present. The column names the verbs that exist (intent plan, spec close, capture, capture resolve, capture wontfix, launch ship) and marks the step's and the bundle's verbs as the planned intents that bring them (itd-2609212103565953, itd-34). Found while repointing every glossary entry at this page; captured with this fix. Refs: iss-2609251617091944 Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609251617091944 Assisted-by: Claude:claude-opus-5-5
…15255771 The mental-model chapter is rewritten, but 59 brief files, including 04-scope.md and the release, version, loop, plan and spec glossary entries, still describe the phase as the live sequencing unit. The sweep is beyond spc-2609230613206890's scope, so it is captured for a ruling. Refs: iss-2609251618079479 Assisted-by: Claude:claude-opus-5-5
The remainder spec's four criteria are delivered on this branch: every glossary entry points at the record-families page, each phase document carries the retirement line, record-lint refuses an entry whose not_to_be_confused_with names nothing on the page and reports a record key naming a family the page does not define, and the mental-model chapter opens with brief, intent and spec, naming the bundle and the derived release. The close ships the intent with its declared additive impact and repoints the spec's own links to the moved records. Delivers: itd-2609211913453478 Assisted-by: Claude:claude-opus-5-5
`abcd lab` mechanises the lab conventions three hand-run labs proved. The store is machine-scoped and keyed on the repository's root commit, as the transcript store is: ~/.abcd/lab/<root-sha>/index.jsonl holds one registry line per lab and <lab-id>/ beside it is the lab home. Every level is created as a real directory, private to the account, and every write inside a home goes through an os.Root opened on it. Hand-run labs at the top of the store are neither read nor written. - mint clones a standalone snapshot detached at the pin under the isolated git environment (no hook fires), cuts its remote, scaffolds INTENTION.md with the lifecycle mapped onto the home, the findings, corrections and amendments logs, and appends the registry line. Nothing is written into the repository. - preflight writes state/preflight.md: harness isolation (no link out of the lab's HOME; a standalone clone descending from the pin, borrowing no object store; no remote; the hooks path a session would run, read with the operator's global config, inside the lab) and dual binary (bin/abcd a regular file whose embedded vintage, read without running it through the new vintage.OfReader, is the pin and unmodified; the same bytes the first passing preflight pinned; a distinct test binary). - record scaffolds a probe record and runs nothing. - sweep searches the lab's own documents for every retracted literal, lists each instance, and fails on an unapplied correction. - harvest assembles harvest/harvest.md in the lifeboat's section shape, cites each finding's probe records, lists product findings as capture candidates, and refuses a finding its records cannot back. A preflight or sweep refusal halts the lab and appends a gate finding rather than adapting around it: a halted lab records no probe until the same gate passes again, and the finding stays. Exit 1 on a gate, 2 on a refused request. The procedure the labs converged on is the discipline record itd-2609251624540864, present tense and host-agnostic. The brief gains chapter 31 and the lab store section; the command page, register row, release-gate manifest pin and regenerated reference and surface snapshot move with it. Decision: the store keys on the root commit (~/.abcd/lab/<root-sha>/<lab-id>/) rather than the spec's flat ~/.abcd/lab/<lab-id>/, per the spec's own "keyed as the worktree and transcript stores are"; it also keeps the verb off the hand-run labs' top-level index. mint clones the snapshot but does not build the work binary; the preflight names the missing binary. Part of itd-2609212137128014 / spc-2609212141418943. Assisted-by: Claude:claude-opus-5-5
All six acceptance criteria are met by the lab verb family and the discipline record: mint lays down the lab home, registry line, pin and lifecycle documents without writing the repository; the preflight writes its harness-isolation and dual-binary artefact and halts naming a failed check; the sweep lists every instance of a retracted pattern and fails on an unapplied correction; the harvest is assembled in the lifeboat's section shape citing probe records, with product findings as capture candidates; a gate refusal halts the lab and is recorded as a finding; and itd-2609251624540864 carries the procedure's amendments in present tense, host-agnostic. The close repoints the discipline's link to the shipped intent. Delivers: itd-2609212137128014 Assisted-by: Claude:claude-opus-5-5
… planned Assisted-by: Claude:claude-opus-5-5
… the shallow refusal A range gate needs four git primitives the canonical package did not have: an argument-safety check for a positional ref, the derivation of a usable range base (an empty value or the all-zeroes placeholder is a skip; a value that names no commit is a fault), a fail-closed shallow-checkout refusal, and a capped read that returns git's bytes untrimmed, because a blob's trailing blank lines are content to a caller that counts lines. RefIsSafe already existed twice as a private copy (lifeboat's refIsSafe and an inline check in capture's mentions listing); both now delegate to the one in gitutil rather than a third copy being written. runBounded keeps its trim and shares its body with RunCappedBytes. The inline shallow probe in launch's retention plan is left as it is: it is the second copy RequireFullHistory now makes a consolidation target, and a peer lane touched it this week. Refs: iss-2608291814575169 Assisted-by: Claude:claude-opus-5-5
…ate retires DA001-DA004 move from scripts/check-decisions-append.sh into internal/core/lint/decisionsappend.go, behind a new record-lint mode: `record-lint decisions-append <base> <head>`. The rules, their boundaries and the reasoning behind each carry over unchanged; the contract heads the new file. Parity. Every case of scripts/check-decisions-append-cases.sh is a TestDecisionsAppend* case with the same fixture, verdict and finding id (51 assertions: 10 DA001, 7 DA002, 6 merge, 4 merge-base, 2 duplicate-parent, 6 merge header-forge, 3 DA004/text, 10 clean, the control-byte report and the two environment faults; the usage fault is a front-door test). Replayed over the whole history of this repository (3,874 commits from the root), the shell gate and the Go gate report the same 70 findings (26 DA001, 41 DA002, 3 DA003), byte-identical in text and order; the Go gate took 3m48s against 9m19s. The base ref is derived once, in Go, through gitutil.ResolveRangeBase, so the decisions step in ci.yml loses its hand-copied zero-sha guard and passes BASE_SHA straight through. The record-lint -agent-diff step and the issue-resolution range step keep their own guards: both call gates this change does not port. TestEveryRangeScopedGateResolvesABaseOnEveryEvent accepts a step that hands its base to a gate deriving it through ResolveRangeBase, and names the tests that prove that gate's guard. Hardening over the shell: the diff runs with --no-textconv and --diff-algorithm=myers as well as --text and --no-ext-diff, so a repository's own diff configuration cannot decide what the gate sees; a ledger path that is not a file is refused rather than read. `make lint-decisions` and CI's record-lint job run the cases, then the gate; the job gains the setup-go step every other Go job carries. The lint brief chapter describes the third gate; the draft intent that retires the gate and the relink comment name its new home. Refs: iss-2608291814575169 Assisted-by: Claude:claude-opus-5-5
… in Go Resolves: iss-2608291814575169 Assisted-by: Claude:claude-opus-5-5
…tale it is The bare status board gains a reviews block: one row per folder under .abcd/work/reviews/, with the commits the default branch has moved since its pin (git rev-list --count <pin>..<default>), stalest first, and a `!` past twenty. A dated review pins in its summary's frontmatter (review_of_commit: <full sha>); a semantic-gate receipt directory is pinned by its own name. A review of a spec carries the spec id in its folder name, <date>-<spc-N>-<slug>/, and the row reads it from there. The --json payload carries the rows and the threshold. The reviews-charter gate gains RD004: a dated review filed without the pin is refused; the three folders from before the rule are named as legacy, a closed set. The gate's reading of the key is the board's (internal/core/reviews.Pin), watched both ways in check-reviews-cases.sh. The default-branch resolution moves from the peers reader to gitutil.DefaultRef so the board and peers count against one branch. Assisted-by: Claude:claude-opus-5-5
The reviews charter and the gate's own header sent a reader to the lint contract chapter for the RD family, and that chapter defines no RD code: the engine carries no numbered catalogue. The codes live in scripts/check-reviews.sh, and both pointers now say so. Refs: iss-2609260149217402 Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609260149217402 Assisted-by: Claude:claude-opus-5-5
The pin, the RD004 gate and the board's reviews block deliver every acceptance criterion; the intent's Decisions record where the implementer settled what the record left open (where the pin is written, the closed legacy set, where the code lives, what the board counts, the spec id as a convention, and CI's gitleaks pass as the scrub). Delivers: itd-28 Assisted-by: Claude:claude-opus-5-5
The lane review of feat/abcd-lab found the preflight's hooks check judging core.hooksPath unexpanded (a %(prefix)/ value passes) and the retraction sweep passing with documents it never read. Both are captured before the fixes that follow. Refs: iss-2609261004261615, iss-2609261004260522 Assisted-by: Claude:claude-opus-5-5
The preflight's isolation.hooks check read core.hooksPath raw with `git config --get` and expanded only `~/` itself, so a global `%(prefix)/share/evil-hooks` read as snapshot-relative and passed as resolving inside the lab while git ran the operator's hooks from its install prefix. The check now reads the value with `git config --type=path --get`, git's own expansion of `~`, `~user` and `%(prefix)/`, and judges the expanded path: the hand-written `~user` branch folds into the generic outside-the-lab refusal, and a value git cannot expand is refused rather than guessed at. ScrubbedEnv stays, so the operator's global and system configuration are in force as they would be for a session. Sibling found on the sweep: an empty core.hooksPath passed as the snapshot itself, but git joins the hook's name to the value (`git rev-parse --git-path hooks/pre-commit` reads `/pre-commit`), so it runs hooks from the filesystem root. An empty value is refused. Refs: iss-2609261004261615 Assisted-by: Claude:claude-opus-5-5
…pands it Resolves: iss-2609261004261615 Assisted-by: Claude:claude-opus-5-5
AC3 says every instance of a retracted literal is listed and an unapplied correction fails the sweep, but three cases passed with the literal standing in the lab: state/probes/ was skipped whole, so a claim in a probe's record.md observation (prose the harvest cites) was never read; a document over the 4 MiB read cap was listed as not swept while the sweep passed; and a document with a NUL byte in its first 8000 bytes was skipped silently. The sweep now reads every probe file but the five capture files (input, argv, exit, stdout, stderr), lists every document it could not read by path with its reason, and, while any correction is recorded, fails on one (check `unswept`, gate finding `sweep/unswept`). With nothing retracted there is nothing to miss, so the same tree passes and still lists what it skipped. Sibling found on the sweep: a link or other non-regular file in the lab home was skipped silently as well; it is now listed as not a regular file and fails the sweep the same way. The surface chapter and the command page say what is swept and what fails. Refs: iss-2609261004260522 Assisted-by: Claude:claude-opus-5-5
The help text and the generated CLI reference still said probe records are not swept. They now name the five capture files as the only probe files the sweep skips, and a document it could not read as a refusal while any correction is recorded, matching the fail-closed sweep. Refs: iss-2609261004260522 Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609261004260522 Assisted-by: Claude:claude-opus-5-5
The lab verb keys its store ~/.abcd/lab/<root-sha>/<lab-id>/, as the worktree and transcript stores are, which supersedes the spec's literal ~/.abcd/lab/<lab-id>/ and the 2026-08-31 entry's hand-run <timestamp>-<sha7> keying. The branch said so only in the feature commit and the internals chapter; the decision log now carries it, with why the hand-run labs are left beside the lanes. Assisted-by: Claude:claude-opus-5-5
hooksPathArmed read core.hooksPath raw and joined any non-absolute value to the clone, so a `~/…/.githooks` spelling of the committed hooks directory, which git expands to that same directory, read as unarmed and the status line advised re-arming a clone whose name guard already runs. It now reads the value with `git config --local --type=path --get`. Found on the sibling sweep of the lab preflight's hooks-path fix, and captured here with the fix. Refs: iss-2609261013469387 Assisted-by: Claude:claude-opus-5-5
… git expands it Resolves: iss-2609261013469387 Assisted-by: Claude:claude-opus-5-5
The retention preview carried its own inline `rev-parse --is-shallow-repository` probe. It now calls gitutil.RequireFullHistory, the one primitive the range gates use, which keeps the same three refusal polarities: a probe that errors, a "true", and any unexpected output all refuse; only "false" admits the tag listing. The refusal reason still names the shallow checkout and carries the primitive's own wording after it. Assisted-by: Claude:claude-opus-5-5
…nfig The decisions-append gate reads -U0 hunk headers arithmetically, and two hunk-shaping settings a repository's own config supplies were left to that config. diff.interHunkContext above zero folds neighbouring hunks into one with context lines between them: two rewords two lines apart then read as a single DA002 at the wrong span, and the DA001 the first one carries is lost because the folded hunk runs to the end of the file. diff.indentHeuristic=false slides an ambiguous insertion, which moves the line a DA001 finding names. The diff now passes --inter-hunk-context=0 and --indent-heuristic, each git's own default and so the shape the rules and their cases were written against. The remaining diff.* keys were checked and leave the reader's input unchanged: diff.context is overridden by --unified=0, diff.relative cannot narrow a diff run from the top level, the prefix keys touch only the file headers the reader never parses, and colour is off. TestDecisionsAppendIgnoresRepoDiffConfig sets each key in a fixture repo's config and requires the same findings as without it. Refs: iss-2609261115023216 Assisted-by: Claude:claude-opus-5-5
…hape Resolves: iss-2609261115023216 Assisted-by: Claude:claude-opus-5-5
TestEveryRangeScopedGateResolvesABaseOnEveryEvent exempts a step from the explicit unusable-base guard when it hands BASE_SHA to a gate that derives its own base through gitutil.ResolveRangeBase. The exemption was a substring match over the step body, so a step that kept the allowed command and also handed BASE_SHA to a second command, on the same line or its own, or carried the allowed text only in an echo or a comment, still earned it. The allowance is now an exact run line: the step's single single-line `run:` must equal an entry of baseGuardingGates, and a block scalar, a second `run:` or anything else on the line fails closed, holding the step to the explicit guard. TestBaseGuardDelegationCoversTheWholeStep plants each shape; on a scratch copy, appending a second "$BASE_SHA" use to the real decisions-append step makes the sweep fail on it. Refs: iss-2609261117268064 Assisted-by: Claude:claude-opus-5-5
…e whole step Resolves: iss-2609261117268064 Assisted-by: Claude:claude-opus-5-5
…rding Two minors from the itd-28 review, captured before the fix: the reviews-charter gate passes three summaries the board reads as unpinned, and the board's "re-run" imperative is untrue for a release receipt. Refs: iss-2609261121375292 Refs: iss-2609261121428530 Assisted-by: Claude:claude-opus-5-5
…inned scripts/check-reviews.sh passed three summaries that reviews.Read shows unpinned, the looser polarity: RD001 tested the summary with [ -f ], which follows a symlink; RD004 read a summary of any size where the board caps the read at 1 MiB; and bash `read` drops a NUL byte (3.2 truncates the line at it), so a pin line carrying one read clean. RD001 now asks [ -L ] of the folder and of 00-summary.md before anything else (a symlinked folder is not on the board at all), and RD004 refuses a summary past 1048576 bytes and a NUL anywhere in the frontmatter block, lines 1 through the closing fence, counted with head and tr so the check is byte-safe on bash 3.2. A NUL in the body past the block moves nothing, matching reviews.Pin. The gate stays stricter than the board on a NUL outside the pin line and on the three bytes the review lists as safe. check-reviews-cases.sh gains nine cases, each boundary's clean side included, and runs the gate under "$BASH" so /bin/bash proves it on 3.2; six were watched fail on a copy of the prior gate under bash 5 and five under /bin/bash 3.2 (3.2 already refused a NUL inside the key). TestReadShowsUnpinnedWhatTheGateRefuses pins the board's half of the same shapes. Refs: iss-2609261121375292 Assisted-by: Claude:claude-opus-5-5
… cannot pin Resolves: iss-2609261121375292 Assisted-by: Claude:claude-opus-5-5
The reviews heading told the reader to "re-run those marked !", but on this repository every flagged row was a release receipt, which nobody re-runs: a receipt gates the release it names, RD002 keeps every one, and each release adds one that stays past the threshold for good, so the bare board grew a permanently flagged row per release. The text render now lists the dated reviews alone under the heading, which counts them, flags the stale ones and asks for a re-run only when a review is marked !, then one receipts line: how many release receipts there are, how far behind the default branch the oldest release gated is, how many pins this history no longer holds, that a receipt is not re-run, and that --json lists each. The JSON is unchanged and still carries every receipt as a row, stale flag included. Both board tests were watched fail on a copy of the prior render: TestBoardListsEachReviewWithItsAgeStalestFirst on the heading, and TestBoardFoldsReleaseReceiptsIntoOneTruthfulLine on the receipts listed a row apiece. commands/abcd.md and the brief's 08-abcd.md describe the new shape. Refs: iss-2609261121428530 Assisted-by: Claude:claude-opus-5-5
…leness truthfully Resolves: iss-2609261121428530 Assisted-by: Claude:claude-opus-5-5
…heavy and branchless histories gitutil.DefaultRef had no direct test: it was covered through the peers reader and through one `main` assertion in the staleness test. It now has one per rung (origin/HEAD over every name, a dangling origin/HEAD falling through, the remote's main before the local one, local main, local master, no default branch, outside a repository). The staleness count is pinned on a merge-heavy history (three --no-ff merges: 9 commits past the pin, not the first-parent 3, which is what Row.CommitsSince documents) and on a repository with no default branch (the board names HEAD and counts against it). Both behaved before this change; these tests hold them there. Each was checked to bite on a copy of the tree by breaking the code it pins. Assisted-by: Claude:claude-opus-5-5
…gacy list spc-2609230613193436's acceptance criterion 5 scaffolds the check-reviews charter into a managed repo. abcd's own gate names three RD004 legacy folders that exist only in abcd's history, so the scaffolded copy carries an empty list or drops the clause (review-itd28 finding 4). Assisted-by: Claude:claude-opus-5-5
…on branch Lane glossary: every glossary entry points at the record-families page, and record-lint holds the glossary and record keys to it. Assisted-by: Claude:claude-opus-5-5
Lane lab: abcd lab mints, preflights, records, sweeps and harvests a lab, with its review fixes to the hooks-path judgement and the sweep. Semantic conflict, fixed in this merge: main gained the sentence manifest (itd-2609212113220149) and the grouped help (itd-146) after the lab branch was cut, so the lab verbs arrived with no sentence and no help placement. The six lab sentences come from the lab lane's report, shortened to the 160-character cap; lab.go's constructor Shorts are dropped (the manifest sets every Short); `lab` is placed in the agents-and-hosts block naming commands/lab.md, under the 2026-09-25 placement ruling (a verb goes in the block of whoever runs it; an agent runs a lab); commands/lab.md declares `block: agents`, and its description, the surface snapshot and the command reference are regenerated with go generate ./internal/surface/cli. Assisted-by: Claude:claude-opus-5-5
…branch Lane itd28: every review names the commit it read, and the board says how stale each one is. Assisted-by: Claude:claude-opus-5-5
…tion branch Lane daport: the decisions-append gate runs in Go through `record-lint decisions-append`, the shell gate retires, and gitutil holds ref safety, range-base resolution and the shallow refusal. Conflict, internal/core/launch/dryrun.go (retention preview's shallow refusal): main had extracted the probe into launch.ShallowCheckout (4a5b068) while the lane routed it through gitutil.RequireFullHistory (76e0a20). Resolved by hunk: the retention preview takes the lane's RequireFullHistory call and refusal wording; main's ShallowCheckout helper and its caller in the launch front door's baseline check merged cleanly and are kept unchanged, since that caller reads shallowness as a branch, not a refusal. Assisted-by: Claude:claude-opus-5-5
Assisted-by: Claude:claude-opus-5-5
Landing the glossary, lab, itd28 and daport lanes on main (811fba1) grew the tree-bounded reading objects. Each window is re-measured by dry run over a clean clone of the integration tip 50152d6 against the rule the entries state, the smallest ten-thousand boundary leaving at least one per cent headroom. Widening measures 1,074,501, past its 1,060,000 declaration, so it moves to 1,090,000 (1.44 per cent); entailment measures 353,700, past 350,000, so it moves to 360,000 (1.78 per cent); detection measures 1,083,537, past 1,060,000, so it moves to 1,100,000 (1.52 per cent). Comparative is bounded by the widening run it is handed, not by the tree, and is exempt by name. Refs: iss-2609251455354719 Assisted-by: Claude:claude-opus-5-5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Four reviewed lanes land together on one integration branch, with one recalibration of the cold-reading windows at the merged tip.
Glossary pointers (itd-2609211913453478). Every glossary entry points at the record-families page, and record-lint holds the glossary and the record keys to it: an entry whose
not_to_be_confused_withnames nothing on the page is refused, and a record key naming a family the page does not define is reported. Each retired phase document carries the retirement line, and the mental-model chapter opens with brief, intent and spec. The families page names only verbs the binary has.abcd lab (itd-2609212137128014).
abcd labruns a lab: a throwaway world pinned at one commit of the repository, run to answer one question.mintlays down the lab home and a standalone snapshot at the pin,preflightruns the harness-isolation and dual-binary checks,recordscaffolds a probe record,sweeplists every instance of a retracted pattern and, while a correction is recorded, fails on any instance still standing or any document it could not read, andharvestassembles the findings in the lifeboat's section shape with capture candidates. A gate refusal halts the lab and is recorded as a finding. The lab's evidence lives in the machine-scoped lab store and nothing is written into the repository. The hooks path is judged as git expands it, in the lab preflight and inabcd ahoy.labis listed in the agents-and-hosts block ofabcd --help --agent.Spec-tied reviews (itd-28). Every dated review names the commit it read, and the check-reviews gate refuses a review folder that does not. The bare
abcdboard lists each review with how many commits the default branch has moved since, stalest first, and folds the release receipts into one line.Decisions-append gate in Go. The decisions-append gate runs as
record-lint decisions-append <base> <head>, with the same findings as the shell gate it retires, and its diff ignores repository diff configuration. The launch dry run's shallow-checkout refusal goes through the same full-history check.Reviews:
Delivers: itd-2609211913453478
Resolves: iss-2609251617091944
Refs: iss-2609251617091944
Refs: iss-2609251618079479
Delivers: itd-2609212137128014
Resolves: iss-2609261004261615
Refs: iss-2609261004261615
Resolves: iss-2609261004260522
Refs: iss-2609261004260522
Resolves: iss-2609261013469387
Refs: iss-2609261013469387
Delivers: itd-28
Resolves: iss-2609260149217402
Refs: iss-2609260149217402
Resolves: iss-2609261121375292
Refs: iss-2609261121375292
Resolves: iss-2609261121428530
Refs: iss-2609261121428530
Resolves: iss-2608291814575169
Refs: iss-2608291814575169
Resolves: iss-2609261115023216
Refs: iss-2609261115023216
Resolves: iss-2609261117268064
Refs: iss-2609261117268064
Refs: iss-2609251455354719
Assisted-by: Claude:claude-opus-5-5