From 93c2cc011ea37e6dfed6ee5091aa1946822e6181 Mon Sep 17 00:00:00 2001 From: DJConnect Date: Thu, 17 Sep 2026 11:10:55 +0200 Subject: [PATCH] docs: refine governed project autonomy and roadmap publication (NO_BUMP) Record owner-requested distinction between the single-Mission inner loop and project-loop authority. Add factual roadmap publication, disposition-aware findings, committed priority and exact approved worksets, plus explicitly bounded delegated development. Extend the documentary DAG from six to nine PLANNED nodes and the shared PMT registry from 24 to 36 scenarios. Preserve Mission 3 acceptance, active grants, runtime state and all product boundaries. Documentary guards are not runtime qualification. --- .../LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md | 131 ++++++++++++++++++ .../LIVE_PROJECT_ROADMAP_MANAGEMENT_V1.md | 52 ++++++- .../live-project-roadmap-management-v1.json | 39 ++++-- tests/test_live_project_roadmap_contract.py | 42 +++++- 4 files changed, 248 insertions(+), 16 deletions(-) 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():