Skip to content

feat: a scope condition is dispositioned from a reading run or a delivery - #704

Merged
REPPL merged 21 commits into
mainfrom
feat/scope-condition-verb
Sep 25, 2026
Merged

REPPL merged 21 commits into
mainfrom
feat/scope-condition-verb

Conversation

@REPPL

@REPPL REPPL commented Sep 25, 2026

Copy link
Copy Markdown
Collaborator

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.

  • Two new leaf packages. internal/core/condition holds the four disposition values, the cond-… identity marker, the two block grammars, and the one reader that folds them into a condition's standing. internal/core/readingitem locates 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 condition writes 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 reports replaced. An invalid payload is refused with nothing written, and never dead-letters over a good verdict.
  • Four minors from the review are captured and resolved: occasions resolve from the repository root, there is one reading-ledger symlink guard, the issue ledger's root is spelled once, and Audit Notes opens with one blank line. itd-199's condition markers are unwrapped from code spans so they read as identities.
  • Two further minors (an unbounded review-block extent under Audit Notes) are captured for one bounded-extent fix. Neither shape is in the tree today.

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

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
REPPL enabled auto-merge September 25, 2026 15:07
@REPPL
REPPL added this pull request to the merge queue Sep 25, 2026
@github-merge-queue
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
@REPPL
REPPL enabled auto-merge September 25, 2026 15:50
@REPPL
REPPL added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit 3c4c63c Sep 25, 2026
13 checks passed
@REPPL
REPPL deleted the feat/scope-condition-verb branch September 25, 2026 16:43
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