feat: a scope condition is dispositioned from a reading run or a delivery - #704
Merged
Merged
Conversation
capture.findReadingItem and readingItemPaths move into internal/core/readingitem as Locate and Paths, beside LocateDisposition and ResolveOccasion, the one occasion resolver the condition, admission and reframe verbs share (spc-2609020626046252). core/intent needs the locator and cannot import core/capture, which imports it, so the walk lives below both. capture keeps its two names as thin wrappers: every refusal is still its own sentinel with its own message, and also satisfies errors.Is for the leaf's, so callers on either side of the move read one error. Assisted-by: Claude:claude-opus-5-5
…delivery `abcd intent condition <itd-N> <cond-id> --disposition <value> --occasioned-by <rdi-N|itd-N> --grounds "<why>" [--narrowing "<text>"]` is the second writer into a shipped intent's scope-condition dispositions (spc-2609020626046252). It appends one dated block to `## Audit Notes`, keyed to the condition's stamped identity and naming what occasioned it; the one-operand form renders each condition's standing and writes nothing. - internal/core/condition, a new leaf, holds the four values, the identity marker, both block grammars, the reader and the Standing fold: the last block in document order stands, except that a verdict block leaves a condition block standing unless its rationale names that block's occasion. audit.go's enum and review marker and claims.go's identity marker read it. - The verdict ingest ends a replaced block at either grammar's marker, so a condition block written after an OWED stub survives the ingest, and it reports the condition blocks it leaves standing. - Both writers render the disposition bullet through one helper, so one reader parses both. Grounds and narrowing are redacted, folded and held to the grounds substance floor; every field goes through oneLine. - A reading item's constraint_in_play citing a different condition is reported, never refused. The detection definition (0.1.3) tells the reading to cite the identity there. - A reading-package regression guard holds that no condition block reaches a bundle: the Audit Notes heading is already withheld (ac-8 held on main). The spec places this build at Step 5, after the four Iteration 2 readings. No reading has run here, and the research workstream moved to a separate fork on 2026-09-23; the run's later scope rulings win. The readings are pinned to an earlier commit, so building now changes nothing they read. Assisted-by: Claude:claude-opus-5-5
…pans The three `<!-- cond: … -->` markers on itd-199's scope conditions sat inside backticks, which the claim reader reads as documentation of the grammar and never as an identity. The record therefore carried no conditions, the verdict dispositions keyed to the three identities joined to nothing, and the condition verb refused to re-disposition cond-2608312031028702, the case its own spec names. With the backticks gone the read form reports all three with their verdict dispositions. The prose of each condition is unchanged. Refs: iss-2609250947113245 Assisted-by: Claude:claude-opus-5-5
…ities Resolves: iss-2609250947113245 Assisted-by: Claude:claude-opus-5-5
Every acceptance criterion holds on this branch: the dated block, the four value refusals, the unresolved-occasion and unshipped-bucket refusals, both blocks standing with the later reported, and the bundle guard. The close parks the intent's fidelity-review OWED stub. The close moved the spec to closed/ and the intent to shipped/; three relative links it stranded are repointed by hand: the spec's link to its intent, its link to the principles spec, and the principles spec's link back. Delivers: itd-2609020625405251 Assisted-by: Claude:claude-opus-5-5
…dence Standing folded by document position on the premise that both writers append, so position is the order of writing. The verdict ingest does not append: it replaces the receipt's OWED stub in place, and the stub is parked at ship time, before any condition block exists. So on every writer-produced record a verdict ingested after a condition block sits ABOVE it, and a verdict naming the block's occasion never overrode it (review of the cond lane, finding 1, probe A). The fold is now source precedence, per the orchestrator's ruling: a verdict entry replaces a condition entry iff its rationale names that condition's occasion, wherever either sits; condition blocks among themselves, and verdict blocks among themselves, keep document order. Watched red on 0449369: TestVerdictNamingTheOccasionOverridesWhereverItSits (leaf) and TestShipConditionIngestOverridesThroughTheWriters (ship -> condition -> ingest through the real writers). Assisted-by: Claude:claude-opus-5-5
A second ingest for an INGESTED receipt returned noop whatever it carried, so an auditor who named a reading-occasioned block's occasion and ingested again, as the spec, commands/intent.md and the ingest's own "still standing" hint told them to, changed nothing (review of the cond lane, finding 1, probe B). Per the orchestrator's ruling a re-ingest is now judged by what it renders: the block already on the record is a noop, a different block replaces it in place after the first ingest's policy and validation checks (reported as `replaced`), and a payload that does not validate is refused with nothing written rather than dead-lettered over a verdict already ingested. No recorded decision makes the ingest write-once; itd-80's ac-5 asks that the notes not be duplicated, which the in-place replacement keeps. The replacement keeps the old block's blank separator, so a following block is not glued to it. The review block's extent is one helper, shared by the replacement and the comparison. The ruling is recorded in DECISIONS.md, the closed spec carries a dated correction of its position premise, and commands/intent.md and the brief's intent surface chapter state the fold and the re-ingest. Watched red on 0449369: TestReingestNamingTheOccasionOverrides, TestReingestOfAnInvalidPayloadNeverReplacesAnIngestedVerdict (core), and TestIntentAuditReingestReportsTheReplacement (CLI render, watched red against the unchanged cli.go). Assisted-by: Claude:claude-opus-5-5
Refs: iss-2609251052591014, iss-2609251052592668, iss-2609251053001508, iss-2609251053005833 ResolveOccasion strips a suffix to recover the repository root and scans every record family for one intent; refuseSymlinkedDir is defined twice; the issue ledger's root is spelled in seven packages; appendToAuditNotes opens a section that already holds a block with a double blank line. Assisted-by: Claude:claude-opus-5-5
ResolveOccasion took an issues root and, for an itd-N occasion, recovered the repository root by suffix-stripping .abcd/work/issues off it, while its one caller joined that suffix on only for it to be stripped; it then built a full record resolver over every family to find one intent, so an unreadable spec store refused an intent occasion. It now takes the repository root and derives the ledger from it, and the intent lookup reads the intent store alone through a new recordid.LookupOne, which scans only the id's own family. The signature in the closed spec and the two open specs that name it follows. Watched red: TestLookupOneReadsOnlyTheIdsFamily (build: undefined), TestResolveOccasionReadsOnlyTheIntentStore and the repointed ResolveOccasion tests (the suffix check refused a repository root). Refs: iss-2609251052591014 Assisted-by: Claude:claude-opus-5-5
… root Resolves: iss-2609251052591014 Assisted-by: Claude:claude-opus-5-5
refuseSymlinkedDir was defined twice with identical bodies, in capture and in the readingitem leaf, since the locator moved. The leaf now exports it as RefuseSymlinkedDir, and capture's seven call sites reach it through capture's name, mapped onto capture's ErrPathUnsafe by the same wrapper the locator uses: one judgement, both sentinels, message unchanged. Watched red: TestSymlinkGuardIsTheLeafs, first on the build (undefined leaf export), then on the assertion that capture's refusal is also the leaf's sentinel. Refs: iss-2609251052592668 Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609251052592668 Assisted-by: Claude:claude-opus-5-5
The repo-relative root .abcd/work/issues was a string literal in seven packages. recordid, the stdlib-only leaf every one of them can import without a cycle, now exports it as IssuesRelDir; capture.LedgerRelPath, changelog, lifeboat, lint and readingitem name it through that constant (intent's copy went with the ResolveOccasion fix), and TestIssuesLedgerRootIsSpelledOnce refuses a new literal anywhere under internal/ outside the definition. Watched red: TestIssuesLedgerRootIsSpelledOnce named the five remaining literals before the change. Refs: iss-2609251053001508 Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609251053001508 Assisted-by: Claude:claude-opus-5-5
appendToAuditNotes wrote one blank line under the heading and then copied the section back with its own leading blank, trimming only the trailing ones, so every write into a section that already held a block (a condition block after the OWED stub, on every shipped record) opened it with two. Leading blanks are trimmed as trailing ones are. Watched red: TestAppendToAuditNotesOpensWithOneBlankLine (the block-already-there and CRLF cases). Refs: iss-2609251053005833 Assisted-by: Claude:claude-opus-5-5
Resolves: iss-2609251053005833 Assisted-by: Claude:claude-opus-5-5
Review 2 of the cond lane found that a review block's extent runs to the next marker, heading or end of file, so text a person wrote under an ingested block is taken as part of it: an identical re-ingest deletes it, and the first ingest deletes trailing link-reference definitions under the owed stub. Neither shape is in the tree today; both are captured for one bounded-extent fix. Refs: iss-2609251451434656 Refs: iss-2609251451432601 Assisted-by: Claude:claude-opus-5-5
Assisted-by: Claude:claude-opus-5-5
Merging main (36b0e86) into this branch grew every tree-bounded reading object. Each window is re-measured by dry run over a clean clone of the merged tip eeff3b6 against the rule the entries state, the smallest ten-thousand boundary leaving at least one per cent headroom. Widening measures 989,958, past its 980,000 declaration, so it moves to 1,000,000 (1.01 per cent); entailment measures 332,485, 2.26 per cent under 340,000, so its declaration stays and only its measured fields move; detection measures 998,994, past its 990,000 declaration, so it moves to 1,010,000 (1.10 per cent). Comparative is bounded by the widening run it is handed, not by the tree, and is exempt by name. Detection's declaration is now past a million estimated tokens, which the entries' own comment calls the reader's window; that is captured separately. Assisted-by: Claude:claude-opus-5-5
Refs: iss-2609251455354719 Assisted-by: Claude:claude-opus-5-5
REPPL
enabled auto-merge
September 25, 2026 15:07
github-merge-queue
Bot
removed this pull request from the merge queue due to a conflict with the base branch
Sep 25, 2026
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.
A scope condition can be dispositioned from a reading run or a delivery with one verb, and a fidelity verdict that names the condition's occasion overrides it. With this, itd-2609020625405251 ships.
internal/core/conditionholds the four disposition values, thecond-…identity marker, the two block grammars, and the one reader that folds them into a condition's standing.internal/core/readingitemlocates reading items and dispositions across every run, refuses a symlink at each level, and holds the one occasion resolver. The four later reading intents build on both.abcd intent conditionwrites a dated condition block. The standing folds by source precedence, not by position: a verdict replaces a condition entry exactly when its rationale names that condition's occasion, wherever either block sits.intent audit ingest: re-ingesting an identical verdict is a no-op. A verdict that renders differently replaces the ingested block in place and reportsreplaced. An invalid payload is refused with nothing written, and never dead-letters over a good verdict.The reading windows were recalibrated at the merged tip (1a19fe5). Detection now declares 1,010,000 estimated tokens, past the million-token reader its entry names; that is captured (iss-2609251455354719) for a ruling.
Review: Fable 5.1. The first round asked for the verdict override to reach through the writers, not only hand-built content. The fix round was verified: SHIP. Reading-corpus change: the window eval passed.
Resolves: iss-2609250947113245
Resolves: iss-2609251052591014
Resolves: iss-2609251052592668
Resolves: iss-2609251053001508
Resolves: iss-2609251053005833
Refs: iss-2609251451434656
Refs: iss-2609251451432601
Refs: iss-2609251455354719
Delivers: itd-2609020625405251
Assisted-by: Claude:claude-opus-5-5