DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-203-loomworks-raw-message-grant-extraction-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-203 — Raw-message grant extraction ahead of routing: the grant path stops depending on routing (v0.1)

Version. 0.1 · Date. 2026-08-11 · Author. Claude Code (drafting, from the extraction scoping) / Marvin Percival (approving). Target. /Users/dunin7/loomworks-engine, branch main. Baseline. Engine 64610b4. CC confirms at Step 0. Companion to. inspection-briefs/loomworks-raw-message-grant-extraction-scoping-v0_1 (record 9fe62ff) and inspection-briefs/loomworks-b86-dependency-remeasurement-v0_1 (record 34c27cc) — where this CR and the briefs disagree, the briefs govern, verified against code. Charter. Autonomous regime. Status. DRAFT — awaiting the gate. Do not execute.


0. Settled — the Operator's rulings, 2026-08-11. Do not re-raise.

  1. The 32-intent classifier change does not rise. The re-measurement (one wired cell in ten; the denial's own suggested sentence never wired in any condition) decided the remedy: extraction ahead of routing makes the grant path not depend on routing at all. A better classifier makes the happy path likelier; this makes it work.
  2. Position: post-classify, pre-route (step 4a) — the redirect_orient_recall_misroute shape. The forensic classified_intent is worth more than one Haiku call. Revoke-first ordering.
  3. Mitigations: adjacency and word boundaries. Nothing beyond that. The false-capture blast radius is structural, not lexical: authorization reads committed only, the conversational grant lands held — a false capture cannot mint authority; the human commit is the semantic confirmation the regex lacks.
  4. The mention/quotation class stays uncaught — chosen, not missed. "What happens if I say you can draft specifications?" is precisely what held-not-committed absorbs; any lexical guard catching it would start refusing genuine grants. The tests pin this as chosen behavior.
  5. The ack is the real residual and it is truthfulness-family. A held card from a false capture asserts the Companion understood a grant that wasn't offered — a claim about what the person meant. The ack is composed to read as "I think you may have granted this," never "you granted this." CR-2026-200 made the held card readable for exactly this reason.

1. The three changes

A. Tighten extract_delegation_grant (delegation/schema.py): adjacency + word boundaries. Today the prefix and the action are matched independently and unanchored, and actions are bare substrings ("render" matches inside "surrender"); the conservatism was living in the classifier gate this CR removes. New matching: the grant prefix must be followed by the action within a short bounded gap (single combined pattern per prefix–action pair, or a distance check between match spans — Step 1 picks the cheaper to test), and every action matches on word boundaries. The tightening applies at every call site deliberately — the CR-2026-200 remember_about_me/add_knowledge branches inherit it; consistency is the point. Measured false-negative cost at drafting: zero — every genuine grant form in the scoping battery and E0127's live sentence has the prefix adjacent.

B. The 4a redirect: redirect_grant_misroute(classified, message) in classifier.py, applied in operator_converse immediately after redirect_orient_recall_misroute. Pure function, no LLM, no DB. Ordering inside it: (1) if the revocation prefixes match (_REVOKE_PREFIXES"you can't render" matches both grant and revoke prefixes), do not redirect as a grant — fall through unchanged; (2) else if the tightened extract_delegation_grant recognizes a grant and the intent is not already remember_about_me/add_knowledge, redirect to remember_about_me — the CR-200 branch re-runs extraction on the raw message and mints. Forensic tradeoff, named: the stored classified_intent on a redirected turn reads remember_about_me, not what the classifier said — the same tradeoff redirect_orient_recall_misroute already accepted; CR-2026-205's outcome column will record delegation_held, restoring the distinction going forward.

C. Reword the CR-200 ack to tentative composition. Server-composed from the parsed grant as today (capability, scope, approval mode — never the model), but framed as the Companion's reading, pointing at the held card as the confirm: on the shape of "I think you may have granted me standing authority to {action} {scope-phrase} — I've noted it as held. If that's what you meant, commit it from the held card; if not, say so and nothing happens." Exact words are Step 2's; the frame — proposal, not fait accompli — is settled (§0.5).

2. Consequences named, so they are chosen

3. Tests — each observed failing first, per the standing discipline

Matcher: battery fixtures from the scoping brief — clause-separation, distant-prefix, and substring-in-word classes must NOT match post-tightening (fail against the current matcher first); genuine forms (E0127 verbatim, capitalized+period, feel free to take notes whenever with its pre_authorized marker) must still match; mention/question classes pinned as matching-by-ruling; dual-match negation not redirected (revoke-first). Redirect: the re-measurement grid replayed as pure-function cases; intent already remember_about_me/add_knowledge untouched; no grant → untouched. Ack: tentative frame asserted (the words "I think"/held/commit-path present; "you granted" absent). Existing CR-200 grant-branch suites re-run explicitly.

4. seed-mutability impact

Kind C expected: grant recognition, routing, and delegation assertions touch personal-engagement memory and conversation_turns, not the seed. Checked at Step 1: extract_delegation_grant, the redirect site, and the CR-200 branch read nothing seed-derived. A null finding is an entry; recorded either way.

5. Build steps

| Step | What | Mode | |---|---|---| | 0 | Pre-flight — baseline 64610b4, tree clean. | Auto | | 1 | Verify §1 against code (briefs govern); tests written and observed failing; adjacency mechanism picked. | Auto | | 2 | The tightened matcher, the 4a redirect, the tentative ack. | Auto | | 3 | Full suite; ruff; mypy; 412-turn corpus sweep re-run and reported. | Auto | | 4 | Eye-test: E0127's sentence replayed live in a throwaway engagement (standing eye-test discipline: Marvin-Test2, teardown to zero rows, classified_intent captured before teardown, listener start-time verified). | Auto | | A | Checkpoint. | Checkpoint | | 5 | Tag cr-2026-203-raw-message-grant-extraction. Push. Watch the CI run and report its result. | Auto |

6. Acceptance gate

  1. All ten re-measurement cells route wired through the redirect (pure-function fence).
  2. Battery classes behave per §3: tightened-out classes fail to match; genuine forms match; chosen classes pinned with the ruling named.
  3. Revoke-first demonstrated: the dual-match negation does not redirect.
  4. Ack reads as proposal (§0.5); server-composed; CR-200 tests green.
  5. Corpus sweep: one genuine historical match, no new captures.
  6. Eye-test observed live; suite green (zero failures); both gates clean; push run watched and reported.
  7. seed-mutability recorded.

7. Kickoff prompt


Execute CR-2026-203 v0.1 at change-requests/cr-2026-203-loomworks-raw-
message-grant-extraction-v0_1.md in loomworks-record. Confirm the CR
number and baseline first.

§0 carries five settled rulings — position 4a, revoke-first, adjacency+
word-boundaries only, mention class chosen-not-missed, tentative ack.
Do not re-raise them.

The scoping briefs govern where this CR disagrees with them, verified
against code. Each test observed failing first. The re-measurement grid
is the fence: all ten cells wired, as a pure function, no LLM.

The blast-radius fact to keep in view: a false capture cannot mint
authority — held is not committed. The ack is the residual; it reads
as the Companion's reading, never as the Operator's act.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-203 — raw-message grant extraction — v0.1 — 2026-08-11 The grant path stops depending on routing; the human commit stays the semantic gate.