v0.30.1 — state-machine review fixes
Four findings from reviewing 0.30.0 the day it shipped. One would have failed at runtime; the other three were contradictions between what the prose said and what the validator enforced.
Fixed
- The state-machine validator is resolved from the plugin root.
design-state-machineandreview-consistencyinvoked it aspython3 tools/lib/state_machine_manifest.py— a path that exists in this repository and nowhere a user actually runs the skill. Both now use${CLAUDE_PLUGIN_ROOT}/tools/lib/…. The contract tests run repository-relative and so could not have caught it. - Rule 5 no longer claims a guard's else branch "is a matrix cell". The matrix has one cell per
(state, event)and that cell isallow— the event is legal there; the guard chooses between outcomes, not between legal and illegal. The else branch lives on the transition (else), which is what the validator already enforced. - A transition's
idempotencyis nowignore|reject, and means one thing: the verdict for a redelivery of the same request (same key, retried message) — return the original outcome, or report the key reuse.allowwas accepted and meant nothing, since a committed transition firing again is the(to, event)matrix cell's decision. The validator refuses it. /architect:pipelineno longer callsanalyze-data-modeldialogue-driven. Optional means skippable; onlycreate-domain-storyanddesign-state-machinetake--auto.
Changed
- The manifest field contract documents
states[].kindandmatrix[].response, which the validator and template already used.
No manifest written by 0.30.0 should exist yet; if one does and carries idempotency: "allow" on a transition, replace it with ignore.
Full detail: CHANGELOG.md (日本語).