- Dossier_Actions (4 AJAX endpoints, manage_options+nonce): save fork /
queue replay / queue rebuild / stage-status poll. Run identity always
derived server-side from post meta; the AJAX layer validates + queues
ONLY — all mutations happen in the cron handlers (chained-cron, CPO
hard constraint). Fork saves lock message structure (count/roles) so
every version stays replayable.
- Edit panel per editable stage: per-message textareas prefilled from
the latest fork or the recorded request_json; explicit fork +
downstream-stale + queued-execution copy; spend strip with ceiling
warning (filterable fraction, default 0.8). Disabled stages always
show WHY (policy reasons; missing-input retention copy).
- Stale / human-edited / attempt chips per stage + header badges (M2
slot filled); dossier polls stage status while a re-run is active
(board poll interval setting) and re-renders when the run settles.
- F2: sidebar Models & Prompts card (per-stage model/pv/role) + Run
Spend card. F3: log-only stages (image_a/b, llm_research, ...) render
from generation_log + the _prautoblogger_image_role attachment grid.
- M2 correctness: dossier is now item-scoped (idea-hash meta) and
excludes gen_log rows linked to other posts of a multi-article run.
- Run-list visibility (product AC): board cards get a Human-modified
chip; Review Queue rows get a stale-stages chip linking to the
dossier. Both via single batched queries (no N+1).
- v0.20.0 + CHANGELOG + ARCHITECTURE #24 (+ file tree, schema tables,
db-version note) in this commit per versioning discipline.
Agent-Session: engineer-prab-m3-20260612
Two operator primitives, both queued (never synchronous — CPO hard
constraint), all mutations in the cron handler after re-validating
eligibility UNDER the generation lock:
- Replay (Stage_Replay + on_replay_job): one governed chat call from the
latest edited input fork. options_from_body() is the exact inverse of
build_body()+apply_reasoning_budget() (headroom subtracted back out;
reasoning pinned explicitly so global-setting drift can't reshape a
replay). Goes through send_chat_completion -> cost governor reserves
against the SAME run row (guardrail 4), retry/empty-guard machinery,
B1 recorder. Fresh output lands in the stage snapshot; downstream
stale-marked (guardrail 3); human_modified set at execution entry
(guardrail 2).
- Rebuild (on_rebuild_job): demote target+downstream to pending, re-enter
Article_Worker with the idea from the stored seed; upstream done stages
reuse (never re-charged), demoted stages rebuild prompts from CURRENT
snapshots — how an upstream edit propagates. Decisions recorded while
rebuilding a human-modified item are flagged.
- Rerun_Eligibility: published/future/private = frozen (guardrail 5,
server-side); executing runs blocked; editable stages = writer chat
stages (outline/draft/polish); chain-order downstream sets.
- Run_State::reopen(): atomic terminal->running gate, ceiling
re-snapshotted from the current setting, accumulated spend NEVER reset.
- Publisher: re-run output refreshes the existing UNPUBLISHED post
(status preserved — re-runs never publish); published posts untouched.
- Article_Worker persists the exact idea payload as a seed (INSERT-once)
so rebuilds can't mis-derive item_key and duplicate a post.
- Rerun_Job_Support: queue/lock/budget/status-transient plumbing; jobs
ride the M1 status transient so the board shows queued->pickup->result.
Agent-Session: engineer-prab-m3-20260612