{ "$schema": "../schemas/workflow.schema.json", "workflow_schema_version": "3.1.0", "workflow_version": "3.2.0", "authority": true, "name": "The Productive Prompter article workflow v3.2", "precedence": [ "run_overrides", "approved_article_recipe", "workflow_schema", "house_policy", "examples" ], "capability_boundary": "A model can participate only when its host can execute article-flow, call a configured local tool, or be invoked by a configured provider adapter. Writing-model rotation additionally requires a passed bounded canary and an accepted execution receipt.", "gate_outcomes": [ "PASS", "REPAIR", "RETRY", "ESCALATE", "TERMINAL" ], "states": [ { "id": "NEW", "actor": "code", "objective": "Create a collision-safe run, reserve its writing model atomically, and lock it to workflow 3.2.0.", "required_inputs": [], "output": "run.json", "output_schema": "run.schema.json", "side_effect_class": "local_reversible", "gate": "G-RUN-IDENTITY", "next_on_pass": "INTAKE", "repair_state": "NEW", "max_attempts": 1, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 1 unsuccessful attempt or when a required operator decision/capability is missing." }, { "id": "INTAKE", "actor": "code", "objective": "Preserve the operator's seed verbatim and record explicit constraints without interpretation.", "required_inputs": [ "seed" ], "output": "artifacts/seed.txt", "output_schema": "artifact.schema.json", "side_effect_class": "local_reversible", "gate": "G-SEED-PRESERVED", "next_on_pass": "RESEARCH_PLAN", "repair_state": "INTAKE", "max_attempts": 1, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 1 unsuccessful attempt or when a required operator decision/capability is missing." }, { "id": "RESEARCH_PLAN", "actor": "model", "objective": "Identify intent-changing unknowns, claim risks, and a source strategy before research or drafting.", "required_inputs": [ "seed" ], "output": "artifacts/research-plan.json", "output_schema": "research-plan.schema.json", "side_effect_class": "read_only_external", "gate": "G-RESEARCH-PLAN", "next_on_pass": "RESEARCH", "repair_state": "RESEARCH_PLAN", "max_attempts": 2, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "RESEARCH", "actor": "model", "objective": "Gather direct, current-enough evidence and create a claim ledger without inventing citations.", "required_inputs": [ "seed", "research-plan" ], "output": "artifacts/claim-ledger.json", "output_schema": "claim-ledger.schema.json", "side_effect_class": "read_only_external", "gate": "G-EVIDENCE-COVERAGE", "next_on_pass": "INTENT_REVIEW", "repair_state": "RESEARCH", "max_attempts": 3, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 3 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "INTENT_REVIEW", "actor": "model_and_policy", "objective": "Resolve reader, purpose, scope, position, and assumptions automatically when evidence is sufficient; stop only for material ambiguity that policy cannot resolve.", "required_inputs": [ "seed", "claim-ledger", "voice-profile" ], "output": "artifacts/intent.json", "output_schema": "intent.schema.json", "side_effect_class": "none", "gate": "G-INTENT-FIDELITY", "next_on_pass": "ARTICLE_RECIPE", "repair_state": "INTAKE", "max_attempts": 3, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 3 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "ARTICLE_RECIPE", "actor": "model_and_policy", "objective": "Choose and validate an article form that serves the reader job and differs from recent posts for a recorded reason without routine operator approval.", "required_inputs": [ "intent", "claim-ledger", "recent-article-history", "voice-profile" ], "output": "artifacts/article-recipe.json", "output_schema": "article-recipe.schema.json", "side_effect_class": "none", "gate": "G-RECIPE-FIT", "next_on_pass": "BRIEF", "repair_state": "ARTICLE_RECIPE", "max_attempts": 2, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "BRIEF", "actor": "model_and_policy", "objective": "Bind intent, recipe, evidence, exclusions, and acceptance criteria into an automatically approved article brief.", "required_inputs": [ "intent", "article-recipe", "claim-ledger", "voice-profile" ], "output": "artifacts/brief.json", "output_schema": "brief.schema.json", "side_effect_class": "none", "gate": "G-BRIEF-ALIGNMENT", "next_on_pass": "DRAFT", "repair_state": "BRIEF", "max_attempts": 2, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "DRAFT", "actor": "assigned_writing_model", "objective": "Write a complete rough draft from the approved brief, evidence, and current effective voice profile without adding unsupported claims or forbidden public prose.", "required_inputs": [ "brief", "article-recipe", "claim-ledger", "voice-profile", "model-assignment" ], "output": "artifacts/draft.md", "output_schema": "artifact.schema.json", "side_effect_class": "none", "gate": "G-DRAFT-COVERAGE", "next_on_pass": "DEVELOPMENT_REVIEW", "repair_state": "DRAFT", "max_attempts": 3, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 3 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "DEVELOPMENT_REVIEW", "actor": "model_and_policy", "objective": "Reverse-outline the complete draft and find material reasoning gaps, unsupported perspective or redundant development before facts are locked.", "required_inputs": [ "draft", "brief", "claim-ledger", "article-recipe", "voice-profile" ], "output": "artifacts/development-review.json", "output_schema": "development-review.schema.json", "side_effect_class": "none", "gate": "G-DEVELOPMENT", "next_on_pass": "VISUAL_PLAN", "repair_state": "DRAFT", "max_attempts": 2, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "VISUAL_PLAN", "actor": "model_and_policy", "objective": "Include diagrams when useful for this article; otherwise explain their omission. Bind each included visual to a unique existing heading or paragraph, accessible explanation, and claim provenance. Compare the chosen topology with an alternative and omission; represent parallel work and deferrals explicitly. Every label must fit in full.", "required_inputs": [ "draft", "brief", "article-recipe", "claim-ledger" ], "output": "artifacts/visual-plan.json", "output_schema": "visual-plan.schema.json", "side_effect_class": "none", "gate": "G-VISUAL-PLAN", "next_on_pass": "VISUAL_RENDER", "repair_state": "VISUAL_PLAN", "max_attempts": 2, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when the article cannot support a truthful, useful visual." }, { "id": "VISUAL_RENDER", "actor": "code", "objective": "Render the approved visual plan as deterministic, accessible SVG assets and produce a hash-bound manifest without asking a model to generate markup.", "required_inputs": [ "draft", "visual-plan" ], "output": "artifacts/visual-manifest.json", "output_schema": "visual-manifest.schema.json", "side_effect_class": "local_reversible", "gate": "G-VISUAL-RENDER", "next_on_pass": "CLAIM_VERIFICATION", "repair_state": "VISUAL_PLAN", "max_attempts": 1, "timeout_seconds": 120, "retry_policy": "deterministic render once from a validated plan; repair the plan on failure", "escalation_condition": "Escalate when the approved plan cannot be rendered or its hashes and accessibility metadata cannot be verified." }, { "id": "CLAIM_VERIFICATION", "actor": "independent_model_and_code", "objective": "Re-extract every externally checkable claim from the rough draft, verify it independently, and lock facts, dates, numbers, names, citations, and URLs. After QA reopens facts, verify the latest accepted article, then send the verified correction to DRAFT before renewing locks through normal verification.", "required_inputs": [ "draft", "claim-ledger", "visual-plan", "visual-manifest" ], "output": "artifacts/verified-claim-ledger.json", "output_schema": "claim-ledger.schema.json", "side_effect_class": "read_only_external", "gate": "G-CLAIMS-VERIFIED", "next_on_pass": "VOICE_PROBE", "repair_state": "CLAIM_VERIFICATION", "max_attempts": 3, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 3 unsuccessful attempts or when a required operator decision/capability is missing.", "next_on_qa_reverification": "DRAFT" }, { "id": "VOICE_PROBE", "actor": "assigned_writing_model_then_human", "objective": "Generate exactly three meaningfully different, one-paragraph voice variants from a controller-selected opening or thesis passage with unchanged verified meaning; let the operator select one or reject the set for regeneration.", "required_inputs": [ "draft", "verified-claim-ledger", "voice-profile", "article-recipe", "model-assignment" ], "output": "artifacts/voice-probe.json", "output_schema": "voice-probe.schema.json", "side_effect_class": "none", "gate": "G-VOICE-PROBE", "next_on_pass": "VOICE_LEARNING", "repair_state": "VOICE_PROBE", "max_attempts": 3, "timeout_seconds": 86400, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 3 unsuccessful attempts or when a required operator decision/capability is missing.", "normal_action": "human_decision" }, { "id": "VOICE_LEARNING", "actor": "code", "objective": "Record the selected passage as a bundled local preference and a pending scoped proposal. Preserve rejected prose as historical evidence, keep the frozen profile unchanged, and record the code-owned learning receipt.", "required_inputs": [ "voice-probe", "voice-profile", "model-assignment" ], "output": "artifacts/voice-learning.json", "output_schema": "voice-learning.schema.json", "side_effect_class": "local_reversible", "gate": "G-VOICE-LEARNING", "next_on_pass": "EDIT", "repair_state": "VOICE_LEARNING", "max_attempts": 2, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "EDIT", "actor": "assigned_writing_model", "objective": "Edit the developed draft using its frozen compact voice guide and applicable local passage preference. Preserve distinctive phrasing, supported reasoning, locked facts, citations, and authorized perspective; send missing development to its upstream owner.", "required_inputs": [ "draft", "verified-claim-ledger", "voice-learning", "voice-profile", "article-recipe", "naturalization-directive", "locked-fields", "model-assignment", "brief" ], "output": "artifacts/article.md", "output_schema": "artifact.schema.json", "side_effect_class": "none", "gate": "G-NATURALIZATION", "next_on_pass": "POST_EDIT_CLAIM_VERIFICATION", "repair_state": "EDIT", "max_attempts": 3, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 3 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "POST_EDIT_CLAIM_VERIFICATION", "actor": "independent_model_and_code", "objective": "Re-extract every externally checkable claim from the rewritten article and verify that the voice rewrite introduced no unsupported claim or evidence drift.", "required_inputs": [ "article", "verified-claim-ledger", "article-recipe" ], "output": "artifacts/post-edit-claim-ledger.json", "output_schema": "claim-ledger.schema.json", "side_effect_class": "read_only_external", "gate": "G-POST-EDIT-CLAIMS", "next_on_pass": "DISPLAY_REVISION", "repair_state": "EDIT", "max_attempts": 2, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "DISPLAY_REVISION", "actor": "model_and_policy", "objective": "Align only title and public description with the finished verified article, preserving all other brief fields.", "required_inputs": [ "article", "brief", "article-recipe", "voice-profile" ], "output": "artifacts/display-brief.json", "output_schema": "brief.schema.json", "side_effect_class": "none", "gate": "G-DISPLAY", "next_on_pass": "EDITORIAL_QA", "repair_state": "DISPLAY_REVISION", "max_attempts": 2, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "EDITORIAL_QA", "actor": "code_and_calibrated_evaluator", "objective": "Automatically assess intent, voice, naturalness, structure, length, contextual cliché variants, and every public-facing title and description; issue targeted repairs without routine operator approval. Record excerpt-grounded checks of wording, rhetoric, paragraph structure, and preservation; a generic pass statement is insufficient. Compare actual rendered SVG paths and label positions with the article; caption-only inspection cannot establish truthful topology.", "required_inputs": [ "article", "brief", "article-recipe", "verified-claim-ledger", "post-edit-claim-ledger", "voice-learning", "style-policy", "naturalization-directive", "voice-profile", "visual-plan", "visual-manifest" ], "output": "receipts/editorial-qa.json", "output_schema": "editorial-assessment.schema.json", "side_effect_class": "none", "gate": "G-EDITORIAL-QA", "next_on_pass": "PACKAGE", "repair_state": "EDIT", "max_attempts": 3, "timeout_seconds": 900, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 3 unsuccessful attempts or when a required operator decision/capability is missing.", "allowed_repair_states": [ "DISPLAY_REVISION", "DRAFT", "CLAIM_VERIFICATION", "VISUAL_PLAN", "EDIT" ] }, { "id": "PACKAGE", "actor": "code", "objective": "Create one clean public package and one private reproducible archive, bind both to the active style-policy hash, and scan all rendered public surfaces before approval.", "required_inputs": [ "article", "brief", "article-recipe", "verified-claim-ledger", "editorial-qa", "post-edit-claim-ledger", "model-assignment", "voice-learning", "style-policy" ], "output": "package/package.json", "output_schema": "package.schema.json", "side_effect_class": "local_reversible", "gate": "G-PACKAGE-INTEGRITY", "next_on_pass": "PUBLISH_APPROVAL", "repair_state": "PACKAGE", "max_attempts": 2, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "PUBLISH_APPROVAL", "actor": "policy_or_human_hold", "objective": "Issue a hash-bound policy approval automatically for the fixed allowlisted production target unless a per-run hold is active.", "required_inputs": [ "package", "publish-plan" ], "output": "approvals/publish-approval.json", "output_schema": "publication-receipt.schema.json", "side_effect_class": "none", "gate": "G-PUBLISH-APPROVAL", "next_on_pass": "PUBLISH", "repair_state": "PUBLISH_APPROVAL", "max_attempts": 1, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 1 unsuccessful attempt or when a required operator decision/capability is missing." }, { "id": "PUBLISH", "actor": "code", "objective": "Revalidate package, plan, approval, style-policy hash, target state, and checkout, then apply and optionally push the approved publication plan once.", "required_inputs": [ "package", "publish-plan", "publish-approval" ], "output": "receipts/publication.json", "output_schema": "publication-receipt.schema.json", "side_effect_class": "irreversible_external", "gate": "G-PUBLISH-REVISION", "next_on_pass": "LIVE_VERIFICATION", "repair_state": "PUBLISH", "max_attempts": 2, "timeout_seconds": 120, "retry_policy": "retry only after idempotency, policy-hash, checkout, and target-state checks", "escalation_condition": "Escalate after 2 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "LIVE_VERIFICATION", "actor": "code", "objective": "Verify the exact rendered revision, model footer, metadata, navigation, links, cards, feed, and sitemap without claiming search indexing.", "required_inputs": [ "publication", "package" ], "output": "receipts/live-verification.json", "output_schema": "publication-receipt.schema.json", "side_effect_class": "read_only_external", "gate": "G-LIVE-REVISION", "next_on_pass": "COMPLETE", "repair_state": "PUBLISH", "max_attempts": 4, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 4 unsuccessful attempts or when a required operator decision/capability is missing." }, { "id": "COMPLETE", "actor": "code", "objective": "Close the run with a verifiable live URL, immutable receipt chain, final model experiment record, and effective voice-profile version.", "required_inputs": [ "live-verification" ], "output": "run.json", "output_schema": "run.schema.json", "side_effect_class": "none", "gate": "G-COMPLETE", "next_on_pass": null, "repair_state": "LIVE_VERIFICATION", "max_attempts": 1, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 1 unsuccessful attempt or when a required operator decision/capability is missing." }, { "id": "TERMINAL", "actor": "code", "objective": "End safely without publishing when a non-recoverable condition is reached.", "required_inputs": [], "output": "run.json", "output_schema": "run.schema.json", "side_effect_class": "none", "gate": null, "next_on_pass": null, "repair_state": null, "max_attempts": 1, "timeout_seconds": 120, "retry_policy": "bounded retry with declared repair state and transient backoff", "escalation_condition": "Escalate after 1 unsuccessful attempt or when a required operator decision/capability is missing." } ], "gates": { "hard": [ "G-RUN-IDENTITY", "G-SEED-PRESERVED", "G-RESEARCH-PLAN", "G-EVIDENCE-COVERAGE", "G-VISUAL-RENDER", "G-CLAIMS-VERIFIED", "G-VOICE-LEARNING", "G-NATURALIZATION", "G-POST-EDIT-CLAIMS", "G-PACKAGE-INTEGRITY", "G-PUBLISH-APPROVAL", "G-PUBLISH-REVISION", "G-LIVE-REVISION", "G-COMPLETE", "G-DEVELOPMENT", "G-DISPLAY" ], "soft": [ "G-INTENT-FIDELITY", "G-RECIPE-FIT", "G-BRIEF-ALIGNMENT", "G-DRAFT-COVERAGE", "G-VISUAL-PLAN", "G-VOICE-PROBE", "G-EDITORIAL-QA" ] }, "rules": [ { "id": "AF-PREC-001", "level": "MUST", "text": "Resolve conflicts by the declared precedence chain; examples never override active controls." }, { "id": "AF-PERSON-001", "level": "MUST", "text": "Choose narrative person for the supplied author perspective, audience and purpose; no grammatical person is universal. First person requires an authorized view or actual experience." }, { "id": "AF-LENGTH-001", "level": "MUST", "text": "Use a recipe target only as guidance and stop when the reader job is complete; house bands are never pass/fail gates." }, { "id": "AF-SHAPE-001", "level": "MUST", "text": "Choose structure for the reader purpose and evidence. Compare recent observable prose moves; avoid unhelpful rhetorical repetition. No fixed article skeleton, separate author personas or mandatory variation quota. Do not require a universal article skeleton." }, { "id": "AF-CITATION-001", "level": "MUST", "text": "Choose citation mode per recipe and validate that mode; model memory is never a citation source." }, { "id": "AF-PACKAGE-001", "level": "MUST", "text": "Use article.md as the canonical private article file and docs/{slug}.html as the canonical public article file for this publication target." }, { "id": "AF-REPAIR-001", "level": "MUST", "text": "Use bounded, gate-specific repairs and escalate after attempt exhaustion." }, { "id": "AF-END-001", "level": "MUST", "text": "Select and evaluate an ending strategy in the article recipe instead of enforcing one closing formula." }, { "id": "AF-MATURITY-001", "level": "MUST", "text": "Compute maturity from conformance evidence; prose may not self-declare production readiness." }, { "id": "AF-EVIDENCE-001", "level": "MUST", "text": "Every material factual claim must be traceable, qualified, fresh enough, and rechecked after drafting and material edits." }, { "id": "AF-NATURALIZE-001", "level": "MUST", "text": "Naturalization may not alter locked claims, numbers, dates, names, citations, URLs, uncertainty, commitments, code, or quotations without reopening evidence verification." }, { "id": "AF-CHAR-001", "level": "MUST", "text": "Reject U+2014 and encoded em-dash entities on editable public surfaces. The frozen house policy permits only unchanged, controller-bound verbatim evidence from a verified published revision source; quote/code labels alone create no exception. Preserve protected evidence exactly and reopen verification for conflicts rather than silently mutating it." }, { "id": "AF-VISUAL-001", "level": "MUST", "text": "Include diagrams if and when they materially improve comprehension. Default the recipe to auto; do not turn diagrams off merely because an article uses continuous prose or has no section headings. For auto or optional, plan zero to four useful visuals and explain an empty plan with omission_reason. Use required or off only for an explicit article-specific requirement. Bind every included visual to one exact existing heading or unique paragraph, accessible alt text and caption, and claim provenance. Label conceptual mechanisms as inference, not measured results. Render and hash-bind every planned asset; an empty plan still requires a bound empty manifest. Packaging must reject missing or unbound assets." }, { "id": "AF-VOICE-001", "level": "MUST", "text": "Preserve the protected baseline. Supply one compact evidence-backed guide and scoped article preferences. A voice selection applies locally and creates a pending learning proposal; it never activates a global rule automatically. AI choices and publication are not human-original evidence. Retain versioned rollback." }, { "id": "AF-ROUTING-001", "level": "MUST", "text": "Reserve writing models atomically from the canary-approved ordered experiment pool; bind one route to rough draft, voice probe, and rewrite, and pin and disclose any fallback as a contaminated experiment." }, { "id": "AF-PUBLISH-001", "level": "MUST", "text": "Separate package, publication plan, hash-bound policy approval, execution, and exact live-revision verification; automatic approval is limited to the fixed allowlisted target and a run hold prevents it." }, { "id": "AF-INDEXING-001", "level": "MUST", "text": "Keep published, accessible, represented for discovery, and indexed as distinct states." }, { "id": "AF-EVAL-001", "level": "MUST", "text": "Distinguish authorized provisional guide use from demonstrated improvement. Human-confirmed voice promotion requires retained comparisons and actual author judgments; model route eligibility still requires its recorded canary. AI self-assessment and publication are not calibration." }, { "id": "AF-LIFECYCLE-001", "level": "MUST", "text": "Corrections, refreshes, supersessions, and archival require a new scoped plan and must preserve revision history, intended URLs, redirects, navigation, and discovery surfaces." }, { "id": "AF-VERIFY-001", "level": "MUST", "text": "Verify claims in a fresh bounded context whose objective is independent support and correction, not defense of the draft; prefer a different calibrated route when one is eligible." }, { "id": "AF-AUTO-001", "level": "MUST", "text": "For ordinary articles, present the exact three local voice options and require an actual answer. Selection continues editing, verification, build, automatic push and exact live verification without another routine confirmation. Explicitly delegated revisions may reuse their pinned guide and record no new human preference. Honor pauses, holds, material ambiguity, exhausted repairs and missing capability." }, { "id": "AF-STYLE-001", "level": "MUST", "text": "Normalize and scan article prose, title, description, rendered article, cards, and feed against the protected high-confidence phrase policy, excluding code, URLs, and attributed quotations from phrase matching but never from the em-dash rule." }, { "id": "AF-MODEL-001", "level": "MUST", "text": "Derive visible drafting-model attribution from accepted execution receipts and retain exact routes, CLI version, timing, retries, fallbacks, URL, and QA results in private experiment history." }, { "id": "AF-LEGACY-001", "level": "MUST", "text": "New runs freeze effective workflow, house policy, recipe defaults and schemas by hash. Retain older workflow definitions and frozen profiles for replay. New feedback/refinement commands create proposals rather than rewriting historical evidence." } ], "lifecycle_states": [ { "id": "CORRECTION", "objective": "Plan and publish a factual or editorial correction while retaining the prior revision and receipt chain.", "requires_redirect_check": false }, { "id": "REFRESH", "objective": "Reverify stale evidence and publish a new revision without silently changing historical receipts.", "requires_redirect_check": false }, { "id": "SUPERSESSION", "objective": "Replace the article intentionally, preserving its prior URL or an explicit redirect and visible history.", "requires_redirect_check": true }, { "id": "ARCHIVAL", "objective": "Remove an article from active surfaces while preserving the intended URL, redirect, and archive record.", "requires_redirect_check": true } ], "automation_boundary": { "default_mode": "active_session", "routine_human_decision_states": [ "VOICE_PROBE" ], "automatic_states": [ "INTENT_REVIEW", "ARTICLE_RECIPE", "BRIEF", "VISUAL_PLAN", "VISUAL_RENDER", "VOICE_LEARNING", "EDITORIAL_QA", "PACKAGE", "PUBLISH_APPROVAL", "PUBLISH", "LIVE_VERIFICATION", "DEVELOPMENT_REVIEW", "DISPLAY_REVISION" ], "exceptional_stops": [ "material_ambiguity", "attempt_exhaustion", "missing_credentials_or_capability", "voice_profile_conflict", "publication_hold", "merge_conflict", "failed_live_verification" ] } }