Skip to content

feat: the command-line hardening, intent bundles, the owed-review drain and the consistency pass - #728

Merged
REPPL merged 114 commits into
mainfrom
integ/land-4
Sep 26, 2026
Merged

REPPL merged 114 commits into
mainfrom
integ/land-4

Conversation

@REPPL

@REPPL REPPL commented Sep 26, 2026

Copy link
Copy Markdown
Collaborator

This integration branch lands five reviewed lanes as one change: the command-line hardening of the cli lane, bundle planning and reclassification (itd-34), the owed fidelity-review listing (itd-2609150819445595) and its bounded drain (itd-53), and the cross-document consistency pass (itd-48). It carries one window recalibration and one preflight.

cli. abcd's command line is more honest at its edges. A refusal names every unmet requirement a verb's usage line declares, at once, and each verb that takes a required input carries a worked example in its help. Every stderr diagnostic is masked for terminal escapes at the print site, including the ones that bypass the normal refusal path. intent plan mints and links a spec for a planned intent that has none, and an in-place plan refused after the mint takes its spec back. intent status --json lists every intent with its acceptance-criteria state. A status or show sub-verb names the record dispatcher, and the staging hooks report their outcome as one JSON line under --json.

itd34. abcd intent plan plans several drafts as one bundle: one shared spec lists every member, and closing it ships them together. abcd intent reclassify changes an intent's kind in place, or supersedes it, writing the link both ways in one write; a bundle left with one member says so. The record lint refuses a bundle no other record names. Every judgement these verbs make is taken under the intent store's lock.

owed. Bare abcd intent audit lists the fidelity reviews owed on shipped intents, each with its receipt and the command that re-emits its request; a dead-lettered review is listed apart as unreviewed. The bare abcd intent board carries the owed count, and abcd <itd-N> names the review state as a shipped intent's next move.

drain. abcd intent audit --owed [--max <n>] orders the owed reviews oldest shipped first, caps the list, names how many remain, and emits the oldest's request with the single audit's routing, so a host drives the drain by hand: audit, ingest, run again. One record that cannot be emitted never blocks the drain, and a failed emit parks no stub. The plugin page runs the loop one audit at a time and captures every NOT_MET. Nothing runs the drain on its own.

itd48. abcd intent consistency [<itd-N>] assembles the brief and every live intent and asks the host's intent auditor (its Role 2) to name where two documents cannot both be right, each end quoted. abcd intent consistency ingest validates the findings fail-closed, files one capture per finding (or links an open record that already quotes an end), and writes a dated report on the reviews shelf pinned to the commit the pass read, marked dirty when the corpus read was uncommitted.

At integration. The drain's history-walk notice now scrubs paths the way every refusal does (iss-2609261327506636, review3-drain's note). capture defer and intent consistency ingest gain the worked examples the cli lane's test requires, and the intent audit sentence names the owed listing and the drain. The reading windows are recalibrated at the merged tip.

