diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index 17bd88f..f6b4b65 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -89,3 +89,4 @@ | task | RMGR-WP-0010-T07 | done | — | workplans/RMGR-WP-0010-authoritative-workload-references.md | | intake | RMGR-IN-0001 | open | — | intakes/intakes.md | | intake | RMGR-IN-0002 | open | — | intakes/intakes.md | +| decision | RMGR-DEC-2026-001 | open | — | decisions/RMGR-DEC-2026-001-whynot-identifier-batch.md | diff --git a/decisions/RMGR-DEC-2026-001-whynot-identifier-batch.md b/decisions/RMGR-DEC-2026-001-whynot-identifier-batch.md new file mode 100644 index 0000000..1cfefd5 --- /dev/null +++ b/decisions/RMGR-DEC-2026-001-whynot-identifier-batch.md @@ -0,0 +1,47 @@ +# RMGR-DEC-2026-001 — Whynot Design identifier cutover batch + +```yaml +id: RMGR-DEC-2026-001 +kind: decision +title: Approve deterministic identifier batch 0002 for whynot-design +status: open +decision_type: pending +owner: Bernd Worsch +repo: repo-manager +workplan: RMGR-WP-0005 +workplan_task: RMGR-WP-0005-T04 +requested_dispositions: + - approved + - revised + - rejected +source_plan: docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v2.json +source_plan_sha256: ac97f6e4f0b35db63a0dc1b4a439f0a39738d13c1407f18419f706d780d4eea0 +batch_manifest: docs/evidence/RMGR-WP-0005-batch-0002-whynot-design.json +batch_sha256: 4039224352c6590fdc6b41e739539f1f9c92d098b43ed6e30b3cd9a87b53da65 +scope: + repositories: [whynot-design] + replacements: 1 + assignments: 0 +apply_authorized: false +approval_effect: >- + Approved authorizes one repository-atomic forward cutover of exactly the + pinned batch in both current projections and the authoritative repository + file, subject to repeated no-drift and restore-point checks. Revised or + rejected authorizes no mutation. +rollback: >- + Reverse the file transaction if written, then reverse workstation and + production projection transactions using their durable aliases. +evidence: docs/evidence/RMGR-WP-0005-batch-0002-readiness-2026-08-22.md +created: "2026-08-22" +updated: "2026-08-22" +``` + +## Decision requested + +Approve, revise, or reject the exact batch manifest named above. Approval is +limited to `whynot-design` and the single `WHYNOT-WP-0003` UUID replacement; it +does not authorize any later fleet batch. + +The manifest remains fail-closed: any Git, source-fingerprint, projection, or +plan-seal drift before execution voids the approval and requires a new batch +hash. diff --git a/docs/evidence/RMGR-WP-0005-batch-0002-readiness-2026-08-22.md b/docs/evidence/RMGR-WP-0005-batch-0002-readiness-2026-08-22.md new file mode 100644 index 0000000..fb07582 --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-batch-0002-readiness-2026-08-22.md @@ -0,0 +1,77 @@ +# RMGR-WP-0005 batch 0002 readiness + +**Observed at:** `2026-08-22T12:48:35Z` + +**Scope:** `whynot-design` only + +**Decision:** `RMGR-DEC-2026-001` + +## Outcome + +The next deterministic-identifier batch is fully specified and ready for an +explicit approval decision. No database or repository identifier was changed. + +The earlier fleet seal correctly rejects 15 repositories whose authoritative +sources changed after it was generated. A refreshed plan now covers 41 eligible +repositories and 230 records with zero collisions: + +- 180 replacements; +- 32 assignments; +- 18 already deterministic; +- 0 skipped repositories. + +Source plan: +`RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v2.json`, SHA-256 seal +`ac97f6e4f0b35db63a0dc1b4a439f0a39738d13c1407f18419f706d780d4eea0`. + +## Batch 0002 + +The proposed batch deliberately stays at one repository and one replacement: + +| Repository | Record | Current UUID | Derived UUID | +| --- | --- | --- | --- | +| `whynot-design` | `WHYNOT-WP-0003` | `41fed928-f44a-48f4-9870-120310fbf071` | `d3a6ec16-ac40-5ffb-99e7-07f997e59a4a` | + +Batch manifest: +`RMGR-WP-0005-batch-0002-whynot-design.json`, SHA-256 seal +`4039224352c6590fdc6b41e739539f1f9c92d098b43ed6e30b3cd9a87b53da65`. + +The manifest reports `ready_for_approval: true`, `apply_authorized: false`. +`whynot-design` is clean, exactly synchronized with `origin/main`, and its +origin is the Forgejo lineage. The plan pins HEAD +`4b62cffc86496d587ac8d48a8e199624bc4a5c1f` and source fingerprint +`55ea5e6884be2c5a0a7b8e9e19326f381c2b86afecbc28adc00252ce56793a7f`. + +## Projection preflight + +Read-only checks against the workstation and production projections agree: + +| Check | Workstation | Production | +| --- | ---: | ---: | +| Current workplan UUID lookup | 200 | 200 | +| Derived workplan UUID lookup | 404 | 404 | +| Tasks linked to current workplan | 9 | 9 | +| Progress events linked to current workplan | 11 | 11 | +| Decisions linked to current workplan | 1 | 1 | + +This is a useful second pilot: unlike the Repo Manager pilot, the same old row +exists in both projections and has matching dependent-record counts. The +database cascade must preserve those links while the task UUIDs remain +unchanged. + +## Approved execution interface + +If `RMGR-DEC-2026-001` is approved against the exact batch hash: + +1. Re-run batch/source/Git preflight and stop on any drift. +2. Retain fresh per-database restore points and hashes. +3. Apply the repository transaction to workstation and production projections. +4. Apply the sealed authoritative file transaction for `whynot-design`. +5. Commit and push only the mapped workplan file. +6. Run consistency twice and require the derived lookup to return 200, the old + lookup to return 404, and all dependent counts to remain 9/11/1. +7. On any failure after database apply, reverse written files if necessary and + then reverse both database transactions from durable aliases. + +The decision does not authorize any other repository or restoration of the +disabled production sweep. diff --git a/docs/evidence/RMGR-WP-0005-batch-0002-whynot-design.json b/docs/evidence/RMGR-WP-0005-batch-0002-whynot-design.json new file mode 100644 index 0000000..6ff632f --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-batch-0002-whynot-design.json @@ -0,0 +1,47 @@ +{ + "schema": "repo-manager.identifier-migration-batch.v1", + "ok": true, + "ready_for_approval": true, + "apply_authorized": false, + "approval_required": true, + "namespace": "helixforge", + "source_plan_sha256": "ac97f6e4f0b35db63a0dc1b4a439f0a39738d13c1407f18419f706d780d4eea0", + "batch_policy": "repository-atomic, sequential, stop on first failure", + "rollback_order": "reverse files if written, then reverse central projection", + "generated_at": "2026-08-22T12:48:35.222354Z", + "totals": { + "repositories": 1, + "records": 1, + "replace": 1, + "assign": 0, + "unchanged": 0 + }, + "repositories": [ + { + "repo": "whynot-design", + "path": "/home/worsch/whynot-design", + "planned_head_sha": "4b62cffc86496d587ac8d48a8e199624bc4a5c1f", + "source_fingerprint": "55ea5e6884be2c5a0a7b8e9e19326f381c2b86afecbc28adc00252ce56793a7f", + "source_verified": true, + "git_preflight": { + "ok": true, + "head_sha": "4b62cffc86496d587ac8d48a8e199624bc4a5c1f", + "expected_head_sha": "4b62cffc86496d587ac8d48a8e199624bc4a5c1f", + "upstream": "origin/main", + "behind": 0, + "ahead": 0, + "origin": "forgejo-remote:coulomb/whynot-design.git", + "errors": [] + }, + "mapping_counts": { + "records": 1, + "replace": 1, + "assign": 0, + "unchanged": 0 + }, + "ready": true + } + ], + "errors": [], + "batch_sha256": "4039224352c6590fdc6b41e739539f1f9c92d098b43ed6e30b3cd9a87b53da65" +} diff --git a/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v2.json b/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v2.json new file mode 100644 index 0000000..f534c17 --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v2.json @@ -0,0 +1,2545 @@ +{ + "schema": "repo-manager.identifier-migration-plan.v1", + "ok": true, + "ready_to_apply": true, + "root": "/home/worsch", + "namespace": "helixforge", + "derivation_version": "repo-manager.work-record-uuid.v1", + "namespace_uuid": "a4058507-5c4a-5a00-ab06-fffa4fb46009", + "scope": "live workplans and unfinished tasks", + "apply_policy": "all-or-nothing per repository", + "generated_at": "2026-08-22T12:42:58.610065Z", + "totals": { + "repositories": 41, + "eligible": 41, + "skipped": 0, + "records": 230, + "replace": 180, + "assign": 32, + "unchanged": 18 + }, + "repositories": [ + { + "repo": "activity-core", + "path": "/home/worsch/activity-core", + "planned_head_sha": "192f74f678255ff4f145976af27e53fae3ef0409", + "source_fingerprint": "c984bd3989eadcb4261e55b1106f0ace350d681fd06b4b035fe9f5785300e00d", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0030-daily-sbom-catchup.md", + "kind": "workplan", + "record_id": "ACTIVITY-WP-0030", + "current_uuid": "bfe2945e-38df-40d1-94d4-6e4a003ef66d", + "derived_uuid": "db3173ee-aaed-51dc-b674-af83f6a5f3fd", + "action": "replace" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0030-daily-sbom-catchup.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0030-T02", + "current_uuid": "0d09c0d3-74bd-4f4d-8b27-5006ba010fa3", + "derived_uuid": "fb121cc1-bd1a-5ad3-82de-601b047ff628", + "action": "replace" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0030-daily-sbom-catchup.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0030-T03", + "current_uuid": "18bcfc21-616a-48a2-aac3-cdcef7579913", + "derived_uuid": "fa265eb9-8667-5e44-a78a-08693d20332f", + "action": "replace" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0030-daily-sbom-catchup.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0030-T04", + "current_uuid": "f09144f6-c7f9-41d4-b466-d8a6288e6a21", + "derived_uuid": "6911e1f6-74fb-5179-8e15-4a9dc81b648b", + "action": "replace" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md", + "kind": "workplan", + "record_id": "ACTIVITY-WP-0031", + "current_uuid": null, + "derived_uuid": "93b37937-a29b-505e-adc2-390980cd8ceb", + "action": "assign" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0031-T01", + "current_uuid": null, + "derived_uuid": "d84116ae-8219-569a-8d7b-e4eb83c192c3", + "action": "assign" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0031-T05", + "current_uuid": null, + "derived_uuid": "a7eb3615-dd11-54c9-80ec-a147d100f8b7", + "action": "assign" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md", + "kind": "workplan", + "record_id": "ACTIVITY-WP-0032", + "current_uuid": null, + "derived_uuid": "256dad13-28b4-5361-ab8a-7d1373a5d14b", + "action": "assign" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0032-T03", + "current_uuid": null, + "derived_uuid": "50225bac-1798-5cf5-91ad-d4c662de7fc7", + "action": "assign" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0032-T04", + "current_uuid": null, + "derived_uuid": "48ff9bca-6251-59ff-8b6f-6b0d79252624", + "action": "assign" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0032-T05", + "current_uuid": null, + "derived_uuid": "e71423f9-8baf-566b-8a70-eec195e2f65f", + "action": "assign" + } + ] + }, + { + "repo": "adaptive-pricing", + "path": "/home/worsch/adaptive-pricing", + "planned_head_sha": "c65a2f1ff9a0b30700ee14818e36e931eb71cae3", + "source_fingerprint": "977e94daeb0a6955a3d4ba76393d0b273d285537d0789eb59350d5c283901887", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "adaptive-pricing", + "path": "workplans/ADAPTIVE-WP-0010-plan-derived-guardrail-ceilings.md", + "kind": "workplan", + "record_id": "ADAPTIVE-WP-0010", + "current_uuid": "38613963-4455-4e0c-849f-65fdda68f572", + "derived_uuid": "543e6398-d2cb-5105-977e-b90461adac3e", + "action": "replace" + }, + { + "repo": "adaptive-pricing", + "path": "workplans/ADAPTIVE-WP-0010-plan-derived-guardrail-ceilings.md", + "kind": "task", + "record_id": "ADAPTIVE-WP-0010-T01", + "current_uuid": "7109ccf7-1267-44b6-9f20-38eff7bb7dd2", + "derived_uuid": "7533431c-a0de-5ac8-a811-14e4604ad651", + "action": "replace" + }, + { + "repo": "adaptive-pricing", + "path": "workplans/ADAPTIVE-WP-0010-plan-derived-guardrail-ceilings.md", + "kind": "task", + "record_id": "ADAPTIVE-WP-0010-T02", + "current_uuid": "7da0b8f5-93a7-4048-900d-8fa39eb0de96", + "derived_uuid": "7bd4dace-3505-5c68-977d-f80b30aebc77", + "action": "replace" + }, + { + "repo": "adaptive-pricing", + "path": "workplans/ADAPTIVE-WP-0010-plan-derived-guardrail-ceilings.md", + "kind": "task", + "record_id": "ADAPTIVE-WP-0010-T03", + "current_uuid": "82788fbd-e0e7-4bb0-94ca-405176e74809", + "derived_uuid": "46e49880-21ff-580f-a2ad-82c8f1401afc", + "action": "replace" + }, + { + "repo": "adaptive-pricing", + "path": "workplans/ADAPTIVE-WP-0010-plan-derived-guardrail-ceilings.md", + "kind": "task", + "record_id": "ADAPTIVE-WP-0010-T04", + "current_uuid": "c9220137-baed-4ba1-929c-449ba1a754b9", + "derived_uuid": "a3eeffa6-57b0-5dc1-8b07-4b9b2a3d3534", + "action": "replace" + } + ] + }, + { + "repo": "audit-core", + "path": "/home/worsch/audit-core", + "planned_head_sha": "b1ec9f71ec220a7ce2e6f3f2c204bbe84d98c5b5", + "source_fingerprint": "66bc7c633002177b956b1ac5b0521567329527bfaef35458574f69e5ca7c65cb", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "audit-core", + "path": "workplans/AUDIT-WP-0008-tenancy-posture-alignment.md", + "kind": "workplan", + "record_id": "AUDIT-WP-0008", + "current_uuid": "84c01552-4c65-45fd-bf6c-7daab0ecc9b6", + "derived_uuid": "a9a248b2-d26c-503e-a8fc-4f3675e6ed51", + "action": "replace" + }, + { + "repo": "audit-core", + "path": "workplans/AUDIT-WP-0008-tenancy-posture-alignment.md", + "kind": "task", + "record_id": "AUDIT-WP-0008-T05", + "current_uuid": "30b56b30-e7eb-4873-aa7c-f4a3bf2fcb24", + "derived_uuid": "76d3b34e-df74-5af0-8025-e77e8644d199", + "action": "replace" + }, + { + "repo": "audit-core", + "path": "workplans/AUDIT-WP-0008-tenancy-posture-alignment.md", + "kind": "task", + "record_id": "AUDIT-WP-0008-T07", + "current_uuid": "e972a8f7-e6ee-4522-bc76-fb69d71e5ed5", + "derived_uuid": "4e3ab790-daa6-5fbb-837e-9a9a26848201", + "action": "replace" + } + ] + }, + { + "repo": "core-hub", + "path": "/home/worsch/core-hub", + "planned_head_sha": "7a95a8345c98112c90340106a6f72693598962e9", + "source_fingerprint": "f61945d65344dd0eb5378da2182e58404bafd1d668fc05540e39115e076c8c25", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "core-hub", + "path": "workplans/CORE-WP-0010-runtime-absorption-and-archive.md", + "kind": "workplan", + "record_id": "CORE-WP-0010", + "current_uuid": "f5a90aa2-e63f-4f94-b052-8be0d0ee55ea", + "derived_uuid": "9cc1abf3-2ab0-54a4-a250-83f382a49441", + "action": "replace" + }, + { + "repo": "core-hub", + "path": "workplans/CORE-WP-0010-runtime-absorption-and-archive.md", + "kind": "task", + "record_id": "CORE-WP-0010-T05", + "current_uuid": "16525001-f85e-4dae-9dc4-d36cb1eb4fbe", + "derived_uuid": "6e67fd41-3f52-5085-85b6-1661c322e290", + "action": "replace" + } + ] + }, + { + "repo": "fin-hub", + "path": "/home/worsch/fin-hub", + "planned_head_sha": "ac0949afd05cee7d33b7e753ee4b5a84ac28d67d", + "source_fingerprint": "87d20c856f5a6f17071948a1cd1c4a149d867a54b99f2f5924413a33811dedd0", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0003-fabric-authority-boundary.md", + "kind": "workplan", + "record_id": "FIN-WP-0003", + "current_uuid": "1f6698f4-65b9-4e3b-bdf5-b079341e4581", + "derived_uuid": "21623d7d-25f8-5d80-9baa-f4d20e1c7a6e", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0003-fabric-authority-boundary.md", + "kind": "task", + "record_id": "FIN-WP-0003-T01", + "current_uuid": "4471c006-5740-4241-8c81-251134c82f0d", + "derived_uuid": "c6f6d2c5-4df2-5f8a-a838-76e4a0cb2974", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0003-fabric-authority-boundary.md", + "kind": "task", + "record_id": "FIN-WP-0003-T02", + "current_uuid": "76c7ed79-8614-4e42-9e4c-f50bf789b584", + "derived_uuid": "9743357c-d32d-5508-845e-d341fd611c49", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0003-fabric-authority-boundary.md", + "kind": "task", + "record_id": "FIN-WP-0003-T03", + "current_uuid": "ae36e4e7-c39d-4027-bc49-e7abb52fb9e1", + "derived_uuid": "b57b5135-7e77-5cbe-9da8-fa226e43a0a5", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0004-resource-cost-evidence-contract.md", + "kind": "workplan", + "record_id": "FIN-WP-0004", + "current_uuid": "67b6de6c-4820-4478-9789-f50260204c27", + "derived_uuid": "e8b432af-43ae-517f-a69b-80d4f0db976d", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0004-resource-cost-evidence-contract.md", + "kind": "task", + "record_id": "FIN-WP-0004-T05", + "current_uuid": "9a411734-76f6-4c8d-9a48-b5a08cf8fd1f", + "derived_uuid": "aabb9b66-cc20-5f96-83d8-5df9dc55282e", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0005-datev-accounting-adapter-operations.md", + "kind": "workplan", + "record_id": "FIN-WP-0005", + "current_uuid": "1c081ee5-cf39-4868-ac17-48aada6e102b", + "derived_uuid": "58432770-da19-5b72-a946-cacbe1eb24ca", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0005-datev-accounting-adapter-operations.md", + "kind": "task", + "record_id": "FIN-WP-0005-T01", + "current_uuid": "55cb6ec1-2bd6-4f33-8a4b-7791193c4c09", + "derived_uuid": "7cdda85d-cdd6-544c-b873-f27ec7ef448d", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0005-datev-accounting-adapter-operations.md", + "kind": "task", + "record_id": "FIN-WP-0005-T02", + "current_uuid": "e2400fb4-ff8e-4336-9702-60d0c2e254b3", + "derived_uuid": "c2e0b529-43d5-5c17-af07-8140ae98d4c2", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0005-datev-accounting-adapter-operations.md", + "kind": "task", + "record_id": "FIN-WP-0005-T03", + "current_uuid": "16865fc6-5e6e-46cd-9ed1-109fa0eeb8e7", + "derived_uuid": "c6b3177a-a9a3-5a91-9917-ffca94f77d7a", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0005-datev-accounting-adapter-operations.md", + "kind": "task", + "record_id": "FIN-WP-0005-T04", + "current_uuid": "e372997a-a5a2-4c02-a6f4-50ea34add067", + "derived_uuid": "0be9e6cf-504f-5c63-a31c-12a9390fc79e", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0006-internal-transfer-settlement.md", + "kind": "workplan", + "record_id": "FIN-WP-0006", + "current_uuid": "681c39ef-b902-4ccd-8018-0fa25bccf455", + "derived_uuid": "e9413a20-5b11-50ff-ba21-15215841cf11", + "action": "replace" + }, + { + "repo": "fin-hub", + "path": "workplans/FIN-WP-0006-internal-transfer-settlement.md", + "kind": "task", + "record_id": "FIN-WP-0006-T01", + "current_uuid": "d9618171-b1cb-4df2-bcaf-92eb937e316e", + "derived_uuid": "9ef3fab5-51a6-57ef-8121-b9714298c502", + "action": "replace" + } + ] + }, + { + "repo": "flex-auth", + "path": "/home/worsch/flex-auth", + "planned_head_sha": "fbef547cfa856a4c9b3285d9a97955f2e7d27a05", + "source_fingerprint": "80e805631bf3d61a9bafc2e01798efa4739f750b99edfea022c2fdcfae189b37", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "workplan", + "record_id": "FLEX-WP-0012", + "current_uuid": "89ecdb1f-ceb0-4a50-b72d-c3dfd5fa7c73", + "derived_uuid": "2a6b5764-1831-5305-b46e-0991d02675df", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T01", + "current_uuid": "a1c9ba0c-3413-4823-9f9e-ccee09cf5d74", + "derived_uuid": "f8491771-be1a-5c70-a4aa-059e48536630", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T02", + "current_uuid": "7e9c4e59-e59c-4617-a87f-99142952fe78", + "derived_uuid": "685f3d70-7c50-5664-95ae-1e8c93b14073", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T03", + "current_uuid": "3335b2b7-cf1a-411d-95b3-03c4b4c35659", + "derived_uuid": "045ec743-4411-5b42-b9e8-df25b0c07984", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T04", + "current_uuid": "40015a87-040c-4d48-b360-fd5566dbc552", + "derived_uuid": "0dcf2e1f-baa2-5fea-9e3e-9a73795af11f", + "action": "replace" + } + ] + }, + { + "repo": "glas-harness", + "path": "/home/worsch/glas-harness", + "planned_head_sha": "3cb53ab310d0eed03bf866a91f25877c6149b403", + "source_fingerprint": "772efdca590be2b2d13ef25c38c0722a9c346a5fe87d68d36782150ce572e469", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "glas-harness", + "path": "workplans/GLAS-WP-0005-sandbox-boundary-runtime-hardening.md", + "kind": "workplan", + "record_id": "GLAS-WP-0005", + "current_uuid": null, + "derived_uuid": "c8049700-73ca-549a-b250-1020de1cddc5", + "action": "assign" + }, + { + "repo": "glas-harness", + "path": "workplans/GLAS-WP-0005-sandbox-boundary-runtime-hardening.md", + "kind": "task", + "record_id": "GLAS-WP-0005-T05", + "current_uuid": null, + "derived_uuid": "a4be4d68-b0af-5273-978a-367bba414f0c", + "action": "assign" + } + ] + }, + { + "repo": "hub-core", + "path": "/home/worsch/hub-core", + "planned_head_sha": "1b3eb3943697574ad0bcc67ee05a4b4135bce7e8", + "source_fingerprint": "55ba9964dcf97b3c980a15ede7d72d366b36d495ce3ae41c9fd7e20f206e2cca", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "hub-core", + "path": "workplans/HUB-WP-0006-repository-classification-navigation.md", + "kind": "workplan", + "record_id": "HUB-WP-0006", + "current_uuid": "c5abf6a3-0ea9-43b8-8757-179829dd8a9c", + "derived_uuid": "05ebd06e-4af8-5f6c-918c-c143c1520e00", + "action": "replace" + }, + { + "repo": "hub-core", + "path": "workplans/HUB-WP-0006-repository-classification-navigation.md", + "kind": "task", + "record_id": "HUB-WP-0006-T06", + "current_uuid": "5c6f3006-b1c7-422b-ad38-8727ae4dc7c2", + "derived_uuid": "7c8225f7-03dc-57b0-a668-c3d781bd828a", + "action": "replace" + } + ] + }, + { + "repo": "issue-core", + "path": "/home/worsch/issue-core", + "planned_head_sha": "216a5087604f341e333a5ffe50f439158dbf56e0", + "source_fingerprint": "498adea6c71e227aa8dfb9ad50e47beefd9daf44de9b4271d73830a3482b6ea7", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "workplan", + "record_id": "ISSUE-WP-0006", + "current_uuid": "0b75b7ae-c8e3-4737-8fa8-2f60a12e6d14", + "derived_uuid": "4d465264-cbe1-56ba-84ed-bd580b649b76", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T01", + "current_uuid": "e2148c3f-fe46-4397-af23-dda7eab5534e", + "derived_uuid": "927eee42-e22d-5c0d-a4f8-dcd36c53c8e9", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T02", + "current_uuid": "78247ad9-65fb-4966-96ec-0a0c70620b0e", + "derived_uuid": "a1d69a48-833b-5e5e-8286-14f5aba627f3", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T03", + "current_uuid": "41bd7596-62cb-475b-8ad0-648066ffd8b8", + "derived_uuid": "75eef8a3-abd7-50dd-9171-3488fda84da5", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T04", + "current_uuid": "8f217196-ab3e-4443-b0c8-c670cf9c33f5", + "derived_uuid": "5be0bce4-1816-599f-a98b-4fa1565a8b0e", + "action": "replace" + } + ] + }, + { + "repo": "markitect-main", + "path": "/home/worsch/markitect-main", + "planned_head_sha": "3a45d51bbad49512d2610950eccaa3c2782a8523", + "source_fingerprint": "a6c5a705f7d5e0dc5620f469e0382467b7908a71390afac915557d7e9c33df77", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "markitect-main", + "path": "workplans/MARKITECT-WP-0002-testdrive-jsui-publication.md", + "kind": "workplan", + "record_id": "MARKITECT-WP-0002", + "current_uuid": "e203d487-01f1-494a-b14d-a436241a4c01", + "derived_uuid": "e03ef262-5284-5dd3-92d2-dbd85c6b6159", + "action": "replace" + }, + { + "repo": "markitect-main", + "path": "workplans/MARKITECT-WP-0002-testdrive-jsui-publication.md", + "kind": "task", + "record_id": "MARKITECT-WP-0002-T01", + "current_uuid": "88b3c206-4d45-4bb3-bbb3-47443cdf2123", + "derived_uuid": "1852eca1-92e2-518e-bb21-9dffbeb32a4f", + "action": "replace" + } + ] + }, + { + "repo": "net-kingdom", + "path": "/home/worsch/net-kingdom", + "planned_head_sha": "337484ae169bb2d0a241e9593d04d72328bd2ebb", + "source_fingerprint": "a08b45267af542fe354c1f007274f78aa4938c4e572f101d9676b5038d454938", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "workplan", + "record_id": "NK-WP-0009", + "current_uuid": "66c9f1e9-6b2f-454b-a6d4-04e5fe42385a", + "derived_uuid": "d4d02dbf-3974-502d-8b87-b776fc63e17e", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T01", + "current_uuid": "79150b07-f25d-4407-a118-e08b6e588d37", + "derived_uuid": "3c6824a0-39e6-51f5-b46f-5861a9375439", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T02", + "current_uuid": "07647ba6-90e1-4569-947a-ebccce7a2d5e", + "derived_uuid": "d13760fd-2527-5a39-acb1-11c8091d65a1", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T03", + "current_uuid": "0f34eda3-f1f3-4c49-9eba-36167b6c5ea9", + "derived_uuid": "16cf51a4-0763-59e9-9b4c-d486f5bde908", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T04", + "current_uuid": "3c17d1ac-3232-43b4-b541-ea6538da2afb", + "derived_uuid": "1d28e3f1-fb39-5d0e-a7ee-ce2e9bc16ed5", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T05", + "current_uuid": "aff82173-0b8e-4216-855a-887ac68b63e0", + "derived_uuid": "c380ef19-4bc2-5ade-b127-baf18c64bf35", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T06", + "current_uuid": "df427aa3-233f-4479-aed9-706676f8e87d", + "derived_uuid": "5b6a1670-a283-56e9-892e-ef8b91194a7b", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "workplan", + "record_id": "NK-WP-0011", + "current_uuid": "a44beef8-c18b-4ae7-b7fe-a178cc4fcdf0", + "derived_uuid": "1075448f-d533-5f9e-94b7-c3adfe151a07", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T01", + "current_uuid": "934f9223-2b6f-4d01-b49b-406b5b98b6e4", + "derived_uuid": "a5807808-fb34-50de-8f67-9128011833d4", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T02", + "current_uuid": "7b514cda-41b3-492f-8731-5a131422059d", + "derived_uuid": "2fe6f100-3a5d-563e-b033-7d7b846ae487", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T03", + "current_uuid": "8c29602e-ab9b-446a-8fee-5e2d8fbcb100", + "derived_uuid": "32d1411b-10a4-5a8b-8f43-99ac46d83908", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T04", + "current_uuid": "d62d7683-24b1-458c-9fd6-96e576b52a64", + "derived_uuid": "6697a994-7343-5ea8-8b37-bc3b921e5a9b", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T05", + "current_uuid": "85319768-5d81-460d-89dc-8de76b63e0dc", + "derived_uuid": "d845380d-3dbc-5e59-8f2b-5a4d1b32d89d", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T06", + "current_uuid": "53801dc2-7bdb-4fa3-9fa0-c1450ef1003b", + "derived_uuid": "9cb7fd93-c16e-5102-83ce-195b3aa87446", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T07", + "current_uuid": "981f79bd-63ee-4da0-8d7d-9af8e468715e", + "derived_uuid": "38998c68-29bf-50d2-8c8d-0c75184d5833", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T08", + "current_uuid": "13634760-7817-40c0-b7db-5e0f4196dbf0", + "derived_uuid": "e5f44ddc-9645-5f61-b84c-da5ab9cccb6d", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0022-railiance01-identity-cutover-and-coulombcore-retirement.md", + "kind": "workplan", + "record_id": "NK-WP-0022", + "current_uuid": "3dadddeb-4cec-48e2-9c2c-788b26dd6e93", + "derived_uuid": "d76ddccc-00c8-548a-b141-2cd660fa38da", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0022-railiance01-identity-cutover-and-coulombcore-retirement.md", + "kind": "task", + "record_id": "NK-WP-0022-T08", + "current_uuid": "9f209f15-64a9-4324-bfa9-3ff21c52fc19", + "derived_uuid": "42a3b4c0-3481-5cfa-bdc2-66d05e751829", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "workplan", + "record_id": "NK-WP-0027", + "current_uuid": "a30a33e4-f980-4934-9efb-d61a75e6ae81", + "derived_uuid": "965ad365-6b81-50a1-a2a3-2d0c1fcce0b4", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "task", + "record_id": "NK-WP-0027-T02", + "current_uuid": "601a0c5f-3f77-419f-9731-25e247424b31", + "derived_uuid": "5b35b646-a525-55da-852a-6005613d42ea", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "task", + "record_id": "NK-WP-0027-T03", + "current_uuid": "b53bfb83-1df9-4548-a62f-628cb55ece4d", + "derived_uuid": "e3f0bb0f-0c85-5cb9-a5ab-75f668cd3447", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "task", + "record_id": "NK-WP-0027-T06", + "current_uuid": null, + "derived_uuid": "bf8b3e1d-7ee0-5ad0-8705-5a580a9fb546", + "action": "assign" + } + ] + }, + { + "repo": "ops-hub", + "path": "/home/worsch/ops-hub", + "planned_head_sha": "abe25c90e8ffba263e3638343342354f2e966875", + "source_fingerprint": "aa3fab12a57aa55390f934ed7a7b291b76b8f54bc374ca5bfbf8b31f4a3fbdca", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "ops-hub", + "path": "workplans/OPS-WP-0003-extension-contract-alignment.md", + "kind": "workplan", + "record_id": "OPS-WP-0003", + "current_uuid": "c0b815eb-41c0-4aa1-a2dd-19a7ba89c1ac", + "derived_uuid": "d688d60b-7f86-5fbe-bf3f-76ff926d9a17", + "action": "replace" + }, + { + "repo": "ops-hub", + "path": "workplans/OPS-WP-0003-extension-contract-alignment.md", + "kind": "task", + "record_id": "OPS-WP-0003-T01", + "current_uuid": "fcd6e8f6-61f7-44d5-baf9-8612c454518b", + "derived_uuid": "a938b0e2-912e-5126-aa6f-d63bdeebca5d", + "action": "replace" + }, + { + "repo": "ops-hub", + "path": "workplans/OPS-WP-0003-extension-contract-alignment.md", + "kind": "task", + "record_id": "OPS-WP-0003-T02", + "current_uuid": "748e21ec-911d-4c1c-9792-f7817bef42dd", + "derived_uuid": "1d1c422d-892c-5404-8d7f-a1f78c5cd87a", + "action": "replace" + }, + { + "repo": "ops-hub", + "path": "workplans/OPS-WP-0003-extension-contract-alignment.md", + "kind": "task", + "record_id": "OPS-WP-0003-T03", + "current_uuid": "1323004c-87e3-40d1-9f78-3d7b56a1b3b7", + "derived_uuid": "947306d4-8a00-5cd6-8c6d-1f266d45055c", + "action": "replace" + } + ] + }, + { + "repo": "ops-warden", + "path": "/home/worsch/ops-warden", + "planned_head_sha": "12c637cbf231ee39874a92b39116e6143175b618", + "source_fingerprint": "92cb8b69cba850af815a241643625d001af10eba3b76e4982cb15b149379d00d", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0027-credential-governance-lockdown.md", + "kind": "workplan", + "record_id": "WARDEN-WP-0027", + "current_uuid": "7d697c52-766a-4562-b2ad-a722880bcdcb", + "derived_uuid": "21528e8d-a049-523d-9ae1-da7a27cb8bbf", + "action": "replace" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0032-security-zones.md", + "kind": "workplan", + "record_id": "WARDEN-WP-0032", + "current_uuid": "f1b6cdcb-5e16-48ab-a72b-339e909e92f0", + "derived_uuid": "38c6a5f3-fb0d-5230-be85-f9e3ffc850f6", + "action": "replace" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0032-security-zones.md", + "kind": "task", + "record_id": "WARDEN-WP-0032-T02", + "current_uuid": "08735f17-fe7e-4a6a-9b71-f350f98c30b1", + "derived_uuid": "b3f41c85-a293-58ad-ac27-9f8110c51266", + "action": "replace" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0032-security-zones.md", + "kind": "task", + "record_id": "WARDEN-WP-0032-T03", + "current_uuid": "fd642377-8d64-473c-b684-f8f1a842c223", + "derived_uuid": "d04a737b-ecdf-5747-ba25-20dadd99d3bc", + "action": "replace" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0032-security-zones.md", + "kind": "task", + "record_id": "WARDEN-WP-0032-T04", + "current_uuid": "1af3d26e-ce21-46ca-a56c-486d52b76dcb", + "derived_uuid": "c7879127-3dba-55c0-853c-a10775736873", + "action": "replace" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0032-security-zones.md", + "kind": "task", + "record_id": "WARDEN-WP-0032-T06", + "current_uuid": "8c082416-0ff9-45dc-8cbd-e9ca7913a6ef", + "derived_uuid": "4294084c-bf3f-5aa6-b84d-5173121882ff", + "action": "replace" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0033-native-lane-handoff.md", + "kind": "workplan", + "record_id": "WARDEN-WP-0033", + "current_uuid": null, + "derived_uuid": "4627d89b-4b00-562a-81e9-76e96f90fa7e", + "action": "assign" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0033-native-lane-handoff.md", + "kind": "task", + "record_id": "WARDEN-WP-0033-T04", + "current_uuid": null, + "derived_uuid": "5acac140-a586-5db3-b231-bbf236710786", + "action": "assign" + } + ] + }, + { + "repo": "policy-nexus", + "path": "/home/worsch/policy-nexus", + "planned_head_sha": "32cea111ebfd8b686906a8e2ca1748bfe9955b45", + "source_fingerprint": "1a7488ae10d0f8234125b08ce91b0340ec36da26f7fd1d6dfc7afb881905b7dd", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md", + "kind": "workplan", + "record_id": "POLICY-NEXUS-WP-0002", + "current_uuid": null, + "derived_uuid": "cf780ff6-ccc1-58e5-aace-665ff9234f5c", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0002-T06", + "current_uuid": null, + "derived_uuid": "f4761eb6-ab53-5c02-8b7c-f301d3ca04fa", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0002-T07", + "current_uuid": null, + "derived_uuid": "4a07237f-715d-595a-9448-ae1e342ca633", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md", + "kind": "workplan", + "record_id": "POLICY-NEXUS-WP-0003", + "current_uuid": null, + "derived_uuid": "d1cfae73-460d-59f7-88c3-b251e563fb05", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0003-T06", + "current_uuid": null, + "derived_uuid": "a06165fe-dabd-58bb-a67a-50e97122a0cc", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0003-T07", + "current_uuid": null, + "derived_uuid": "f752e1f3-881e-5c3e-bcd3-071283f7d40b", + "action": "assign" + } + ] + }, + { + "repo": "prj-canon-federation", + "path": "/home/worsch/prj-canon-federation", + "planned_head_sha": "2b6980bea9022bc16c5efa6ec87984842ae4d626", + "source_fingerprint": "f70680a4c532ed0b86bf8db1c964a42440a355b98a578fd81d746de0d045c64a", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "workplan", + "record_id": "CFED-WP-0001", + "current_uuid": "7a96da54-050d-4210-96f9-0bb411aaaec8", + "derived_uuid": "1c5615fc-03b7-5648-ba58-e828b8c0cb0f", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T02", + "current_uuid": "0ca7878c-f925-44f3-bf00-51b91fba0b3e", + "derived_uuid": "9c5ba080-e304-52cd-86d5-749a5a642387", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T03", + "current_uuid": "45cd377e-d6f1-4708-8fb4-a822b2930aed", + "derived_uuid": "57092ca3-e1a8-5469-83be-d0338a78c150", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T04", + "current_uuid": "743a2da9-56b3-4c3a-ba89-94a3525ce3b7", + "derived_uuid": "1be7aa81-4fc8-5a5a-8451-e288e660a326", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T05", + "current_uuid": "986a0ac6-12c2-4bae-a849-c23f1da10325", + "derived_uuid": "700a0c89-1b17-5993-a76e-7ef22b5847d9", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T06", + "current_uuid": "0a29bb3e-6460-4c4a-ba19-bcd2c38cd344", + "derived_uuid": "6bdb96c9-0524-5d3c-89e0-7c91df7ee56c", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T07", + "current_uuid": "776905c6-26a9-4754-b289-d9dd4d328fb5", + "derived_uuid": "26a96020-49bb-5a5e-97d1-c478b83bffd0", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T08", + "current_uuid": "3eee0510-cfa0-4571-a599-8654c3f01aa0", + "derived_uuid": "e0558c32-415f-5563-bca2-438b35fa6b53", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T09", + "current_uuid": "5d3e744e-b390-41e1-b7ca-caa4cf60664e", + "derived_uuid": "42ebf476-6a45-5e23-b507-eb90bc4f5c07", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T11", + "current_uuid": "4cff900d-aeb5-46ed-a59d-3aab5a2aa637", + "derived_uuid": "526843be-1dfa-5cd0-ba0c-123ea37d0f63", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T12", + "current_uuid": "8e238d89-da71-4126-b0a2-cca7f5eac657", + "derived_uuid": "f82385e9-5735-5147-aab6-d86653f33e26", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T13", + "current_uuid": "d87513dc-8bcf-470e-be3c-cb78f053e0a3", + "derived_uuid": "b6d097a3-1abc-584b-ab23-7a05c969670d", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T10", + "current_uuid": "f89a08fe-c6ba-4f81-a063-6f49727eae2d", + "derived_uuid": "2faeb8fb-58cc-5ea8-b5a8-ea0ed9583b30", + "action": "replace" + } + ] + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "/home/worsch/prj-forgejo-org-refactor", + "planned_head_sha": "847ee07c5c0ae791d53ec8d00107e6b1b16717cc", + "source_fingerprint": "e8cdbeabb5f6b285569bf3d9cb2a02399f695ad54033b68a08127baf1aeae0e7", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "workplan", + "record_id": "ORGREF-WP-0001", + "current_uuid": "cfe053ed-4317-4977-b545-47fa997d6c77", + "derived_uuid": "c1dcd349-1a7a-51ae-8827-4ce96cfe0008", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T01", + "current_uuid": "c027b40f-f25a-403f-8d83-e29044bab20a", + "derived_uuid": "4964bf8f-96eb-59f0-8a50-5ecb5c7dbc8f", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T02", + "current_uuid": "90d6a61e-b715-4073-aa3e-e92340c78dc8", + "derived_uuid": "00d150ed-81dd-51ac-af7b-197900373cbe", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T03", + "current_uuid": "2e458360-3035-47e8-a0c5-33e2249ffaa0", + "derived_uuid": "4b57ef3f-2a7c-56ff-b19d-e751b0b4685d", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T04", + "current_uuid": "32030788-ed92-492f-920d-5b9a51663fc0", + "derived_uuid": "a55d95e2-6014-5d84-ba6e-b178c3901f3e", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T05", + "current_uuid": "4f5d510a-c52b-42d4-9a84-ecf432ce4866", + "derived_uuid": "3ad6090f-5aa9-5087-a670-37d7b2ffdb7c", + "action": "replace" + } + ] + }, + { + "repo": "prj-state-hub-retirement", + "path": "/home/worsch/prj-state-hub-retirement", + "planned_head_sha": "54f9706b294681964253e7991ff9876cf853cd7e", + "source_fingerprint": "9d355c3e663502c23d9b65292dd9d18b266be98ca9476af1513018c15f0dd3df", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "workplan", + "record_id": "SHR-WP-0002", + "current_uuid": "c94c3ba1-6c31-4989-a2eb-650726add747", + "derived_uuid": "53f42c0c-3a35-53b0-99c8-8eaee7b17354", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T01", + "current_uuid": "7bf75488-59c9-47ab-a2ff-6ae459dd1444", + "derived_uuid": "8c54ea9b-8a92-55bc-80ce-8425678f3efe", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T02", + "current_uuid": "d2dbe425-345f-46cf-af70-0ca4b69a336e", + "derived_uuid": "fdae9c55-5a85-5b11-91ed-0b724129d887", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T03", + "current_uuid": "3254b7d3-e319-44a6-ae63-23b0d080247a", + "derived_uuid": "06119690-312f-5d14-aee0-2fc4dac1e89e", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T04", + "current_uuid": "b2196340-fa22-4531-81a2-a34bc217d66c", + "derived_uuid": "3815d764-b484-5342-9c7d-2edacc02be13", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T05", + "current_uuid": "2b97a7c5-f877-4020-ba83-8eb00c3690e6", + "derived_uuid": "c2957182-4bb3-5aa9-9940-656956cfe52d", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T06", + "current_uuid": "9b390f80-1cbb-4485-a958-14b0e24a0b26", + "derived_uuid": "714ce904-bccd-5cd8-ae2e-a756f5c0bccc", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T07", + "current_uuid": "07636ddf-a26b-4760-8353-2532af9fd938", + "derived_uuid": "a89cf85d-d613-5434-92cb-11f850889b08", + "action": "replace" + } + ] + }, + { + "repo": "prj-unattended-progress-company", + "path": "/home/worsch/prj-unattended-progress-company", + "planned_head_sha": "7e547b3eb2b733d98a9085b36f7d82d84d69f04d", + "source_fingerprint": "5adadf8049df4dc8b7b2b43b751120bd1a71822acf1b50ad0a463af31514778b", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "workplan", + "record_id": "UPC-WP-0002", + "current_uuid": "b8f00a8a-646e-4a2e-861d-c96b43e794ff", + "derived_uuid": "8d47ba5f-0608-5f83-8b4b-7dee53ada6f6", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T01", + "current_uuid": "6da07153-7a6c-43c7-b580-7ea9f5a5195c", + "derived_uuid": "ab714cd3-9457-5386-8b3c-056702c234e4", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T02", + "current_uuid": "65dfcc19-3088-427c-98d4-125b39516565", + "derived_uuid": "0d10e613-a92e-5f3a-8152-d24e25c8aeae", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T03", + "current_uuid": "6bca2e44-6742-4668-9d20-ae7ce8b567b9", + "derived_uuid": "ac7e4972-d6bc-5e35-b34e-c51bfbcedf2b", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T04", + "current_uuid": "c6aca17d-b5d0-41eb-8175-61dc43d4b666", + "derived_uuid": "7fff1007-5283-5d3b-8408-d8a504b9542f", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "workplan", + "record_id": "UPC-WP-0003", + "current_uuid": "47871f09-f17c-414d-b3c4-dc6582ed3ddd", + "derived_uuid": "81b17b8a-4b22-5510-8830-a8d19aed821e", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "task", + "record_id": "UPC-WP-0003-T01", + "current_uuid": "e2437c6e-580d-4ad9-924d-d04b7e4a054b", + "derived_uuid": "57636795-371d-56ac-b4f4-cfcf2968e133", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "task", + "record_id": "UPC-WP-0003-T02", + "current_uuid": "c15f290f-04b5-4878-8a21-c6c9795a0811", + "derived_uuid": "b38eebc3-51a7-54e4-a4d3-8f8edfc16aac", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "task", + "record_id": "UPC-WP-0003-T03", + "current_uuid": "fee4912b-f0a1-4bae-8955-96c7f3e5e250", + "derived_uuid": "d79967eb-a270-53aa-a501-0a4f38d8c1cc", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "workplan", + "record_id": "UPC-WP-0004", + "current_uuid": "8d5d0db2-c334-49cb-ac55-11696026ff09", + "derived_uuid": "a6cf0a20-a3d5-56c6-8fc7-8cb167c71d66", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "task", + "record_id": "UPC-WP-0004-T01", + "current_uuid": "9cb476fe-9a1d-494b-96d8-04cb51b4bbed", + "derived_uuid": "cd349f71-aa8b-5480-80c2-38083aa16f58", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "task", + "record_id": "UPC-WP-0004-T02", + "current_uuid": "34954c9e-5022-409c-acf3-3195c0e1b797", + "derived_uuid": "86cf36f9-0330-538b-8c79-4f62b75bb331", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "task", + "record_id": "UPC-WP-0004-T03", + "current_uuid": "0516cd4e-ab84-433b-9314-4b401c4d168f", + "derived_uuid": "0f7fd4f6-f320-5715-be1c-0a9536516e65", + "action": "replace" + } + ] + }, + { + "repo": "railiance-cluster", + "path": "/home/worsch/railiance-cluster", + "planned_head_sha": "ea0452b9a9cf84702c81cce06f4617047f6e388b", + "source_fingerprint": "a189a30682143270d94e61158e44373fff82afb2d51e4e31b4940890b398805b", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "workplan", + "record_id": "RCLUSTER-WP-0007", + "current_uuid": "9e208376-23f1-40c7-9813-fac1f7d6ad3b", + "derived_uuid": "16da36fe-5a10-522b-b6d6-02dbb6de6c14", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T01", + "current_uuid": "1f8a8668-31eb-4d79-bbcd-50f6430a8d66", + "derived_uuid": "9d1f463f-e4d1-5e75-97fd-e57b833bc2b9", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T02", + "current_uuid": "b1d4e0fa-da41-4b13-a7d6-34dd040cb605", + "derived_uuid": "a1f4fa2b-69a7-5de4-8c44-15e8f9baf0b2", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T05", + "current_uuid": "68315a40-dd5b-4032-a9e7-1152e38f9807", + "derived_uuid": "02cc3adb-9d42-5540-9f32-4e5f1198b79e", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T06", + "current_uuid": "f658aa6a-1c48-4660-88fa-35eaa0137e12", + "derived_uuid": "4f033381-24aa-5773-bca6-337ccacc0e7a", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T07", + "current_uuid": "70f6c8ab-a700-4fb2-893e-cf5a40615044", + "derived_uuid": "b45b3086-3beb-56d4-a028-6bf651834992", + "action": "replace" + } + ] + }, + { + "repo": "railiance-master", + "path": "/home/worsch/railiance-master", + "planned_head_sha": "5078e5a4877e6cd1e68bea5b10013181d6e66786", + "source_fingerprint": "1bc2df8a7ed124e894981eeb0e372bb162fa929e459adaba43ae6b40e74f7204", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-master", + "path": "workplans/RMASTER-WP-0020-openbao-migration-to-reef-railiance.md", + "kind": "workplan", + "record_id": "RMASTER-WP-0020", + "current_uuid": "0616a297-18c5-4c4e-a4fc-69135b3f9a15", + "derived_uuid": "a7d0c934-75d7-53cc-a35b-6a789a2e0f14", + "action": "replace" + }, + { + "repo": "railiance-master", + "path": "workplans/RMASTER-WP-0020-openbao-migration-to-reef-railiance.md", + "kind": "task", + "record_id": "RMASTER-WP-0020-T08", + "current_uuid": "1dc50d98-64e8-4755-a52e-2b94b765019e", + "derived_uuid": "abf1b45e-2d6b-528e-8712-1575749f4657", + "action": "replace" + }, + { + "repo": "railiance-master", + "path": "workplans/RMASTER-WP-0020-openbao-migration-to-reef-railiance.md", + "kind": "task", + "record_id": "RMASTER-WP-0020-T09", + "current_uuid": "287920d3-b038-495f-b521-d16cfc7ba941", + "derived_uuid": "020060b9-fb2c-571a-9488-59de29d7c158", + "action": "replace" + }, + { + "repo": "railiance-master", + "path": "workplans/RMASTER-WP-0024-canon-and-policy-publication-alignment.md", + "kind": "workplan", + "record_id": "RMASTER-WP-0024", + "current_uuid": "de6681cd-9f8b-4a17-89d8-d3e3ce506388", + "derived_uuid": "29e4db7f-53c1-5d52-a4c8-70656b34167a", + "action": "replace" + }, + { + "repo": "railiance-master", + "path": "workplans/RMASTER-WP-0024-canon-and-policy-publication-alignment.md", + "kind": "task", + "record_id": "RMASTER-WP-0024-T02", + "current_uuid": "00e6bc8b-bb75-44a0-b6aa-5a4ce034ce99", + "derived_uuid": "92010e1c-e231-546e-8a2b-955209a081b5", + "action": "replace" + } + ] + }, + { + "repo": "railiance-platform", + "path": "/home/worsch/railiance-platform", + "planned_head_sha": "0d9cebedea00374eed13d1812aa628f1158b6500", + "source_fingerprint": "6c5ed9cc9194dfe298a06ea8cbf51393bb4d3fa3ee9861566181bff67ce19fd2", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0024-audit-core-custody-and-recovery-coordination.md", + "kind": "workplan", + "record_id": "RAILIANCE-WP-0024", + "current_uuid": "88c4ef7f-0af8-580e-90dc-a2bae2675a4d", + "derived_uuid": "88c4ef7f-0af8-580e-90dc-a2bae2675a4d", + "action": "unchanged" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0024-audit-core-custody-and-recovery-coordination.md", + "kind": "task", + "record_id": "RAILIANCE-WP-0024-T01", + "current_uuid": "c4da371a-f35d-5377-9f6a-d34e274c98d0", + "derived_uuid": "c4da371a-f35d-5377-9f6a-d34e274c98d0", + "action": "unchanged" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0024-audit-core-custody-and-recovery-coordination.md", + "kind": "task", + "record_id": "RAILIANCE-WP-0024-T02", + "current_uuid": "caba7fcd-014e-5253-87f7-6993731cb0c4", + "derived_uuid": "caba7fcd-014e-5253-87f7-6993731cb0c4", + "action": "unchanged" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0024-audit-core-custody-and-recovery-coordination.md", + "kind": "task", + "record_id": "RAILIANCE-WP-0024-T03", + "current_uuid": "09cf4065-4f8a-5b5f-beec-17f623efb56f", + "derived_uuid": "09cf4065-4f8a-5b5f-beec-17f623efb56f", + "action": "unchanged" + } + ] + }, + { + "repo": "railiance-telemetry", + "path": "/home/worsch/railiance-telemetry", + "planned_head_sha": "773f4822c37f4c9786cb129425b9086d2d6adf70", + "source_fingerprint": "8ee6c55dfee994a049861796d8ef1c7ab909db5cda286a3386a7d8e0fee40d7a", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "workplan", + "record_id": "RTELE-WP-0001", + "current_uuid": "60f5fe7c-9749-40be-9945-6ad608398b3f", + "derived_uuid": "3acd587b-3ac6-5eee-af31-05170ff8bcf7", + "action": "replace" + }, + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "task", + "record_id": "RTELE-WP-0001-T01", + "current_uuid": "de712c57-79fa-49be-97a2-873e9e1a8bec", + "derived_uuid": "4aca4677-6712-553b-ac26-0682fdf211de", + "action": "replace" + }, + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "task", + "record_id": "RTELE-WP-0001-T02", + "current_uuid": "79febfbb-6a67-40e0-9c24-96ff83ab706e", + "derived_uuid": "b6632ce1-dc84-532d-b277-adce8510a304", + "action": "replace" + }, + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "task", + "record_id": "RTELE-WP-0001-T03", + "current_uuid": "adea3657-c074-443b-9c5e-3c2095dd7c5b", + "derived_uuid": "4877f6e2-8298-5bab-b6a8-9a1ec1718289", + "action": "replace" + } + ] + }, + { + "repo": "rapp-core-hub", + "path": "/home/worsch/rapp-core-hub", + "planned_head_sha": "b17b586ebf0bf961de8f5c9957b77dc0578e5694", + "source_fingerprint": "0d2ae2228b446bbb552201b99a549737e5953ca876325778dde82f35824fc02e", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rapp-core-hub", + "path": "workplans/RAPPCOREHUB-WP-0002-hub-core-candidate-and-cutover.md", + "kind": "workplan", + "record_id": "RAPPCOREHUB-WP-0002", + "current_uuid": null, + "derived_uuid": "626cb2d7-9525-5712-be9e-93c1ed840fc5", + "action": "assign" + }, + { + "repo": "rapp-core-hub", + "path": "workplans/RAPPCOREHUB-WP-0002-hub-core-candidate-and-cutover.md", + "kind": "task", + "record_id": "RAPPCOREHUB-WP-0002-T05", + "current_uuid": null, + "derived_uuid": "42a1e9a2-bc6f-5a6b-87a2-72e55634ca55", + "action": "assign" + } + ] + }, + { + "repo": "rapp-postgres", + "path": "/home/worsch/rapp-postgres", + "planned_head_sha": "35d8db3546b7be1f395ae9222575243c3002c6a9", + "source_fingerprint": "72bbfdaf1b7a38d4d6e0cdc89e72a701a98d48b5eecbf5704fafd195d1334f43", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rapp-postgres", + "path": "workplans/RAPP-POSTGRES-WP-0004-hub-runtime-schema-extension.md", + "kind": "workplan", + "record_id": "RAPP-POSTGRES-WP-0004", + "current_uuid": null, + "derived_uuid": "21727a82-8dfe-5166-af35-e500d17ea71b", + "action": "assign" + }, + { + "repo": "rapp-postgres", + "path": "workplans/RAPP-POSTGRES-WP-0004-hub-runtime-schema-extension.md", + "kind": "task", + "record_id": "RAPP-POSTGRES-WP-0004-T03", + "current_uuid": null, + "derived_uuid": "1e7e9ae2-5d3b-5506-a54d-0eaa8a028760", + "action": "assign" + } + ] + }, + { + "repo": "rapp-qonto", + "path": "/home/worsch/rapp-qonto", + "planned_head_sha": "f57e60ad2a41c18f55dd9ee4ec24a56a4e0d9ff2", + "source_fingerprint": "3a4de22edfc774ce2e8be9c2ba507bec1128268c3cae540c78b3de753eb07868", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rapp-qonto", + "path": "workplans/RAPP-QONTO-WP-0002-resource-usage-and-cost-evidence.md", + "kind": "workplan", + "record_id": "RAPP-QONTO-WP-0002", + "current_uuid": "25b3b715-9a56-499e-a85c-a09ebd9bbb79", + "derived_uuid": "6152c89b-a4f3-55b6-af0b-d57462b3c6f7", + "action": "replace" + }, + { + "repo": "rapp-qonto", + "path": "workplans/RAPP-QONTO-WP-0002-resource-usage-and-cost-evidence.md", + "kind": "task", + "record_id": "RAPP-QONTO-WP-0002-T01", + "current_uuid": "f6ece6fb-1a9f-4709-af02-e93cbb76d263", + "derived_uuid": "09483a24-55ca-5de2-a19c-a00f938dba86", + "action": "replace" + }, + { + "repo": "rapp-qonto", + "path": "workplans/RAPP-QONTO-WP-0002-resource-usage-and-cost-evidence.md", + "kind": "task", + "record_id": "RAPP-QONTO-WP-0002-T02", + "current_uuid": "c16049af-d9d6-4dc1-b6c5-c24017eee17d", + "derived_uuid": "88cca0db-f8d8-52fd-ae5d-3ed4996f64b8", + "action": "replace" + }, + { + "repo": "rapp-qonto", + "path": "workplans/RAPP-QONTO-WP-0002-resource-usage-and-cost-evidence.md", + "kind": "task", + "record_id": "RAPP-QONTO-WP-0002-T03", + "current_uuid": "14f73bec-d123-4940-b9af-5dbfcf9d4853", + "derived_uuid": "3d5be5e8-ba76-51a6-944f-b13268f4a73e", + "action": "replace" + } + ] + }, + { + "repo": "rapp-sbom-nexus", + "path": "/home/worsch/rapp-sbom-nexus", + "planned_head_sha": null, + "source_fingerprint": "fadc0fc24f04b95797f0df94d71add3e4bc07b96412e331e1277dee7b97bdeec", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rapp-sbom-nexus", + "path": "workplans/RAPP-SBOM-NEXUS-WP-0001-bootstrap.md", + "kind": "workplan", + "record_id": "RAPP-SBOM-NEXUS-WP-0001", + "current_uuid": null, + "derived_uuid": "7e67de27-22ea-558e-80df-017b09164c69", + "action": "assign" + } + ] + }, + { + "repo": "rapp-tenant-engine", + "path": "/home/worsch/rapp-tenant-engine", + "planned_head_sha": "82bbbf78c4159aa5267af683efca75cce7a57c00", + "source_fingerprint": "688ef6e849a584bc80fdbd3f6bbbc337f04b6f82676a3baf3c6b19305c678387", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rapp-tenant-engine", + "path": "workplans/RAPP-TENANT-ENGINE-WP-0001-bootstrap.md", + "kind": "workplan", + "record_id": "RAPP-TENANT-ENGINE-WP-0001", + "current_uuid": null, + "derived_uuid": "ec2896aa-9226-5516-a537-2de02138949f", + "action": "assign" + } + ] + }, + { + "repo": "rapp-user-engine", + "path": "/home/worsch/rapp-user-engine", + "planned_head_sha": "e599b4f345cdd4725a6d0ee16efd475cf98ea616", + "source_fingerprint": "742b40ed957bb256da6b18e48dd86f6c9b8bcfe38a03f7af35605de71dec4c97", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rapp-user-engine", + "path": "workplans/RAPP-USER-ENGINE-WP-0001-bootstrap.md", + "kind": "workplan", + "record_id": "RAPP-USER-ENGINE-WP-0001", + "current_uuid": null, + "derived_uuid": "3f5b67d5-8262-5e6a-b1c2-06c7bf9b78d6", + "action": "assign" + } + ] + }, + { + "repo": "reef-railiance", + "path": "/home/worsch/reef-railiance", + "planned_head_sha": "3e98b10d81990c45465f3f620441d97347670b52", + "source_fingerprint": "fcd9a60c88a4e031fd08dedc1e9fb43aef51f09a4a5cc2e685ed164df34b02c5", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "reef-railiance", + "path": "workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md", + "kind": "workplan", + "record_id": "REEF-RAILIANCE-WP-0003", + "current_uuid": "c3f9fbfd-3db1-4387-8b65-7d53ba57138d", + "derived_uuid": "8ac413ad-2f57-53e6-b586-c5bec9cfbd1f", + "action": "replace" + }, + { + "repo": "reef-railiance", + "path": "workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md", + "kind": "task", + "record_id": "REEF-RAILIANCE-WP-0003-T04", + "current_uuid": "9d0c1f61-0ed8-4d5c-b4c2-2578424ad3b4", + "derived_uuid": "9d792070-5f2b-5b3d-ba52-92c8b0d4a6b8", + "action": "replace" + } + ] + }, + { + "repo": "reef-storage", + "path": "/home/worsch/reef-storage", + "planned_head_sha": "9c6b025226cfcba7f1c6266e1821ba718f1d9871", + "source_fingerprint": "b80b3e5e02f81ccb6477b38e1ff8eb556cd32350872e3f53db4f63898b450138", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "reef-storage", + "path": "workplans/REEF-STORAGE-WP-0002-fill-after-purchase.md", + "kind": "workplan", + "record_id": "REEF-STORAGE-WP-0002", + "current_uuid": null, + "derived_uuid": "af6ed97f-fc45-5fc0-b8e9-6010c217808f", + "action": "assign" + }, + { + "repo": "reef-storage", + "path": "workplans/REEF-STORAGE-WP-0002-fill-after-purchase.md", + "kind": "task", + "record_id": "REEF-STORAGE-WP-0002-T02", + "current_uuid": null, + "derived_uuid": "140c2250-a4c2-56f6-98b7-3ffcb57be7b9", + "action": "assign" + } + ] + }, + { + "repo": "repo-manager", + "path": "/home/worsch/repo-manager", + "planned_head_sha": "a7145b5bf5f7daa49bae9ff13502342b130b2c9e", + "source_fingerprint": "ffdb5acb7abba1ef62b38554a797a5d983193e138b428f03057b3cbcb044f58c", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "workplan", + "record_id": "RMGR-WP-0005", + "current_uuid": "6dcf854e-9229-569d-90f0-2d9df235a61d", + "derived_uuid": "6dcf854e-9229-569d-90f0-2d9df235a61d", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T12", + "current_uuid": "0d69713d-0596-5415-b40c-8f5035641541", + "derived_uuid": "0d69713d-0596-5415-b40c-8f5035641541", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T02", + "current_uuid": "7892ca86-bd89-537e-9361-d648dff8e4b2", + "derived_uuid": "7892ca86-bd89-537e-9361-d648dff8e4b2", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T04", + "current_uuid": "3fd25c8f-25ea-566e-91c7-ac5ccba83009", + "derived_uuid": "3fd25c8f-25ea-566e-91c7-ac5ccba83009", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T05", + "current_uuid": "f2634e3a-b32e-5862-85bf-78437fc976dc", + "derived_uuid": "f2634e3a-b32e-5862-85bf-78437fc976dc", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T07", + "current_uuid": "e3c2a791-f632-59f3-9929-b179e45c77d0", + "derived_uuid": "e3c2a791-f632-59f3-9929-b179e45c77d0", + "action": "unchanged" + } + ] + }, + { + "repo": "risk-nexus", + "path": "/home/worsch/risk-nexus", + "planned_head_sha": "623f7ccb2eb8bd964ce30a032d05c315e72fd73b", + "source_fingerprint": "930c0e7d60dad90954ff6776efec8db80ca92d2ae31d8c00026d86ea5c8babf6", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "risk-nexus", + "path": "workplans/RISK-WP-0002-publication-handover.md", + "kind": "workplan", + "record_id": "RISK-WP-0002", + "current_uuid": null, + "derived_uuid": "b79af69c-5b08-55df-8caa-258eed3e397e", + "action": "assign" + }, + { + "repo": "risk-nexus", + "path": "workplans/RISK-WP-0002-publication-handover.md", + "kind": "task", + "record_id": "RISK-WP-0002-T01", + "current_uuid": null, + "derived_uuid": "9ac32008-76b6-591c-82a1-ad6e2f8368b7", + "action": "assign" + } + ] + }, + { + "repo": "sbom-nexus", + "path": "/home/worsch/sbom-nexus", + "planned_head_sha": "0941a2e5f411438da8b3016960260500fcc259c0", + "source_fingerprint": "60dca89aaca9fc12ca2bd4df0ac0cddb0d5392ca241819e56821fc9537d16bfd", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "workplan", + "record_id": "SBOM-WP-0002", + "current_uuid": "7729a4bd-c1c4-50b9-a3b6-1faa51fff97d", + "derived_uuid": "7729a4bd-c1c4-50b9-a3b6-1faa51fff97d", + "action": "unchanged" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "task", + "record_id": "SBOM-WP-0002-T01", + "current_uuid": "95a520d4-30c2-5c87-8054-6bfe549c2686", + "derived_uuid": "95a520d4-30c2-5c87-8054-6bfe549c2686", + "action": "unchanged" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "task", + "record_id": "SBOM-WP-0002-T02", + "current_uuid": "22cbb75f-d82f-5b47-9fef-27bde3b410d5", + "derived_uuid": "22cbb75f-d82f-5b47-9fef-27bde3b410d5", + "action": "unchanged" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "task", + "record_id": "SBOM-WP-0002-T03", + "current_uuid": "49bd74a5-d806-5d8e-9d75-0d465b380171", + "derived_uuid": "49bd74a5-d806-5d8e-9d75-0d465b380171", + "action": "unchanged" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "task", + "record_id": "SBOM-WP-0002-T04", + "current_uuid": "e7681dce-e3b6-52d1-bf13-92595b082b09", + "derived_uuid": "e7681dce-e3b6-52d1-bf13-92595b082b09", + "action": "unchanged" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "task", + "record_id": "SBOM-WP-0002-T05", + "current_uuid": "59f83f01-13bc-5a63-bb0b-bf527047762e", + "derived_uuid": "59f83f01-13bc-5a63-bb0b-bf527047762e", + "action": "unchanged" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "task", + "record_id": "SBOM-WP-0002-T06", + "current_uuid": "dad4577d-5dcf-5452-b65e-d72299f432be", + "derived_uuid": "dad4577d-5dcf-5452-b65e-d72299f432be", + "action": "unchanged" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0002-production-cutover.md", + "kind": "task", + "record_id": "SBOM-WP-0002-T07", + "current_uuid": "bb1ff087-f204-5fd0-9295-3bd10bf0d38a", + "derived_uuid": "bb1ff087-f204-5fd0-9295-3bd10bf0d38a", + "action": "unchanged" + } + ] + }, + { + "repo": "secrets-engine", + "path": "/home/worsch/secrets-engine", + "planned_head_sha": "3ca0e63bed109a64774a5c8d94ca8953a815a766", + "source_fingerprint": "689080b0698835472bab9044ceb636deece6d4a4b159e3ee90ae80f75c6f11d2", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "secrets-engine", + "path": "workplans/SECRETS-WP-0006-catalog-lane-adoption.md", + "kind": "workplan", + "record_id": "SECRETS-WP-0006", + "current_uuid": null, + "derived_uuid": "31f7f8ea-7f73-516c-8877-f03a13f1db82", + "action": "assign" + }, + { + "repo": "secrets-engine", + "path": "workplans/SECRETS-WP-0006-catalog-lane-adoption.md", + "kind": "task", + "record_id": "SECRETS-WP-0006-T05", + "current_uuid": null, + "derived_uuid": "fb103f1e-2ff7-5de5-9a2c-191a19c43542", + "action": "assign" + }, + { + "repo": "secrets-engine", + "path": "workplans/SECRETS-WP-0006-catalog-lane-adoption.md", + "kind": "task", + "record_id": "SECRETS-WP-0006-T06", + "current_uuid": null, + "derived_uuid": "1431edae-5791-5892-8c4b-829419b537d2", + "action": "assign" + } + ] + }, + { + "repo": "soul-frame", + "path": "/home/worsch/soul-frame", + "planned_head_sha": "6ccd5e2a6a523125eaba8798fb8fb317368170a3", + "source_fingerprint": "97149208faf5b5e3332cfca6f01a9cec854218536634c958284395e99af1930c", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "soul-frame", + "path": "workplans/SOUL-WP-0008-phase-vii-paper.md", + "kind": "workplan", + "record_id": "SOUL-WP-0008", + "current_uuid": "a1398af7-a2e4-4a32-9612-1d0eb47a036b", + "derived_uuid": "c730a7e2-244e-558c-9ec1-66d04e275ff8", + "action": "replace" + }, + { + "repo": "soul-frame", + "path": "workplans/SOUL-WP-0008-phase-vii-paper.md", + "kind": "task", + "record_id": "SOUL-WP-0008-T01", + "current_uuid": "4c3a35c6-bd71-4995-97d7-a4117a1f50ae", + "derived_uuid": "6b11edf8-3eb7-582f-8eba-d58f870d6329", + "action": "replace" + }, + { + "repo": "soul-frame", + "path": "workplans/SOUL-WP-0008-phase-vii-paper.md", + "kind": "task", + "record_id": "SOUL-WP-0008-T02", + "current_uuid": "d4675ea1-7676-4f38-9b7b-38cec3c90a48", + "derived_uuid": "7b7d4731-3938-599b-899f-db65134be08d", + "action": "replace" + }, + { + "repo": "soul-frame", + "path": "workplans/SOUL-WP-0008-phase-vii-paper.md", + "kind": "task", + "record_id": "SOUL-WP-0008-T03", + "current_uuid": "f3eab6e4-6482-4b19-8a4d-d3311194e2f5", + "derived_uuid": "f44863b9-6dd5-55b6-aaf2-b08c21072483", + "action": "replace" + }, + { + "repo": "soul-frame", + "path": "workplans/SOUL-WP-0008-phase-vii-paper.md", + "kind": "task", + "record_id": "SOUL-WP-0008-T04", + "current_uuid": "e22041ed-2b69-4c2c-9359-96ddf7104c6d", + "derived_uuid": "cfc9ef36-4aa9-5bf5-a41a-a8ce5912cac5", + "action": "replace" + } + ] + }, + { + "repo": "state-hub", + "path": "/home/worsch/state-hub", + "planned_head_sha": "70a708ff1198e8a8027c87531de8cd80c66e9da3", + "source_fingerprint": "fabaeff19ee0acb476b8f140fc294d0e0c9df6a58995a06782a99c72a996b204", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "workplan", + "record_id": "CUST-WP-0038", + "current_uuid": "8d0c1b5d-44da-4b91-8357-e6526d3e0a85", + "derived_uuid": "ccb87fa4-6381-5f22-b097-6e026f56a9c1", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T01", + "current_uuid": "aa1bf291-3b6c-4940-a4f5-7680b0349110", + "derived_uuid": "5c79e069-281e-5b3c-a45e-3e906b9053fa", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T02", + "current_uuid": "5575f244-5cef-47aa-a168-24027cd08140", + "derived_uuid": "b91f9086-c526-5452-bade-ad2451ce3bd3", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T03", + "current_uuid": "5330fcc3-684b-49f6-8d28-ea8c929733d6", + "derived_uuid": "b6fbdfe2-7561-561d-936b-d531300f88aa", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T04", + "current_uuid": "64175ed0-af36-47ea-9401-74c4b15ffe24", + "derived_uuid": "c7f59893-6042-540c-ada7-e3661ffdabf7", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T05", + "current_uuid": "73c5008a-380e-42bf-ad57-1c9d0bda3a86", + "derived_uuid": "390f292d-1d74-5ca7-a08c-530e9c679bd3", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T06", + "current_uuid": "4e5b97ff-ef1c-414d-812b-39b87b242c74", + "derived_uuid": "e7640bd3-827b-5f8c-b03b-93e76eb8c412", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T07", + "current_uuid": "959062d8-decb-4969-a60b-0d3b618a8d6c", + "derived_uuid": "6492555c-aa6a-5c91-a2cf-3824fe1f1b12", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/CUST-WP-0038-state-hub-threephoenix-ha.md", + "kind": "task", + "record_id": "CUST-WP-0038-T08", + "current_uuid": "d4a7ca26-c338-48a1-b8b1-85a356550add", + "derived_uuid": "57412aef-f47a-5b58-b0a3-ca066d05ca09", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0079-retirement-strangler.md", + "kind": "workplan", + "record_id": "STATE-WP-0079", + "current_uuid": "749beac6-3c62-4284-aab5-9ed7fce900c2", + "derived_uuid": "ed077b62-7048-5752-bf65-f90471f45854", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0079-retirement-strangler.md", + "kind": "task", + "record_id": "STATE-WP-0079-T04", + "current_uuid": "db5291f2-3801-40fa-abf2-ceb0e77687c9", + "derived_uuid": "3a454438-1955-547f-a491-8eab7cd25710", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0079-retirement-strangler.md", + "kind": "task", + "record_id": "STATE-WP-0079-T05", + "current_uuid": "02e508ed-3cde-4487-907e-d324a8a877d6", + "derived_uuid": "f6cf8c01-eb59-5ca8-a541-23928d4a000c", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0079-retirement-strangler.md", + "kind": "task", + "record_id": "STATE-WP-0079-T06", + "current_uuid": "d52c95c6-af3f-4b2c-804e-e07763c9a8ab", + "derived_uuid": "9230c99b-af58-5794-9291-452e619a30fa", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "workplan", + "record_id": "STATE-WP-0081", + "current_uuid": "f36ee3e0-6d25-4f08-b41f-0cea79d50949", + "derived_uuid": "bb2798fd-0680-5027-8479-3af3a5b048de", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T01", + "current_uuid": "35e81d95-be10-4f1c-bb5d-3cb122b554a7", + "derived_uuid": "7dca680b-d34d-5bfe-838e-b463a4487a9c", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T02", + "current_uuid": "25f04375-b523-4e30-baaf-cc63efdacb0a", + "derived_uuid": "3fd4d23c-6b67-5b92-b312-25a7295773fd", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T03", + "current_uuid": "557908e1-b51c-477d-8db3-44fef660482b", + "derived_uuid": "8e5a5eb8-f29c-5cab-a19d-3447b6e0c26a", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T04", + "current_uuid": "3db96de9-006d-401b-b772-a05fbe7a7c62", + "derived_uuid": "57ab0ced-ef3f-5260-b7d6-e2a78ff4e023", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T05", + "current_uuid": "7f5a26d5-5043-41a3-865a-cf4e536d25da", + "derived_uuid": "530fbd27-e463-51d2-b09c-ba9827d057de", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T06", + "current_uuid": "6cd1316d-7a5d-4706-8b81-d46136c9196f", + "derived_uuid": "1d74e5e2-fb0f-5342-afbb-6ce2986823f4", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T07", + "current_uuid": "16ba9741-b908-4236-9a8b-4c74274072bd", + "derived_uuid": "12a2ce9f-7cdf-501b-9018-4c960d45e855", + "action": "replace" + }, + { + "repo": "state-hub", + "path": "workplans/STATE-WP-0081-cluster-self-sufficiency-and-registrar.md", + "kind": "task", + "record_id": "STATE-WP-0081-T08", + "current_uuid": "eaa37816-2d0d-48da-82f9-a4734d0a1b80", + "derived_uuid": "782c502a-5ce2-5ec3-8f07-b550c9705013", + "action": "replace" + } + ] + }, + { + "repo": "tenant-engine", + "path": "/home/worsch/tenant-engine", + "planned_head_sha": "0c0b40f510ba745fe6652f40832b9d491e37d3fb", + "source_fingerprint": "0542ebcc27fc0f49e4aef16b2c358b44073523f4306aff358fdaee0f3bde1ca6", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "tenant-engine", + "path": "workplans/TEN-WP-0008-staged-promotion-onboarding.md", + "kind": "workplan", + "record_id": "TEN-WP-0008", + "current_uuid": "e9da1c15-7beb-48d9-97ab-b657fdf9366e", + "derived_uuid": "416bec42-f4f7-5515-85e3-e30d36962cf3", + "action": "replace" + }, + { + "repo": "tenant-engine", + "path": "workplans/TEN-WP-0008-staged-promotion-onboarding.md", + "kind": "task", + "record_id": "TEN-WP-0008-T01", + "current_uuid": "0231e4d1-2e1a-4e77-92ba-2cfaf23692ab", + "derived_uuid": "42433839-3e2d-5055-a7f2-a142edd45d12", + "action": "replace" + }, + { + "repo": "tenant-engine", + "path": "workplans/TEN-WP-0008-staged-promotion-onboarding.md", + "kind": "task", + "record_id": "TEN-WP-0008-T02", + "current_uuid": "5f2ad011-1de8-45df-8e8f-dd6bcf51ece4", + "derived_uuid": "0f9df947-5535-55f4-a75a-957d44359ef2", + "action": "replace" + }, + { + "repo": "tenant-engine", + "path": "workplans/TEN-WP-0008-staged-promotion-onboarding.md", + "kind": "task", + "record_id": "TEN-WP-0008-T03", + "current_uuid": "c4b79dc1-c280-428e-9dc5-b17c05b084c6", + "derived_uuid": "c700bbb1-59d9-5bea-a590-086bf0f35a1b", + "action": "replace" + }, + { + "repo": "tenant-engine", + "path": "workplans/TEN-WP-0008-staged-promotion-onboarding.md", + "kind": "task", + "record_id": "TEN-WP-0008-T04", + "current_uuid": "b816a862-51e0-4abd-a2f3-ee40359526cc", + "derived_uuid": "fb8d1eb5-28aa-5f2e-bda1-7b344fd6b082", + "action": "replace" + } + ] + }, + { + "repo": "the-custodian", + "path": "/home/worsch/the-custodian", + "planned_head_sha": "22d93669ce77a9fb9d58a89b2063c25f97d12b6c", + "source_fingerprint": "bcbc2d128e62f1b6a04fc7904d946095852417a14d43ebf6ce04243ac93bd8ad", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0062-sbom-nexus-daily-catchup.md", + "kind": "workplan", + "record_id": "CUST-WP-0062", + "current_uuid": "6d9e5d3e-e779-471c-aaf4-74a33f9dec7f", + "derived_uuid": "ce062024-b221-54b1-8c1d-f14360d0354e", + "action": "replace" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0062-sbom-nexus-daily-catchup.md", + "kind": "task", + "record_id": "CUST-WP-0062-T01", + "current_uuid": "b593aeab-c435-47d1-9775-bbfbcf4cf4ab", + "derived_uuid": "9b65928b-cc69-53a8-803e-daae1109f939", + "action": "replace" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0062-sbom-nexus-daily-catchup.md", + "kind": "task", + "record_id": "CUST-WP-0062-T02", + "current_uuid": "eaf08a83-9b25-4e5e-beeb-d24fa696a626", + "derived_uuid": "cbbbd680-2b17-540f-a339-30436b4ebf86", + "action": "replace" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0062-sbom-nexus-daily-catchup.md", + "kind": "task", + "record_id": "CUST-WP-0062-T03", + "current_uuid": "936d6554-dbd9-4a24-a223-3858b49d30c3", + "derived_uuid": "d1c0c3ed-fc55-5656-a504-5562fd848dae", + "action": "replace" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0062-sbom-nexus-daily-catchup.md", + "kind": "task", + "record_id": "CUST-WP-0062-T04", + "current_uuid": "afd45c7f-55d7-4312-a6cf-df511913c998", + "derived_uuid": "5e3132ff-4000-5eac-9d29-017c2dcec5e4", + "action": "replace" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0062-sbom-nexus-daily-catchup.md", + "kind": "task", + "record_id": "CUST-WP-0062-T05", + "current_uuid": "0bdfbc56-3293-4578-a266-e4ca9313aabf", + "derived_uuid": "27172afa-072f-5b47-a7be-5b857ba74463", + "action": "replace" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0062-sbom-nexus-daily-catchup.md", + "kind": "task", + "record_id": "CUST-WP-0062-T06", + "current_uuid": "ceb75c3d-945f-4fc2-9399-5df8b5baa10d", + "derived_uuid": "a15dc52b-43b5-56b1-90a7-49d5ab84c67a", + "action": "replace" + } + ] + }, + { + "repo": "whitehat-security", + "path": "/home/worsch/whitehat-security", + "planned_head_sha": "b8facab71741b7a76bb9fc25930ce6a99f216ff1", + "source_fingerprint": "7b05f2e7426b48b5e80de2ea429dbcd8d3ba66665b9dda394fdcaceb0f0d3567", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "workplan", + "record_id": "WHITEHAT-WP-0001", + "current_uuid": "ecc16edc-9f9b-4fc4-8fb1-96b947a59299", + "derived_uuid": "3049aa1e-b188-514f-9ad7-bf3026094fb9", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T03", + "current_uuid": "742561f1-97b6-4fcc-8e06-d18508ddecae", + "derived_uuid": "e03edc76-a314-50dc-8625-3666c6351818", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T05", + "current_uuid": "6df676e7-bed5-4291-a128-eb6e9844edf2", + "derived_uuid": "7c2c3dab-a135-543b-86b1-d543ec6af0fc", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T06", + "current_uuid": "99254ab5-f08e-44c7-8399-be706dc03019", + "derived_uuid": "3a2d7a31-86b9-5c82-ab88-606b64381b2a", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T07", + "current_uuid": "54f33288-5361-4b20-8e1f-168866d64644", + "derived_uuid": "602d0f23-8406-5882-8f93-ec90151dd475", + "action": "replace" + } + ] + }, + { + "repo": "whynot-design", + "path": "/home/worsch/whynot-design", + "planned_head_sha": "4b62cffc86496d587ac8d48a8e199624bc4a5c1f", + "source_fingerprint": "55ea5e6884be2c5a0a7b8e9e19326f381c2b86afecbc28adc00252ce56793a7f", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "whynot-design", + "path": "workplans/WHYNOT-WP-0003-downstream-consumption.md", + "kind": "workplan", + "record_id": "WHYNOT-WP-0003", + "current_uuid": "41fed928-f44a-48f4-9870-120310fbf071", + "derived_uuid": "d3a6ec16-ac40-5ffb-99e7-07f997e59a4a", + "action": "replace" + } + ] + }, + { + "repo": "zone-engine", + "path": "/home/worsch/zone-engine", + "planned_head_sha": "9b6ada7c894a1cb31f5101528300647b282510f0", + "source_fingerprint": "5ab8f1b179c86c00bdeb425d93304e706ea1830f13d5309815b12ce621c17f2d", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "zone-engine", + "path": "workplans/ZONE-WP-0001-security-zone-model.md", + "kind": "workplan", + "record_id": "ZONE-WP-0001", + "current_uuid": "a75c8c9c-c108-4831-8d72-4343cce49879", + "derived_uuid": "84db5351-3813-5059-9462-4a4fc43614fe", + "action": "replace" + }, + { + "repo": "zone-engine", + "path": "workplans/ZONE-WP-0001-security-zone-model.md", + "kind": "task", + "record_id": "ZONE-WP-0001-T07", + "current_uuid": "c7ea24df-8aa9-4ead-ba3a-033aa5201c21", + "derived_uuid": "9a794ffe-c056-5da8-9d56-6826f5ed37ce", + "action": "replace" + } + ] + } + ], + "plan_sha256": "ac97f6e4f0b35db63a0dc1b4a439f0a39738d13c1407f18419f706d780d4eea0" +} diff --git a/docs/work-record-uuid-derivation_v1.md b/docs/work-record-uuid-derivation_v1.md index 8282904..c27900c 100644 --- a/docs/work-record-uuid-derivation_v1.md +++ b/docs/work-record-uuid-derivation_v1.md @@ -44,6 +44,13 @@ rmgr identifier preflight --root /path/to/fleet rmgr identifier migration-plan --root /path/to/fleet --output uuid-migration.json rmgr identifier migration-verify --plan uuid-migration.json rmgr identifier migration-verify --plan uuid-migration.json --repo repo-manager +rmgr identifier migration-batch-plan \ + --plan uuid-migration.json \ + --repo whynot-design \ + --output batch.json +rmgr identifier migration-batch-verify \ + --plan uuid-migration.json \ + --batch batch.json ``` `migration-plan` is non-mutating. Its versioned JSON output preserves every @@ -61,6 +68,13 @@ repository. `--repo` verifies one atomic apply unit, so unrelated fleet churn does not invalidate a stable repository. A new plan is required for each unit whose authoritative source drifts. +`migration-batch-plan` converts selected atomic units into a bounded approval +package. Each selected repository must still match the planned Git HEAD, have a +clean worktree, exactly match its configured upstream, and use a non-retired +origin. The batch records these facts and its own SHA-256 seal, but always emits +`apply_authorized: false`. An explicit decision must cite that batch hash before +any database or file mutation. + Activation and applying a bulk migration remain separate governed steps. Publishing or planning this function does not retroactively rewrite existing identifiers. `--namespace` remains an explicit override for a foreign/forked diff --git a/src/repo_manager/cli.py b/src/repo_manager/cli.py index ffa956b..da603f6 100644 --- a/src/repo_manager/cli.py +++ b/src/repo_manager/cli.py @@ -312,6 +312,20 @@ def main(argv: list[str] | None = None) -> int: ) p_id_verify.add_argument("--plan", required=True) p_id_verify.add_argument("--repo", default=None, help="Verify one repository atomic unit") + p_id_batch = identifier_sub.add_parser( + "migration-batch-plan", + help="Pin a clean synchronized repository batch for explicit approval", + ) + p_id_batch.add_argument("--plan", required=True) + p_id_batch.add_argument("--repo", action="append", required=True, dest="repos") + p_id_batch.add_argument("--output", default=None) + p_id_batch.add_argument("--force", action="store_true") + p_id_batch_verify = identifier_sub.add_parser( + "migration-batch-verify", + help="Verify a saved batch seal and repeat source/Git preflight", + ) + p_id_batch_verify.add_argument("--plan", required=True) + p_id_batch_verify.add_argument("--batch", required=True) p_id_files = identifier_sub.add_parser( "migration-files", help="Validate or execute one repository's sealed UUID file rewrite", @@ -686,7 +700,9 @@ def main(argv: list[str] | None = None) -> int: load_fleet_namespace, migrate_repository_identifier_files, plan_identifier_migration, + plan_identifier_migration_batch, scan_live_identifier_collisions, + verify_identifier_migration_batch, verify_identifier_migration_plan, ) @@ -730,6 +746,37 @@ def main(argv: list[str] | None = None) -> int: except (OSError, TypeError, ValueError, json.JSONDecodeError) as exc: print(json.dumps({"ok": False, "error": str(exc)}, indent=2)) return 1 + elif args.identifier_command == "migration-batch-plan": + try: + plan = json.loads(Path(args.plan).read_text(encoding="utf-8")) + if not isinstance(plan, dict): + raise TypeError("migration plan must be a JSON object") + result = plan_identifier_migration_batch(plan, repo_slugs=args.repos) + except (OSError, TypeError, ValueError, json.JSONDecodeError) as exc: + print(json.dumps({"ok": False, "error": str(exc)}, indent=2)) + return 1 + if args.output: + output = Path(args.output) + if output.exists() and not args.force: + print( + json.dumps( + {"ok": False, "error": f"output exists: {output}; use --force to replace"}, + indent=2, + ) + ) + return 1 + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") + elif args.identifier_command == "migration-batch-verify": + try: + plan = json.loads(Path(args.plan).read_text(encoding="utf-8")) + batch = json.loads(Path(args.batch).read_text(encoding="utf-8")) + if not isinstance(plan, dict) or not isinstance(batch, dict): + raise TypeError("migration plan and batch must be JSON objects") + result = verify_identifier_migration_batch(batch, plan=plan) + except (OSError, TypeError, ValueError, json.JSONDecodeError) as exc: + print(json.dumps({"ok": False, "error": str(exc)}, indent=2)) + return 1 else: try: result = plan_identifier_migration(Path(args.root), namespace) diff --git a/src/repo_manager/identifiers.py b/src/repo_manager/identifiers.py index 3ed82f9..29472b3 100644 --- a/src/repo_manager/identifiers.py +++ b/src/repo_manager/identifiers.py @@ -6,6 +6,7 @@ import hashlib import json import os import re +import subprocess import tempfile import uuid from collections import defaultdict @@ -296,6 +297,224 @@ def verify_identifier_migration_plan( } +def _git_cutover_preflight(repo: Path, *, expected_head_sha: str | None) -> dict[str, Any]: + errors: list[str] = [] + + def git(*args: str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + ["git", *args], + cwd=repo, + capture_output=True, + text=True, + check=False, + ) + + current_head = head_sha(repo) + if current_head is None: + errors.append("repository has no Git HEAD") + elif current_head != expected_head_sha: + errors.append("Git HEAD changed after migration planning") + + status = git("status", "--porcelain") + if status.returncode != 0: + errors.append(status.stderr.strip() or "could not inspect Git worktree") + elif status.stdout.strip(): + errors.append("worktree is not clean") + + upstream = git("rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}") + upstream_name = upstream.stdout.strip() if upstream.returncode == 0 else None + behind: int | None = None + ahead: int | None = None + if upstream_name is None: + errors.append("current branch has no upstream") + else: + counts = git("rev-list", "--left-right", "--count", "@{u}...HEAD") + try: + behind, ahead = (int(value) for value in counts.stdout.split()) + except (TypeError, ValueError): + errors.append(counts.stderr.strip() or "could not compare HEAD with upstream") + else: + if behind or ahead: + errors.append("branch does not exactly match its upstream") + + remote = git("remote", "get-url", "origin") + origin = remote.stdout.strip() if remote.returncode == 0 else None + if origin is None: + errors.append("origin remote is missing") + elif any( + marker in origin + for marker in ("gitea-remote", "gitea.coulomb.social", "92.205.130.254") + ): + errors.append("origin targets the retired Gitea lineage") + + return { + "ok": not errors, + "head_sha": current_head, + "expected_head_sha": expected_head_sha, + "upstream": upstream_name, + "behind": behind, + "ahead": ahead, + "origin": origin, + "errors": errors, + } + + +def plan_identifier_migration_batch( + plan: dict[str, Any], *, repo_slugs: list[str] +) -> dict[str, Any]: + """Pin a reviewed repository batch after source and Git preflight. + + The result is an approval package, not apply authority. Live database and + file mutation still require an explicit decision citing ``batch_sha256``. + """ + plan_sha256 = _verified_plan_seal(plan) + requested = [slug.strip() for slug in repo_slugs if slug.strip()] + errors: list[dict[str, str]] = [] + if not requested: + errors.append({"scope": "batch", "reason": "at least one repository is required"}) + if len(set(requested)) != len(requested): + errors.append({"scope": "batch", "reason": "repository list contains duplicates"}) + + repositories_by_slug: dict[str, list[dict[str, Any]]] = defaultdict(list) + for repository in plan.get("repositories", []): + repositories_by_slug[str(repository.get("repo") or "")].append(repository) + + batch_repositories: list[dict[str, Any]] = [] + totals = {"repositories": 0, "records": 0, "replace": 0, "assign": 0, "unchanged": 0} + for slug in requested: + matches = repositories_by_slug.get(slug, []) + if len(matches) != 1: + errors.append( + { + "scope": slug, + "reason": "repository must occur exactly once in the source plan", + } + ) + continue + repository = matches[0] + source_verification = verify_identifier_migration_plan(plan, repo_slug=slug) + repo = Path(str(repository.get("path") or "")).resolve() + git_preflight = _git_cutover_preflight( + repo, + expected_head_sha=repository.get("planned_head_sha"), + ) + mappings = list(repository.get("mappings") or []) + action_counts = { + action: sum(mapping.get("action") == action for mapping in mappings) + for action in ("replace", "assign", "unchanged") + } + actionable = action_counts["replace"] + action_counts["assign"] + if actionable == 0: + errors.append({"scope": slug, "reason": "repository has no migration action"}) + for error in source_verification["errors"]: + errors.append({"scope": slug, "reason": error["reason"]}) + for reason in git_preflight["errors"]: + errors.append({"scope": slug, "reason": reason}) + + batch_repositories.append( + { + "repo": slug, + "path": str(repo), + "planned_head_sha": repository.get("planned_head_sha"), + "source_fingerprint": repository.get("source_fingerprint"), + "source_verified": source_verification["ok"], + "git_preflight": git_preflight, + "mapping_counts": {"records": len(mappings), **action_counts}, + "ready": source_verification["ok"] and git_preflight["ok"] and actionable > 0, + } + ) + totals["repositories"] += 1 + totals["records"] += len(mappings) + for action, count in action_counts.items(): + totals[action] += count + + result = { + "schema": "repo-manager.identifier-migration-batch.v1", + "ok": not errors, + "ready_for_approval": not errors, + "apply_authorized": False, + "approval_required": True, + "namespace": plan.get("namespace"), + "source_plan_sha256": plan_sha256, + "batch_policy": "repository-atomic, sequential, stop on first failure", + "rollback_order": "reverse files if written, then reverse central projection", + "generated_at": utc_now_text(), + "totals": totals, + "repositories": batch_repositories, + "errors": errors, + } + canonical = json.dumps(result, sort_keys=True, separators=(",", ":")).encode("utf-8") + result["batch_sha256"] = hashlib.sha256(canonical).hexdigest() + return result + + +def verify_identifier_migration_batch( + batch: dict[str, Any], *, plan: dict[str, Any] +) -> dict[str, Any]: + """Verify a saved batch seal and repeat every selected source/Git check.""" + errors: list[dict[str, str]] = [] + expected_batch_sha256 = batch.get("batch_sha256") + unsealed = {key: value for key, value in batch.items() if key != "batch_sha256"} + canonical = json.dumps(unsealed, sort_keys=True, separators=(",", ":")).encode("utf-8") + actual_batch_sha256 = hashlib.sha256(canonical).hexdigest() + if batch.get("schema") != "repo-manager.identifier-migration-batch.v1": + errors.append({"scope": "batch", "reason": "unsupported batch schema"}) + if expected_batch_sha256 != actual_batch_sha256: + errors.append({"scope": "batch", "reason": "batch SHA-256 mismatch"}) + + try: + plan_sha256 = _verified_plan_seal(plan) + except (OSError, ValueError) as exc: + errors.append({"scope": "plan", "reason": str(exc)}) + plan_sha256 = None + if batch.get("source_plan_sha256") != plan_sha256: + errors.append({"scope": "plan", "reason": "batch source plan SHA-256 mismatch"}) + if batch.get("apply_authorized") is not False or batch.get("approval_required") is not True: + errors.append( + { + "scope": "batch", + "reason": "batch must remain unauthorized and approval-required", + } + ) + + saved_repositories = list(batch.get("repositories") or []) + repo_slugs = [str(item.get("repo") or "") for item in saved_repositories] + if not repo_slugs or any(not slug for slug in repo_slugs): + errors.append({"scope": "batch", "reason": "batch has no valid repository scope"}) + fresh = None + else: + try: + fresh = plan_identifier_migration_batch(plan, repo_slugs=repo_slugs) + except (OSError, ValueError) as exc: + errors.append({"scope": "batch", "reason": str(exc)}) + fresh = None + + if fresh is not None: + errors.extend(fresh["errors"]) + fresh_by_slug = {item["repo"]: item for item in fresh["repositories"]} + for saved in saved_repositories: + slug = str(saved.get("repo") or "") + current = fresh_by_slug.get(slug) + if current is None: + errors.append({"scope": slug, "reason": "repository disappeared from batch"}) + continue + for field in ("planned_head_sha", "source_fingerprint", "mapping_counts"): + if saved.get(field) != current.get(field): + errors.append({"scope": slug, "reason": f"saved {field} differs from plan"}) + + return { + "schema": "repo-manager.identifier-migration-batch-verification.v1", + "ok": not errors, + "ready_for_decision": not errors, + "apply_authorized": False, + "approval_required": True, + "batch_sha256": expected_batch_sha256, + "source_plan_sha256": plan_sha256, + "repositories": repo_slugs, + "errors": errors, + } + + def _verified_plan_seal(plan: dict[str, Any]) -> str: if plan.get("schema") != "repo-manager.identifier-migration-plan.v1": raise ValueError("unsupported identifier migration plan schema") diff --git a/tests/test_identifiers.py b/tests/test_identifiers.py index fc2b751..4d5835f 100644 --- a/tests/test_identifiers.py +++ b/tests/test_identifiers.py @@ -10,7 +10,9 @@ from repo_manager.identifiers import ( load_fleet_namespace, migrate_repository_identifier_files, plan_identifier_migration, + plan_identifier_migration_batch, scan_live_identifier_collisions, + verify_identifier_migration_batch, verify_identifier_migration_plan, ) @@ -203,3 +205,84 @@ def test_identifier_file_migration_requires_exact_plan_confirmation(tmp_path: Pa repo_slug="one", confirm_plan_sha256="0" * 64, ) + + +def _push_fixture_to_upstream(repo: Path, remote: Path) -> None: + subprocess.run(["git", "init", "--bare", remote], check=True, capture_output=True) + subprocess.run(["git", "remote", "add", "origin", str(remote)], cwd=repo, check=True) + subprocess.run(["git", "push", "-u", "origin", "HEAD:main"], cwd=repo, check=True) + + +def test_migration_batch_plan_pins_clean_synchronized_repo(tmp_path: Path) -> None: + repo = tmp_path / "one" + path = repo / "workplans" / "one.md" + _workplan(path, "ONE-WP-0001", "active") + subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True) + subprocess.run( + ["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-m", "seed"], + cwd=repo, + check=True, + capture_output=True, + ) + _push_fixture_to_upstream(repo, tmp_path / "remote.git") + plan = plan_identifier_migration(tmp_path, "helixforge") + + batch = plan_identifier_migration_batch(plan, repo_slugs=["one"]) + + assert batch["ok"] is True + assert batch["ready_for_approval"] is True + assert batch["apply_authorized"] is False + assert batch["approval_required"] is True + assert batch["repositories"][0]["git_preflight"]["upstream"] == "origin/main" + assert len(batch["batch_sha256"]) == 64 + + +def test_migration_batch_plan_rejects_dirty_or_duplicate_scope(tmp_path: Path) -> None: + repo = tmp_path / "one" + path = repo / "workplans" / "one.md" + _workplan(path, "ONE-WP-0001", "active") + subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True) + subprocess.run( + ["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-m", "seed"], + cwd=repo, + check=True, + capture_output=True, + ) + _push_fixture_to_upstream(repo, tmp_path / "remote.git") + plan = plan_identifier_migration(tmp_path, "helixforge") + path.write_text(path.read_text(encoding="utf-8") + "\ndrift\n", encoding="utf-8") + + batch = plan_identifier_migration_batch(plan, repo_slugs=["one", "one"]) + + assert batch["ok"] is False + assert batch["ready_for_approval"] is False + assert any(error["reason"] == "repository list contains duplicates" for error in batch["errors"]) + assert any(error["reason"] == "worktree is not clean" for error in batch["errors"]) + + +def test_migration_batch_verification_repeats_preflight_and_detects_tampering( + tmp_path: Path, +) -> None: + repo = tmp_path / "one" + path = repo / "workplans" / "one.md" + _workplan(path, "ONE-WP-0001", "active") + subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True) + subprocess.run( + ["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-m", "seed"], + cwd=repo, + check=True, + capture_output=True, + ) + _push_fixture_to_upstream(repo, tmp_path / "remote.git") + plan = plan_identifier_migration(tmp_path, "helixforge") + batch = plan_identifier_migration_batch(plan, repo_slugs=["one"]) + + assert verify_identifier_migration_batch(batch, plan=plan)["ok"] is True + + batch["totals"]["records"] = 999 + verification = verify_identifier_migration_batch(batch, plan=plan) + assert verification["ok"] is False + assert any(error["reason"] == "batch SHA-256 mismatch" for error in verification["errors"]) diff --git a/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md b/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md index a2dc1b8..4385167 100644 --- a/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md +++ b/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md @@ -431,6 +431,23 @@ evidence, restore points, hashes, and residuals are in progress: widening beyond this single repository requires a new explicit fleet cutover decision and refreshed source fingerprints. +**Batch 0002 prepared (2026-08-22):** the original fleet seal now rejects 15 +repositories with legitimate source drift. A refreshed zero-collision plan +covers 41 repositories and 230 records. New `rmgr identifier +migration-batch-plan` pins an exact subset only after source verification plus +clean, Forgejo-synchronized Git preflight, and always emits +`apply_authorized: false` until a decision cites its batch hash. + +`RMGR-DEC-2026-001` now offers the directly executable second pilot: +`whynot-design` only, one workplan UUID replacement, no task replacements or +assignments. Workstation and production both resolve the old UUID, reject the +derived UUID, and agree on 9 tasks, 11 progress events, and 1 decision. The +sealed batch hash is +`4039224352c6590fdc6b41e739539f1f9c92d098b43ed6e30b3cd9a87b53da65`. +No mutation has run; approval, revision, or rejection of that exact package is +the remaining gate. Evidence: +`docs/evidence/RMGR-WP-0005-batch-0002-readiness-2026-08-22.md`. + ## Retire the interim rule ```task