feat: ADR-0034 — history journal records err + replay parses/filters the journal
Replay (§3): run_replay parses <ts>|<status>|<source> journal records — runs ok, skips non-ok — while still accepting bare .commands scripts (prefix-detected so a | inside a bare command isn't misread). Fixes replay history.log, which died on line 1. Journal failures (§1/§2): failed commands are recorded err via a new Action::JournalFailure, emitted by the pure-sync App for both parse failures and worker-execution failures (runtime appends best-effort, never fatal). Hydration reads all records so typo'd/rejected commands are recallable across sessions. Amendment 1 — replay filters app-lifecycle commands: a working replay history.log exposed that the journal also records save as/load/new/export/import/rebuild/mode (which would panic the worker dispatch or abort replay). Replay now re-applies only schema/data writes and skips every app-lifecycle command + nested replay, classified by entry word so modal/incomplete forms (save as, bare mode) and quit skip uniformly rather than aborting. All skips continue (reversing the nested-replay refusal); import and nested replay warn. replay.error_nested removed; replay.skipped_import/_replay added; ReplayCompleted carries warnings. requirements.md U3/U4 updated; app-command runtime-failure journalling tracked as a follow-up. 1659 passing / 0 failing / 0 skipped / 1 ignored. Clippy clean.
This commit is contained in:
@@ -468,10 +468,11 @@ pub const KEYS_AND_PLACEHOLDERS: &[(&str, &[&str])] = &[
|
||||
("replay.command_echo", &["command"]),
|
||||
("replay.completed", &["path", "count"]),
|
||||
("replay.error_could_not_open", &["path", "detail"]),
|
||||
("replay.error_nested", &[]),
|
||||
("replay.error_parse", &["detail"]),
|
||||
("replay.failed_at_line", &["path", "line_number", "error"]),
|
||||
("replay.failed_open", &["path", "error"]),
|
||||
("replay.skipped_import", &["line", "command"]),
|
||||
("replay.skipped_replay", &["line", "command"]),
|
||||
// ---- UNIQUE violations (anchor: "already has the value") ----
|
||||
(
|
||||
"error.unique.insert.headline",
|
||||
|
||||
@@ -842,4 +842,10 @@ replay:
|
||||
# compose with `failed_at_line`'s `{error}` placeholder.
|
||||
error_could_not_open: "could not open `{path}`: {detail}"
|
||||
error_parse: "parse error: {detail}"
|
||||
error_nested: "nested `replay` is not allowed inside a replay file"
|
||||
# Skipped during replay (ADR-0034): app-lifecycle commands are
|
||||
# not re-applied. Most skip silently; `import` and a nested
|
||||
# `replay` warn because skipping them can leave the replayed
|
||||
# state incomplete (imported data / the nested file's commands
|
||||
# are not reconstructed).
|
||||
skipped_import: "[skip] line {line}: `{command}` — replay does not re-import; the imported data is not reconstructed"
|
||||
skipped_replay: "[skip] line {line}: nested `{command}` — its commands were not replayed"
|
||||
|
||||
Reference in New Issue
Block a user