diff --git a/docs/architecture/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md b/docs/architecture/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md index cfc879b..a9d9507 100644 --- a/docs/architecture/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md +++ b/docs/architecture/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md @@ -178,6 +178,137 @@ from a changing Mission denominator, and no dummy next Mission when no work rema Read-only/docs/design outcomes retain their effect and artifact semantics; a report or approved design is not permission to implement the recommendation. +## Project-loop authority refinement — 17 September 2026 + +Owner-requested refinement `PROJECT_LOOP_AUTHORITY_2026_09_17`, observed against +Forge `107936d56223a3fa9fef4b6d2ac6b831d97ff9d2` and Workspace +`eb6c656a92d71666cb493059d517fd174857855d`. These are historical design bases, +not live activation evidence. This section refines the existing contract and DAG; +it creates no second backlog, scheduler, policy engine or executable programme. + +### Inner loop versus project loop + +The inner loop dynamically derives 1..n Actions inside one authorized Mission. +The project loop reconciles results, updates the roadmap, proposes new work and +releases a subsequent Mission only under its own current authority. A successful +single-Mission multi-Action test does not qualify that second loop. Mission 3's +already fixed acceptance, zero-retry requirement and attempt identity are not +expanded, reset or satisfied by this documentary refinement. Production repair +policy remains separately governed; the strict canary is not a blanket policy. + +### Automatic facts; governed direction + +Record authenticated approval, release, dispatch, EP admission, actual start, +wait/block, failure, cancellation, partial delivery, terminal outcome, Forge +reconciliation and required acceptance as separate source-backed facts. Preserve +all actual statuses and unknowns; no current approval click is required merely +to record a verified event. Facts must not promote a proposal into approved work. + +The canonical project authority repository owns approved roadmap direction and +policy definitions. Forge owns the runtime decisions/evidence and their live +projection. Persist factual state promptly in Forge, then publish meaningful +milestone snapshots to the designated repository through the existing authorized +EP/repository-delivery route. Forge does not acquire a direct target-Git writer. + +The repository projection contract pins project, repository, allowed paths, +source snapshot/event identity, policy revision, expected base and publication +operation. Use bounded coalescing, compare-and-swap, protected delivery and +idempotent readback. Preserve human-authored goals, priority decisions and old +evidence; generated progress sections never silently replace approved direction. +A publication conflict yields a visible pending/conflicting projection, not a +rewritten execution result or permission to bypass branch protection. Publish +runtime freshness and repository freshness separately. Reconcile the same +publication operation after uncertainty, not a new product Mission. + +Every event need not create a Git commit. Approval, start, material block/change +and terminal reconciliation are meaningful publication boundaries under policy. +A projection's own commit must not recursively generate another Mission, +reprioritization or infinite projection commit. A final projection cannot require +its own as-yet-nonexistent commit as completion evidence. No source-SHA/request- +baseline mutation of already dispatched Actions; publication is a distinct effect. + +### Three project modes, independent of release and review cadence + +These names are PLANNED policy vocabulary, not shipped enums or an active default. +The recommended default is MISSION_RELEASE; existing effective policies do not +change by reading or merging this document. + +| Mode | Permitted selection | New scope and committed priority | +| --- | --- | --- | +| MISSION_RELEASE | Execute a specifically approved and released Mission; propose what follows | Applicable Business/Architecture decisions and explicit release remain human-governed unless independently covered by existing authority | +| APPROVED_WORKLIST | Progress through an explicitly approved finite workset whose exact subjects have valid AUTO_WHEN_ELIGIBLE release | Forge cannot add findings, replace subjects or change committed order without an authorized amendment | +| DELEGATED_DEVELOPMENT | Select, refine, prioritize and release new work only through a qualified bounded delegation | Requires separately authorized policy/grant and exact auditable subject decisions; selecting the mode supplies none of these | + +An approved workset pins subject revisions, membership, ordering or a specifically +approved deterministic selection rule, dependencies, limits and release choices. +Recommendations remain separately visible. Default: wait when the next committed +item is ineligible; skipping or reordering requires the approved selector to +explicitly permit it. Never silently promote a newly found Candidate as the +"most important" next Mission. Exhausted worksets go idle and present proposals. + +Business owns value, cost and timing; Architecture owns technical scope and risk. +Their required decisions remain distinct even when one authorized person holds +both roles. Valid prior approval is not requested again just to release work. +A human may select any eligible authorized backlog item instead of Forge's top +recommendation; this does not waive prerequisites or amend a frozen subject. +UI sorting is not a priority decision. A priority proposal binds old/new order, +exact subjects, evidence, impact, proposer and required decision to a revision. +Approval of scope, committed priority, permission to start and actual activation +are orthogonal and separately audited. + +DELEGATED_DEVELOPMENT is not unrestricted self-approval. Its planned capability +must reconcile the existing human-governed Business/Architecture contracts with +an explicitly permitted delegated decision path before use. A mandatory personal +human decision remains mandatory unless separately governed policy legitimately +changes that obligation. Mode selection cannot rewrite that policy. Missing or +unsupported delegation support means wait/unsupported, not fabricated approval. + +A delegation names issuer, delegated decision roles, goals, repositories/effects, +risk exclusions, selection rule, time/budget/Mission ceilings, validity, revocation, +stop conditions and exact policy revision. Decisions identify their real delegated +actor and grant, not an invented human signer. Candidate proposal is never its +own approval evidence. Recheck grants and remaining ceilings at selection, +approval, release and protected effects; preserve consumption across Missions, +restarts and mode changes. EP assurance, merge/publish/deploy authority, mandatory +human gates and emergency fences remain independent. Forge cannot widen its own +goals/grants or relabel risk to continue. Unknown applicability escalates. + +### Findings become proposals, not commands + +EP and review agents report evidence; they do not own backlog priority. Classify +findings against the current Mission before deciding what follows: + +- A violated current acceptance criterion remains a current delivery/acceptance + problem; moving it to a Candidate cannot make that Mission pass. Use only the + authorized repair/progression policy or a governed amendment. +- Non-blocking out-of-scope work becomes an evidence-linked new or refined + Candidate and a priority recommendation. It has no executable authority. +- Duplicate, superseded, accepted-risk, deferred or rejected findings retain + their disposition and rationale. Reopen only for materially changed evidence + with the applicable decision; do not repeatedly regenerate rejected work. + +Record finding identity, origin run/Action/candidate, source evidence, impact, +uncertainty, scope classification, links to existing work and proposed disposition. +Candidate refinement is versioned and cannot overwrite approved/human edits. +Severity is a proposal input, not a priority grant. An urgent finding may trigger +an authorized scoped safety hold, but a hold is not authority for a broader fix. +Completion may legitimately leave accepted non-blocking follow-up Candidates. + +### Qualification slices and the next-Mission boundary + +Qualify manual release, approved-worklist continuation and delegated development +as distinct slices. A two-Mission positive case alone is insufficient: after M1, +prove that an unapproved high-priority finding cannot replace already approved M2; +that a human can choose a different eligible item; and that a stopped/expired +delegation cannot launch more work. Use real owning decision/intake APIs, not +approved rows injected by the test driver. Include all failure/block/cancellation +and repository-projection boundaries, not only terminal success. + +PMT-25..36 in the shared registry capture these additional cases. Documentary +checks prove graph/contract consistency only. Neither this merge nor an inner-loop +PASS is project-loop qualification, an automatic backlog approval, or an instruction +to start another Mission. + ## Interfaces, rollout and evidence Workspace Client -> Workspace Server -> Forge/EP and Forge -> EP remain authenticated, diff --git a/docs/roadmap/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md b/docs/roadmap/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md index 9c391ef..1c22371 100644 --- a/docs/roadmap/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md +++ b/docs/roadmap/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md @@ -14,12 +14,15 @@ F5 is not a scheduler; its parent refinement is navigation, not a backward edge. | --- | --- | --- | | PRM-F-CONTRACT | Versioned project/readiness/change contracts and identity mapping | none | | PRM-F-PROJECTION | Consistent project roadmap snapshot and HTTP read projection | PRM-F-CONTRACT | -| PRM-F-ELIGIBILITY | Current condition-vector and approved-pending interpretation | PRM-F-CONTRACT | +| PRM-F-ELIGIBILITY | Current condition-vector and approved-pending interpretation | PRM-F-CONTRACT, PRM-F-PRIORITY | | PRM-F-ACTIVATION | Existing-runtime guarded intake/activation and recovery | PRM-F-ELIGIBILITY | -| PRM-F-CHANGES | Source-backed iteration deltas and advisory expectation refresh | PRM-F-PROJECTION | -| PRM-F-Q | Installed service, restart and outer-loop qualification | PRM-F-ACTIVATION, PRM-F-CHANGES | +| PRM-F-CHANGES | Source-backed lifecycle deltas, disposition-aware finding triage and advisory expectation refresh | PRM-F-PROJECTION | +| PRM-F-PRIORITY | Recommended versus committed order, exact approved worksets and versioned Business/Architecture decisions | PRM-F-CONTRACT, PRM-F-CHANGES | +| PRM-F-REPOSITORY | Idempotent milestone projection through authorized EP repository delivery with separate runtime/repository freshness | PRM-F-CHANGES | +| PRM-F-DELEGATION | Explicit bounded delegated project decisions without implicit approval or mandate expansion | PRM-F-PRIORITY, PRM-F-ACTIVATION | +| PRM-F-Q | Installed service, restart and separately scoped project-mode qualification | PRM-F-ACTIVATION, PRM-F-CHANGES, PRM-F-REPOSITORY, PRM-F-DELEGATION | -All nodes remain PLANNED with empty qualification evidence. External evidence +All nine nodes remain PLANNED with empty qualification evidence. External evidence is a real producer subset, not permission to allocate peer implementation. PRM-F-PROJECTION consumes F2/FH operation/HTTP subsets. PRM-F-ELIGIBILITY and @@ -34,6 +37,35 @@ projection may ship before activation. A qualified headless activation slice may ship before Workspace management; PRM-F-Q is integrated full-family proof, not a prerequisite for every independent bounded implementation. +## Project-loop refinement and scoped rollout + +`PROJECT_LOOP_AUTHORITY_2026_09_17` adds explicit work for the owner-requested +boundary between automatic facts and governed direction. PRM-F-CHANGES classifies +findings without turning them into commands. PRM-F-PRIORITY keeps recommendations +separate from the committed sequence and freezes exact approved workset membership. +PRM-F-REPOSITORY plans bounded publication through the existing EP delivery owner, +not a direct Forge filesystem/Git writer. Conflicts preserve execution evidence +and show repository freshness independently; projection commits cannot recursively +start product work. + +The planned project modes are MISSION_RELEASE, APPROVED_WORKLIST and +DELEGATED_DEVELOPMENT. They are independent of MANUAL_RELEASE/AUTO_WHEN_ELIGIBLE +and intermediate review cadence. MISSION_RELEASE is the recommended design default, +not an activated setting. APPROVED_WORKLIST may progress only under its exact +approved selector and limits; findings cannot silently enlarge it. + +PRM-F-DELEGATION is an additional qualified capability, not permission conferred +by a mode selector. It requires separately governed delegated decision roles, +exact subject decisions, time/scope/budget limits and current grants. It cannot +waive mandatory human, assurance, merge or deployment gates. Standard manual and +approved-worklist slices need not wait for full delegated development. Full-family +PRM-F-Q includes all nodes; slice qualification must name its actually supported +subset and relevant PMT cases. + +Mission 3 proves a single-Mission inner loop only. Its existing scope, zero-retry +acceptance and telemetry/reporting conditions are unchanged. This roadmap adds +no prerequisite or successor Mission to that attempt and does not start anything. + ## Shared mandatory future acceptance PMT IDs are shared with the companion repository; keep IDs and meanings aligned. @@ -65,6 +97,18 @@ They extend the relevant service/inner/outer/UI layers, not a second simulator. | PMT-22 | Failed/ambiguous predecessor never grants new authority or fresh repair budget under a replacement Mission | SERVICE_OUTER | | PMT-23 | Missing API/capability or peer outage has no CLI/import/SQL/Inbox/IPC fallback; read-only rollout labels unsupported controls | SERVICE_UI | | PMT-24 | No remaining project gap yields bounded idle and no fabricated Expected/Candidate/Mission or extra provider call | OUTER_LOOP | +| PMT-25 | Approval, dispatch, admission, running, blocked, failed, cancelled, partial delivery, reconciliation and acceptance remain distinct automatic facts | SERVICE_OUTER_UI | +| PMT-26 | Authorized repository milestone projection preserves approved direction and separate freshness; duplicate, conflict or self-generated commit cannot start work | SERVICE_OUTER_UI | +| PMT-27 | Out-of-scope reviewer findings create evidence-linked proposals, never new execution authority; urgent scoped stop is not permission to fix | OUTER_LOOP | +| PMT-28 | A current acceptance defect cannot be hidden in a follow-up Candidate to claim success; governed repair or amendment remains required | INNER_OUTER_UI | +| PMT-29 | Duplicate, rejected, deferred and accepted-risk findings preserve disposition; changed evidence may propose but not silently approve reopening | SERVICE_OUTER_UI | +| PMT-30 | Human choice of any eligible authorized item may override the recommendation without bypassing dependencies; sorting never changes committed order | SERVICE_UI | +| PMT-31 | APPROVED_WORKLIST executes only exact approved released subjects under the committed selector; high-ranked new findings cannot join or reorder it | OUTER_LOOP | +| PMT-32 | DELEGATED_DEVELOPMENT requires qualified explicit role grants and exact auditable decisions; mode selection never replaces mandatory human gates | SERVICE_OUTER_UI | +| PMT-33 | Delegation scope, expiry, revocation and consumed limits survive successor Missions, restart and mode switch; unknown authority stops release | SERVICE_OUTER | +| PMT-34 | Priority and workset amendments bind exact revisions, impact and role decisions; stale or concurrent commands cannot broaden authorization | SERVICE_UI | +| PMT-35 | Single-Mission multi-Action proof cannot qualify the project loop or alter Mission 3 acceptance; qualification slices remain separate | INNER_OUTER_UI | +| PMT-36 | Capability contribution and acceptance remain many-to-many and evidence-bound; completed Mission counts or published projections cannot prove product completion | SERVICE_UI | The later outer-loop cases add a second positive path: create pending M2's Candidate, real separate approvals and bounded automatic release through public diff --git a/docs/roadmap/live-project-roadmap-management-v1.json b/docs/roadmap/live-project-roadmap-management-v1.json index d0ddc5a..7643cc4 100644 --- a/docs/roadmap/live-project-roadmap-management-v1.json +++ b/docs/roadmap/live-project-roadmap-management-v1.json @@ -12,25 +12,34 @@ "architecture": "docs/architecture/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md", "roadmap": "docs/roadmap/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md", "source_pins": {"forge": "77374203ada9260a9152a8cbb1be841fd070d871", "workspace": "664a3eb87b7b6523d0473dc8b696e94064908940"}, - "invariants": {"one_canonical_project_semantics": true, "roadmap_node_requires_mission": false, "frozen_freezes_action_script": false, "approval_implies_execution_authority": false, "automatic_start_requires_explicit_current_authority": true, "read_projection_can_start_mission": false, "workspace_owns_scheduler": false, "ep_owns_action_admission_and_capacity": true, "priority_overrides_hard_dependency": false, "new_source_revision_always_invalidates_approval": false, "material_scope_change_requires_governance": true, "duplicate_activation_allowed": false, "resume_resets_budget": false, "expected_is_committed_backlog": false, "retired_expectation_deletes_approved_mission": false, "new_mission_resets_failed_lineage_budget": false, "snapshot_and_source_freshness_required": true, "read_refresh_invokes_ai": false, "workspace_close_stops_authorized_work": false, "peer_transport": "AUTHENTICATED_VERSIONED_HTTP_ONLY", "console_replaces_workspace": false, "mock_ci_pass_is_live_ep_proof": false}, + "refinement": {"id": "PROJECT_LOOP_AUTHORITY_2026_09_17", "source_pins": {"forge": "107936d56223a3fa9fef4b6d2ac6b831d97ff9d2", "workspace": "eb6c656a92d71666cb493059d517fd174857855d"}, "mission_3_scope_changed": false, "activated_policy": false}, + "invariants": {"one_canonical_project_semantics": true, "roadmap_node_requires_mission": false, "frozen_freezes_action_script": false, "approval_implies_execution_authority": false, "automatic_start_requires_explicit_current_authority": true, "read_projection_can_start_mission": false, "workspace_owns_scheduler": false, "ep_owns_action_admission_and_capacity": true, "priority_overrides_hard_dependency": false, "new_source_revision_always_invalidates_approval": false, "material_scope_change_requires_governance": true, "duplicate_activation_allowed": false, "resume_resets_budget": false, "expected_is_committed_backlog": false, "retired_expectation_deletes_approved_mission": false, "new_mission_resets_failed_lineage_budget": false, "snapshot_and_source_freshness_required": true, "read_refresh_invokes_ai": false, "workspace_close_stops_authorized_work": false, "peer_transport": "AUTHENTICATED_VERSIONED_HTTP_ONLY", "console_replaces_workspace": false, "mock_ci_pass_is_live_ep_proof": false, "factual_progress_changes_approved_direction": false, "recommendation_changes_committed_priority": false, "ep_finding_grants_mission_authority": false, "mode_selection_creates_grant": false, "approved_worklist_auto_adopts_findings": false, "projection_commit_starts_product_mission": false, "inner_loop_pass_qualifies_project_loop": false, "repository_projection_via_authorized_delivery": true, "delegated_decisions_require_explicit_supported_authority": true, "current_acceptance_defect_can_be_hidden_as_backlog": false}, "groups": ["ACTIVE", "APPROVED_PENDING", "CANDIDATES", "EXPECTED", "HISTORY"], "release_modes": ["MANUAL_RELEASE", "AUTO_WHEN_ELIGIBLE"], + "project_modes": ["MISSION_RELEASE", "APPROVED_WORKLIST", "DELEGATED_DEVELOPMENT"], + "project_mode_default": {"recommended": "MISSION_RELEASE", "active": null}, + "qualification_slices": {"manual_release": "Existing required PMT cases plus applicable PMT-25..36; no delegated-development prerequisite", "approved_worklist": "Manual foundation plus exact finite-workset and autonomous successor cases", "delegated_development": "Explicit qualified decision/grant support plus all delegation cases; mode alone is unsupported authority"}, "peer_graph": {"repository": "pcvantol/workspace", "path": "docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_DAG.json"}, "nodes": [ {"id": "PRM-F-CONTRACT", "owner": "forge", "status": "PLANNED", "depends_on": [], "delivery": "Versioned project/readiness/change contracts and identity mapping", "qualification_evidence": []}, {"id": "PRM-F-PROJECTION", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-CONTRACT"], "delivery": "Consistent project roadmap snapshot and HTTP read projection", "qualification_evidence": []}, - {"id": "PRM-F-ELIGIBILITY", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-CONTRACT"], "delivery": "Current condition-vector and approved-pending interpretation", "qualification_evidence": []}, + {"id": "PRM-F-ELIGIBILITY", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-CONTRACT", "PRM-F-PRIORITY"], "delivery": "Current condition-vector and approved-pending interpretation", "qualification_evidence": []}, {"id": "PRM-F-ACTIVATION", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-ELIGIBILITY"], "delivery": "Existing-runtime guarded intake/activation and recovery", "qualification_evidence": []}, - {"id": "PRM-F-CHANGES", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-PROJECTION"], "delivery": "Source-backed iteration deltas and advisory expectation refresh", "qualification_evidence": []}, - {"id": "PRM-F-Q", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-ACTIVATION", "PRM-F-CHANGES"], "delivery": "Installed service, restart and outer-loop qualification", "qualification_evidence": []} + {"id": "PRM-F-CHANGES", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-PROJECTION"], "delivery": "Source-backed lifecycle deltas, disposition-aware finding triage and advisory expectation refresh", "qualification_evidence": []}, + {"id": "PRM-F-PRIORITY", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-CONTRACT", "PRM-F-CHANGES"], "delivery": "Recommended versus committed order, exact approved worksets and versioned Business/Architecture decisions", "qualification_evidence": []}, + {"id": "PRM-F-REPOSITORY", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-CHANGES"], "delivery": "Idempotent milestone projection through authorized EP repository delivery with separate runtime/repository freshness", "qualification_evidence": []}, + {"id": "PRM-F-DELEGATION", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-PRIORITY", "PRM-F-ACTIVATION"], "delivery": "Explicit bounded delegated project decisions without implicit approval or mandate expansion", "qualification_evidence": []}, + {"id": "PRM-F-Q", "owner": "forge", "status": "PLANNED", "depends_on": ["PRM-F-ACTIVATION", "PRM-F-CHANGES", "PRM-F-REPOSITORY", "PRM-F-DELEGATION"], "delivery": "Installed service, restart and separately scoped project-mode qualification", "qualification_evidence": []} ], "external_node_dependencies": {}, "evidence_gates": [ {"id": "PRM-HTTP", "owner": "forge", "status": "REQUIRED_SUBSET_EVIDENCE", "requires": "Qualified own HTTP operation/event/error/auth contracts; no full UI dependency"}, {"id": "PRM-RUNTIME", "owner": "forge", "status": "REQUIRED_SUBSET_EVIDENCE", "requires": "Existing intake, governance, progression, activation/claim/recovery and actual configured Mission capacity; no new scheduler"}, - {"id": "PRM-EXECUTION", "owner": "engineering-platform", "status": "REQUIRED_SUBSET_EVIDENCE", "requires": "Qualified actual EP execution/receipt/capacity contracts for claimed behavior; no peer work allocation"} + {"id": "PRM-EXECUTION", "owner": "engineering-platform", "status": "REQUIRED_SUBSET_EVIDENCE", "requires": "Qualified actual EP execution/receipt/capacity contracts for claimed behavior; no peer work allocation"}, + {"id": "PRM-REPOSITORY", "owner": "engineering-platform", "status": "REQUIRED_SUBSET_EVIDENCE", "requires": "Authorized bounded roadmap publication, protected delivery and exact operation readback; no Forge direct Git writer"}, + {"id": "PRM-DELEGATION", "owner": "forge", "status": "REQUIRED_SUBSET_EVIDENCE", "requires": "Explicitly governed delegated decision roles, grants, exact subject evidence, remaining limits and mandatory human fences; no mode-implied authority"} ], - "node_evidence_gates": {"PRM-F-PROJECTION": ["PRM-HTTP"], "PRM-F-ELIGIBILITY": ["PRM-RUNTIME"], "PRM-F-ACTIVATION": ["PRM-RUNTIME", "PRM-EXECUTION"], "PRM-F-Q": ["PRM-HTTP", "PRM-RUNTIME", "PRM-EXECUTION"]}, + "node_evidence_gates": {"PRM-F-PROJECTION": ["PRM-HTTP"], "PRM-F-ELIGIBILITY": ["PRM-RUNTIME"], "PRM-F-ACTIVATION": ["PRM-RUNTIME", "PRM-EXECUTION"], "PRM-F-PRIORITY": ["PRM-RUNTIME"], "PRM-F-REPOSITORY": ["PRM-REPOSITORY"], "PRM-F-DELEGATION": ["PRM-RUNTIME", "PRM-DELEGATION"], "PRM-F-Q": ["PRM-HTTP", "PRM-RUNTIME", "PRM-EXECUTION", "PRM-REPOSITORY", "PRM-DELEGATION"]}, "scenario_registry": [ {"id": "PMT-01", "requirement": "Typed capability/Mission/Candidate/Expected/history groups, actual zero/one/multiple active work and no phantom Mission allocation", "test_layer": "SERVICE_UI", "required": true, "status": "PLANNED"}, {"id": "PMT-02", "requirement": "Frozen revision, distinct approvals, manual/automatic release, eligibility and active lifecycle remain orthogonal", "test_layer": "SERVICE_UI", "required": true, "status": "PLANNED"}, @@ -55,9 +64,21 @@ {"id": "PMT-21", "requirement": "Versioned hold/disarm/reorder/release commands show preview and actual readback; paused Forge does not cancel admitted EP work", "test_layer": "SERVICE_UI", "required": true, "status": "PLANNED"}, {"id": "PMT-22", "requirement": "Failed/ambiguous predecessor never grants new authority or fresh repair budget under a replacement Mission", "test_layer": "SERVICE_OUTER", "required": true, "status": "PLANNED"}, {"id": "PMT-23", "requirement": "Missing API/capability or peer outage has no CLI/import/SQL/Inbox/IPC fallback; read-only rollout labels unsupported controls", "test_layer": "SERVICE_UI", "required": true, "status": "PLANNED"}, - {"id": "PMT-24", "requirement": "No remaining project gap yields bounded idle and no fabricated Expected/Candidate/Mission or extra provider call", "test_layer": "OUTER_LOOP", "required": true, "status": "PLANNED"} + {"id": "PMT-24", "requirement": "No remaining project gap yields bounded idle and no fabricated Expected/Candidate/Mission or extra provider call", "test_layer": "OUTER_LOOP", "required": true, "status": "PLANNED"}, + {"id": "PMT-25", "requirement": "Approval, dispatch, admission, running, blocked, failed, cancelled, partial delivery, reconciliation and acceptance remain distinct automatic facts", "test_layer": "SERVICE_OUTER_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-26", "requirement": "Authorized repository milestone projection preserves approved direction and separate freshness; duplicate, conflict or self-generated commit cannot start work", "test_layer": "SERVICE_OUTER_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-27", "requirement": "Out-of-scope reviewer findings create evidence-linked proposals, never new execution authority; urgent scoped stop is not permission to fix", "test_layer": "OUTER_LOOP", "required": true, "status": "PLANNED"}, + {"id": "PMT-28", "requirement": "A current acceptance defect cannot be hidden in a follow-up Candidate to claim success; governed repair or amendment remains required", "test_layer": "INNER_OUTER_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-29", "requirement": "Duplicate, rejected, deferred and accepted-risk findings preserve disposition; changed evidence may propose but not silently approve reopening", "test_layer": "SERVICE_OUTER_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-30", "requirement": "Human choice of any eligible authorized item may override the recommendation without bypassing dependencies; sorting never changes committed order", "test_layer": "SERVICE_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-31", "requirement": "APPROVED_WORKLIST executes only exact approved released subjects under the committed selector; high-ranked new findings cannot join or reorder it", "test_layer": "OUTER_LOOP", "required": true, "status": "PLANNED"}, + {"id": "PMT-32", "requirement": "DELEGATED_DEVELOPMENT requires qualified explicit role grants and exact auditable decisions; mode selection never replaces mandatory human gates", "test_layer": "SERVICE_OUTER_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-33", "requirement": "Delegation scope, expiry, revocation and consumed limits survive successor Missions, restart and mode switch; unknown authority stops release", "test_layer": "SERVICE_OUTER", "required": true, "status": "PLANNED"}, + {"id": "PMT-34", "requirement": "Priority and workset amendments bind exact revisions, impact and role decisions; stale or concurrent commands cannot broaden authorization", "test_layer": "SERVICE_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-35", "requirement": "Single-Mission multi-Action proof cannot qualify the project loop or alter Mission 3 acceptance; qualification slices remain separate", "test_layer": "INNER_OUTER_UI", "required": true, "status": "PLANNED"}, + {"id": "PMT-36", "requirement": "Capability contribution and acceptance remain many-to-many and evidence-bound; completed Mission counts or published projections cannot prove product completion", "test_layer": "SERVICE_UI", "required": true, "status": "PLANNED"} ], - "ci_joins": {"inner": "Reuse FCI real-service/installed harness and FIE-01..28; unchanged existing required cases", "outer": "Extend FCO-FLOW/RESTART/NEGATIVE with PMT-03/04 and recovery without replacing FOE-01..10", "browser": "Workspace own API/Playwright, five locales, both themes; real producer subsets, no internal eligibility stub"}, + "ci_joins": {"inner": "Reuse FCI real-service/installed harness and FIE-01..28; unchanged existing required cases and Mission 3 scope", "outer": "Extend FCO-FLOW/RESTART/NEGATIVE with PMT-03/04 and PMT-25..36 without replacing FOE-01..10; qualify each declared project mode separately", "browser": "Workspace own API/Playwright, five locales, both themes; real producer subsets, no internal eligibility stub"}, "completion_requires_live_proof": false, - "completion_note": "All applicable required PMT cases and owning subset evidence must pass; document presence and external fake success are not runtime qualification." + "completion_note": "All applicable required PMT cases and owning subset evidence must pass for the claimed slice; documentary completion is not runtime or project-loop qualification and activates no policy." } diff --git a/tests/test_live_project_roadmap_contract.py b/tests/test_live_project_roadmap_contract.py index 698db2a..f36faa6 100644 --- a/tests/test_live_project_roadmap_contract.py +++ b/tests/test_live_project_roadmap_contract.py @@ -28,7 +28,7 @@ def test_documentary_scope_and_no_execution_authority(self): def test_owned_nodes_and_table_edges_are_valid_and_acyclic(self): nodes = self.graph["nodes"] by_id = {n["id"]: n for n in nodes} - self.assertEqual(len(nodes), 6) + self.assertEqual(len(nodes), 9) self.assertEqual(len(by_id), len(nodes)) for n in nodes: self.assertEqual(n["owner"], "forge") @@ -46,9 +46,16 @@ def test_owned_nodes_and_table_edges_are_valid_and_acyclic(self): def test_scenarios_remain_mandatory_future_work(self): scenarios = self.graph["scenario_registry"] - expected = [f"PMT-{i:02}" for i in range(1, 25)] + expected = [f"PMT-{i:02}" for i in range(1, 37)] self.assertEqual([s["id"] for s in scenarios], expected) - self.assertEqual(set(re.findall(r"^\| (PMT-\d{2}) \|", self.roadmap, re.MULTILINE)), set(expected)) + rows = {} + for line in self.roadmap.splitlines(): + if re.match(r"^\| PMT-\d{2} \|", line): + cells = [x.strip() for x in line.strip("|").split("|")] + self.assertEqual(len(cells), 3) + self.assertNotIn(cells[0], rows) + rows[cells[0]] = (cells[1], cells[2]) + self.assertEqual(rows, {s["id"]: (s["requirement"], s["test_layer"]) for s in scenarios}) for scenario in scenarios: self.assertIs(scenario["required"], True) self.assertEqual(scenario["status"], "PLANNED") @@ -68,6 +75,35 @@ def test_authority_effects_and_projection_boundaries(self): self.assertIs(inv["snapshot_and_source_freshness_required"], True) self.assertEqual(inv["peer_transport"], "AUTHENTICATED_VERSIONED_HTTP_ONLY") + def test_project_modes_are_planned_and_do_not_approve_work(self): + g = self.graph + self.assertEqual(g["project_modes"], ["MISSION_RELEASE", "APPROVED_WORKLIST", "DELEGATED_DEVELOPMENT"]) + self.assertEqual(g["project_mode_default"], {"recommended": "MISSION_RELEASE", "active": None}) + self.assertEqual(set(g["qualification_slices"]), {"manual_release", "approved_worklist", "delegated_development"}) + self.assertFalse(g["refinement"]["mission_3_scope_changed"]) + self.assertFalse(g["refinement"]["activated_policy"]) + for mode in g["project_modes"]: + self.assertIn(mode, self.design) + self.assertIn(mode, self.roadmap) + for sha in g["refinement"]["source_pins"].values(): + self.assertRegex(sha, r"^[0-9a-f]{40}$") + self.assertIn(sha, self.design) + + def test_project_loop_authority_and_roadmap_publication_invariants(self): + inv = self.graph["invariants"] + for flag in ("factual_progress_changes_approved_direction", "recommendation_changes_committed_priority", + "ep_finding_grants_mission_authority", "mode_selection_creates_grant", + "approved_worklist_auto_adopts_findings", "projection_commit_starts_product_mission", + "inner_loop_pass_qualifies_project_loop", "current_acceptance_defect_can_be_hidden_as_backlog"): + self.assertIs(inv[flag], False) + self.assertIs(inv["repository_projection_via_authorized_delivery"], True) + self.assertIs(inv["delegated_decisions_require_explicit_supported_authority"], True) + by_id = {n["id"]: n for n in self.graph["nodes"]} + self.assertIn("PRM-F-PRIORITY", by_id["PRM-F-ELIGIBILITY"]["depends_on"]) + self.assertNotIn("PRM-F-DELEGATION", by_id["PRM-F-ACTIVATION"]["depends_on"]) + self.assertIn("PRM-REPOSITORY", self.graph["node_evidence_gates"]["PRM-F-REPOSITORY"]) + self.assertIn("PRM-DELEGATION", self.graph["node_evidence_gates"]["PRM-F-DELEGATION"]) + def test_evidence_requirements_and_navigation(self): gates = {g["id"] for g in self.graph["evidence_gates"]} for node, required in self.graph["node_evidence_gates"].items():