diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 4e6dd61..88852e8 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -60,6 +60,18 @@ jobs: python3 scripts/plan_repository_presentation.py verify-plan \ --plan "${plan_path}" + - name: Prove reviewed general fleet convergence planning + shell: bash + run: | + plan_path="${RUNNER_TEMP}/fleet-convergence.plan.json" + python3 scripts/plan_fleet_convergence.py plan \ + --manifest "examples/convergence/fleet.manifest.json" \ + --catalog "examples/convergence/catalog.json" \ + --observatory "examples/convergence/observatory.snapshot.json" \ + --output "${plan_path}" + python3 scripts/plan_fleet_convergence.py verify-plan \ + --plan "${plan_path}" + - name: Run adversarial validator tests run: >- python3 -m unittest discover @@ -76,4 +88,4 @@ jobs: set -euo pipefail while IFS= read -r document; do python3 -m json.tool "${document}" >/dev/null - done < <(find examples schemas -type f -name "*.json" -print | sort) + done < <(find contracts examples schemas -type f -name "*.json" -print | sort) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index adc88b7..3c08fa2 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -8,7 +8,7 @@ status: provisional owners: - egohygiene created: 2026-08-19 -updated: 2026-08-31 +updated: 2026-09-02 governed_by: - architecture-architecture depends_on: @@ -92,6 +92,29 @@ Egolint report, reviewed plan, immutable contract set, and rollback snapshot. An external authorized operator may consume that artifact only after the review boundary; application remains outside this slice. +## Implemented fleet convergence slice + +```text +Hygiene catalog + Holon manifest + Pace current/desired locks + + + Observatory organization-health snapshot + | + v + deterministic drift -> ordered repository units -> exact review + | + v + bounded candidate verification -> one upgrade PR +``` + +`scripts/plan_fleet_convergence.py` activates the general inventory reader, +desired-state resolver, drift engine, reconciliation planner, and a deliberately +narrow GitHub adapter. Observatory supplies observation; Pace does not scan. +Holon supplies exact generated-file plans and rendering; Pace verifies the +resulting candidate rather than reproducing the materializer. The adapter can +create one non-default branch and pull request only when the remote base still +equals the represented commit and the local diff exactly equals the reviewed +allowlist. Merge remains outside the adapter. + ## Dependency rules - Sibling domain capabilities integrate through versioned public contracts, not direct access to internals. @@ -115,11 +138,11 @@ The architecture favors independently usable local and self-hosted operation. Op ## Evidence and uncertainty -- **Observed:** Pace owns a versioned dependency-lock validator plus a bounded - repository-presentation inventory, deterministic drift/plan projection, - exact review authorization, credential-free single-repository proposal, - adversarial tests, and least-privilege CI gate. General update resolution and - every consumer write/application path remain unimplemented. +- **Observed:** Pace owns a versioned dependency-lock validator, a general + deterministic convergence planner, exact partial-fleet review records, + bounded candidate verification, an idempotent one-PR GitHub adapter, and the + specialized repository-presentation rollout planner. It consumes pinned + sibling contracts and does not merge or mutate a default branch. - **Decided for this draft:** The repository owns the bounded concern described here and participates through versioned contracts. - **Proposed:** Target systems and later roadmap phases remain proposals until accepted and implemented. - **Open question:** Which parts of this draft should become active in the first independently versioned release? diff --git a/README.md b/README.md index a23b1e1..1870b73 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,28 @@ See the complete [lock and update policy](LOCK_POLICY.md), the [JSON Schema](schemas/pace-lock-v1.schema.json), and the [six-kind example](examples/pace.lock.json). +## Plan reviewed fleet convergence + +The general convergence path consumes Hygiene catalog membership, Holon +foundation intent, current and desired Pace locks, and Observatory's current +represented state. It produces deterministic dependency-ordered drift before +any write and requires an exact review for each repository-sized upgrade unit. + +```bash +python3 scripts/plan_fleet_convergence.py plan \ + --manifest "examples/convergence/fleet.manifest.json" \ + --catalog "examples/convergence/catalog.json" \ + --observatory "examples/convergence/observatory.snapshot.json" \ + --output "/tmp/fleet-convergence.plan.json" + +python3 scripts/plan_fleet_convergence.py verify-plan \ + --plan "/tmp/fleet-convergence.plan.json" +``` + +After review, `propose` prepares one credential-free PR request and `open-pr` +accepts only an exact candidate tree on the still-current represented commit. +See the [fleet convergence contract and operator guide](docs/fleet-convergence.md). + ## Plan repository-presentation rollout Pace now owns a read-only, privacy-safe repository-presentation inventory and a @@ -51,8 +73,8 @@ See the [rollout contract and operating guide](docs/repository-presentation-roll ## Current authority boundary -Pace validates desired locks and can now turn a reviewed repository-presentation -inventory into a deterministic no-write fleet plan. It may emit a credential-free -single-repository proposal only after exact plan review and valid pinned Egolint -evidence. It still does not edit consumer files, open pull requests, or apply -changes; those remain separately authorized authority boundaries. +Pace validates desired locks and can turn pinned catalog, Holon, lock, and +Observatory inputs into deterministic no-write fleet plans. After an exact +human review, it can verify a locally materialized candidate and open one +bounded consumer pull request. It never scans repositories, renders Holon +outputs, updates a default branch, or merges a pull request. diff --git a/ROADMAP.md b/ROADMAP.md index efb3fa5..12e6b2d 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -8,7 +8,7 @@ status: provisional owners: - egohygiene created: 2026-08-19 -updated: 2026-08-31 +updated: 2026-09-02 governed_by: - architecture-roadmap depends_on: @@ -40,7 +40,8 @@ updated: 2026-08-24 > This evidence-reconciled snapshot is the issue-generation and visual-roadmap handoff. The longer-horizon strategy below remains canonical context; generated HTML, JSON, progress, issue plans, and commit lists are projections. **Lifecycle:** seed implementation -**Current gate:** Review issue #14's no-write repository-presentation fleet plan, then unblock and independently approve its three canaries before any consumer PR. +**Current gate:** Review PAC-02's general convergence contracts and bounded PR adapter, while issue #14 separately unblocks its three presentation canaries. + **North-star outcome:** Reviewable fleet convergence from declared desired state, observed state, and explicit drift. ### Visual roadmap publication @@ -78,72 +79,75 @@ issues: [] #### PAC-Q02 — Capture observed state -**State:** `active` +**State:** `complete` + **Depends on:** `PAC-Q01` **Outcome:** Pace can record what is actually deployed without mutating it. **Exit criteria:** -- [ ] An observed-state schema and collector are implemented. -- [ ] Fixtures prove stable normalization of at least one representative fleet. +- [x] Pace consumes Observatory's pinned organization-health schema instead of adding a second collector. +- [x] Fixtures prove stable ingestion of represented fleet state and block stale or ambiguous evidence. **Current evidence:** -- A bounded, privacy-safe repository-presentation inventory now records all 29 repositories and explicit adoption states. -- General-purpose observed-state collection remains unimplemented. +- Observatory PR #15 provides the read-only organization-health contract. +- Pace pins that contract and binds the exact catalog bytes, snapshot ID, freshness, and represented commit into every plan. #### PAC-Q03 — Render actionable drift -**State:** `planned` +**State:** `complete` + **Depends on:** `PAC-Q02` **Outcome:** Desired and observed states produce a deterministic, human-reviewable drift report. **Exit criteria:** -- [ ] Additions, removals, and changes are distinguished. -- [ ] Repeated runs on unchanged input are identical. +- [x] Additions, removals, and changes are distinguished. +- [x] Repeated runs on unchanged input are identical. **Current evidence:** -- Issue #14 implements deterministic repository-presentation drift categories and an Observatory-safe projection. -- The general cross-capability drift engine remains planned. +- PAC-02 compares complete current and desired Pace lock entries and explains categorical risk. +- The canonical plan digest binds inputs, dependency order, drift, risk, blockers, and rollback state. #### PAC-Q04 — Create a reviewable convergence plan -**State:** `planned` +**State:** `complete` + **Depends on:** `PAC-Q03` **Outcome:** Issue #2 yields an ordered plan with explicit risk, ownership, and rollback information. **Exit criteria:** -- [ ] The plan is generated without applying changes. -- [ ] Each action links to the drift that caused it. +- [x] The plan is generated without applying changes. +- [x] Each action links to the drift that caused it. **Current evidence:** -- Issue #14 now proves an exact no-write plan, plan digest, review record, supersession boundary, and one-repository proposal contract for repository presentation. -- Issue #2 remains the broader convergence-planning gate. +- PAC-02 emits topologically ordered repository units with full before/after lock entries, risk reasons, exact review records, and partial-fleet selection. +- One reviewed unit can verify one bounded candidate and open one non-default-branch PR; merge remains human-owned.