Re-merge onto main (#725, #726, #727). The branch takes main at 5735c89. The record dispatcher's closed verb list carries both intent audit and main's capture reframe. Every verb integ1–3 added that takes a required input now carries a worked example that runs as written: ahoy connect, capture admit, capture reframe, capture surprise, the five lab sub-verbs, scribe assemble and scribe ingest. Bare abcd scribe is recorded as a bare-render exception, which the brief already names. The consistency pass spells its curly quotes as escapes, which main's source guard requires; the runtime bytes are the same. The intent audit sentence also names the issue-drift check, and it says truthfully that only --owed or an intent id writes an OWED stub. The review's note that capture defer prints an unscrubbed absolute path was reproduced and closed as wontfix (iss-2609261737325810). The line is the checkout banner every capture verb prints: it goes to stderr, it is home-redacted by design, and scrubbing the working directory would erase the checkout it exists to name. The reading windows are recalibrated at the re-merged tip: widening 1,270,000, entailment 380,000, detection 1,280,000.

Reviews (Fable 5.1):

  • cli: round 1 SHIP with three minors, fixed in round 2; round 3 SHIP.
  • itd34: round 1 FIX FIRST (one medium pre-lock race and five lows), all six fixed; round 2 SHIP.
  • owed: SHIP.
  • drain: round 1 FIX FIRST (one major merge-time routing gap and three more), fixed; round 2 SHIP with two minors, fixed; round 3 SHIP.
  • itd48: round 1 FIX FIRST (a major dirty-pin gap), fixed; round 2 SHIP with one minor, fixed; round 3 SHIP.

Delivers: itd-34
Delivers: itd-2609150819445595
Delivers: itd-53
Delivers: itd-48
Resolves: iss-242
Resolves: iss-2608261550596333
Resolves: iss-2608300927241768
Resolves: iss-2609012037438844
Resolves: iss-2609091642508271
Resolves: iss-2609091801075902
Resolves: iss-2609100508565741
Resolves: iss-2609100509537730
Resolves: iss-2609100531051385
Resolves: iss-2609190337466942
Resolves: iss-2609200953255336
Resolves: iss-2609202015349672
Resolves: iss-2609211119023345
Resolves: iss-2609211738504433
Resolves: iss-2609240519471816
Resolves: iss-2609252052381777
Resolves: iss-2609252052384356
Resolves: iss-2609252052385551
Resolves: iss-2609252052386874
Resolves: iss-2609252054322226
Resolves: iss-2609252127427592
Resolves: iss-2609252127428538
Resolves: iss-2609260002152124
Resolves: iss-2609260221563975
Resolves: iss-2609260221565656
Resolves: iss-2609260221577624
Resolves: iss-2609260221578565
Resolves: iss-2609260234039115
Resolves: iss-2609260926130217
Resolves: iss-2609260926130480
Resolves: iss-2609260935465554
Resolves: iss-2609261055135912
Resolves: iss-2609261215159796
Resolves: iss-2609261215160156
Resolves: iss-2609261215168271
Resolves: iss-2609261218301461
Resolves: iss-2609261218318807
Resolves: iss-2609261232176189
Resolves: iss-2609261327506636
Resolves: iss-2609261737325810
Refs: iss-2609251455354719
Refs: iss-2609252038344132
Refs: iss-2609260926323349
Refs: iss-2609261254247117
Assisted-by: Claude:claude-opus-5-5

Every spec close that ships an intent parks an OWED review marker, and
nothing counted those markers across the record. One reader in
internal/core/intent (Reviews / ReviewOf, owed.go) reads the first
marker of every shipped intent through existingMarker, the authority
the re-emit already uses, and never writes. The owed set is OWED plus
no marker; DEAD_LETTER is reported apart with the reason its quarantine
block recorded (the retention path after it is cut, so no local-tier
path leaves the reader); INGESTED is not owed.

Three surfaces call it: bare `abcd intent audit` is the listing (text
and --json, exit 0, zero writes, the re-emit command rather than the
request file); bare `abcd intent` carries `reviews owed N` beside the
bucket counts, from the same reader; `abcd <itd-N>` on a shipped intent
names the review state as its next move in place of a flat "none".
No gate reads it: lint, record-lint and the release cut are unchanged.

Judgement recorded here: the listing's JSON states are the marker's own
words (OWED, INGESTED, DEAD_LETTER) plus `none`; `re_emit` is set only
where the review is owed, because on a terminal receipt the re-emit
changes nothing. `intent audit` joins the dispatcher's closed verb list.
A markerless shipped intent's dispatcher move changes from "none" to
owed (decision 3), so the lifecycle test's shipped row is updated.

Refs: iss-2609100509537730
Assisted-by: Claude:claude-opus-5-5
Closes spc-2609202112205096 with --impact additive (the intent declared
none); the close-hook moves the intent planned -> shipped and parks its
own OWED review marker, which the new listing names. Resolves the issue
the intent graduated from, so the promote join reads the same from both
ends once the intent is shipped.

Delivers: itd-2609150819445595
Resolves: iss-2609100509537730
Assisted-by: Claude:claude-opus-5-5
`abcd intent audit --owed [--max <n>]` is the bounded command that pays
the review debt (itd-53, spc-2609211930059886). The owed set is the one
reader's (Reviews); internal/core/intent adds the order and the cap
(OwedQueue, read-only) and one step that re-emits the head's request
through the single audit's own emit (NextOwedAudit). The CLI prints the
ordered list, how many remain beyond the cap, and the next request path,
so a host without the plugin page drives the drain by hand: audit,
ingest, run again. It runs no reviewer; every entry stays owed until its
verdict is ingested.

The plugin page runs the loop one audit at a time through the existing
request/ingest pair: it checks for the intent-auditor first and, with
none available, audits nothing and says why in the summary; a NOT_MET
verdict is captured through `capture` naming the receipt, never fixed.
The close hook is untouched: it still only enqueues.

Judgement recorded here:
- "Oldest" is the day the intent entered shipped/, the day its review
  fell owed, read from the site package's one history walk
  (History.EnteredBucket) and injected, because site imports intent.
  An intent not yet committed sorts last; ties, and a tree with no
  history, fall to mint order (numeric, so ordinals precede timestamp
  ids). A history that cannot be read is said on stderr and the queue
  falls to mint order rather than refusing the drain.
- `--owed` emits the head's request (a write, as `audit <itd-N>` is),
  because the spec's CLI form prints "the next request path" and a path
  into the gitignored tier may have been swept; only the head is emitted.
- `--max 0` is no cap; a negative cap is refused naming the value.
  `--max` without `--owed`, and `--owed` with an intent id or with
  `--issue-drift`, are refused with exit 2.
- Every intent the drain reaches is already shipped, so every NOT_MET it
  surfaces is on "a long-shipped intent" and is captured.
- The runner lives in its own file (intent_drain.go) and the flags are
  additive, so the parallel `--route` change merges mechanically.

Assisted-by: Claude:claude-opus-5-5
…mand

Closes spc-2609211930059886 with --impact additive (the impact the
intent declares); the close-hook moves the intent planned -> shipped,
parks its own OWED review marker (which the drain it ships will list),
and repoints the one plan link that named the planned path.

Delivers: itd-53
Assisted-by: Claude:claude-opus-5-5
Refs: iss-2609252038344132
Refs: iss-2609100509537730
Assisted-by: Claude:claude-opus-5-5
# Conflicts:
#	.abcd/development/brief/04-surfaces/05-intent.md
#	.abcd/development/release/surface.json
#	docs/reference/cli/commands.md
#	internal/surface/cli/cli.go
Refs: iss-2609252052385551
Refs: iss-2609252052381777
Refs: iss-2609252052386874
Refs: iss-2609252052384356

Assisted-by: Claude:claude-opus-5-5
`intent audit --owed` returned before the route was resolved and emitted
the head through the option-less ReEmitAudit, so after tier2's --route
landed the drain's request carried no Routing section, its JSON next had
no routing member, and `--owed --route <x>` was accepted and dropped.
The --owed branch now resolves the auditor's route first (a refusal
writes nothing), emits through ReEmitAuditWith with the routing section,
and joins the routing member to next and the routing line to the text
form, exactly as `audit <itd-N>` does. The page and the brief row say
so.

