Version. 0.1 · Date. 2026-08-10 · Author. Claude Code (drafting, from the grant-pathway brief) / Marvin Percival (approving).
Target. /Users/dunin7/loomworks-engine, branch main. Surface touched only if Step 1 proves a render site lives there (verify-then-do; live surface is /Users/dunin7/loomworks).
Baseline. Engine 5e6cd17. CC confirms at Step 0.
Companion to. inspection-briefs/loomworks-b81-grant-pathway-step-0-findings-v0_1 (record c80cd99) — the source for every fact below; where this CR and the brief disagree, the brief governs, verified against code.
Charter. Autonomous regime. Status. DRAFT — awaiting the gate. Do not execute.
Closes. B-81 (its remaining, grant-pathway half — the truthfulness half closed at CR-2026-199).
produce_artifact ruling: a grant does what its own words say and nothing wider. It also inverts safely: someone who meant everywhere can say so; someone who meant here and got everywhere can't know they did. The held card must name the scope explicitly. (No schema change needed: DelegationScope is already "all" | [engagement ids] and verify_companion_authorization already matches scope-covers-engagement.)per_action cards each act — but both actual mitigations are the wrong kind to lean on: the "always" markers producing pre_authorized are exactly what a loose matcher over-catches, and the Tier-1 forcing flag is slice-scoped by its own record. Loosening stays out; per the brief's deciding finding it is unnecessary anyway — the exact-prefix matcher stays exact and is shown the Operator's own words.Two sub-causes from the brief, both now cheap because the deciding question answered well:
extract_delegation_grant runs on the classifier's rewritten personal_fact (router.py:3570) while the raw Operator text is already a parameter of the same function (message, router.py:3477). "Remember about me: you can draft specifications" → paraphrased to "Can draft specifications." → no prefix match → the grant silently becomes a plain note._route_add_knowledge has no grant recognition, and route_intent carries message to its call site and drops it at the last hop (router.py:3971-3979). The denial reply's own suggested sentence, typed in-engagement, commits as a project note.
And the blocker in front of both, per ruling 2: a held delegation renders as raw JSON (HeldItem.content = a.content verbatim, router.py:966-975; to_assertion_content is json.dumps) and the ack quotes the sentence without naming it a grant — the confirm cannot carry the knowability the seed requires.
First — the confirm becomes readable (engine, possibly surface):
DelegationContent, never from the model.HeldItem, show_held, and the Memory-room held card's API path at minimum) and the fix composes the human rendering server-side from the parsed content. Preference: compose into the existing content-string channel so no wire-schema change is needed; HALT if a render site genuinely requires one — a new wire field is a decision, not an implementation detail.Then — reachability, as two minimal wires (ruling 3):
_route_remember_about_me: extraction runs on message (already in scope); the note text for non-grant facts keeps using the extracted paraphrase.route_intent forwards message into _route_add_knowledge (one kwarg, one parameter); the same extraction runs ahead of the plain-note path. A recognized grant follows the grant flow (held delegation + the ruling-2 ack); everything else falls through to the note path unchanged.engagement_id present defaults scope=[that engagement]; scope="all" only on an explicit everywhere-marker (an enumerated, exact list — e.g. "across all projects", "everywhere", "on all my projects" — extending the extractor's existing marker discipline, not loosening it). The personal path (no project context) keeps "all" — there is no narrower referent to default to, and the sentence was said outside any project.verify_companion_authorization, the delegation schema, or the approval-card machinery.personal_fact that is a paraphrase and a message carrying the grant sentence: a delegation is held (fails today — plain note).add_knowledge with message forwarded: a delegation is held, not a project note (fails today — no wire).scope == [engagement_id]; with an everywhere-marker → "all"; personal-path grant → "all" (fails today — always "all").request_draft in that engagement and is denied in another (exercises the existing scope matching under the new default).Per the CR-2026-199 discipline: the positive tests assert the presence of the grant object/rendering in the controlled channel, not word-absence; each is run against pre-fix code and its failure observed before the fix is trusted.
Report anything found; fix nothing beyond §2. The Step 1 render-site enumeration in particular reports every place delegation JSON currently escapes to a surface, even ones out of this CR's reach.
B-69 applies. Delegation content, prompt acks, and routing wires are unlikely to touch seed state — record Kind C with what was checked. A null finding is an entry.
| Step | What | Mode |
|---|---|---|
| 0 | Pre-flight — baseline 5e6cd17, tree clean. | Auto |
| 1 | Enumerate every render site a held delegation's content reaches. HALT if readable rendering requires a wire-schema change at any site. | Auto, conditional halt |
| 2 | The readable confirm: server-composed grant ack + human rendering at every Step-1 site. | Auto |
| 3 | Reachability wires (1b then 1a) + scope defaulting. Strictly after Step 2 (ruling 2 — the order is load-bearing). | Auto |
| 4 | Tests per §4, each observed failing first; full suite; ruff; mypy. | Auto |
| A | Checkpoint — including the product eye-test plan for the gate. | Checkpoint |
| 5 | Tag cr-2026-200-b81-grant-pathway. Push. Watch the CI run and report its result. | Auto |
classified_intent of every eye-test turn before teardown).
Execute CR-2026-200 v0.1 at change-requests/cr-2026-200-loomworks-b81-
grant-pathway-v0_1.md in loomworks-record. Confirm the CR number and
the baseline first.
§0 carries the Operator's four rulings verbatim. Don't re-raise them.
The order in §2 is load-bearing: the confirm becomes readable BEFORE
reachability is added — reachability first would widen a confirm that
can't be read.
The deciding finding from the brief: the raw text is already a
parameter of _route_remember_about_me, and route_intent drops it one
hop from _route_add_knowledge. Two minimal wires. No pre-dispatch
interception. No matcher loosening — pin that with the negative
controls.
Scope defaults to this engagement when granted in-project; "all" only
on an enumerated everywhere-marker; personal-path grants keep "all".
The held card names the scope.
HALT at Step 1 if making the held grant readable requires a wire-schema
change at any render site — a new wire field is a decision, not an
implementation detail.
Gate item 1 is the arc closing: the sentence the Companion itself
suggests, typed in a project, must finally do what it says — and the
card the Operator confirms must say what it does.
DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-200 — B-81 grant pathway — v0.1 — 2026-08-10 The matcher stays exact; it is shown the Operator's own words; and the confirm says what it grants.