Record the Cut 2 fix batch, Soul pass 2 and two operator rulings

The fix batch landed at afca403 and acb9b33: identical lens weights are
refused as no canonical change, and the forged all-zero row is now caught
only by the draw rule. Soul's second pass found that the no-op check
compares map spelling, so a set padded with a zero entry still commits.
That fix is folded into Cut 3, next to the divisor guard.

The Cut 2 spec's claim that identical weights commit is now marked as
history. The implementation plan names a NoEffect variant that the kernel
never had; it now describes the NoCanonicalChange refusal that exists.

Operator rulings: the browser create form (L1.f11) is fixed in Dungeon
pass D2. Draft approvals (L1.f12) are deferred until multi-player
membership returns, and lens weights are excluded from any future binding
because they do not affect what an approver sees.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-16 15:45:58 +02:00
commit 1a402e1d45
2 changed files with 42 additions and 3 deletions

View file

@ -800,8 +800,10 @@ not repo artifacts.
=> { require_owner(state, &command.caller)?; if !weights.draws() {
return Err(KernelError::PatchRejected(vec![Mismatch::LensWeightsNeverDraw])); }
Ok(WorldEffect::LensWeightsReplaced { weights: weights.clone() }) }`.
Identical weights are still a commit (the owner's act is canonical, as an
empty-motion tick is, `lib.rs:1619-1621`); the doc says so.
History: this spec said identical weights are still a commit, likening
the owner's act to an empty-motion tick. Superseded by c2.s1.f1: an
identical set changes nothing canonical and is refused with
`NoCanonicalChange`, while a tick moves fictional time.
- `lib.rs:4708-4894` `apply_effect`: arm `WorldEffect::LensWeightsReplaced
{ weights }` re-deciding `require_owner` and `draws()` (the same
re-decide shape as `WorldActivated`, `:4788-4798`) then `state.lens_weights
@ -996,6 +998,32 @@ not repo artifacts.
passes with `draws()` weakened. Fix: build the forgery so its digests are
consistent and only the draw rule can refuse it, then mutate `draws()` to
prove it.
- **Fix batch landed:** `afca403` (c2.s1.f1) and `acb9b33` (c2.s1.f4).
- `reduce`'s `SetLensWeights` arm refuses a set equal to the current
weights with `PatchRejected([NoCanonicalChange])`, after the capability,
owner and draw checks. The kernel has no `NoEffect` variant; the
existing "valid but changes nothing" refusal is used, and the
implementation plan's wording is corrected to match.
- The forged-row test now builds self-consistent forgeries. A control set
rebuilt the same way replays, so only the draw rule refuses the all-zero
row, at `verify_state_shape`.
- Mutations: MF1.1 (the equality check deleted) fails the external and
in-crate tests; MF4.1 (`draws()` changed to `!is_empty()`) fails the
forged-row test.
- Counts: library 435, doc 10, external_admission 11, Dungeon 53,
build_provenance 1, persona-projection 13. Warnings identical.
- **Soul findings, pass 2** (all against `acb9b33`; promises 1 and 3–7 of the
batch held):
- **c2.s2.f1 (introduced, low, fix in Cut 3):** the no-op check compares
raw maps, but a missing lens reads as weight zero. `{charter:3}` →
`{patina:0, charter:3}` commits (revision 3 → 4), and changing back
commits again. Both sets draw identically. Fix in Cut 3, beside c1.s1.f2:
equality compares every lens's effective weight, not the map's spelling.
- **c2.s2.f2 (introduced, low, recorded):** only the in-crate test pins
that the no-op check comes after the draw rule (mutation SO.2). The
external test cannot observe it. One pin is sufficient.
- **c2.s2.f3 (introduced, low, fixed here):** this map's Cut 2 spec still
said identical weights commit. It is now marked as history above.
## Cut 3. The lens and its text on the session, in the store, and the adoption rule
@ -1512,6 +1540,8 @@ session on one answer was that nobody wrote one.
Only tests and the smoke harness exercise `world.create`, and Cut 2's
eighth binding inherits the same gap. It bears directly on the playtest
gate (Dungeon pass D2).
- **Ruling:** fix in Dungeon pass D2, which rebuilds the create path anyway.
**Authority:** operator. **Ruled:** 2026-09-16.
- **L1.f12 (pre-existing shape widened by Cut 2, design, operator):** Draft
approvals are bound to nothing. `draft_approvals` (`lib.rs:806`) is only
inserted (`lib.rs:4827`) and read (`lib.rs:1594`, `4837`), never cleared.
@ -1519,6 +1549,14 @@ session on one answer was that nobody wrote one.
a Draft `AdmitPatch`, and activation still succeeds on the original
approval. An approval therefore covers any flavor or structure change
made after it. No spec decided this.
- **Correction:** lens weights are not part of this problem. They shape
what elaboration adds later, not the world an approver sees, and the
owner may change them in any phase (L1-Q3). The substance is structure:
a Draft `AdmitPatch` after an approval.
- **Ruling:** deferred until multi-player membership is rebuilt. Today
approvals are effectively the owner approving their own world. If
approvals are bound then, bind them to the world's structure, excluding
lens weights. **Authority:** operator. **Ruled:** 2026-09-16.
- **L1.f1 (pre-existing, medium, operator-triaged, not blocking L1):** a
sweep error whose `requires_quarantine()` is true reaches

View file

@ -45,7 +45,8 @@ cutover.
- **Outputs:** a rejection receipt changes nothing. An accepted command returns
one `WorldCommit`, including any reducer-issued ID mapping, and atomically
appends one digest-chained revision. A structurally valid command that lowers
to no factual, speech, lifecycle, or time mutation returns `NoEffect` and does
to no factual, speech, lifecycle, or time mutation is refused with
`Mismatch::NoCanonicalChange` inside `PatchRejected` and does
not advance revision, change either digest, allocate IDs, or append a journal
row.
- **Derived state:** immutable snapshots and subject views, currently executable