Refs: iss-2609252052385551

Assisted-by: Claude:claude-opus-5-5
…uting

Resolves: iss-2609252052385551

Assisted-by: Claude:claude-opus-5-5
Refs: iss-2609252054322226

Assisted-by: Claude:claude-opus-5-5
Bare `intent audit` lists the owed reviews and dispatches no agent, but
it never resolved --route, so the flag was accepted and dropped. It now
resolves it for no agent, which refuses at exit 2 as --issue-drift does.

Refs: iss-2609252054322226

Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609252054322226

Assisted-by: Claude:claude-opus-5-5
When the history walk failed, every drain entry printed "shipped (not
yet committed)" and the JSON omitted `shipped`, so an unreadable history
read exactly like a store of uncommitted intents. Each queued review now
carries shipped_state — dated, uncommitted (the history was read and
does not hold it) or unknown (no history was read) — and the text form
labels an unknown day as such.

Refs: iss-2609252052381777

Assisted-by: Claude:claude-opus-5-5
… unknown

Resolves: iss-2609252052381777

Assisted-by: Claude:claude-opus-5-5
An emit failure on the drain's head (a malformed spec_id, an unreadable
file) exited 2 with no listing, and --max could not skip it, so one bad
oldest record blocked every drain run. The step now keeps the error on
that entry's own queue row (emit_error) and emits the next entry
instead; with no listed entry emittable the queue still comes back, with
no next, and the text form names the hand fix. The page skips an entry
carrying emit_error and reports it.

