Expose mission assertion backfill controls and run paths across engine, API, and CLI surfaces. - add mission assertion backfill gating classification and reliability coverage for assertion-linked validation recovery - add dashboard mission routes plus legacy API coverage and e2e checks for running assertion backfill - expose new extension tool support and update Fusion skill docs/capability references - add a changeset for @runfusion/fusion and refresh mission documentation Files changed: .changeset/fn-5764-mission-backfill-assertions.md | 9 ++ docs/missions-completion-contract.md | 7 +- docs/missions.md | 7 +- packages/cli/skill/fusion/SKILL.md | 2 +- .../cli/skill/fusion/references/extension-tools.md | 9 ++ .../skill/fusion/references/fusion-capabilities.md | 1 + packages/cli/src/__tests__/extension.test.ts | 41 +++++++ packages/cli/src/extension.ts | 43 +++++++ .../dashboard/app/__tests__/api-missions.test.ts | 44 +++++++ packages/dashboard/app/api/legacy.ts | 34 ++++++ .../dashboard/src/__tests__/mission-e2e.test.ts | 127 +++++++++++++++++++++ packages/dashboard/src/mission-routes.ts | 29 +++++ .../mission-validation-trigger-gap.test.ts | 66 +++++++++++ .../workflow-step-readonly-allowlist.test.ts | 1 + packages/engine/src/gating-classifications.ts | 1 + 15 files changed, 418 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-5764 Fusion-Task-Lineage: b16123c2-7cfe-4b17-a899-4e30044a7a49
11 KiB
Mission Completion Gate Contract
Status
- Decision date: 2026-05-30
- Task: FN-5718
- Depends on enforcement behavior from: FN-5715 (reference implementation of the trigger/recovery path)
- Scope: Product contract and implementation requirements only (no code changes in this task)
- Implementation status: Realized by FN-5733 (loop auto-pass advancement, mission/store guard telemetry, MissionManager label reconciliation)
Problem
Mission validation has had a recurring ambiguity: users can see feature acceptance text and milestone "completion criteria" text, but autopilot enforcement is actually driven by assertion linkage + validator outcomes. This document defines the canonical enforced gate so mission completion cannot silently stall or be misread.
Canonical Completion Gate (Enforced)
Decision
A feature is autopilot-complete only when its linked contract assertions are satisfied.
Canonical authored source and enforcement path:
MissionFeature.acceptanceCriteriais the canonical authored criteria text (authoring surface).- MissionStore must maintain a store-managed per-feature
MissionContractAssertionderived from feature content, with text priority:feature.acceptanceCriteriafeature.descriptionVerify implementation of: {feature.title}
- The mission validator enforces completion using the feature's linked assertions (including its store-managed assertion and any additional linked milestone assertions).
- Feature/slice/mission advance is gated by the validator outcome (or explicit no-assertions auto-pass behavior defined below).
Precedence and interpretation rules
MissionFeature.acceptanceCriteriais the canonical authoring field for feature-level intent.- The linked assertion set is the canonical enforcement set.
- Milestone
MissionContractAssertionrows are additive contract rows. They are enforced only when linked to a feature. milestone.acceptanceCriteriais descriptive/informational milestone text and is not directly executed by the validator.
Worked examples
- Feature has acceptance criteria; store-managed assertion linked; validator passes
- Result: feature may move to done/passed and contribute to slice completion.
- Feature has acceptance criteria; additive milestone assertion also linked; one linked assertion fails
- Result: feature is not complete; no slice advance.
- Feature has acceptance criteria visible, but no linked assertions (legacy FN-5696 shape)
- Result: data inconsistency; must not be interpreted by operators as a separate enforced gate. Repair links (FN-5696 backfill) so enforcement matches displayed intent.
Enforced vs. Informational Surfaces
| Surface | Category | Contract meaning |
|---|---|---|
MissionFeature.acceptanceCriteria |
Informational authoring source | Canonical authored feature criteria text; enforcement happens through derived/linked assertions |
Store-managed per-feature MissionContractAssertion |
Enforced | Primary validator gate for the feature |
Additive milestone MissionContractAssertion (linked to feature) |
Enforced | Additional validator gate for that linked feature |
Additive milestone MissionContractAssertion (unlinked) |
Informational until linked | Contract candidate, not yet a feature gate |
milestone.acceptanceCriteria |
Informational | Milestone summary/pass-bar text for humans; not directly validator-executed |
MissionManager milestone-feature-acceptance-rollup UI (data-testid="milestone-feature-acceptance-rollup") |
Informational display | Display-only rendering of feature acceptance text, not a separate enforcement mechanism |
Zero-Assertion Behavior and FN-5696 Failure Shape
Zero-assertions runtime behavior (canonical FN-5738 path)
When a feature reaches completion trigger points and has zero linked assertions, mission execution must take exactly one canonical auto-pass path (not a silent stall and not a competing behavior):
- mark feature terminal as
status="done",loopState="passed",lastValidatorStatus="passed", - emit explicit observability/audit evidence with mission event code
validation_auto_passed_no_assertions, - continue normal slice/mission advancement checks idempotently (no duplicate re-fire on repeated recovery).
FN-5696 legacy shape clarification
A feature can show acceptance text while links are missing (legacy pre-repair data). This must be treated as a linkage/data integrity problem, not as proof that milestone text alone is enforced. Assertion authoring/backfill (FN-5696) is outside the execution loop; the loop must not synthesize mission_feature_assertions rows. The contract prevents ambiguity by separating:
- authored/informational text surfaces, from
- linked assertion enforcement surfaces.
Operators should use the mission assertion backfill operator path to restore expected store-managed linkage for FN-5696 legacy rows:
- Agent/tool:
fn_mission_backfill_assertionswith{ missionId?, dryRun? }(defaults to dry-run). - API:
POST /api/missions/:missionId/backfill-assertionswith body{ dryRun?: boolean }(defaults totrue). - Run dry-run first, then apply (
dryRun=false) once repaired rows look correct. - This remediation is additive: it derives/links one store-managed assertion per unlinked feature so runtime enforcement uses validator-linked assertions rather than the zero-assertion auto-pass branch.
Slice Status and Mission Autopilot Advance Derivation
Autopilot may advance only when each active-slice feature is resolved under this contract:
- Feature with linked assertions: all linked assertions must pass.
- Feature with zero linked assertions: explicit auto-pass path completes it.
- Feature with failed/blocked validation: slice remains incomplete.
- Feature stranded without a task link in an active autopilot slice (
taskId == null): startup + maintenance reconciliation must repair it (title-match link first, otherwise defined-status re-triage) soallDoneremains reachable instead of stalling on never-triaged features.
Then:
- All features resolved complete → slice flips to
complete. - Completed active slice with pending next slice → next slice activates.
- All milestone slices complete → milestone complete.
- All mission milestones complete → mission complete.
This keeps completion logic deterministic and consistent with FN-5715 trigger/recovery behavior.
UI Reconciliation Requirements (for follow-on engineering task)
✅ Implemented in FN-5733 with MissionManager labels:
Contract assertions (autopilot gate)+ enforced indicatorFeature acceptance criteria (informational)+ not-enforced indicator- warning badge when
hasProseButNoAssertions === true
Target surface: packages/dashboard/app/components/MissionManager.tsx
-
Disambiguate labels
- Use distinct wording for:
- feature-authored acceptance text, and
- milestone contract assertions.
- Do not reuse "Completion criteria" to refer to both categories.
- Required wording baseline (or semantically equivalent copy):
- Feature rollup heading:
Feature acceptance criteria (informational source) - Assertion list heading:
Contract assertions (validator-enforced when linked)
- Feature rollup heading:
- Use distinct wording for:
-
Per-row enforcement indicator
- Every displayed row in the assertions/criteria area must show whether it is:
Enforced gate(validator-blocking when linked), orInformational(display-only).
- Every displayed row in the assertions/criteria area must show whether it is:
-
Empty-state contract-correct copy
- Replace the current implication that completion criteria are absent when assertion rows are empty.
- Empty-state text must acknowledge when feature acceptance text exists but no assertion rows are defined/linked.
- Required behavior:
- If feature acceptance text exists but no assertion rows are present, show copy equivalent to:
No contract assertions are linked yet. Feature acceptance criteria are present below and remain informational until assertions are linked. - If neither feature acceptance text nor assertions exist, show copy equivalent to:
No feature acceptance criteria or contract assertions defined yet.
- If feature acceptance text exists but no assertion rows are present, show copy equivalent to:
-
No button/mobile scope expansion
- No button touch-target/mobile-reflow requirements (standing directive).
Engineering Acceptance Criteria (follow-on implementation)
✅ Implemented in FN-5733:
- Auto-pass path now advances
loopStatetopassedand emits mission event codevalidation_auto_passed_no_assertionswhile preserving thevalidation:passedemit contract ("No assertions linked"summary). - Milestone rollup/store guard now exposes
hasProseButNoAssertionsand emits warning mission event codemilestone_missing_structured_assertions(debounced on transition into condition). - MissionManager UI now distinguishes enforced assertion gate vs informational feature acceptance criteria.
-
Data/model contract
- Preserve the canonical relationship: feature-authored criteria -> store-managed assertion -> linked assertion enforcement.
- If any model/UI metadata is added for enforced-vs-informational badges, it must be backward compatible with existing mission rows.
-
Validator/loop behavior
- Maintain FN-5715 invariants:
- done mission-linked tasks with linked assertions trigger validation,
- completion-trigger starts loop if needed,
- startup recovery replays done-implementing features with unpassed assertions,
- periodic self-heal maintenance replays the same
recoverActiveMissionspath so historically strandedimplementingfeatures recover without restart, - zero-linked-assertions path remains explicit canonical auto-pass.
- Maintain FN-5715 invariants:
-
UI behavior
- Implement the Step-2 label reconciliation and per-row indicator requirements.
- Ensure no shared ambiguous terminology remains between feature acceptance text and assertion rows.
-
Regression coverage
- Add at least one regression test pinning the Goals-mission shape:
- feature has
acceptanceCriteria, - parent milestone has zero
MissionContractAssertionrows / no links, - autopilot behavior is deterministic and observable (explicit auto-pass path, no silent stall).
- feature has
- Add at least one regression test pinning the Goals-mission shape:
-
Operational observability
- Ensure mission/audit surfaces make no-assertions auto-pass and subsequent advance decisions queryable in logs/events.
Success Metric
For 30 days after the follow-on implementation ships:
- Primary metric: zero autopilot stalls of the FN-5715 class (done mission task + unresolved validation trigger gap) in production mission runs.
- Evidence source: mission audit/event stream (
feature_completed,slice_completed,mission_completed) plusmission_validator_runsrecords showing:- explicit no-assertions auto-pass evidence (summary/reason path such as
No assertions linkedwhen no validator run is started), and - downstream advancement evidence without stalled active slices.
- explicit no-assertions auto-pass evidence (summary/reason path such as
Follow-on Task Requirement
Implementation must land in a separate engineering task that references this document and FN-5715 as the enforcement baseline.