Files
cleveragents-core/features/tdd_invariant_propagation_subplan.feature
freemo 9cfa1dd1d7
CI / lint (pull_request) Successful in 1m25s
CI / typecheck (pull_request) Successful in 1m48s
CI / quality (pull_request) Successful in 1m52s
CI / security (pull_request) Successful in 1m52s
CI / push-validation (pull_request) Successful in 36s
CI / helm (pull_request) Successful in 38s
CI / build (pull_request) Successful in 46s
CI / integration_tests (pull_request) Successful in 3m55s
CI / unit_tests (pull_request) Successful in 6m46s
CI / docker (pull_request) Successful in 1m33s
CI / coverage (pull_request) Successful in 10m45s
CI / status-check (pull_request) Successful in 7s
CI / lint (push) Successful in 56s
CI / quality (push) Successful in 1m15s
CI / typecheck (push) Successful in 1m25s
CI / security (push) Successful in 1m30s
CI / build (push) Successful in 34s
CI / push-validation (push) Successful in 40s
CI / helm (push) Successful in 43s
CI / benchmark-regression (push) Failing after 45s
CI / integration_tests (push) Successful in 3m55s
CI / unit_tests (push) Successful in 4m21s
CI / e2e_tests (push) Successful in 4m26s
CI / docker (push) Successful in 1m28s
CI / coverage (push) Successful in 12m20s
CI / status-check (push) Successful in 3s
CI / benchmark-publish (push) Successful in 1h20m8s
fix(subplan): propagate invariant_enforced decisions to child plans on spawn
SubplanService.spawn() now re-records all invariant_enforced decisions from
the parent plan decision tree onto each child plan decision tree. This
satisfies the spec requirement: 'recorded as invariant_enforced decisions that
propagate to child plans.' (Glossary → Invariant)

Previously, child plans started Strategize with a completely empty invariant
set, violating the spec's propagation requirement. non_overridable global
invariants enforced on the parent were not guaranteed to be enforced on child
plans.

The fix adds _propagate_invariant_decisions() to SubplanService which queries
the parent plan's invariant_enforced decisions and re-records each one on the
child plan using DecisionService.record_decision(). The DecisionService is
already injected into SubplanService, so no new dependencies are required.

BDD regression coverage added in features/tdd_invariant_propagation_subplan.feature
with 4 scenarios covering: single invariant propagation, multiple invariant
propagation, non_overridable invariant propagation, and clean spawn with no
parent invariants.

ISSUES CLOSED: #9131
2026-05-12 16:45:59 +00:00

39 lines
2.0 KiB
Gherkin

@tdd_issue @tdd_issue_9131 @mock_only
Feature: TDD Issue #9131 — invariant_enforced decisions not propagated to child plans on subplan spawn
As a developer
I want to verify that SubplanService.spawn() propagates invariant_enforced decisions
from the parent plan to each child plan's decision tree
So that child plans start Strategize with the parent's enforced invariant set
The spec states: "recorded as invariant_enforced decisions that propagate to child plans."
SubplanService.spawn() currently creates child Plan objects with no invariant_enforced
decisions, violating the spec's propagation requirement.
@tdd_issue @tdd_issue_9131
Scenario: Child plan receives parent invariant_enforced decisions on spawn
Given a parent plan with invariant_enforced decisions recorded
And a valid spawn entry for the parent plan
When I spawn a child plan via SubplanService
Then the decision service should have recorded invariant_enforced decisions for the child plan
@tdd_issue @tdd_issue_9131
Scenario: Child plan receives all parent invariant_enforced decisions
Given a parent plan with 3 invariant_enforced decisions recorded
And a valid spawn entry for the parent plan
When I spawn a child plan via SubplanService
Then the child plan should have 3 invariant_enforced decisions recorded
@tdd_issue @tdd_issue_9131
Scenario: Non-overridable global invariants are propagated to child plans
Given a parent plan with a non_overridable invariant_enforced decision
And a valid spawn entry for the parent plan
When I spawn a child plan via SubplanService
Then the child plan should have the non_overridable invariant decision propagated
@tdd_issue @tdd_issue_9131
Scenario: Child plan with no parent invariant_enforced decisions spawns cleanly
Given a parent plan with no invariant_enforced decisions
And a valid spawn entry for the parent plan
When I spawn a child plan via SubplanService
Then the spawn should succeed with no invariant decisions recorded for the child