The error rides on the entry rather than on next alone, because an
error on next alone would still stop the drain at the same head on
every run, which is the defect.

Refs: iss-2609252052386874

Assisted-by: Claude:claude-opus-5-5
… drain

Resolves: iss-2609252052386874

Assisted-by: Claude:claude-opus-5-5
A negative --max was refused only after the history walk (about 0.65 s
on this repository); the front door now checks the cap through the
core's CheckOwedCap before anything else. The --owed flag help and the
page say the drain writes: its emit parks an OWED stub in a markerless
intent, a committed record, so a bare look leaves a diff a peer sees.

Refs: iss-2609252052384356

Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609252052384356

Assisted-by: Claude:claude-opus-5-5
…rrors

The second review of the drain lane named two minors; the run drains findings
rather than filing them, so both are captured here and fixed on this branch.

Refs: iss-2609252127427592
Refs: iss-2609252127428538

Assisted-by: Claude:claude-opus-5-5
emitAuditWith wrote the OWED stub into the intent file and then the request,
and the drain moves on after an emit error, so a request write that failed
(an unwritable local tier, or the reviews directory a plain file) parked a
stub with no request on every markerless entry within the cap while each row
still read "no receipt". The updated content is already in memory, so the
request is written first and the intent file second: a failed emit now parks
nothing, and the row keeps the receipt state the reader gave it (an already
parked receipt the failed re-emit named stays reported as OWED). The reverse
failure leaves only the gitignored request, which the next emit of the same
content rewrites under the same receipt. The brief's drain row says so.

Refs: iss-2609252127427592

Assisted-by: Claude:claude-opus-5-5
The drain's per-entry emit error reached the text row and the JSON emit_error
with its absolute path intact, and the plugin page tells the host to report
that text; the single `intent audit <itd-N>` refusal carried the same path.
Both now pass through fsutil.RedactHome, the convention the cli's other
home-bearing messages already follow, so a path under the home reads ~/...
The brief's drain row says so.

Refs: iss-2609252127428538

Assisted-by: Claude:claude-opus-5-5
…rks no stub

Resolves: iss-2609252127427592

Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609252127428538

Assisted-by: Claude:claude-opus-5-5
…and agent verbs

abcd --help at 6e4eca9 lists the person's verbs in labelled groups and
names --agent for the verbs agents and hosts call; each command page's
block: frontmatter says which list it belongs to. Delivered by itd-146
in 4bac5e5, reachable from this branch's base.

Resolves: iss-2609211119023345
Assisted-by: Claude:claude-opus-5-5
abcd abcd <id> and abcd consult each answered with "this binary predates
the command ... run abcd update" on an up-to-date binary, because the
stale-usage note read any commands/<token>.md as proof the surface is newer
than the binary. The dispatcher page documents the bare call and the
host-delegated pages (consult, ingest, prepare-this-repo) run in the host
agent, so no rebuild or update ever adds their verb.

pagesWithNoVerb (staleusage.go) names each such page with what the token
is: the dispatcher token says did you mean abcd <record-id>, a
host-delegated one names its /abcd:<page> invocation. The surface-parity
test reads the same set in place of its own copy, and a test fails if the
set ever names a verb the binary registers. The brief's version chapter
states the exemption.

Refs: iss-2609200953255336
Refs: iss-2609240519471816
Assisted-by: Claude:claude-opus-5-5
…se stale claim for pages with no verb

