A campaign author can find out why a choice was refused or greyed out, and a developer can find out why a replay diverged, without adding logging to the engine by hand. Today the kind reports that a requirement was unmet and stops there, which is correct for the player and useless for the person who wrote the requirement.
03 §8.4 fixes ten event names and the shipped kind declares four. Its own prose singles out two of the missing six as carrying most of the value, for the two audiences the channel exists to serve.
Done when
Agent instructions
Run /slice W86.
- Scope and criteria:
design/30-slices.md § W86 @ 6fd30e04106b4db4db7614faa0e474ff1b160405
- Signatures:
design/03-story-graph-kind.md §8.2, §8.4; design/05-observability.md §2, §9; design/04-core.md §3
- Out of scope here: an author-facing presentation of these events (routes to content tooling, 05 §13); new event names; changing any severity the table fixes; the sink implementations, which already ship
Stop conditions and procedure: .claude/commands/slice.md. Not restated here.
A campaign author can find out why a choice was refused or greyed out, and a developer can find out why a replay diverged, without adding logging to the engine by hand. Today the kind reports that a requirement was unmet and stops there, which is correct for the player and useless for the person who wrote the requirement.
03 §8.4 fixes ten event names and the shipped kind declares four. Its own prose singles out two of the missing six as carrying most of the value, for the two audiences the channel exists to serve.
Done when
datafields it lists and no others, and all ten are declared inKind.eventNames. A test enumerates the declared names against the emitted ones so a future row cannot be declared without an emit site or emitted without being declared.requirement.evaluatedfires once per requirement rather than once per choice, asserted on a choice carrying more than one requirement with the exact event count stated. The row's stated purpose does not survive its owndatacolumn, and that discrepancy (03 §8.4 says a compound condition "reports which clause failed", but the row declareschoiceIdandsatisfiedonly) is stated in the pull request rather than resolved by widening the column.serialize()output and identicalStateChangearrays.npm run typecheck,npm run lintandnpm testpass fromsrc/engine/.Agent instructions
Run
/slice W86.design/30-slices.md§ W86 @6fd30e04106b4db4db7614faa0e474ff1b160405design/03-story-graph-kind.md§8.2, §8.4;design/05-observability.md§2, §9;design/04-core.md§3Stop conditions and procedure:
.claude/commands/slice.md. Not restated here.