ADR Enforcement Debt¶
Inverts ADR conformance from citation-drift noise to the load-bearing question: does each Accepted ADR's **Enforced by:** resolve to a real, runnable, asserting check, or is the decision unenforced-decision debt? REAL = an enforced ADR with a resolving, non-mutating, asserting check. WEAK = a manual prose pointer, or an enforced ADR whose every resolving check is tautological (green but asserts nothing). MISSING = no **Enforced by:** check at all (e.g. a bare decision-of-record). WEAK + MISSING are the debt — except where the decision is a justified, allow-listed process-only exemption (docs/standards/adr_enforcement/exemptions.md): those are excluded from the outstanding-debt headline, matching the merge gate in tests/architecture/test_adr_enforcement_ratchet.py.
Summary¶
- Accepted ADRs: 81
- REAL (real asserting enforcement): 78 (96.3%)
- WEAK (prose-only or tautological): 3
- MISSING (no
**Enforced by:**): 0 - Justified exemptions (process-only, allow-listed): 3
- Outstanding unenforced-decision debt (non-exempt WEAK + MISSING): 0 / 81 = 0.0%
By declared **Enforcement:** kind: enforced 78 · manual 3 · decision-of-record 0.
Classification¶
| ADR | Class | Exempt | Kind | Enforced by |
|---|---|---|---|---|
| ADR-0001 | REAL | — | enforced | pytest:tests/test_orchestrator_loops.py, pytest:tests/architecture/test_loop_count_matches_adr0001.py |
| ADR-0002 | REAL | — | enforced | pytest:tests/test_state_machine.py |
| ADR-0004 | REAL | — | enforced | pytest:tests/test_agent_cli.py, pytest:tests/test_base_runner.py |
| ADR-0005 | REAL | — | enforced | pytest:tests/test_implement_phase.py |
| ADR-0007 | REAL | — | enforced | pytest:tests/test_dashboard_routes_repo.py |
| ADR-0008 | REAL | — | enforced | pytest:tests/test_dashboard_routes_repo.py |
| ADR-0009 | REAL | — | enforced | pytest:tests/architecture/test_adr0009_process_per_repo_isolation.py::test_workspace_paths_are_repo_slug_scoped_and_collision_free |
| ADR-0010 | REAL | — | enforced | pytest:tests/test_integration_worktree.py |
| ADR-0011 | REAL | — | enforced | pytest:tests/test_epic.py, pytest:tests/test_release.py |
| ADR-0012 | REAL | — | enforced | pytest:tests/test_epic_merge_coordination.py |
| ADR-0014 | REAL | — | enforced | pytest:tests/test_state_machine.py |
| ADR-0015 | REAL | — | enforced | pytest:tests/test_review_phase_hooks.py |
| ADR-0016 | REAL | — | enforced | pytest:tests/test_visual_validation.py |
| ADR-0017 | REAL | — | enforced | pytest:tests/test_state_machine.py |
| ADR-0018 | REAL | — | enforced | pytest:tests/test_screenshot_scanner.py, pytest:tests/test_report_issue_loop.py |
| ADR-0019 | REAL | — | enforced | pytest:tests/test_epic_manager.py, pytest:tests/test_post_merge_handler.py |
| ADR-0021 | REAL | — | enforced | pytest:tests/test_state_persistence.py, pytest:tests/test_event_persistence.py, pytest:tests/test_data_migration_d2.py |
| ADR-0022 | REAL | — | enforced | pytest:tests/test_integration_pipeline.py |
| ADR-0023 | REAL | — | enforced | pytest:tests/architecture/test_adr0023_test_local_class_instantiation.py::test_no_dead_test_local_classes |
| ADR-0024 | REAL | — | enforced | pytest:tests/test_implement_phase.py, pytest:tests/scenarios/fakes/test_prior_failure_propagation.py |
| ADR-0025 | WEAK | exempt | manual | Review checklist — reviewers verify symmetric field-assertion coverage (all three legs per method) by searching for the field name across test functions for the affected methods (see "Review checklist" under Consequences). |
| ADR-0027 | REAL | — | enforced | pytest:tests/architecture/test_adr0027_duplicate_model_class_definitions.py::test_no_dead_duplicate_model_class_definitions |
| ADR-0028 | REAL | — | enforced | pytest:tests/test_report_event_flow.py |
| ADR-0029 | REAL | — | enforced | pytest:tests/test_caretaker_loop_wiring.py |
| ADR-0030 | REAL | — | enforced | pytest:tests/architecture/test_adr0030_dashboard_routes_decomposition.py::test_create_router_wires_each_named_domain_register |
| ADR-0032 | REAL | — | enforced | pytest:tests/test_repo_wiki.py, pytest:tests/test_repo_wiki_store_git.py, pytest:tests/test_repo_wiki_ingest.py, pytest:tests/test_wiki_drift_detector.py, pytest:tests/test_wiki_drift_symbols.py, pytest:tests/test_wiki_semantic_drift.py, pytest:tests/test_repo_wiki_temporal.py, pytest:tests/test_wiki_corroboration.py |
| ADR-0034 | REAL | — | enforced | pytest:tests/test_state_machine.py |
| ADR-0035 | WEAK | exempt | manual | Code review checklist item (Decision §3) applied during PR review of any change touching toggle-gated logic; see also 'docs/wiki/testing.md'. |
| ADR-0037 | REAL | — | enforced | pytest:tests/test_adr_pre_validator.py |
| ADR-0041 | REAL | — | enforced | pytest:tests/test_issue_cache.py, pytest:tests/test_precondition_gate.py |
| ADR-0042 | REAL | — | enforced | pytest:tests/architecture/test_adr0042_two_tier_branch_rulesets.py::test_main_ruleset_is_merge_commit_only |
| ADR-0043 | REAL | — | enforced | pytest:tests/test_preflight_plugins.py, pytest:tests/test_phase_skill_filter.py |
| ADR-0045 | REAL | — | enforced | pytest:tests/test_trust_fleet_sanity_loop.py, pytest:tests/test_loop_wiring_completeness.py, pytest:tests/test_trust_fleet_anomaly_detectors.py |
| ADR-0047 | REAL | — | enforced | make:trust-contracts, pytest:tests/trust/contracts/test_fake_github_contract.py |
| ADR-0049 | REAL | — | enforced | pytest:tests/test_loop_kill_switch_completeness.py, pytest:tests/regressions/test_canonical_killswitch.py |
| ADR-0050 | REAL | — | enforced | pytest:tests/test_auto_agent_preflight_loop.py, pytest:tests/scenarios/test_auto_agent_preflight.py, pytest:tests/test_loop_wiring_completeness.py, pytest:tests/test_auto_agent_hitl_intake.py, pytest:tests/test_preflight_decision_hitl_widened.py |
| ADR-0051 | WEAK | exempt | manual | 'superpowers:subagent-driven-development' workflow (per-task reviews), this ADR (process documentation), 'superpowers:requesting-code-review' (which dispatches the 'code-reviewer' agent) skill (the fresh-eyes reviewer) — a process convention, not a runnable check. |
| ADR-0052 | REAL | — | enforced | pytest:tests/test_mockworld_fakes_conformance.py, pytest:tests/test_sandbox_scenario_contract.py |
| ADR-0053 | REAL | — | enforced | pytest:tests/test_ubiquitous_language_drift.py, pytest:tests/test_seed_terms.py |
| ADR-0054 | REAL | — | enforced | pytest:tests/test_term_proposer_loop.py, pytest:tests/architecture/test_term_proposer_wiring.py |
| ADR-0056 | REAL | — | enforced | pytest:tests/test_adr_touchpoint_auditor_loop.py |
| ADR-0057 | REAL | — | enforced | pytest:tests/test_term_pruner_loop.py, pytest:tests/architecture/test_term_pruner_wiring.py |
| ADR-0058 | REAL | — | enforced | pytest:tests/test_edge_proposer_loop.py, pytest:tests/architecture/test_edge_proposer_wiring.py |
| ADR-0060 | REAL | — | enforced | pytest:tests/test_atlas_routes.py |
| ADR-0061 | REAL | — | enforced | pytest:tests/test_atlas_routes.py |
| ADR-0062 | REAL | — | enforced | pytest:tests/test_entry_evidence_loop.py, pytest:tests/scenarios/test_entry_evidence_loop_scenario.py |
| ADR-0064 | REAL | — | enforced | pytest:tests/test_adversarial_retry_loop.py |
| ADR-0065 | REAL | — | enforced | pytest:tests/architecture/test_adr0065_code_grooming_removed.py::test_no_live_code_grooming_references_in_src_or_tests |
| ADR-0071 | REAL | — | enforced | pytest:tests/test_route_back.py |
| ADR-0083 | REAL | — | enforced | pytest:tests/test_sandbox_scenario_contract.py, pytest:tests/test_no_screenshot_regression_tests.py |
| ADR-0085 | REAL | — | enforced | pytest:tests/test_secret_scrub.py, pytest:tests/regressions/test_issue_9143_codeql_suppression.py |
| ADR-0087 | REAL | — | enforced | pytest:tests/test_prompt_registry_completeness.py, pytest:tests/test_audit_prompts.py |
| ADR-0088 | REAL | — | enforced | pytest:tests/test_label_drift_watcher_loop.py, pytest:tests/test_label_drift_watcher_integration.py |
| ADR-0089 | REAL | — | enforced | pytest:tests/test_memory_backlog_loop.py, pytest:tests/test_loop_wiring_completeness.py, pytest:tests/architecture/test_functional_area_coverage.py |
| ADR-0090 | REAL | — | enforced | pytest:tests/test_atlas_routes.py |
| ADR-0092 | REAL | — | enforced | pytest:tests/test_untrusted_text.py, pytest:tests/test_preflight_untrusted_fencing.py, pytest:tests/test_agent_cli.py, pytest:tests/test_agent_advanced.py |
| ADR-0093 | REAL | — | enforced | pytest:tests/test_loop_fitness_completeness.py |
| ADR-0094 | REAL | — | enforced | pytest:tests/test_convergence_ledger.py, pytest:tests/test_convergence_gate.py, pytest:tests/scenarios/test_convergence_review_mockworld.py, pytest:tests/sandbox_scenarios/scenarios/s50_convergence_review.py |
| ADR-0095 | REAL | — | enforced | pytest:tests/test_review_advisor.py, pytest:tests/test_review_phase_core.py::TestApproveConvergenceGate, pytest:tests/scenarios/test_convergence_review_mockworld.py, pytest:tests/sandbox_scenarios/scenarios/s50_convergence_review.py |
| ADR-0096 | REAL | — | enforced | pytest:tests/scenarios/test_convergence_pipeline_mockworld.py |
| ADR-0097 | REAL | — | enforced | pytest:tests/scenarios/test_convergence_counter_migration_mockworld.py |
| ADR-0098 | REAL | — | enforced | pytest:tests/scenarios/test_convergence_oscillation_mockworld.py |
| ADR-0099 | REAL | — | enforced | pytest:tests/test_seed_terms.py |
| ADR-0100 | REAL | — | enforced | pytest:tests/test_adr_conformance_coverage.py |
| ADR-0102 | REAL | — | enforced | pytest:tests/test_review_phase_core.py |
| ADR-0103 | REAL | — | enforced | pytest:tests/test_human_steering.py, pytest:tests/test_human_steering_loop.py, pytest:tests/test_human_steering_actuator.py, pytest:tests/test_human_steering_state.py, pytest:tests/test_orchestrator_human_steering.py, pytest:tests/test_config_env.py |
| ADR-0104 | REAL | — | enforced | pytest:tests/test_auto_tighten_invariant.py |
| ADR-0106 | REAL | — | enforced | pytest:tests/regressions/test_issue_9552.py |
| ADR-0107 | REAL | — | enforced | pytest:tests/architecture/test_adr0107_discover_shape_collapsed.py::test_pipeline_stage_has_no_discover_or_shape |
| ADR-0109 | REAL | — | enforced | pytest:tests/test_ultra_review.py |
| ADR-0110 | REAL | — | enforced | pytest:tests/test_config_combo_env.py::test_reject_glm_model_on_claude_provider |
| ADR-0111 | REAL | — | enforced | pytest:tests/test_flows.py |
| ADR-0112 | REAL | — | enforced | pytest:tests/architecture/test_adr0112_clone_local_isolation.py::test_workspace_create_uses_git_clone_local |
| ADR-0113 | REAL | — | enforced | pytest:tests/test_audit_lineage_check.py::test_control_plane_adr_missing_both_lines_fails |
| ADR-0114 | REAL | — | enforced | pytest:tests/test_events.py::TestEventBusTypedSubscription::test_typed_subscriber_receives_only_subscribed_types |
| ADR-0115 | REAL | — | enforced | pytest:tests/regressions/test_escape_auto_diagnose_before_human.py::TestEscapeAutoDiagnoseBeforeHuman::test_real_and_encoded_is_auto_resolved_no_human_surface, pytest:tests/regressions/test_escape_auto_diagnose_before_human.py::TestEscapeAutoDiagnoseBeforeHuman::test_inconclusive_still_reaches_a_human, pytest:tests/regressions/test_sampled_audit_auto_adjudicate_before_human.py::TestSampledAuditAutoAdjudicateBeforeHuman::test_upheld_self_applies_label_and_crosslinks, pytest:tests/regressions/test_sampled_audit_auto_adjudicate_before_human.py::TestSampledAuditAutoAdjudicateBeforeHuman::test_inconclusive_leaves_it_for_a_human, pytest:tests/test_escape_auto_diagnose.py::TestClassifyDiagnosis::test_bug_label_stays_inconclusive_not_dismissed, pytest:tests/test_audit_adjudicate.py::TestParseAdjudication::test_unparseable_is_inconclusive_not_upheld, pytest:tests/regressions/test_issue_11176.py::test_aging_resolvable_escape_self_answers_despite_a_busy_ask_budget |
| ADR-0116 | REAL | — | enforced | pytest:tests/test_prompt_registry_completeness.py, pytest:tests/test_prompt_fitness.py, pytest:tests/test_adr_enforcement_completeness.py, pytest:tests/test_prompt_rubric_calibration.py |
| ADR-0117 | REAL | — | enforced | pytest:tests/test_prompt_observatory.py |
| ADR-0118 | REAL | — | enforced | pytest:tests/architecture/test_no_otel_imports.py |
| ADR-0119 | REAL | — | enforced | pytest:tests/test_credit_failover.py |
| ADR-0134 | REAL | — | enforced | pytest:tests/test_repo_backend.py, pytest:tests/test_config_repo_provider.py, pytest:tests/test_base_runner_repo_provider.py, pytest:tests/test_base_subprocess_runner_repo_provider.py, pytest:tests/test_dashboard_routes_state.py |
Unenforced-decision debt¶
Outstanding (non-exempt)¶
(none — every non-exempt Accepted ADR has a real asserting enforcement)
Justified exemptions (process-only, allow-listed)¶
Allow-listed in docs/standards/adr_enforcement/exemptions.md as genuinely process-only — no machine-checkable invariant — so excluded from the outstanding-debt headline above.
| ADR | Class | Kind | Justification |
|---|---|---|---|
| ADR-0025 | WEAK | manual | Symmetric N×3 field-assertion coverage requires knowing which methods populate which shared-model fields and whether each has all three legs — a semantic-coverage judgment no non-tautological static check can make; enforcement is the reviewer's field-name search. |
| ADR-0035 | WEAK | manual | Toggle-assertion consistency links a config toggle to the code path it gates and to whether a given test sets that toggle in its fixture — the ADR notes static analysis of mock/fixture setups is fragile, so no non-tautological check can fail on violation. |
| ADR-0051 | WEAK | manual | Iterative fresh-eyes review-until-convergence is a pure human-process cadence (Claude Code review skills, run per feature) with no on-disk invariant a test could assert. |
Weak / tautological enforcements¶
(none)
Unattributed enforcements¶
REAL ADRs whose cited test resolves and asserts, but whose text never names the ADR — so the check need not relate to the decision it enforces. Add the ADR number (e.g. ADR-0123) to the enforcing test, or repoint the ADR at one that names it. Advisory: this does NOT change the REAL/WEAK/MISSING class above.
| ADR | Enforcement |
|---|---|
| ADR-0002 | pytest:tests/test_state_machine.py |
| ADR-0004 | pytest:tests/test_agent_cli.py, pytest:tests/test_base_runner.py |
| ADR-0005 | pytest:tests/test_implement_phase.py |
| ADR-0007 | pytest:tests/test_dashboard_routes_repo.py |
| ADR-0008 | pytest:tests/test_dashboard_routes_repo.py |
| ADR-0010 | pytest:tests/test_integration_worktree.py |
| ADR-0011 | pytest:tests/test_epic.py, pytest:tests/test_release.py |
| ADR-0012 | pytest:tests/test_epic_merge_coordination.py |
| ADR-0014 | pytest:tests/test_state_machine.py |
| ADR-0015 | pytest:tests/test_review_phase_hooks.py |
| ADR-0016 | pytest:tests/test_visual_validation.py |
| ADR-0017 | pytest:tests/test_state_machine.py |
| ADR-0018 | pytest:tests/test_screenshot_scanner.py, pytest:tests/test_report_issue_loop.py |
| ADR-0019 | pytest:tests/test_epic_manager.py, pytest:tests/test_post_merge_handler.py |
| ADR-0022 | pytest:tests/test_integration_pipeline.py |
| ADR-0024 | pytest:tests/test_implement_phase.py, pytest:tests/scenarios/fakes/test_prior_failure_propagation.py |
| ADR-0028 | pytest:tests/test_report_event_flow.py |
| ADR-0029 | pytest:tests/test_caretaker_loop_wiring.py |
| ADR-0032 | pytest:tests/test_repo_wiki.py, pytest:tests/test_repo_wiki_store_git.py, pytest:tests/test_repo_wiki_ingest.py, pytest:tests/test_wiki_drift_detector.py, pytest:tests/test_wiki_drift_symbols.py, pytest:tests/test_wiki_semantic_drift.py, pytest:tests/test_repo_wiki_temporal.py, pytest:tests/test_wiki_corroboration.py |
| ADR-0034 | pytest:tests/test_state_machine.py |
| ADR-0037 | pytest:tests/test_adr_pre_validator.py |
| ADR-0041 | pytest:tests/test_issue_cache.py, pytest:tests/test_precondition_gate.py |
| ADR-0043 | pytest:tests/test_preflight_plugins.py, pytest:tests/test_phase_skill_filter.py |
| ADR-0045 | pytest:tests/test_trust_fleet_sanity_loop.py, pytest:tests/test_loop_wiring_completeness.py, pytest:tests/test_trust_fleet_anomaly_detectors.py |
| ADR-0047 | make:trust-contracts, pytest:tests/trust/contracts/test_fake_github_contract.py |
| ADR-0050 | pytest:tests/test_auto_agent_preflight_loop.py, pytest:tests/scenarios/test_auto_agent_preflight.py, pytest:tests/test_loop_wiring_completeness.py, pytest:tests/test_auto_agent_hitl_intake.py, pytest:tests/test_preflight_decision_hitl_widened.py |
| ADR-0052 | pytest:tests/test_mockworld_fakes_conformance.py, pytest:tests/test_sandbox_scenario_contract.py |
| ADR-0057 | pytest:tests/test_term_pruner_loop.py, pytest:tests/architecture/test_term_pruner_wiring.py |
| ADR-0058 | pytest:tests/test_edge_proposer_loop.py, pytest:tests/architecture/test_edge_proposer_wiring.py |
| ADR-0060 | pytest:tests/test_atlas_routes.py |
| ADR-0061 | pytest:tests/test_atlas_routes.py |
| ADR-0064 | pytest:tests/test_adversarial_retry_loop.py |
| ADR-0071 | pytest:tests/test_route_back.py |
| ADR-0083 | pytest:tests/test_sandbox_scenario_contract.py, pytest:tests/test_no_screenshot_regression_tests.py |
| ADR-0090 | pytest:tests/test_atlas_routes.py |
| ADR-0093 | pytest:tests/test_loop_fitness_completeness.py |
| ADR-0096 | pytest:tests/scenarios/test_convergence_pipeline_mockworld.py |
| ADR-0097 | pytest:tests/scenarios/test_convergence_counter_migration_mockworld.py |
| ADR-0102 | pytest:tests/test_review_phase_core.py |
| ADR-0104 | pytest:tests/test_auto_tighten_invariant.py |
| ADR-0106 | pytest:tests/regressions/test_issue_9552.py |
| ADR-0109 | pytest:tests/test_ultra_review.py |
| ADR-0110 | pytest:tests/test_config_combo_env.py::test_reject_glm_model_on_claude_provider |
| ADR-0111 | pytest:tests/test_flows.py |
| ADR-0117 | pytest:tests/test_prompt_observatory.py |
| ADR-0119 | pytest:tests/test_credit_failover.py |