Resolves: iss-2609200953255336
Resolves: iss-2609240519471816
Assisted-by: Claude:claude-opus-5-5
abcd intent status itd-5 listed the intent sub-verbs and nothing else, and
abcd spec show spc-3 fell to the stale-usage path, though abcd <record-id>
answers exactly that question. recordReadHint names the dispatcher, filled
with the id the caller gave, when a record verb (capture, intent, spec)
meets status or show alone or before one record id; the refusal and its
exit code are unchanged, and prose beginning with the word still files.
abcd --version, the record's first half, already works at base (7b579ca).

Refs: iss-2609190337466942
Assisted-by: Claude:claude-opus-5-5
… dispatcher

Resolves: iss-2609190337466942
Assisted-by: Claude:claude-opus-5-5
The close that ships an intent mints an OWED receipt, parks an
abcd-review: OWED marker in the intent's Audit Notes and writes the review
request under .abcd/.work.local/reviews/, and the verb's help named only
the two moves. Its Long help now names all three and the verb that answers
the request, so a caller learns at the verb that the audit is owed and
where its input is. The CLI reference is regenerated.

Refs: iss-2609202015349672
Assisted-by: Claude:claude-opus-5-5
The bundle close refuses --remainder and a member back in drafts/ before
anything is minted or moved, and neither refusal was tested. Both now
are, each proved to fail with its refusal removed (on a scratch copy).
The CLI's refusal of --bundle with one intent was tested by exit code
alone; it now asserts the message too.

Assisted-by: Claude:claude-opus-5-5
Row 1 of spc-2609211859391533's steps table reads "refused across
phases", wording that predates decision 5, which retired phases. The
closed spec is left as written; a dated note under the intent's
decisions says the row means refused across shelves.

Assisted-by: Claude:claude-opus-5-5
…nder the lock

Resolves: iss-2609261215159796
Assisted-by: Claude:claude-opus-5-5
…arries under the lock

Resolves: iss-2609261218301461
Assisted-by: Claude:claude-opus-5-5
…der the lock

Resolves: iss-2609261218318807
Assisted-by: Claude:claude-opus-5-5
…destination

Resolves: iss-2609261215168271
Assisted-by: Claude:claude-opus-5-5
…mber

Resolves: iss-2609261215160156
Assisted-by: Claude:claude-opus-5-5
The twin of iss-2609261218301461 in Plan's branch for a planned record
with no spec.

Refs: iss-2609261232176189
Refs: iss-2609261218301461
Assisted-by: Claude:claude-opus-5-5
Plan's branch for a planned record with no spec rewrote the record from
bytes read under the intent mint lock but took the kind it kept from
the corpus loaded before it, so a reclassify landing in the window was
overwritten. It now parses the record from the bytes it read under the
lock, as the draft branch does.

Refs: iss-2609261232176189
Assisted-by: Claude:claude-opus-5-5
…kind read under the lock

Resolves: iss-2609261232176189
Assisted-by: Claude:claude-opus-5-5
Refs: iss-2609261254247117
Assisted-by: Claude:claude-opus-5-5
…ane fix/cli-cluster)

Lane itd34 ships itd-34 (bundle planning and reclassify); it carries the
cli lane's error-surface, requirements and worked-example work.

Conflicts, resolved by hunk:
- internal/surface/cli/guard.go: main moved the two DROPPED notices onto
  guardDropNotice (which also names a refused uncommitted edit); the cli
  lane routed them through diagnosticLine. Both kept: the notice main
  composes is printed through diagnosticLine, so it stays masked.
- docs/reference/cli/commands.md, .abcd/development/release/surface.json:
  regenerated with go generate ./internal/surface/cli.

Semantic conflict: main's new `capture defer` verb declares required
inputs, and the cli lane's TestEveryVerbWithARequiredInputCarriesAWorkedExample
refuses a verb with none, so examples.go gains its worked example.

Assisted-by: Claude:claude-opus-5-5
Lane drain ships itd-53 (the bounded drain of owed fidelity reviews); it
carries the owed lane, which ships itd-2609150819445595 (the owed listing).

Conflicts, resolved by hunk (union throughout):
- internal/core/intent/intent.go StatusView: keeps both ReviewsOwed (owed)
  and the per-intent Intents listing (cli lane).
