feat(plan): enforce invariants during Strategize phase via Invariant Reconciliation Actor #1154

Closed
brent.edwards wants to merge 2 commits from feature/m3-invariant-enforcement-strategize into master

2 Commits

Author SHA1 Message Date
brent.edwards 54f55e4623 Merge remote-tracking branch 'origin/master' into feature/m3-invariant-enforcement-strategize
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 16s
CI / lint (pull_request) Successful in 3m24s
CI / typecheck (pull_request) Successful in 3m48s
CI / quality (pull_request) Successful in 3m42s
CI / security (pull_request) Successful in 3m56s
CI / integration_tests (pull_request) Successful in 5m57s
CI / unit_tests (pull_request) Successful in 7m16s
CI / docker (pull_request) Successful in 1m4s
CI / e2e_tests (pull_request) Successful in 9m13s
CI / coverage (pull_request) Successful in 10m12s
CI / status-check (pull_request) Successful in 1s
CI / benchmark-regression (pull_request) Successful in 1h1m46s
# Conflicts:
#	CHANGELOG.md
#	src/cleveragents/application/container.py
2026-03-25 20:46:39 +00:00
brent.edwards 1f298948d1 feat(plan): enforce invariants during Strategize phase via Invariant Reconciliation Actor
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Failing after 26s
CI / lint (pull_request) Successful in 3m45s
CI / quality (pull_request) Successful in 4m7s
CI / typecheck (pull_request) Successful in 4m22s
CI / security (pull_request) Successful in 4m30s
CI / unit_tests (pull_request) Successful in 6m12s
CI / docker (pull_request) Successful in 1m9s
CI / integration_tests (pull_request) Successful in 7m37s
CI / e2e_tests (pull_request) Successful in 10m2s
CI / coverage (pull_request) Successful in 11m20s
CI / status-check (pull_request) Successful in 1s
CI / benchmark-regression (pull_request) Successful in 52m55s
Wire the Invariant Reconciliation Actor into PlanLifecycleService.start_strategize()
so that invariants from all scopes (global, project, action, plan) are automatically
collected, reconciled using plan > project > global precedence, and recorded as
invariant_enforced decisions in the plan's decision tree.

Key changes:
- Added _enforce_invariants() method to PlanLifecycleService that creates an
  InvariantReconciliationActor, registers plan-level invariants from the Plan
  model into the InvariantService, and invokes the actor to reconcile and record
  invariant_enforced decisions.
- Added invariant_service parameter to PlanLifecycleService.__init__() following
  the existing optional dependency pattern (None = silently skip).
- Registered InvariantService as a Singleton in the DI container and wired it
  into PlanLifecycleService.
- Added 6 Behave BDD scenarios covering basic enforcement, zero-invariant case,
  missing service graceful degradation, multi-scope reconciliation, de-duplication,
  and failure resilience.
- Added 4 Robot Framework integration tests for the invariant enforcement lifecycle.
- Updated CHANGELOG.md.

ISSUES CLOSED: #843
2026-03-24 23:40:28 +00:00