Roll back script_state on undo/retry; fix retry double-apply
The shared per-adventure script_state ("scoreboard" scripts write to) was
never reverted by undo, and retry re-ran the output hook on top of the already-
mutated state, double-applying its changes (e.g. "+10 gold" became +20).
Each action now snapshots script_state as it was immediately before its own
hooks ran (new Action.state_before column, migration 25):
- undo restores the turn's first-action snapshot, prunes memories that
summarized the removed actions, and takes the turn lock against races.
- retry restores the AI action's snapshot before regenerating.
Story-card mutations are not reverted (documented limit). Adds the project's
first test suite: unit + full HTTP integration through the real scripting
engine (14 tests). See plan/11-state-revert-and-retry-fix.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
92044a53c4
commit
dab1807118
@@ -75,6 +75,10 @@ MIGRATIONS: list[tuple[int, str]] = [
|
||||
# re-synced on demand. NULL for copies made before this column existed.
|
||||
(24, "ALTER TABLE adventure_scripts ADD COLUMN source_script_id INTEGER "
|
||||
"REFERENCES scripts(id) ON DELETE SET NULL"),
|
||||
# Per-action snapshot of the shared script_state as it was before that
|
||||
# action's hooks ran, enabling undo/retry to roll state back. JSON is valid
|
||||
# on both SQLite and Postgres.
|
||||
(25, "ALTER TABLE actions ADD COLUMN state_before JSON"),
|
||||
]
|
||||
|
||||
LATEST_VERSION = max((v for v, _ in MIGRATIONS), default=1)
|
||||
|
||||
Reference in New Issue
Block a user