Skip to content

feat: glossary pointers, abcd lab, spec-tied reviews and the decisions gate in Go - #725

Merged
REPPL merged 45 commits into
mainfrom
integ/land-1
Sep 26, 2026
Merged

REPPL merged 45 commits into
mainfrom
integ/land-1

Conversation

@REPPL

@REPPL REPPL commented Sep 26, 2026

Copy link
Copy Markdown
Collaborator

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_with names 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 lab runs a lab: a throwaway world pinned at one commit of the repository, run to answer one question. mint lays down the lab home and a standalone snapshot at the pin, preflight runs the harness-isolation and dual-binary checks, record scaffolds a probe record, sweep lists 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, and harvest assembles 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 in abcd ahoy. lab is listed in the agents-and-hosts block of abcd --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 abcd board 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:

  • Glossary pointers: review FIX FIRST (one records-only fix), addressed on the branch in 50dae52.
  • abcd lab: review FIX FIRST (three minor fixes), then second review SHIP.
  • Spec-tied reviews: review SHIP (0 blocking, four minors, addressed on the branch).
  • Decisions-append gate in Go: review SHIP (two low non-blocking notes, addressed on the branch).

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

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant