Four cuts Soul named on pass 2, none of them behaviour changes.
- runtime.rs: delete the `source_version` presence check in
`admit_controller_command`. It called `.ok_or_else(...)?` and discarded the
value, so it validated nothing. The `expected_revision = source_version - 1`
computation on the approve/activate path is untouched; that one still needs a
caller-supplied binding.
- world/patch.rs: drop `Serialize`/`Deserialize` from `RefKind`.
`RefKind::Subject(Option<SubjectKind>)` is an internally tagged newtype over a
non-map, which serde refuses at runtime, so the derives were unexercised
weight. `RefKind` is never persisted: it appears only in `Mismatch` (not
serializable), the resolution index, and the three kind constants. Soul's
`soul_ref_kind_is_not_a_serializable_shape` cannot compile as a negative
without the derives it falsifies, so it is deleted; the doc comment on
`RefKind` now carries the rule it was proving.
- world/mailbox.rs: document that `submit_stamped` stamps `world_id` as well as
`revision`, and why — the mailbox owns exactly one world, so there is no other
world a controller runner could mean. The consequence is that
`WorldKernel::submit`'s `WorldMismatch` check is unreachable on this path;
`soul_a_stamped_submission_still_fails_closed_on_a_foreign_scope` stays as the
proof that scope still fails closed.
- world/mod.rs: `ComponentOp` and `RouteDeclaration` are test-only, so their
import moves behind `#[cfg(test)]`.
ghostlight-persona-projection: `opportunity_digest` no longer claims to bind
"world state as one value"; pass 2 made it bind the scope digest.
cargo test -p ghostlight-dungeon --bin ghostlight-dungeon world::
75 passed (76 minus the deleted RefKind test), 1 ignored.
cargo test -p ghostlight-dungeon: 110 passed + 1, 1 ignored.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>