Version. 0.1 · Date. 2026-08-11 · Author. Claude Code (drafting, from the B-86 scoping) / Marvin Percival (approving).
Target. /Users/dunin7/loomworks-engine, branch main.
Baseline. Engine 64610b4. CC confirms at Step 0.
Companion to. inspection-briefs/loomworks-b86-b87-scoping-report-v0_1 Part 2 (the ruled remedy) 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.
conversation_turns durably records classified_intent and structured_data, but the operation outcome — denied / approval_card / executed / … — survives only inside prose. This CR makes it a recorded fact on the turn. It proceeds as its own thing, unchanged by the extraction ruling.
A. New nullable TEXT column operation_outcome on conversation_turns (own column, the organized_view_citation/CR-2026-204 precedent — a fact about the turn, not a payload the turn produced; structured_data's one-payload slot stays untouched).
B. The value is the discriminator the route already computed — persisted verbatim, never re-derived. Enumerated from code at drafting (pre-flight shape 4), frozen as one frozenset in orchestration (single-source-of-truth discipline), asserted at the write:
operation_data["outcome"] (request/approve flow): no_project, missing_shape_type, missing_target, denied, approval_card, executed, approved, nothing_pending — with executed split to executed / executed_then_failed by execution_result["status"], the same server fact CR-2026-199/201 branch on (recording raw executed over a failed execution would persist the exact falsehood this arc exists to kill), and approved split to approved / approved_then_failed on the same rule.operation_data["action"] (memory/delegation flow): held, refined, retracted, confirm_retraction, delegation_held, delegation_revoke_proposed, delegation_revoked, no_match, no_exact_match, no_personal_fact, ambiguous.operation_data["error"] (add_knowledge / remember error branches): persisted as error:{key} with the enumerated error keys.general_conversation, orient, creation flow, no route_result — writes null. Step 1 verifies this enumeration is complete against the router (the fifth-wrong-premise check); any value found beyond it is added to the frozenset before the migration, not discovered at test time.
C. Write site: the step-7 companion record_turn in operator_converse, via a small pure derive_operation_outcome(route_result) — one function, unit-testable without the pipeline. record_turn gains the kwarg; membership in the frozenset asserted there (TEXT column, no DB CHECK — the vocabulary will grow with intents; the code-level single source is the enforcement surface, and a test pins that every discriminator literal in router.py is in the set).
delegation_held — restoring the forensic distinction the redirect costs (its §1B). The two CRs compose but do not depend: either lands alone.tune_setting (NON_CONVERSATION_INTENTS) records no turn at all today — so it records no outcome. Unchanged; named so it is not read as a gap later.
derive_operation_outcome: one case per §1B row, including both split rules (a failed execution derives executed_then_failed, never executed) and the null rows. Write path: outcome persisted on a delegated turn; null on a general_conversation turn; assertion rejects a value outside the frozenset. Vocabulary completeness: the suite test collecting router discriminator literals against the frozenset (observed failing by removing a value first). Migration up/down. Existing turn-recording suites re-run explicitly.
Kind C expected: the discriminator is computed by routes from delegation/memory state, not the seed; the write is a turn column. Checked at Step 1 across every §1B source site. A null finding is an entry; recorded either way.
| Step | What | Mode |
|---|---|---|
| 0 | Pre-flight — baseline 64610b4, tree clean. | Auto |
| 1 | Verify §1B enumeration complete against router (briefs govern); tests written and observed failing. | Auto |
| 2 | Migration; frozenset; derive_operation_outcome; record_turn kwarg; step-7 wiring. | Auto |
| 3 | Full suite; ruff; mypy; migration up/down verified. | Auto |
| 4 | Eye-test: one delegated turn and one conversational turn live; column read back (standing eye-test discipline). | Auto |
| A | Checkpoint. | Checkpoint |
| 5 | Tag cr-2026-205-persist-operation-outcome. Push. Watch the CI run and report its result. | Auto |
executed/approved.
Execute CR-2026-205 v0.1 at change-requests/cr-2026-205-loomworks-
persist-operation-outcome-v0_1.md in loomworks-record. Confirm the CR
number and baseline first.
§0 is settled: persist, don't route. If the diff touches the
classifier's prompt or its history assembly, stop — that is the
ruled-out half.
The value is the discriminator the route computed, verbatim, with the
two split rules (executed_then_failed / approved_then_failed) — never
re-derived, never prose-parsed. Step 1's enumeration-completeness
check is the fifth-wrong-premise check; run it against the router
before the migration is written.
Each test observed failing first.
DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-205 — persist the operation outcome — v0.1 — 2026-08-11 The server knew what happened; now the record does too.