From 956efbb7aef00b63e344a5a5005d1e10307e17bf Mon Sep 17 00:00:00 2001 From: tegwick Date: Fri, 21 Aug 2026 23:57:03 +0200 Subject: [PATCH] feat(identifier): declare helixforge fleet namespace Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a023c0-a0a3-7c03-b395-5a0d2757214d --- WORK-RECORDS.md | 2 +- config/fleet-namespace.yaml | 12 + ...lixforge-migration-readiness-2026-08-21.md | 54 + ...xforge-uuid-migration-plan-2026-08-21.json | 2664 +++++++++++++++++ docs/work-record-uuid-derivation_v1.md | 25 +- src/repo_manager/cli.py | 28 +- src/repo_manager/identifiers.py | 84 +- tests/test_identifiers.py | 39 + ...gistrar-consolidation-deterministic-ids.md | 24 +- 9 files changed, 2915 insertions(+), 17 deletions(-) create mode 100644 config/fleet-namespace.yaml create mode 100644 docs/evidence/RMGR-WP-0005-helixforge-migration-readiness-2026-08-21.md create mode 100644 docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-21.json diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index d87e282..2866608 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -43,7 +43,7 @@ | task | RMGR-WP-0004-T09 | done | — | workplans/RMGR-WP-0004-repository-standards-conformance.md | | task | RMGR-WP-0005-T01 | done | — | workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md | | task | RMGR-WP-0005-T02 | wait | — | workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md | -| task | RMGR-WP-0005-T03 | progress | — | workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md | +| task | RMGR-WP-0005-T03 | done | — | workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md | | task | RMGR-WP-0005-T04 | progress | — | workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md | | task | RMGR-WP-0005-T05 | wait | — | workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md | | task | RMGR-WP-0005-T06 | done | — | workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md | diff --git a/config/fleet-namespace.yaml b/config/fleet-namespace.yaml new file mode 100644 index 0000000..11785e3 --- /dev/null +++ b/config/fleet-namespace.yaml @@ -0,0 +1,12 @@ +schema: repo-manager.fleet-namespace.v1 +namespace: helixforge +scope: HelixForge fleet +lineage: + kind: root + parent: null +posture: + current: {N: 2, U: 1, R: 1, S: 1} + target: {N: 3, U: 2, R: 2, S: 1} +declared_by: Bernd Worsch +declared: "2026-08-21" +decision_ref: RMGR-WP-0005-T03 diff --git a/docs/evidence/RMGR-WP-0005-helixforge-migration-readiness-2026-08-21.md b/docs/evidence/RMGR-WP-0005-helixforge-migration-readiness-2026-08-21.md new file mode 100644 index 0000000..dcdfede --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-helixforge-migration-readiness-2026-08-21.md @@ -0,0 +1,54 @@ +--- +id: RMGR-EVIDENCE-0005-HELIXFORGE-MIGRATION-20260821 +type: evidence +workplan_task: RMGR-WP-0005-T04 +created: "2026-08-21" +--- + +# HelixForge deterministic-identifier migration readiness + +Fleet owner Bernd Worsch declared `helixforge` as the authoritative current +namespace. Repo Manager records it in `config/fleet-namespace.yaml`; omitting +`--namespace` now resolves to that checked-in declaration. + +## Source preflight + +- 114 repository workplan roots scanned under `/home/worsch`; +- 242 live workplan/task identifiers; +- zero live identifier collisions; +- one initial ineligible repository (`net-kingdom`) due to 14 legacy task ids + written as `-T1`…`-T8`; +- those ids and their four documentation references were normalized to + `-T01`…`-T08` in NetKingdom commit `25ed928`; +- regenerated plan: 42/42 repositories eligible, 242 records, 209 replacements, + 33 assignments, zero skipped; +- plan SHA-256: + `98a7d876d49fbec9c062f970c18e25750da4cd4b5c89ab0d4ed24d50183abbda`. + +The full old-to-derived mapping is +`docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-21.json`. +It carries canonical UTC generation time plus per-repository Git HEAD and +authoritative-source fingerprints. `rmgr identifier migration-verify` validates +the seal and all 42 source preconditions. + +## Central-projection gate + +No UUID was rewritten. State Hub uses these UUIDs as primary keys, with +references from tasks, progress and token events, decisions, dependencies, +launch requests, intakes, capability requests, contributions, technical debt, +extension points, and legacy suggestions. The checked-in foreign keys specify +delete behavior but no `ON UPDATE CASCADE` behavior. + +Consequently, changing the repository fields first would detach the central +projection, while directly updating database primary keys would fail or leave +references split. Apply remains unauthorized until State Hub has: + +1. a transactional old→derived projection migration covering every referencing + table; +2. durable alias/provenance for old ids used by saved links and events; +3. per-repository prepare/apply/rollback behavior coordinated with the Git + commit and push seal; and +4. an isolated PostgreSQL rehearsal proving forward and reverse mappings. + +This is a discovered compatibility requirement, not a source-data blocker. The +sealed plan remains evidence; any source or HEAD drift requires regeneration. diff --git a/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-21.json b/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-21.json new file mode 100644 index 0000000..a76ada8 --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-21.json @@ -0,0 +1,2664 @@ +{ + "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-21T21:55:58.740255Z", + "totals": { + "repositories": 42, + "eligible": 42, + "skipped": 0, + "records": 242, + "replace": 209, + "assign": 33, + "unchanged": 0 + }, + "repositories": [ + { + "repo": "activity-core", + "path": "/home/worsch/activity-core", + "planned_head_sha": "8fdaa2ce7d7540eb353e6d722fe92acb219d963c", + "source_fingerprint": "68643eb5af125d908dfecaf06d3cf7f059cb8cd9d3e66fcf64367400857e3328", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0029-hub-port-alignment.md", + "kind": "workplan", + "record_id": "ACTIVITY-WP-0029", + "current_uuid": "1b18849c-db3a-40a0-8f22-7af7fd4dbcfc", + "derived_uuid": "0890b1cf-fed0-5c5e-8f7a-d5799b997532", + "action": "replace" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0029-hub-port-alignment.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0029-T03", + "current_uuid": "3fbadbfe-9107-4869-b53f-3b9b46e0555a", + "derived_uuid": "2d21912e-32af-5baa-b9f3-ec059d4aa69e", + "action": "replace" + }, + { + "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": "d0790524e289acdd56e85a70d7a4ece7255421eb", + "source_fingerprint": "85bd1ad69aab0c5802add729393f6c9724ea17d1d763b8779eee3cf9ff4f326f", + "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": "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": "739b838b9f99f7ea84ab2be76d57de9cedbb9997", + "source_fingerprint": "b6fca93a1d8913eaa6990440a4f23a620dad5ec0c0c017cf8bde8553879e7b38", + "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-T01", + "current_uuid": "a1dfa4ec-f946-425e-8183-782eef7763c4", + "derived_uuid": "d88714a4-0bcb-567e-8542-d5b4c556b8ec", + "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": "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": "e18894ee5bd129b7d5011dd3d3044c7d34275995", + "source_fingerprint": "8ee917427da648d3d8f792fe8932042711204af0f2791a80e464b03c67cd56ba", + "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": "rail-kubernetes", + "path": "/home/worsch/rail-kubernetes", + "planned_head_sha": "c6b045051f18a7529312eb17f2e55c381f3ba69b", + "source_fingerprint": "b43fdca50b125919eccb5a80133f6e3e8742b6375c8dfb9a4f0678d3143842f9", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rail-kubernetes", + "path": "workplans/RAIL-K8S-WP-0003-private-by-default-networking.md", + "kind": "workplan", + "record_id": "RAIL-K8S-WP-0003", + "current_uuid": null, + "derived_uuid": "55ab4f28-b6a8-53ad-8ea4-2dc8fe91b681", + "action": "assign" + }, + { + "repo": "rail-kubernetes", + "path": "workplans/RAIL-K8S-WP-0003-private-by-default-networking.md", + "kind": "task", + "record_id": "RAIL-K8S-WP-0003-T01", + "current_uuid": null, + "derived_uuid": "8c4c7c80-0c5e-5498-8054-ec47acb5b4ba", + "action": "assign" + }, + { + "repo": "rail-kubernetes", + "path": "workplans/RAIL-K8S-WP-0003-private-by-default-networking.md", + "kind": "task", + "record_id": "RAIL-K8S-WP-0003-T02", + "current_uuid": null, + "derived_uuid": "40f6f415-18f1-594e-ac21-35263b2aa532", + "action": "assign" + } + ] + }, + { + "repo": "railiance-cluster", + "path": "/home/worsch/railiance-cluster", + "planned_head_sha": "fd3f9cccdd6b417e531347e45e7c52742ed38964", + "source_fingerprint": "df5f8a919f983a48816a0db354de4e72db949ca178439dcc50f9eaa8fb6cbfd5", + "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-cluster", + "path": "workplans/RCLUSTER-WP-0014-capacity-utilization-and-allocation-evidence.md", + "kind": "workplan", + "record_id": "RCLUSTER-WP-0014", + "current_uuid": "ea6ec98a-0d65-4afa-b6c5-6e7ed34011ac", + "derived_uuid": "73ff6641-eaf6-5546-8f0e-b5aa1aa7f35b", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0014-capacity-utilization-and-allocation-evidence.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0014-T01", + "current_uuid": "a144bf1d-0402-4526-9bda-17846390270c", + "derived_uuid": "abc4980e-4103-5d63-9e05-5a198dc7988b", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0014-capacity-utilization-and-allocation-evidence.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0014-T02", + "current_uuid": "6460d9aa-3ded-420a-bf01-f0ccdeee0a02", + "derived_uuid": "9e0dc15e-a853-512e-be44-71525ce0bc47", + "action": "replace" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0014-capacity-utilization-and-allocation-evidence.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0014-T03", + "current_uuid": "e5ff9b6c-e883-4356-9eca-b31757661d2f", + "derived_uuid": "8a052726-e6f2-5852-aada-a14e67bca695", + "action": "replace" + } + ] + }, + { + "repo": "railiance-enablement", + "path": "/home/worsch/railiance-enablement", + "planned_head_sha": "3933376b9a8e9579ad7f7c51216f05776a446ac7", + "source_fingerprint": "a57eab57bdd04d58b77f089317101d656073597348f6cb86a5abe80551f16aa9", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-enablement", + "path": "workplans/RAIL-EN-WP-0001-private-by-default-templates.md", + "kind": "workplan", + "record_id": "RAIL-EN-WP-0001", + "current_uuid": "0070cc66-e5e5-42fc-a4cb-bbcc78451ea6", + "derived_uuid": "c2c2c230-22f2-51e3-85ee-90e7101dd674", + "action": "replace" + }, + { + "repo": "railiance-enablement", + "path": "workplans/RAIL-EN-WP-0001-private-by-default-templates.md", + "kind": "task", + "record_id": "RAIL-EN-WP-0001-T01", + "current_uuid": "ceea9e5a-385e-4f13-b8ea-0b1e72cddaee", + "derived_uuid": "4c5f5f56-7ca6-5cb5-bb54-a2bc89a762a7", + "action": "replace" + } + ] + }, + { + "repo": "railiance-forge", + "path": "/home/worsch/railiance-forge", + "planned_head_sha": "2b71b7ea05799a95742799f8433f1d992b1548e1", + "source_fingerprint": "5ca15bfce50b8965e86beb288521455e24757855daf2f146e69a28677b0bdeb6", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-forge", + "path": "workplans/RFORGE-WP-0002-forge-resource-economics-evidence.md", + "kind": "workplan", + "record_id": "RFORGE-WP-0002", + "current_uuid": "72f935a5-d921-48a4-96e4-2365556c7374", + "derived_uuid": "ce3bcfc5-a9af-5459-9d5c-e44ea50e7b13", + "action": "replace" + }, + { + "repo": "railiance-forge", + "path": "workplans/RFORGE-WP-0002-forge-resource-economics-evidence.md", + "kind": "task", + "record_id": "RFORGE-WP-0002-T01", + "current_uuid": "7048e354-0844-4f6c-aeaa-acf188b04ce2", + "derived_uuid": "07b43be8-f1f8-5b0f-be52-3343e9ade2d7", + "action": "replace" + }, + { + "repo": "railiance-forge", + "path": "workplans/RFORGE-WP-0002-forge-resource-economics-evidence.md", + "kind": "task", + "record_id": "RFORGE-WP-0002-T02", + "current_uuid": "643c2393-2ee5-4264-972c-04c3b358dc86", + "derived_uuid": "61531eba-5802-5ace-8822-1a5ad67ad44a", + "action": "replace" + }, + { + "repo": "railiance-forge", + "path": "workplans/RFORGE-WP-0002-forge-resource-economics-evidence.md", + "kind": "task", + "record_id": "RFORGE-WP-0002-T03", + "current_uuid": "498cc0c7-ba07-4e7f-a0ef-2e6b34bef04c", + "derived_uuid": "27612238-ec67-55f1-8f5e-0d1ad7bc6af8", + "action": "replace" + } + ] + }, + { + "repo": "railiance-infra", + "path": "/home/worsch/railiance-infra", + "planned_head_sha": "84dfdc4dc91b7a413ddc9ae82f5d363a97f31e4b", + "source_fingerprint": "d931602ba4619957df95df3ae9d0251f24d88a043211ffe2edb6e3a3f348b172", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-infra", + "path": "workplans/RAIL-HO-WP-0010-new-reef-ports-need-a-grant.md", + "kind": "workplan", + "record_id": "RAIL-HO-WP-0010", + "current_uuid": "9eed7d88-27a5-4fbe-b405-2a40aae832f3", + "derived_uuid": "226e81e2-2bed-5d3b-869f-0cec7940719c", + "action": "replace" + }, + { + "repo": "railiance-infra", + "path": "workplans/RAIL-HO-WP-0010-new-reef-ports-need-a-grant.md", + "kind": "task", + "record_id": "RAIL-HO-WP-0010-T01", + "current_uuid": "f4cc01f8-5b5e-4693-b389-9bd81e26a799", + "derived_uuid": "7935c941-269a-5827-a139-1b02c6b649f6", + "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": "c54de0f3d004dfd517f0ed0316ec6da840956d61", + "source_fingerprint": "fb5b804f7a028c69427c3ed2ed4fdd3c9ecb6b74715bb30e827aaa1e42f20502", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0022-agent-high-risk-boundary-coverage.md", + "kind": "workplan", + "record_id": "RAILIANCE-WP-0022", + "current_uuid": "b4701216-b235-48d1-a527-b52b8fb7e6fc", + "derived_uuid": "a7977cbf-ab43-56b7-b7a9-ceb52382b341", + "action": "replace" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0022-agent-high-risk-boundary-coverage.md", + "kind": "task", + "record_id": "RAILIANCE-WP-0022-T05", + "current_uuid": "47aa5ed9-95c5-4a23-a460-e4bbd3ed6f65", + "derived_uuid": "6f034ee3-bbf0-5cbb-bbd2-bb5e9eea6d5d", + "action": "replace" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0023-hub-core-candidate-credential-lanes.md", + "kind": "workplan", + "record_id": "RAILIANCE-WP-0023", + "current_uuid": "d2adc2d4-6461-4f7b-affc-7248fea49e60", + "derived_uuid": "ec52fbe6-571b-570e-884b-c7a32ff7bcc8", + "action": "replace" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0023-hub-core-candidate-credential-lanes.md", + "kind": "task", + "record_id": "RAILIANCE-WP-0023-T02", + "current_uuid": "d15f82db-f1ba-467a-bb69-86eb7c314016", + "derived_uuid": "c6e180b5-b3e6-500f-8d28-449092780946", + "action": "replace" + } + ] + }, + { + "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-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": "5dc2f3cdf66318e3814d1bb667cc9f8f108ab4d7", + "source_fingerprint": "d64ebac83d52c784ca174db71cab24998070bee93f16ede572e1cc61d6698b58", + "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": "7ddb5421-d960-4a3c-94b1-40b6c96abfab", + "derived_uuid": "6dcf854e-9229-569d-90f0-2d9df235a61d", + "action": "replace" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T12", + "current_uuid": "7b4edf5b-c1a1-4ef3-ab17-95487b9b19c8", + "derived_uuid": "0d69713d-0596-5415-b40c-8f5035641541", + "action": "replace" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T02", + "current_uuid": "8e679ddb-9845-457f-8672-1fd4b7455e7b", + "derived_uuid": "7892ca86-bd89-537e-9361-d648dff8e4b2", + "action": "replace" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T04", + "current_uuid": "503a23a9-ede1-4cf1-bd32-e9669b84ce58", + "derived_uuid": "3fd25c8f-25ea-566e-91c7-ac5ccba83009", + "action": "replace" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T05", + "current_uuid": "3946d1fc-2137-4d7b-a400-29b447ca83de", + "derived_uuid": "f2634e3a-b32e-5862-85bf-78437fc976dc", + "action": "replace" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T07", + "current_uuid": "70f83359-0b61-4dc0-83b0-33f289b64e83", + "derived_uuid": "e3c2a791-f632-59f3-9929-b179e45c77d0", + "action": "replace" + } + ] + }, + { + "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": "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": "81861d816bec95212edd843341f663a75c6aa867", + "source_fingerprint": "14ba1e8ff89ad8f1e659565254909958c41068c7a240dd57029a35cb5cd1f41d", + "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": "beab2a04d1835b8ad9836a3db72a6743da6653db", + "source_fingerprint": "040460e8c099a904bcf6ab72985d670359e3c893e618e28ec7c2a525143bd0c5", + "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-T04", + "current_uuid": "a2afc0f5-3ece-410c-864c-829a8aac30fc", + "derived_uuid": "3956bdad-14cd-5b60-91b5-9a27ac4ab745", + "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": "e8a569f2e609c45996989e445c46b445b97f3a81", + "source_fingerprint": "6e87041338f8e2b6b956d23f9aed81e6d0c1c825078afb1e1e59b8cf9bb2bd04", + "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-T01", + "current_uuid": "ea74316e-b711-4888-9b38-553ebc9ad856", + "derived_uuid": "297b714c-4aac-5d63-a56f-f3cf83ef038c", + "action": "replace" + }, + { + "repo": "zone-engine", + "path": "workplans/ZONE-WP-0001-security-zone-model.md", + "kind": "task", + "record_id": "ZONE-WP-0001-T03", + "current_uuid": "7f47b750-1ae4-467d-b3c4-064f4ec07dbd", + "derived_uuid": "6896ee26-7abd-5c0a-ba00-076aa9d05874", + "action": "replace" + }, + { + "repo": "zone-engine", + "path": "workplans/ZONE-WP-0001-security-zone-model.md", + "kind": "task", + "record_id": "ZONE-WP-0001-T04", + "current_uuid": "1c542ca5-2b82-4778-a3e4-c76e932423c9", + "derived_uuid": "8808346a-6293-59be-9336-67e1c896f198", + "action": "replace" + }, + { + "repo": "zone-engine", + "path": "workplans/ZONE-WP-0001-security-zone-model.md", + "kind": "task", + "record_id": "ZONE-WP-0001-T05", + "current_uuid": "f4556ca0-cb26-46ed-9351-d00270bd2309", + "derived_uuid": "911fbcf1-d330-53e6-8874-cff320b5fc3a", + "action": "replace" + }, + { + "repo": "zone-engine", + "path": "workplans/ZONE-WP-0001-security-zone-model.md", + "kind": "task", + "record_id": "ZONE-WP-0001-T06", + "current_uuid": "8a000c18-6ee7-4328-99c7-53c490435316", + "derived_uuid": "1957437b-223f-5f63-961a-c9256690746f", + "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": "98a7d876d49fbec9c062f970c18e25750da4cd4b5c89ab0d4ed24d50183abbda" +} diff --git a/docs/work-record-uuid-derivation_v1.md b/docs/work-record-uuid-derivation_v1.md index c54bd19..60967b0 100644 --- a/docs/work-record-uuid-derivation_v1.md +++ b/docs/work-record-uuid-derivation_v1.md @@ -25,10 +25,12 @@ fixed value above rather than recomputing it. Fleet namespace names are lowercase DNS-label style. Canonical identifiers are `PREFIX-WP-NNNN` or `PREFIX-WP-NNNN-TNN`. -The repository is not a namespace. Under the current N1 posture, the fleet must -declare one shared namespace name before activation. A future fork uses its own -namespace name and therefore derives different UUIDs for the same unqualified -identifier, as required by ADR-011. +The repository is not a namespace. The fleet owner declared the current shared +namespace as **`helixforge`** on 2026-08-21; the versioned declaration is +`config/fleet-namespace.yaml`. This raises the namespace posture from implied +N1 to declared N2. A future fork uses its own namespace name and therefore +derives different UUIDs for the same unqualified identifier, as required by +ADR-011. Only proposed, ready, active, blocked, or backlog workplans and their unfinished tasks enter the live derivation set. Finished and archived history retains its @@ -37,10 +39,10 @@ the live-collision preflight. Any duplicate is a hard refusal; it is never silently disambiguated with a repository slug. ```bash -rmgr identifier derive --namespace --record-id RMGR-WP-0005 +rmgr identifier derive --record-id RMGR-WP-0005 rmgr identifier preflight --root /path/to/fleet -rmgr identifier migration-plan --root /path/to/fleet \ - --namespace --output uuid-migration.json +rmgr identifier migration-plan --root /path/to/fleet --output uuid-migration.json +rmgr identifier migration-verify --plan uuid-migration.json ``` `migration-plan` is non-mutating. Its versioned JSON output preserves every @@ -49,7 +51,12 @@ unit. A collision or malformed live identifier makes that whole repository ineligible while leaving unaffected repositories visible in the plan. Existing output files are not replaced unless `--force` is explicit. +Plans carry a canonical UTC creation time, SHA-256 integrity seal, and per-repo +Git HEAD/source fingerprints. `migration-verify` rejects a modified plan, a +namespace mismatch, an ineligible repository, or any source/HEAD change after +planning. A new plan is required after any such drift. + Activation and applying a bulk migration remain separate governed steps. Publishing or planning this function does not retroactively rewrite existing -identifiers. The caller must supply the namespace explicitly until the current -fleet namespace is declared by the namespace owner under ADR-011. +identifiers. `--namespace` remains an explicit override for a foreign/forked +fleet; omitting it uses the checked-in `helixforge` declaration. diff --git a/src/repo_manager/cli.py b/src/repo_manager/cli.py index d32acf5..b6ba86a 100644 --- a/src/repo_manager/cli.py +++ b/src/repo_manager/cli.py @@ -282,7 +282,7 @@ def main(argv: list[str] | None = None) -> int: p_identifier = sub.add_parser("identifier", help="Deterministic work-record identifiers") identifier_sub = p_identifier.add_subparsers(dest="identifier_command") p_id_derive = identifier_sub.add_parser("derive", help="Derive one UUIDv5") - p_id_derive.add_argument("--namespace", required=True) + p_id_derive.add_argument("--namespace", default=None, help="Override declared fleet namespace") p_id_derive.add_argument("--record-id", required=True) p_id_preflight = identifier_sub.add_parser("preflight", help="Scan live identifier collisions") p_id_preflight.add_argument("--root", default=".") @@ -291,9 +291,14 @@ def main(argv: list[str] | None = None) -> int: help="Emit a non-mutating, per-repository old-to-derived UUID plan", ) p_id_plan.add_argument("--root", default=".") - p_id_plan.add_argument("--namespace", required=True) + p_id_plan.add_argument("--namespace", default=None, help="Override declared fleet namespace") p_id_plan.add_argument("--output", default=None, help="Write the provenance mapping as JSON") p_id_plan.add_argument("--force", action="store_true", help="Replace an existing --output file") + p_id_verify = identifier_sub.add_parser( + "migration-verify", + help="Verify a sealed migration plan against current repository sources", + ) + p_id_verify.add_argument("--plan", required=True) p_sbom = sub.add_parser("sbom", help="Derive SBOM snapshots and licence reports from repository files") sbom_sub = p_sbom.add_subparsers(dest="sbom_command") @@ -616,27 +621,40 @@ def main(argv: list[str] | None = None) -> int: return 2 from repo_manager.identifiers import ( derive_work_record_uuid, + load_fleet_namespace, plan_identifier_migration, scan_live_identifier_collisions, + verify_identifier_migration_plan, ) + namespace = getattr(args, "namespace", None) or load_fleet_namespace() + if args.identifier_command == "derive": try: - derived = derive_work_record_uuid(args.namespace, args.record_id) + derived = derive_work_record_uuid(namespace, args.record_id) except ValueError as exc: print(json.dumps({"ok": False, "error": str(exc)}, indent=2)) return 1 result = { "ok": True, - "namespace": args.namespace, + "namespace": namespace, "record_id": args.record_id, "uuid": str(derived), } elif args.identifier_command == "preflight": result = scan_live_identifier_collisions(Path(args.root)) + elif args.identifier_command == "migration-verify": + 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 = verify_identifier_migration_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), args.namespace) + result = plan_identifier_migration(Path(args.root), namespace) except ValueError as exc: print(json.dumps({"ok": False, "error": str(exc)}, indent=2)) return 1 diff --git a/src/repo_manager/identifiers.py b/src/repo_manager/identifiers.py index 9781dda..c15a8e8 100644 --- a/src/repo_manager/identifiers.py +++ b/src/repo_manager/identifiers.py @@ -2,22 +2,41 @@ from __future__ import annotations +import hashlib +import json import re import uuid from collections import defaultdict from pathlib import Path from typing import Any +import yaml + +from repo_manager.cache import source_fingerprint +from repo_manager.gitops import head_sha from repo_manager.parse.workplan import iter_workplan_files, parse_workplan_file from repo_manager.prefix_registry import iter_repo_roots +from repo_manager.time import utc_now_text DERIVATION_NAMESPACE_UUID = uuid.UUID("a4058507-5c4a-5a00-ab06-fffa4fb46009") DERIVATION_VERSION = "repo-manager.work-record-uuid.v1" +FLEET_NAMESPACE_SCHEMA = "repo-manager.fleet-namespace.v1" +DEFAULT_NAMESPACE_CONTRACT = Path(__file__).resolve().parents[2] / "config" / "fleet-namespace.yaml" LIVE_WORKPLAN_STATUSES = frozenset({"proposed", "ready", "active", "blocked", "backlog"}) _NAMESPACE_RE = re.compile(r"^[a-z0-9][a-z0-9.-]{0,62}$") _RECORD_ID_RE = re.compile(r"^[A-Z][A-Z0-9-]*-WP-[0-9]{4}(?:-T[0-9]{2,})?$") +def load_fleet_namespace(path: Path = DEFAULT_NAMESPACE_CONTRACT) -> str: + data = yaml.safe_load(path.read_text(encoding="utf-8")) or {} + if not isinstance(data, dict) or data.get("schema") != FLEET_NAMESPACE_SCHEMA: + raise ValueError(f"unsupported fleet namespace contract: {path}") + namespace = str(data.get("namespace") or "").strip() + if not _NAMESPACE_RE.fullmatch(namespace): + raise ValueError(f"invalid fleet namespace in contract: {path}") + return namespace + + def derivation_name(namespace: str, identifier: str) -> str: """Return the exact UTF-8 UUIDv5 name input defined by contract v1.""" namespace = namespace.strip() @@ -110,6 +129,7 @@ def plan_identifier_migration(root: Path, namespace: str) -> dict[str, Any]: totals = {"repositories": 0, "eligible": 0, "skipped": 0, "records": 0, "replace": 0, "assign": 0, "unchanged": 0} for repo in iter_repo_roots(root): + fingerprint, _source_files = source_fingerprint(repo) mappings: list[dict[str, str | None]] = [] blockers: list[dict[str, str]] = [] for path in iter_workplan_files(repo): @@ -164,6 +184,8 @@ def plan_identifier_migration(root: Path, namespace: str) -> dict[str, Any]: { "repo": repo.name, "path": str(repo), + "planned_head_sha": head_sha(repo), + "source_fingerprint": fingerprint, "eligible": eligible, "atomic_unit": True, "blockers": blockers, @@ -176,7 +198,7 @@ def plan_identifier_migration(root: Path, namespace: str) -> dict[str, Any]: for mapping in mappings: totals[str(mapping["action"])] += 1 - return { + report = { "schema": "repo-manager.identifier-migration-plan.v1", "ok": totals["skipped"] == 0, "ready_to_apply": totals["skipped"] == 0, @@ -186,6 +208,66 @@ def plan_identifier_migration(root: Path, namespace: str) -> dict[str, Any]: "namespace_uuid": str(DERIVATION_NAMESPACE_UUID), "scope": "live workplans and unfinished tasks", "apply_policy": "all-or-nothing per repository", + "generated_at": utc_now_text(), "totals": totals, "repositories": repositories, } + canonical = json.dumps(report, sort_keys=True, separators=(",", ":")).encode("utf-8") + report["plan_sha256"] = hashlib.sha256(canonical).hexdigest() + return report + + +def verify_identifier_migration_plan(plan: dict[str, Any]) -> dict[str, Any]: + """Verify a saved plan against its seal and current repository sources.""" + errors: list[dict[str, str]] = [] + if plan.get("schema") != "repo-manager.identifier-migration-plan.v1": + errors.append({"scope": "plan", "reason": "unsupported schema"}) + expected_seal = plan.get("plan_sha256") + unsealed = {key: value for key, value in plan.items() if key != "plan_sha256"} + canonical = json.dumps(unsealed, sort_keys=True, separators=(",", ":")).encode("utf-8") + actual_seal = hashlib.sha256(canonical).hexdigest() + if expected_seal != actual_seal: + errors.append({"scope": "plan", "reason": "plan SHA-256 mismatch"}) + try: + declared_namespace = load_fleet_namespace() + except (OSError, ValueError) as exc: + errors.append({"scope": "namespace", "reason": str(exc)}) + declared_namespace = None + if plan.get("namespace") != declared_namespace: + errors.append( + { + "scope": "namespace", + "reason": f"plan={plan.get('namespace')!r}, declared={declared_namespace!r}", + } + ) + if not plan.get("ready_to_apply"): + errors.append({"scope": "plan", "reason": "plan is not ready_to_apply"}) + + checked_repositories = 0 + for repository in plan.get("repositories") or []: + repo = Path(str(repository.get("path") or "")) + scope = str(repository.get("repo") or repo.name or "repository") + if not repository.get("eligible"): + errors.append({"scope": scope, "reason": "repository is ineligible"}) + continue + if not repo.is_dir(): + errors.append({"scope": scope, "reason": f"repository path is missing: {repo}"}) + continue + checked_repositories += 1 + if head_sha(repo) != repository.get("planned_head_sha"): + errors.append({"scope": scope, "reason": "Git HEAD changed after planning"}) + current_fingerprint, _source_files = source_fingerprint(repo) + if current_fingerprint != repository.get("source_fingerprint"): + errors.append({"scope": scope, "reason": "authoritative source changed after planning"}) + + return { + "schema": "repo-manager.identifier-migration-verification.v1", + "ok": not errors, + "namespace": plan.get("namespace"), + "plan_sha256": expected_seal, + "checked_repositories": checked_repositories, + "errors": errors, + "source_preconditions_satisfied": not errors, + "apply_authorized": False, + "remaining_gate": "transactional central-projection migration and rollback", + } diff --git a/tests/test_identifiers.py b/tests/test_identifiers.py index 202d013..8a26725 100644 --- a/tests/test_identifiers.py +++ b/tests/test_identifiers.py @@ -1,16 +1,23 @@ from __future__ import annotations +import subprocess from pathlib import Path import pytest from repo_manager.identifiers import ( derive_work_record_uuid, + load_fleet_namespace, plan_identifier_migration, scan_live_identifier_collisions, + verify_identifier_migration_plan, ) +def test_declared_fleet_namespace_is_helixforge() -> None: + assert load_fleet_namespace() == "helixforge" + + def _workplan(path: Path, identifier: str, status: str, task_status: str = "todo") -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text( @@ -80,6 +87,8 @@ def test_migration_plan_preserves_mapping_and_is_atomic_per_repo(tmp_path: Path) "ONE-WP-0001-T01", } assert all(item["current_uuid"] is None for item in one_plan["mappings"]) + assert len(report["plan_sha256"]) == 64 + assert report["generated_at"].endswith("Z") def test_migration_plan_skips_entire_repo_affected_by_collision(tmp_path: Path) -> None: @@ -97,3 +106,33 @@ def test_migration_plan_skips_entire_repo_affected_by_collision(tmp_path: Path) assert one_plan["eligible"] is False assert any(item["record_id"] == "ONE-WP-0002" for item in one_plan["mappings"]) assert any(item["reason"] == "live identifier collision" for item in one_plan["blockers"]) + + +def test_migration_verification_detects_tampering_and_source_drift(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, + ) + plan = plan_identifier_migration(tmp_path, "helixforge") + assert verify_identifier_migration_plan(plan)["ok"] is True + + path.write_text(path.read_text(encoding="utf-8") + "\nchanged\n", encoding="utf-8") + verification = verify_identifier_migration_plan(plan) + assert verification["ok"] is False + assert any( + error["reason"] == "authoritative source changed after planning" + for error in verification["errors"] + ) + + plan["namespace"] = "tampered" + assert any( + error["reason"] == "plan SHA-256 mismatch" + for error in verify_identifier_migration_plan(plan)["errors"] + ) diff --git a/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md b/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md index 69e14db..f5f3127 100644 --- a/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md +++ b/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md @@ -277,7 +277,7 @@ before then. ```task id: RMGR-WP-0005-T03 -status: progress +status: done priority: high state_hub_task_id: "28067729-498d-4f47-89bd-5b9718e999c7" ``` @@ -330,6 +330,14 @@ current fleet namespace boundary/name: ADR-011 intentionally leaves that an open governance question, so Repo Manager does not infer it from a hostname. No existing minted identifier was rewritten implicitly. +**Result (2026-08-21):** fleet owner Bernd Worsch declared `helixforge` as the +authoritative namespace. `config/fleet-namespace.yaml` records the decision, +root lineage, and accurate `N2 U1 R1 S1` posture with `N3 U2 R2 S1` target. +Identifier commands now use that declaration by default while retaining an +explicit override for foreign namespaces. The derivation contract, fixed UUID, +collision/unarchive guard, and independent reproduction test are all active; +bulk replacement remains the separately governed T04 operation. + ## Migrate the fleet ```task @@ -358,6 +366,20 @@ malformed live identifier. Applying those plans remains gated on the namespace declaration and a compatibility write path that updates file and central projection together. +**Progress (2026-08-21, namespace declared):** the `helixforge` fleet preflight +scanned 114 repository roots and found 242 live identifiers with zero +collisions. Fourteen non-canonical NetKingdom task ids were the sole initial +repository blocker and were normalized in commit `25ed928`. The regenerated, +SHA-256-sealed mapping is source-ready across 42/42 affected repositories: 209 +UUID replacements and 33 assignments, with per-repository HEAD/source +fingerprints verified by `rmgr identifier migration-verify`. + +Apply is still deliberately unauthorized. State Hub's workplan/task primary +keys are referenced by numerous foreign keys without `ON UPDATE CASCADE`; a +file-first or direct-PK rewrite would split the projection. Evidence and the +required transactional/alias/rollback contract are recorded in +`docs/evidence/RMGR-WP-0005-helixforge-migration-readiness-2026-08-21.md`. + ## Retire the interim rule ```task