- internal/surface/cli/cli.go newIntentAuditCommand: the drain's Use line;
  the Short the drain wrote is dropped because main sets every Short from
  the sentence table, so the audit sentence in
  internal/core/surface/sentences.go is reworded to name the bare listing
  and the drain, within the 160-character cap.
- commands/intent.md: main's generated description; the argument-hint
  carries itd-34's plan --bundle and reclassify forms and the drain's
  audit --owed form; the status summary names reviews_owed and the
  intents array.
- commands/abcd.md, brief 04-surfaces/08-abcd.md: the ledger line, the
  bundle-spec paragraph and the fidelity-review move all kept.
- brief 04-surfaces/05-intent.md: the status row carries the owed count
  and the per-intent listing.
- docs/reference/cli/commands.md, .abcd/development/release/surface.json:
  regenerated with go generate ./internal/surface/cli.

Assisted-by: Claude:claude-opus-5-5
review3-drain's note, owed at landing: the history-walk notice prints git's
stderr with Sanitize only, so an absolute path it names is not redacted.

Refs: iss-2609261327506636
Assisted-by: Claude:claude-opus-5-5
When the history walk fails, the drain says the shipped days are unknown
and quotes the walk's error, which carries git's own stderr. That error
went to stderr through termsafe.Sanitize alone, so an absolute path git
names (an alternates entry, an object directory) reached the terminal
unredacted: the one print in the drain front door no redactor touched.

The notice now goes through scrubPaths, as every refusal Run prints does,
and through diagnosticLine, the one print site that masks an out-of-band
stderr line. TestIntentAuditOwedHistoryNoticeScrubsPaths was watched RED
on the absolute repository path in the notice, then GREEN.

Refs: iss-2609261327506636
Assisted-by: Claude:claude-opus-5-5
…bs paths

