diff --git a/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md b/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md index 06d8784..80ee8d6 100644 --- a/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md +++ b/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md @@ -153,6 +153,113 @@ is distinct, authorized and budgeted. Closing a tab stops its polling only, not server work. Offline caches are redacted, scoped and read-only; old browser eligibility never authorizes an operation after reconnect. +## Project-loop authority refinement — 17 September 2026 + +Refinement `PROJECT_LOOP_AUTHORITY_2026_09_17` follows the owner-requested Forge +contract addition, observed against Forge +`107936d56223a3fa9fef4b6d2ac6b831d97ff9d2` and Workspace +`eb6c656a92d71666cb493059d517fd174857855d`. These are documentary bases, not +installation or activation evidence. The interface must distinguish autonomy +inside an approved Mission from permission to select another product objective. +Mission 3 remains its separately defined single-Mission multi-Action test; +this project-loop design neither expands that test nor claims it has passed. + +### Three planned modes and independent decisions + +| Planned project mode | User-facing meaning | What is not implied | +| --- | --- | --- | +| MISSION_RELEASE | Autonomously execute one specifically approved and released Mission; show proposed follow-up work | Completion does not start the next Candidate | +| APPROVED_WORKLIST | Continue through an exact approved workset under its approved order or explicit selection rule | New findings do not join the workset or jump the queue | +| DELEGATED_DEVELOPMENT | Develop within explicitly delegated product goals, scope, decision roles and remaining limits | Selecting the mode creates no grant, approval, merge or deployment authority | + +These are target policy terms, not existing lifecycle enums or currently enabled +controls. The design recommends MISSION_RELEASE by default but changes no active +setting. Show the effective mode, policy revision, actual grant, remaining limits +and why a requested mode is unsupported or waiting. A full-autonomy toggle without +qualified delegated decision support must not be presented as effective authority. +Required personal human gates remain visible and blocking; a model cannot sign +as the human or approve its own exception. + +Keep four decisions visibly separate: approve exact scope, approve committed +priority/workset, release for start, and observe actual activation. A valid +Business/Architecture decision is not requested a second time just to release. +AUTO_WHEN_ELIGIBLE remains release of already-approved work, not permission to +approve new Candidates. Intermediate review cadence is independent of these modes. + +Business evaluates value/cost/timing; Architect evaluates technical scope, risk +and dependencies. One person may hold both roles without collapsing their decision +records. Workspace routes decisions to the owning Forge service; it does not +make itself the approval authority or infer a decision from a chat sentiment. + +### Recommendation versus committed execution order + +Show distinct recommended and committed order, exact workset membership, per-item +approved revision, release state and selector policy. A changed recommendation +gets a reason and impact preview, not an automatic execution reorder. +The authorized user may select any eligible item instead of the top recommendation; +show blocking prerequisites rather than offering a bypass for ineligible work. +A saved list sort or drag preview is not an applied priority decision. + +Default workset behavior waits on an ineligible next item. Skipping/reordering is +allowed only by its explicitly approved selector. Add/remove/reorder requests bind +exact subjects, before/after revisions, actual actor/role and idempotency identity. +Readback confirms application; stale clicks and concurrent changes cannot silently +expand the selected set. After exhaustion show idle plus proposals, not an invented +next Mission. Do not pre-check all future Candidates in a bulk approval control. + +Example, not live state: + +```text +M1 delivered and reconciled. +Committed next: approved M2, automatic release authorized. +New finding: Candidate C7; Forge recommends priority above M2. +Decision needed: Business/Architecture assessment and workset amendment. +Until decided: C7 does not execute or replace M2. +``` + +### Findings and their disposition + +The Changes view distinguishes current acceptance defects from optional future +work. Moving an unmet criterion to a Candidate cannot make the current Mission +pass. Out-of-scope non-blocking findings are evidence-linked proposals, retaining +origin Action/run/candidate, impact, uncertainty and prior dispositions. + +Offer authorized refine/approve/defer/reject/accept-risk actions through the owning +contracts; do not invent a universal acceptance role. Preserve duplicate links, +rejection and accepted-risk reasons. Materially new evidence may propose reopening, +not silently erase a previous decision. An urgent scoped safety stop does not grant +authority to build the suggested broader fix. Completed Mission and unresolved +non-blocking Candidates may legitimately coexist. + +### Runtime facts and canonical repository publication + +Display approval, admission, execution, partial results, block/failure/cancellation, +reconciliation and acceptance with their separate evidence and timestamps. Automatic +factual refresh is not roadmap direction approval. A capability can have several +contributing Missions and a Mission can contribute to several capabilities; +counts of completed Missions do not prove capability acceptance. + +Show both the latest Forge runtime snapshot and the canonical repository's last +published roadmap snapshot, including source revision, projection operation and +freshness. Pending/conflicting publication does not erase proven delivery. Allow +inspection of the bounded publication diff and receipt where authorized; no browser +filesystem patch or silent human-text replacement. Repository publication is routed +through the existing authorized EP delivery owner, not a new Workspace scheduler. +A projection-only commit cannot create another product Mission or an endless update. + +### Rollout and evidence + +PRM-W-DECISIONS covers mode, workset and finding decisions; PRM-W-SYNC covers dual +freshness/publication evidence. Existing read-only views and basic management may +ship before full delegated mode. Each control advertises only the qualified owning +subset and actual role authority. Source docs do not enable delegation. + +The shared PMT-25..36 cases extend the existing registry. Prove human-selected +non-top work, unapproved high-priority findings not entering a released workset, +expired/revoked delegation, stale amendments, all lifecycle outcomes and repository +publication conflicts. No internal approval stubs or test-driver orchestration. +Headless Forge continuation remains independent of an open Workspace tab. + ## UI, API and evidence requirements Use the common EP-aligned design system, two themes, en/nl/de/fr/es, accessible diff --git a/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_DAG.json b/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_DAG.json index f041207..53b0bd7 100644 --- a/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_DAG.json +++ b/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_DAG.json @@ -12,23 +12,32 @@ "architecture": "docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md", "roadmap": "docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_ROADMAP.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/forge", "path": "docs/roadmap/live-project-roadmap-management-v1.json"}, "nodes": [ {"id": "PRM-W-CONTRACT", "owner": "workspace", "status": "PLANNED", "depends_on": [], "delivery": "Workspace consumer and interaction contract", "qualification_evidence": []}, {"id": "PRM-W-VIEW", "owner": "workspace", "status": "PLANNED", "depends_on": ["PRM-W-CONTRACT"], "delivery": "Live overview, dependency graph and detail views", "qualification_evidence": []}, {"id": "PRM-W-MANAGE", "owner": "workspace", "status": "PLANNED", "depends_on": ["PRM-W-VIEW"], "delivery": "Governed management, release explanations and iteration changes", "qualification_evidence": []}, - {"id": "PRM-W-Q", "owner": "workspace", "status": "PLANNED", "depends_on": ["PRM-W-MANAGE"], "delivery": "Installed HTTP/browser, localization and access qualification", "qualification_evidence": []} + {"id": "PRM-W-DECISIONS", "owner": "workspace", "status": "PLANNED", "depends_on": ["PRM-W-MANAGE"], "delivery": "Role-aware project modes, recommended versus committed worksets and finding disposition decisions", "qualification_evidence": []}, + {"id": "PRM-W-SYNC", "owner": "workspace", "status": "PLANNED", "depends_on": ["PRM-W-VIEW"], "delivery": "Runtime and repository projection freshness, publication evidence and conflict explanations", "qualification_evidence": []}, + {"id": "PRM-W-Q", "owner": "workspace", "status": "PLANNED", "depends_on": ["PRM-W-MANAGE", "PRM-W-DECISIONS", "PRM-W-SYNC"], "delivery": "Installed HTTP/browser, localization and separately scoped project-mode qualification", "qualification_evidence": []} ], - "external_node_dependencies": {"PRM-W-CONTRACT": ["PRM-F-CONTRACT"], "PRM-W-VIEW": ["PRM-F-PROJECTION", "PRM-F-ELIGIBILITY"], "PRM-W-MANAGE": ["PRM-F-ACTIVATION", "PRM-F-CHANGES"], "PRM-W-Q": ["PRM-F-Q"]}, + "external_node_dependencies": {"PRM-W-CONTRACT": ["PRM-F-CONTRACT"], "PRM-W-VIEW": ["PRM-F-PROJECTION", "PRM-F-ELIGIBILITY"], "PRM-W-MANAGE": ["PRM-F-ACTIVATION", "PRM-F-CHANGES"], "PRM-W-DECISIONS": ["PRM-F-PRIORITY", "PRM-F-DELEGATION"], "PRM-W-SYNC": ["PRM-F-REPOSITORY"], "PRM-W-Q": ["PRM-F-Q"]}, + "external_dependency_note": "Full-node completion requires listed producer subsets; manual/worklist UI slices do not require delegated-development support and must label unsupported controls.", "evidence_gates": [ {"id": "PRM-HTTP", "owner": "workspace", "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-W-VIEW": ["PRM-HTTP"], "PRM-W-MANAGE": ["PRM-HTTP", "PRM-RUNTIME"], "PRM-W-Q": ["PRM-HTTP", "PRM-RUNTIME", "PRM-EXECUTION"]}, + "node_evidence_gates": {"PRM-W-VIEW": ["PRM-HTTP"], "PRM-W-MANAGE": ["PRM-HTTP", "PRM-RUNTIME"], "PRM-W-DECISIONS": ["PRM-HTTP", "PRM-RUNTIME", "PRM-DELEGATION"], "PRM-W-SYNC": ["PRM-HTTP", "PRM-REPOSITORY"], "PRM-W-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"}, @@ -53,9 +62,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/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_ROADMAP.md b/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_ROADMAP.md index 67ff340..451dbaa 100644 --- a/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_ROADMAP.md +++ b/docs/LIVE_PROJECT_ROADMAP_MANAGEMENT_V1_ROADMAP.md @@ -14,25 +14,54 @@ WORKSPACE::ROADMAP_DAG_GOVERNANCE_V1, not the Forge Server admin Console. | PRM-W-CONTRACT | Workspace consumer and interaction contract | none | | PRM-W-VIEW | Live overview, dependency graph and detail views | PRM-W-CONTRACT | | PRM-W-MANAGE | Governed management, release explanations and iteration changes | PRM-W-VIEW | -| PRM-W-Q | Installed HTTP/browser, localization and access qualification | PRM-W-MANAGE | +| PRM-W-DECISIONS | Role-aware project modes, recommended versus committed worksets and finding disposition decisions | PRM-W-MANAGE | +| PRM-W-SYNC | Runtime and repository projection freshness, publication evidence and conflict explanations | PRM-W-VIEW | +| PRM-W-Q | Installed HTTP/browser, localization and separately scoped project-mode qualification | PRM-W-MANAGE, PRM-W-DECISIONS, PRM-W-SYNC | -All nodes remain PLANNED with empty qualification evidence. External evidence -is a real producer subset, not permission to allocate peer implementation. +All six Workspace nodes remain PLANNED with empty qualification evidence. +External evidence is a real producer subset, not permission to allocate peer work. | Workspace node | Required Forge producer nodes | | --- | --- | | PRM-W-CONTRACT | PRM-F-CONTRACT | | PRM-W-VIEW | PRM-F-PROJECTION, PRM-F-ELIGIBILITY | | PRM-W-MANAGE | PRM-F-ACTIVATION, PRM-F-CHANGES | +| PRM-W-DECISIONS | PRM-F-PRIORITY, PRM-F-DELEGATION | +| PRM-W-SYNC | PRM-F-REPOSITORY | | PRM-W-Q | PRM-F-Q | -The coordinated ten-node graph is acyclic: Forge does not depend on the full +The coordinated fifteen-node graph is acyclic: Forge does not depend on the full Workspace UI to activate authorized work. Contract design can start independently; live delivery needs the exact producer subsets. Read-only views can ship before management, but must mark unsupported operations. Chat/refinement links consume available RC contracts; full chat, installer and Console completion are not new prerequisites. Workspace uses qualified HTTP only and never owns activation. +## Project-loop refinement and scoped rollout + +`PROJECT_LOOP_AUTHORITY_2026_09_17` makes automatic facts, governed direction, +recommended order and committed execution visibly different. PRM-W-DECISIONS +adds planned MISSION_RELEASE, APPROVED_WORKLIST and DELEGATED_DEVELOPMENT views, +exact workset membership and disposition-aware finding decisions. These modes +are independent of MANUAL_RELEASE/AUTO_WHEN_ELIGIBLE and review cadence. + +A mode selector cannot grant authority or replace Business/Architecture decisions. +Delegated decisions require explicit qualified producer support and real grant/ +subject evidence; required personal human gates stay intact. PRM-F-DELEGATION is +needed only for the delegated portion of PRM-W-DECISIONS, not as a new prerequisite +for basic manual/worklist interactions. Full-node/full-family qualification claims +require all listed producer subsets; smaller slices label unsupported controls. + +PRM-W-SYNC shows the latest Forge snapshot separately from the last protected +repository publication. A delayed or conflicting roadmap writeback cannot erase +proven delivery. No Workspace filesystem writer, second scheduler or implicit +reprioritization. A human can choose eligible authorized work other than Forge's +first recommendation; no dependency is deleted to make that choice executable. + +Mission 3 remains its already defined single-Mission multi-Action canary. Its +acceptance contract, runtime, zero-retry condition and attempt identity are not +changed. These future project-loop nodes neither prove nor start another Mission. + ## Shared mandatory future acceptance PMT IDs are shared with the companion repository; keep IDs and meanings aligned. @@ -64,6 +93,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/tests/test_live_project_roadmap_contract.py b/tests/test_live_project_roadmap_contract.py index d2b0f22..10f32bb 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), 4) + self.assertEqual(len(nodes), 6) self.assertEqual(len(by_id), len(nodes)) for n in nodes: self.assertEqual(n["owner"], "workspace") @@ -43,12 +43,25 @@ def test_owned_nodes_and_table_edges_are_valid_and_acyclic(self): cells = [x.strip() for x in line.strip("|").split("|")] rows[cells[0]] = set(re.findall(r"PRM-W-[A-Z]+", cells[2])) self.assertEqual(rows, {n["id"]: set(n["depends_on"]) for n in nodes}) + external_rows = {} + for line in self.roadmap.splitlines(): + if line.startswith("| PRM-W-") and len(line.strip("|").split("|")) == 2: + cells = [x.strip() for x in line.strip("|").split("|")] + external_rows[cells[0]] = set(re.findall(r"PRM-F-[A-Z]+", cells[1])) + self.assertEqual(external_rows, {key: set(value) for key, value in self.graph["external_node_dependencies"].items()}) 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 +81,34 @@ 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) + self.assertEqual(self.graph["external_node_dependencies"]["PRM-W-SYNC"], ["PRM-F-REPOSITORY"]) + self.assertIn("PRM-F-DELEGATION", self.graph["external_node_dependencies"]["PRM-W-DECISIONS"]) + self.assertIn("PRM-REPOSITORY", self.graph["node_evidence_gates"]["PRM-W-SYNC"]) + self.assertIn("PRM-DELEGATION", self.graph["node_evidence_gates"]["PRM-W-DECISIONS"]) + 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():