Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f165631
refactor(readingitem): move the reading-item locator into a shared leaf
REPPL Sep 25, 2026
fd584be
feat(intent): disposition a scope condition from a reading item or a …
REPPL Sep 25, 2026
e5346b9
fix(intents): unwrap itd-199's condition identity markers from code s…
REPPL Sep 25, 2026
a8a3b18
chore: resolve iss-2609250947113245 — itd-199's markers read as ident…
REPPL Sep 25, 2026
0449369
chore: close spc-2609020626046252 and ship itd-2609020625405251
REPPL Sep 25, 2026
10faf78
fix(condition): fold a verdict over a condition block by source prece…
REPPL Sep 25, 2026
58f521b
fix(intent): a re-ingest that renders differently replaces the verdict
REPPL Sep 25, 2026
6aed07a
chore: capture four minors from the cond lane review
REPPL Sep 25, 2026
3606c9e
fix(readingitem): resolve an occasion from the repository root
REPPL Sep 25, 2026
d0248f2
chore: resolve iss-2609251052591014 — occasions resolve from the repo…
REPPL Sep 25, 2026
cba6b25
fix(capture): meet the reading ledger's symlink guard through the leaf
REPPL Sep 25, 2026
5b68906
chore: resolve iss-2609251052592668 — one reading-ledger symlink guard
REPPL Sep 25, 2026
ee88b50
fix(recordid): spell the issue ledger's root once
REPPL Sep 25, 2026
1d4bb8c
chore: resolve iss-2609251053001508 — the ledger root is spelled once
REPPL Sep 25, 2026
d12638d
fix(intent): open the Audit Notes section with one blank line
REPPL Sep 25, 2026
bdec703
chore: resolve iss-2609251053005833 — one blank line under Audit Notes
REPPL Sep 25, 2026
cce6066
chore: capture the unbounded review-block extent under Audit Notes
REPPL Sep 25, 2026
eeff3b6
Merge branch 'main' into feat/scope-condition-verb
REPPL Sep 25, 2026
1a19fe5
chore: recalibrate the reading windows at the merged tip
REPPL Sep 25, 2026
abac8ca
chore: capture the detection window passing a million tokens
REPPL Sep 25, 2026
92ed0ae
Merge branch 'main' into feat/scope-condition-verb
REPPL Sep 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions .abcd/config/reading-presets.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@
"test"
],
"window": {
"tokens_est": 980000,
"measured_tokens_est": 964528,
"measured_bytes": 3713434,
"measured_at": "4c9c7be8995a0b53da068763104b7653b1b44b0e"
"tokens_est": 1000000,
"measured_tokens_est": 989958,
"measured_bytes": 3811341,
"measured_at": "eeff3b69722d67b1799bb1a450d7b61efdc1ea83"
}
},
"entailment": {
Expand Down Expand Up @@ -133,9 +133,9 @@
],
"window": {
"tokens_est": 340000,
"measured_tokens_est": 328679,
"measured_bytes": 1265417,
"measured_at": "4c9c7be8995a0b53da068763104b7653b1b44b0e"
"measured_tokens_est": 332485,
"measured_bytes": 1280070,
"measured_at": "eeff3b69722d67b1799bb1a450d7b61efdc1ea83"
}
},
"comparative": {
Expand Down Expand Up @@ -216,10 +216,10 @@
"test"
],
"window": {
"tokens_est": 990000,
"measured_tokens_est": 973565,
"measured_bytes": 3748228,
"measured_at": "4c9c7be8995a0b53da068763104b7653b1b44b0e"
"tokens_est": 1010000,
"measured_tokens_est": 998994,
"measured_bytes": 3846129,
"measured_at": "eeff3b69722d67b1799bb1a450d7b61efdc1ea83"
}
}
}
Expand Down
17 changes: 15 additions & 2 deletions .abcd/development/brief/04-surfaces/05-intent.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ judgement no verb makes.
| `ready` | gate | shipped |
| `audit` | audit | shipped |
| `audit ingest` | audit | shipped |
| `condition` | — | shipped |