Resolves: iss-2609261327506636
Assisted-by: Claude:claude-opus-5-5
Lane itd48 ships itd-48 (the cross-document consistency pass, the
intent auditor's Role 2).

Conflicts, resolved by hunk:
- .abcd/development/intents/shipped/itd-34-three-intent-kinds.md: the two
  sides differ only in the itd-48 links; itd-48's close repointed them to
  ../shipped/, which is where itd-48 now lives, so every link itd-34's
  relink aimed at ../planned/itd-48 now resolves (no link to planned/itd-48
  remains in the tree).
- agents/intent-auditor.md: one description naming Role 1 with its
  scope-condition dispositions (cli lane, 0.3.2) and Role 2 (itd48);
  prompt_version 0.4.0. agents/CHANGELOG.md keeps both entries, newest
  first (0.4.0 above 0.3.2).
- internal/core/intent/audit_contract_test.go: both sides' tests kept
  (TestAuditorDescriptionNamesTheDispositionSurface and the two Role 2
  lockstep tests).
- commands/intent.md argument-hint: the union of plan --bundle,
  reclassify, audit --owed and both consistency forms.
- brief 04-surfaces/05-intent.md generated appendix: the union of the
  sub-verbs (consistency and reclassify); the verb table merged cleanly.
- docs/reference/cli/commands.md, .abcd/development/release/surface.json:
  regenerated with go generate ./internal/surface/cli.

Semantic conflict: `intent consistency ingest` declares a required
--findings-json, and the cli lane's worked-example test refuses a verb
with none, so examples.go gains its worked example.

Assisted-by: Claude:claude-opus-5-5
Measured on a clean clone of 4e4a709 (the tip after the itd34, drain and
itd48 merges) with a dry-run assemble at each position; the window is the
smallest ten-thousand boundary leaving at least one per cent headroom.

- widening:   1,112,251 est. tokens, 4,282,169 bytes: 1,060,000 -> 1,130,000
- entailment:   349,386 est. tokens, 1,345,138 bytes:   350,000 ->   360,000
  (the standing window left 0.18%, under the one per cent asked for)
- detection:  1,121,287 est. tokens, 4,316,957 bytes: 1,060,000 -> 1,140,000

Comparative is exempt and unchanged.

Refs: iss-2609251455354719
Assisted-by: Claude:claude-opus-5-5
main carries integ1 (#725), integ2 (#726) and integ3 (#727). Resolved by hunk:
- internal/core/record/record.go: RecommendedVerbPaths is the union, carrying
  both this branch's intent audit and main's capture reframe; record_test.go
  unions the closed-list want map and keeps both sides' new tests (the review
  moves and the re-emit pin, with the admission, surprise and reframe
  descriptions).
- .abcd/config/reading-presets.json: main's window figures, re-measured at the
  merged tip in a later commit.
- docs/reference/cli/commands.md and surface.json: regenerated with
  go generate ./internal/surface/cli.

Semantic conflicts fixed here:
- TestEveryVerbWithARequiredInputCarriesAWorkedExample met the verbs integ1-3
  landed. examples.go gains a worked example for ahoy connect, capture admit,
  reframe and surprise, lab harvest, mint, preflight, record and sweep, and
  scribe assemble and ingest. Each was run as written in a scratch repository
  under a temporary HOME: each reaches a domain refusal, and lab mint mints.
- TestEveryTopLevelVerbRendersStateBareOrIsAnException met scribe, a parent
  that prints its sub-verbs bare. barerender.go records it as an exception,
  which the brief's Bare invocation paragraph already names.
- main's TestNoCurlyQuotesInGoSource met itd48's consistency.go and its test.
  The heading regexp, the rendered end quote and the test fixture now spell
  the glyphs as escapes, with the same bytes at runtime.

Assisted-by: Claude:claude-opus-5-5
The review of the integration branch found that the `abcd intent audit`
sentence, "Writes nothing bare, an OWED stub otherwise", over-claims for
--issue-drift, a fourth mode that also writes nothing. The sentence now
names the drift check, and it says the OWED stub is written only for --owed
or an intent id, which is true of all four modes. It is 159 characters.

Assisted-by: Claude:claude-opus-5-5
The integ4 review noted, out of scope, that `abcd capture defer` prints
"ledger of <absolute cwd>" on stdout unscrubbed. The capture records what a
reproduction at this tip shows: the line is the checkout banner every
capture verb prints, on stderr, and it is home-redacted.

Refs: iss-2609261737325810

Assisted-by: Claude:claude-opus-5-5
…y design

A reproduction at this tip shows the line the review saw is the checkout
banner every capture verb prints on stderr. It is home-redacted, and
routing it through scrubPaths would reduce the working directory to ".",
which erases the checkout identity the banner exists to give. The review ran
with a temporary HOME and a scratch repository outside it, so the path
could not be home-redacted. No capture verb prints a path on stdout outside
--json's ledger member.

Resolves: iss-2609261737325810
Assisted-by: Claude:claude-opus-5-5
Measured on a clean clone of f074685 with a dry-run assemble per position;
window = ceil(tokens * 1.01 / 10000) * 10000.
- widening:   1,249,424 tokens / 4,810,285 bytes; 1,200,000 -> 1,270,000
- entailment:   367,204 tokens / 1,413,738 bytes;   370,000 ->   380,000
  (the old window had 0.76% headroom, below the 1% floor)
- detection:  1,258,460 tokens / 4,845,073 bytes; 1,200,000 -> 1,280,000
Comparative is unchanged.

Refs: iss-2609251455354719

Assisted-by: Claude:claude-opus-5-5
@REPPL
REPPL enabled auto-merge September 26, 2026 18:05
…s it

TestGuardHookMasksAttackRunesInADroppedRepoLayer relied on a JSON type error naming the offending map key. Go 1.27's encoding/json does; Go 1.26.7, the toolchain go.mod pins and CI builds with, does not, so the test's own precondition failed on the ubuntu leg of #728 while passing locally. An unknown top-level key reaches the strict decoder's unknown-field error, which names the key on both toolchains; the masking assertion is unchanged.

Assisted-by: Claude:claude-opus-5-5
@REPPL
REPPL added this pull request to the merge queue Sep 26, 2026
Merged via the queue into main with commit 711ce17 Sep 26, 2026
22 of 23 checks passed
@REPPL
REPPL deleted the integ/land-4 branch September 26, 2026 20:12
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