RUL-015 — Plan fidelity — execute a ratified plan as written
Ruling
"whenever a plan is there you should do nothing but execute that plan; the idea of diverting should never come up unless I bring up an issue." (verbatim intent, 2026-07-24). Ratified as constitutional Article XII — Plan Fidelity.
Evidence
- Project memory
feedback-plan-fidelity: divergence authority belongs to Mohamed alone; fixing defects encountered while executing is part of execution, not divergence (see RUL-006).
Enforcement
- constitution Article XII
Verification
src/orchestrata_ultimate/prolog/constitutional.pl defines plan_fidelity/2 and constitutional_check(12, ...) under "Article XII — Plan Fidelity" (grep-verified present, Phase 1 critical-safety tier), consulted over three :- dynamic ground-fact predicates: active_plan/1, plan_step/2, human_issue_raised/2.
Status as of 2026-08-19: staged in AUDIT-ONLY mode, not enforcing, and only two of the three fact predicates have a real producer. A prior state of this page claimed all three were "asserted from Python" — they were not; nothing in production ever asserted them, and Article XII was never queried outside tests. Closing that gap:
- Reachability (AUDIT-ONLY):
kernel/dispatcher.py'sMessageDispatcher— the same staged pattern already used for the routing-policy audit (policy_audit_mode, W4.6/D3) — now also builds aConstitutionalEnforcerand, on everydispatch(), callscheck_article(12, message_type, ...)and logs the verdict at INFO (policy_audit_mode article12 verdict: ...). This is audit-only: the verdict is computed and logged, never consulted for allow/deny. Enforcement is a separate, deliberate flip not implemented by this wiring — flipping it before the finding below is addressed would deny most CXP dispatch traffic. active_plan/1/plan_step/2— real producer:planning/plan_parser.py'sload_plan_governance_facts()parses whichever planORCHESTRATA_PLAN_PATHresolves to (defaultplans/execution-plan.md) and reads the document's own**Status:** ...marker (an existing project convention, now also machine-read). A plan is assertedactive_plan(<path>)unless that marker is terminal (DONE/COMPLETE/SUPERSEDED/CLOSED/ARCHIVED/CANCELLED); each parsed step is asserted asplan_step(<path>, step_<N>).kernel/dispatcher.py's_build_default_constitutional_enforcer()calls this and asserts the facts into the real Prolog engine at dispatcher construction time. Current real-world value:plans/execution-plan.mdis markedSTATUS: DONE, soactive_plan/1is never asserted for it today — Article XII is vacuously "faithful" for every action (plan_fidelity(Action, faithful) :- \+ active_plan(_)). Verified against a real dispatch:governance_boot ... article=12 plan_id=plans/execution-plan.md active=False status=DONE steps=231, and a subsequent dispatch logsarticle12 verdict: ... decision=faithful.- Vocabulary mismatch (the important finding):
plan_step/2is keyed by plan-document step ids (step_1…step_231, from a 2026-04 port plan), while the audited Action is the CXPmessage_type(message/reply/broadcast). These vocabularies never overlap. Proven with a real active fixture plan: onceactive_plan/1IS asserted, a real dispatch logsarticle12 verdict: action=message decision=divergentfor ordinary traffic — not because anything is wrong, but because plan-fidelity as specified checks a work-plan step id against a wire-level message type. Enforcing Article XII against dispatch traffic as currently wired would deny nearly everything, which is exactly the hazard staging is meant to surface before enforcement is ever turned on. human_issue_raised/2— NO production seam found; the rule itself is real and tested, but nothing asserts the fact. Investigated and rejected: (1)kernel/pipeline_escalation.py'spacket.payload["prolog_facts"]→PrologGate.assert_factpassthrough — fed by LLM-generated free text out of a volk's response, not a deliberate signal (per this ruling's own governing principle: divergence authority belongs to Mohamed alone). (2)orchestrator/pipeline_escalation.py'sEscalationInterruptMixin.reject(thread_id, reason)— genuinely human-typed (a required CLI argument onsession pipeline reject --thread <id> "<reason>") but keyed by an ephemeral pipelinethread_id, not the plan-documentPlanIdactive_plan/1/plan_step/2use; assertinghuman_issue_raised(<plan_id>, reason)from areject()on an unrelated thread would be a false, invented correspondence between two different identifier spaces. (3)session/controller/_goals.py'sGoalMixin.add_blocker(reason)— schema-checked and human-facing in shape, but has zero production callers (unwired dead code; not reachable from any CLI/RPC). No fabricated emitter was wired for this predicate; the rule itself is exercised directly (with hand-asserted, ground, test-scoped facts) intests/governance/test_constitutional_real_rules.py.
Tests: tests/kernel/test_dispatcher_policy_audit.py (TestArticleXIIAuditModeOff, TestArticleXIIAuditModeOn, TestArticleXIIAuditModeEnforcerFailure) prove the audit-only wiring end-to-end through real dispatch, real CXP transport, and a real Prolog engine, including that a real, actively-parsed plan fixture correctly yields a divergent verdict without blocking dispatch. tests/governance/test_constitutional_real_rules.py (test_article_12_*) exercises plan_fidelity/2's four clauses (vacuous truth, plan-prescribed, divergent, human-issue-unlocked) against the real constitutional.pl via ConstitutionalEnforcer.check_article(12, ...). tests/planning/test_plan_parser.py covers the new status-marker parsing.