## 1. Intent IDs, kinds, and lifecycle
Expand Down Expand Up @@ -280,7 +281,8 @@ Later phase — intent-auditor (shape-classification role) scans the corpus
| Readiness gate (one intent id, optionally with grounds) | **Implement-readiness gate**: reports whether an intent is ready to implement — eight checks, four of which gate: in `planned/`, with acceptance criteria, a bidirectional spec link, and a written spec body. The two claim rows (mechanism prompted-and-nullable, scope conditions with each condition identified) and the grounds row (a discipline record is exempt: it carries no conjecture of its own) are reported as advisory and never withhold readiness, their refusals parked by iss-2609091009111294 until the rethink of the reading work. The steps row is advisory by design: it reports the linked spec's `## Steps` shape — the steps listed and how many have landed, or none and so one step — and names a section that is not a numbered list with the shape it expects (itd-2609212103565953). Exit 0 ready / 1 not ready / 2 fault. Recording grounds, in the form `<pursued\|deferred\|declined>: <conjecture>`, is the gate's one write: it appends the conjecture behind this decision — what is expected, and what would show it wrong — to the intent's `## Grounds` section, append-only ([adr-57](../../decisions/adrs/0057-grounds-accumulate-as-an-append-only-section.md)), and then reports; a shipped or superseded record is never backfilled. | (no move; recorded grounds append to `## Grounds`) |
| Audit (one intent id) | **Role 1 — single-document fidelity.** Takes a **shipped** intent and nothing else: a record still in `drafts/`, `planned/`, `disciplines/` or `superseded/` is refused by name, because only a shipped intent has a delivered reality to be judged against. Compares the intent's press release + acceptance criteria against delivered reality (code, configs, docs, tests). Per-criterion verdicts (`MET` / `MET_WITH_CONCERNS` / `NOT_MET` / `INCONCLUSIVE`) appended to the intent's `## Audit Notes`. Aligns with the spec store's `plan-review` / `impl-review` / `completion-review` vocabulary — same operation shape (adversarial second opinion), different opponent (press release vs engineering spec). spc-12 (predecessor store) ships this **manual** verb; spc-28 (predecessor store) ships the on-close hook (move `planned → shipped` + queue a review), but auto-running the reviewer off that queue is still deferred (no spec currently owns it; spc-6 (predecessor store) disowned auto-firing). | (stays) |
| Issue drift (the whole corpus, optionally strict) | **The promote join's drift check** (itd-4 AC3, in the predecessor store's spc-23 shape): walks the intent store and the issue ledger, readings included, and reports every join that does not read the same from both ends — an intent naming a record in `related_issues` that does not name it back in `related_intents` (from an issue's end a one-way `related_intents` is a loose relation and stays silent; a reading item carries none, so from its end it is reported), either end naming a record the tree does not hold, a shipped intent naming an issue that is not in `resolved/`, and a record still carrying a retired back-link key. Each finding is a warning on stderr and the run exits 0; the strict form exits 1 on any finding, for a CI gate. Findings land in `.abcd/.work.local/logs/audit/issue-drift-<ts>/report.json`. | (no move; writes only its receipt) |
| Audit ingest (a verdict JSON path) | Ingests a host-delegated intent-fidelity verdict JSON, validated fail-closed against the schema and the parked review request, and writes its per-criterion verdict into the shipped intent's `## Audit Notes` (or quarantines a bad payload). | (no move; updates `## Audit Notes`) |
| Audit ingest (a verdict JSON path) | Ingests a host-delegated intent-fidelity verdict JSON, validated fail-closed against the schema and the parked review request, and writes its per-criterion verdict into the shipped intent's `## Audit Notes` (or quarantines a bad payload). A second ingest for the same receipt is a no-op when its payload renders to the block on the record, replaces that block in place when it renders differently, and is refused with nothing written when it does not validate. | (no move; updates `## Audit Notes`) |
| Condition disposition (one shipped intent id, optionally one condition id) | **The second writer into the scope-condition disposition surface.** With the intent alone it is read-only: every scope condition the intent carries, with its standing disposition and the block that disposition came from, or `untested (no block)`; the machine-readable form carries the whole history and the fold. With a condition identity it writes one disposition against a **shipped** intent — `survived`, `narrowed`, `falsified` or `untested` — joined to what occasioned it: a reading item at any position, or a delivered intent in `shipped/` whose delivery changed the condition's standing. It appends one dated block to `## Audit Notes`, beside the fidelity verdict's blocks and in the same bullet shape. A condition's standing is its latest reading-occasioned block where it has one, and otherwise its latest verdict block: a verdict overrides a reading-occasioned block only where its rationale names that block's occasion, wherever the two sit in the section; the verdict ingest reports what it leaves standing, and a re-ingest for the same receipt that names the occasion replaces the ingested verdict. Refused, with nothing written: an intent not in `shipped/` (naming its bucket), an identity the intent does not carry or carries twice, a value outside the four, grounds below the substance floor, `narrowed` without a narrowing or a narrowing on any other value, an occasion that does not resolve, and the intent itself as its own occasion. Grounds and narrowing are redacted before the write. When a reading item's `constraint_in_play` cites a different condition's identity, the mismatch is reported and never refused: the reading names the tension and the researcher marks the condition. The block sits under the heading every reading's assembler withholds, so no disposition reaches a reading. | (no move; appends to `## Audit Notes`) |
| `/abcd:intent consistency [<itd-N>]` | **Role 2 — cross-document fidelity.** Surfaces five judgement categories (terminology drift, premise contradictions, scope leakage, sequencing impossibilities, naming conflicts) across briefs + intents. **Bare** scans the whole corpus; **with `<itd-N>`** narrows to one intent's relationship with the rest. Findings land in `.abcd/.work.local/logs/audit/consistency-<ts>/report.{json,md}`. The judgement half + on-demand verb are the predecessor's spc-29 (a later phase); mechanical-half categories and pre-commit hook are deferred follow-ups. | (stays) |
| `/abcd:intent shape [<itd-N>]` | **Role 3 — kind classification.** Examines whether an intent's declared `kind` (the noun) still fits the corpus. Surfaces *suggested* reclassifications across three live types: `kind_change`, `bundle`, `supersession`. **Bare** scans the corpus; **with `<itd-N>`** checks one intent. Pairs with the reclassify step (action verb that commits a `shape` finding). On-demand only per spc-29 (predecessor store; a later phase); findings land in `.abcd/.work.local/logs/audit/shape-<ts>/report.{json,md}`. Concurrency via `flock(2)` on `.abcd/coordination/shape.lock` (see § 7). Scheduled / continuous invocation is a deferred follow-up. | (stays) |
| The reclassify step, on one intent id | **A later phase — no reclassify sub-verb ships yet.** Late reclassification (e.g., a standalone intent realised to be a bundle-member; a draft realised to be a discipline; a shipped intent superseded by a later one). Records `reclassification_history` entry; moves the file between directories as the new kind dictates. Reclassifying to superseded, naming the successor handle, is the supersession path: the file moves to `superseded/`, frontmatter records `superseded_by: <handle>` — the record that formally supersedes this intent, either an intent (`itd-M`) or an ADR (`adr-M`) when a decision redecided the question — AND `kind_at_supersession: <original-kind>` so future readers know what shape the intent had when retired. | varies by destination kind |
Expand Down Expand Up @@ -605,7 +607,7 @@ _Generated from the command tree; a drift test fails `go test` when this appendi

### `abcd intent`

Sub-verbs: `abcd intent audit`, `abcd intent hold`, `abcd intent link`, `abcd intent new`, `abcd intent plan`, `abcd intent ready`, `abcd intent unhold`.
Sub-verbs: `abcd intent audit`, `abcd intent condition`, `abcd intent hold`, `abcd intent link`, `abcd intent new`, `abcd intent plan`, `abcd intent ready`, `abcd intent unhold`.

| Flag | Type |
|---|---|
Expand All @@ -630,6 +632,17 @@ Sub-verbs: none.
|---|---|
| `--verdict-json` | string |

### `abcd intent condition`

Sub-verbs: none.

| Flag | Type |
|---|---|
| `--disposition` | string |
| `--grounds` | string |
| `--narrowing` | string |
| `--occasioned-by` | string |

### `abcd intent hold`

Sub-verbs: none.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ A table that cannot say what a reading is about cannot distinguish four readings

## Scope Conditions

- Whether a scope should be expressible as a set of record families rather than one target is unknown until several readings have run. The grammar starts closed and narrow; widening it is cheaper than retracting it. `<!-- cond: cond-2608312031029678 -->`
- The comparative position's object is the widening reading's pre-admission output, which is not a subset of the repository and has no channel today. A scope operand does not supply one, and that absence stays open — which is why this intent makes the position refuse rather than quietly serve it the wrong corpus. `<!-- cond: cond-2608312031028702 -->`
- **The impact stays `fix`, and the reasoning is stated rather than left to be reconstructed.** A required operand where none existed is the textbook breaking change, and two things make it a fix here instead. The verb's output cannot be handed to any reader at any position, so there is no working invocation to break; and the comparative position was returning a corpus that is not its object, so its every past run was already wrong. Calling this `breaking` would assert that something usable stopped working, which would be the more misleading of the two labels. `<!-- cond: cond-2608312031020321 -->`
- Whether a scope should be expressible as a set of record families rather than one target is unknown until several readings have run. The grammar starts closed and narrow; widening it is cheaper than retracting it. <!-- cond: cond-2608312031029678 -->
- The comparative position's object is the widening reading's pre-admission output, which is not a subset of the repository and has no channel today. A scope operand does not supply one, and that absence stays open — which is why this intent makes the position refuse rather than quietly serve it the wrong corpus. <!-- cond: cond-2608312031028702 -->
- **The impact stays `fix`, and the reasoning is stated rather than left to be reconstructed.** A required operand where none existed is the textbook breaking change, and two things make it a fix here instead. The verb's output cannot be handed to any reader at any position, so there is no working invocation to break; and the comparative position was returning a corpus that is not its object, so its every past run was already wrong. Calling this `breaking` would assert that something usable stopped working, which would be the more misleading of the two labels. <!-- cond: cond-2608312031020321 -->

## Acceptance Criteria

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ None.

## Audit Notes

_Empty. Populated by intent-auditor when intent moves to shipped/._
<!-- abcd-review: OWED receipt=rcp-dd287c31bbb6 -->
Fidelity review OWED (receipt rcp-dd287c31bbb6).

## Grounds

Expand Down
34 changes: 34 additions & 0 deletions .abcd/development/release/surface.json
Original file line number Diff line number Diff line change
Expand Up @@ -1294,6 +1294,40 @@
}
]
},
{
"path": "abcd intent condition",
"hidden": false,
"flags": [
{
"name": "disposition",
"shorthand": "",
"type": "string",
"required": false,
"hidden": false
},
{
"name": "grounds",
"shorthand": "",
"type": "string",
"required": false,
"hidden": false
},
{
"name": "narrowing",
"shorthand": "",
"type": "string",
"required": false,
"hidden": false
},
{
"name": "occasioned-by",
"shorthand": "",
"type": "string",
"required": false,
"hidden": false
}
]
},
{
"path": "abcd intent hold",
"hidden": false,
Expand Down
Loading
Loading