From 055c6971ab4e5ffdcb422c27be98b586ea1881f9 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 22 Aug 2026 23:50:34 +0200 Subject: [PATCH] feat(identifiers): verify batch projections Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a023c0-a0a3-7c03-b395-5a0d2757214d --- ...5-adaptive-pricing-preflight-2026-08-22.md | 55 + ...R-WP-0005-batch-0005-adaptive-pricing.json | 182 ++ ...rge-uuid-migration-plan-2026-08-22-v4.json | 2388 +++++++++++++++++ docs/work-record-uuid-derivation_v1.md | 9 +- ...state-hub-sealed-projection-repair-v1.yaml | 62 + src/repo_manager/cli.py | 13 +- .../commands/registrar_reconcile.py | 11 +- src/repo_manager/identifiers.py | 96 +- tests/test_identifiers.py | 88 +- tests/test_registrar_reconcile.py | 48 + ...gistrar-consolidation-deterministic-ids.md | 21 + 11 files changed, 2964 insertions(+), 9 deletions(-) create mode 100644 docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing-preflight-2026-08-22.md create mode 100644 docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing.json create mode 100644 docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v4.json create mode 100644 interfaces/state-hub-sealed-projection-repair-v1.yaml diff --git a/docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing-preflight-2026-08-22.md b/docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing-preflight-2026-08-22.md new file mode 100644 index 0000000..801aada --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing-preflight-2026-08-22.md @@ -0,0 +1,55 @@ +# RMGR-WP-0005 batch 0005 projection preflight + +**Observed at:** `2026-08-22T21:46:30Z` + +**Scope:** `adaptive-pricing` only + +## Outcome + +Batch 0005 is source-ready but **not ready for approval**. No database or +repository identifier changed. + +The refreshed fleet plan is sealed as +`28cd01bdbc66c53ad5ef11b9821a74ebadd7c8cfdae4c227f37ce7f9d67cbf18`. +The adaptive-pricing unit is clean, synchronized with `origin/main`, and pinned +at `c65a2f1ff9a0b30700ee14818e36e931eb71cae3`. It contains five replacements: +`ADAPTIVE-WP-0010` and its four unfinished tasks. + +The projection-aware batch manifest is sealed as +`20decab5521ea5477826d1b2a9c9670912a96c4b8245faf5d270c8d1efc988c5`. +It records `ready_for_approval: false` and `apply_authorized: false`. + +## Projection evidence + +| Projection | Five current UUIDs | Five derived UUIDs | Result | +| --- | --- | --- | --- | +| Workstation `:8000` | HTTP 200 | HTTP 404 | ready | +| Production tunnel `:18000` | HTTP 404 | HTTP 404 | blocked | + +A governed `registrar-reconcile --repair-workplan ADAPTIVE-WP-0010` attempt +used clean source revision `c65a2f1...` and correlation id +`b708a73e-fc09-48ee-aa2d-ff8b3c642466`. State Hub retained the conservative +C-03 rule for the pre-derivation random UUID and did not create it. This is the +correct ordinary-consistency behavior, but it means the existing transactional +migration executor cannot run: that executor requires every old source row to +exist in the target repository projection. + +The attempt also exposed a Repo Manager result bug: a failed exact repair could +be labeled `applied` because an empty ordinary-registration set passed +verification vacuously. The wrapper now requires repair/bootstrap mode's own +exact projection proof and does not run ordinary requested-record verification +for an empty request. + +## Owner-ready resolution + +`helixforge.identifiers.state-hub-sealed-projection-repair.v1` offers State Hub +a bounded repair task. It preserves the default C-03 refusal and permits old-row +restoration only from one clean source revision plus one exact sealed migration +unit, with primary confirmation, atomicity, idempotency, and a receipt. Once +adopted, repeat this batch plan against both projections; only a new manifest +with all current lookups 200 and all derived lookups 404 may be proposed for +approval. + +The fleet scan found one other projection-complete candidate, `state-hub`, but +its checkout contains unrelated uncommitted owner evidence. The Git preflight +therefore excludes it until the owner publishes or dispositions that work. diff --git a/docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing.json b/docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing.json new file mode 100644 index 0000000..5b18e0c --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing.json @@ -0,0 +1,182 @@ +{ + "schema": "repo-manager.identifier-migration-batch.v1", + "ok": false, + "ready_for_approval": false, + "apply_authorized": false, + "approval_required": true, + "projection_api_bases": [ + "http://127.0.0.1:8000", + "http://127.0.0.1:18000" + ], + "namespace": "helixforge", + "source_plan_sha256": "28cd01bdbc66c53ad5ef11b9821a74ebadd7c8cfdae4c227f37ce7f9d67cbf18", + "batch_policy": "repository-atomic, sequential, stop on first failure", + "rollback_order": "reverse files if written, then reverse central projection", + "generated_at": "2026-08-22T21:45:54.917855Z", + "totals": { + "repositories": 1, + "records": 5, + "replace": 5, + "assign": 0, + "unchanged": 0 + }, + "repositories": [ + { + "repo": "adaptive-pricing", + "path": "/home/worsch/adaptive-pricing", + "planned_head_sha": "c65a2f1ff9a0b30700ee14818e36e931eb71cae3", + "source_fingerprint": "977e94daeb0a6955a3d4ba76393d0b273d285537d0789eb59350d5c283901887", + "source_verified": true, + "git_preflight": { + "ok": true, + "head_sha": "c65a2f1ff9a0b30700ee14818e36e931eb71cae3", + "expected_head_sha": "c65a2f1ff9a0b30700ee14818e36e931eb71cae3", + "upstream": "origin/main", + "behind": 0, + "ahead": 0, + "origin": "forgejo-remote:coulomb/adaptive-pricing.git", + "errors": [] + }, + "projection_preflight": { + "required": true, + "ok": false, + "projections": [ + { + "api_base": "http://127.0.0.1:8000", + "ok": true, + "replacement_checks": [ + { + "record_id": "ADAPTIVE-WP-0010", + "kind": "workplan", + "current_status": 200, + "derived_status": 404, + "ok": true + }, + { + "record_id": "ADAPTIVE-WP-0010-T01", + "kind": "task", + "current_status": 200, + "derived_status": 404, + "ok": true + }, + { + "record_id": "ADAPTIVE-WP-0010-T02", + "kind": "task", + "current_status": 200, + "derived_status": 404, + "ok": true + }, + { + "record_id": "ADAPTIVE-WP-0010-T03", + "kind": "task", + "current_status": 200, + "derived_status": 404, + "ok": true + }, + { + "record_id": "ADAPTIVE-WP-0010-T04", + "kind": "task", + "current_status": 200, + "derived_status": 404, + "ok": true + } + ] + }, + { + "api_base": "http://127.0.0.1:18000", + "ok": false, + "replacement_checks": [ + { + "record_id": "ADAPTIVE-WP-0010", + "kind": "workplan", + "current_status": 404, + "derived_status": 404, + "ok": false + }, + { + "record_id": "ADAPTIVE-WP-0010-T01", + "kind": "task", + "current_status": 404, + "derived_status": 404, + "ok": false + }, + { + "record_id": "ADAPTIVE-WP-0010-T02", + "kind": "task", + "current_status": 404, + "derived_status": 404, + "ok": false + }, + { + "record_id": "ADAPTIVE-WP-0010-T03", + "kind": "task", + "current_status": 404, + "derived_status": 404, + "ok": false + }, + { + "record_id": "ADAPTIVE-WP-0010-T04", + "kind": "task", + "current_status": 404, + "derived_status": 404, + "ok": false + } + ] + } + ], + "errors": [ + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T01", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T02", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T03", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T04", + "reason": "projection requires current UUID=200 and derived UUID=404" + } + ] + }, + "mapping_counts": { + "records": 5, + "replace": 5, + "assign": 0, + "unchanged": 0 + }, + "ready": false + } + ], + "errors": [ + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T01", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T02", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T03", + "reason": "projection requires current UUID=200 and derived UUID=404" + }, + { + "scope": "http://127.0.0.1:18000:ADAPTIVE-WP-0010-T04", + "reason": "projection requires current UUID=200 and derived UUID=404" + } + ], + "batch_sha256": "20decab5521ea5477826d1b2a9c9670912a96c4b8245faf5d270c8d1efc988c5" +} diff --git a/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v4.json b/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v4.json new file mode 100644 index 0000000..3327664 --- /dev/null +++ b/docs/evidence/RMGR-WP-0005-helixforge-uuid-migration-plan-2026-08-22-v4.json @@ -0,0 +1,2388 @@ +{ + "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-22T21:35:25.445356Z", + "totals": { + "repositories": 39, + "eligible": 39, + "skipped": 0, + "records": 215, + "replace": 152, + "assign": 24, + "unchanged": 39 + }, + "repositories": [ + { + "repo": "activity-core", + "path": "/home/worsch/activity-core", + "planned_head_sha": "04c0535a61a4629b0116b775345a5e77784b86b8", + "source_fingerprint": "a22f724f8c34203e050f719c10d6365f2411594be85bbab03e7996360d1145e0", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md", + "kind": "workplan", + "record_id": "ACTIVITY-WP-0031", + "current_uuid": "93b37937-a29b-505e-adc2-390980cd8ceb", + "derived_uuid": "93b37937-a29b-505e-adc2-390980cd8ceb", + "action": "unchanged" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0031-T01", + "current_uuid": "d84116ae-8219-569a-8d7b-e4eb83c192c3", + "derived_uuid": "d84116ae-8219-569a-8d7b-e4eb83c192c3", + "action": "unchanged" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0031-T05", + "current_uuid": "a7eb3615-dd11-54c9-80ec-a147d100f8b7", + "derived_uuid": "a7eb3615-dd11-54c9-80ec-a147d100f8b7", + "action": "unchanged" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md", + "kind": "workplan", + "record_id": "ACTIVITY-WP-0032", + "current_uuid": "256dad13-28b4-5361-ab8a-7d1373a5d14b", + "derived_uuid": "256dad13-28b4-5361-ab8a-7d1373a5d14b", + "action": "unchanged" + }, + { + "repo": "activity-core", + "path": "workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md", + "kind": "task", + "record_id": "ACTIVITY-WP-0032-T05", + "current_uuid": "e71423f9-8baf-566b-8a70-eec195e2f65f", + "derived_uuid": "e71423f9-8baf-566b-8a70-eec195e2f65f", + "action": "unchanged" + } + ] + }, + { + "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": "ea2e7499eb7e8c0a1459a18bc0a44706be7f300f", + "source_fingerprint": "f9e45ff633aea0172144fef848aea1af15415f74a7e55def3e6bb0692b5fa1db", + "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": "00a7bc46090ceb71dc23fef0530629f18398d3b1", + "source_fingerprint": "80e805631bf3d61a9bafc2e01798efa4739f750b99edfea022c2fdcfae189b37", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "workplan", + "record_id": "FLEX-WP-0012", + "current_uuid": "89ecdb1f-ceb0-4a50-b72d-c3dfd5fa7c73", + "derived_uuid": "2a6b5764-1831-5305-b46e-0991d02675df", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T01", + "current_uuid": "a1c9ba0c-3413-4823-9f9e-ccee09cf5d74", + "derived_uuid": "f8491771-be1a-5c70-a4aa-059e48536630", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T02", + "current_uuid": "7e9c4e59-e59c-4617-a87f-99142952fe78", + "derived_uuid": "685f3d70-7c50-5664-95ae-1e8c93b14073", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T03", + "current_uuid": "3335b2b7-cf1a-411d-95b3-03c4b4c35659", + "derived_uuid": "045ec743-4411-5b42-b9e8-df25b0c07984", + "action": "replace" + }, + { + "repo": "flex-auth", + "path": "workplans/FLEX-WP-0012-credential-grant-authorization-surface.md", + "kind": "task", + "record_id": "FLEX-WP-0012-T04", + "current_uuid": "40015a87-040c-4d48-b360-fd5566dbc552", + "derived_uuid": "0dcf2e1f-baa2-5fea-9e3e-9a73795af11f", + "action": "replace" + } + ] + }, + { + "repo": "glas-harness", + "path": "/home/worsch/glas-harness", + "planned_head_sha": "3cb53ab310d0eed03bf866a91f25877c6149b403", + "source_fingerprint": "772efdca590be2b2d13ef25c38c0722a9c346a5fe87d68d36782150ce572e469", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "glas-harness", + "path": "workplans/GLAS-WP-0005-sandbox-boundary-runtime-hardening.md", + "kind": "workplan", + "record_id": "GLAS-WP-0005", + "current_uuid": null, + "derived_uuid": "c8049700-73ca-549a-b250-1020de1cddc5", + "action": "assign" + }, + { + "repo": "glas-harness", + "path": "workplans/GLAS-WP-0005-sandbox-boundary-runtime-hardening.md", + "kind": "task", + "record_id": "GLAS-WP-0005-T05", + "current_uuid": null, + "derived_uuid": "a4be4d68-b0af-5273-978a-367bba414f0c", + "action": "assign" + } + ] + }, + { + "repo": "hub-core", + "path": "/home/worsch/hub-core", + "planned_head_sha": "1b3eb3943697574ad0bcc67ee05a4b4135bce7e8", + "source_fingerprint": "55ba9964dcf97b3c980a15ede7d72d366b36d495ce3ae41c9fd7e20f206e2cca", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "hub-core", + "path": "workplans/HUB-WP-0006-repository-classification-navigation.md", + "kind": "workplan", + "record_id": "HUB-WP-0006", + "current_uuid": "c5abf6a3-0ea9-43b8-8757-179829dd8a9c", + "derived_uuid": "05ebd06e-4af8-5f6c-918c-c143c1520e00", + "action": "replace" + }, + { + "repo": "hub-core", + "path": "workplans/HUB-WP-0006-repository-classification-navigation.md", + "kind": "task", + "record_id": "HUB-WP-0006-T06", + "current_uuid": "5c6f3006-b1c7-422b-ad38-8727ae4dc7c2", + "derived_uuid": "7c8225f7-03dc-57b0-a668-c3d781bd828a", + "action": "replace" + } + ] + }, + { + "repo": "issue-core", + "path": "/home/worsch/issue-core", + "planned_head_sha": "216a5087604f341e333a5ffe50f439158dbf56e0", + "source_fingerprint": "498adea6c71e227aa8dfb9ad50e47beefd9daf44de9b4271d73830a3482b6ea7", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "workplan", + "record_id": "ISSUE-WP-0006", + "current_uuid": "0b75b7ae-c8e3-4737-8fa8-2f60a12e6d14", + "derived_uuid": "4d465264-cbe1-56ba-84ed-bd580b649b76", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T01", + "current_uuid": "e2148c3f-fe46-4397-af23-dda7eab5534e", + "derived_uuid": "927eee42-e22d-5c0d-a4f8-dcd36c53c8e9", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T02", + "current_uuid": "78247ad9-65fb-4966-96ec-0a0c70620b0e", + "derived_uuid": "a1d69a48-833b-5e5e-8286-14f5aba627f3", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T03", + "current_uuid": "41bd7596-62cb-475b-8ad0-648066ffd8b8", + "derived_uuid": "75eef8a3-abd7-50dd-9171-3488fda84da5", + "action": "replace" + }, + { + "repo": "issue-core", + "path": "workplans/ISSUE-WP-0006-forgejo-only-projection-boundary.md", + "kind": "task", + "record_id": "ISSUE-WP-0006-T04", + "current_uuid": "8f217196-ab3e-4443-b0c8-c670cf9c33f5", + "derived_uuid": "5be0bce4-1816-599f-a98b-4fa1565a8b0e", + "action": "replace" + } + ] + }, + { + "repo": "markitect-main", + "path": "/home/worsch/markitect-main", + "planned_head_sha": "e26bd8b7eb8531be222edf42ba0604b1b05250e3", + "source_fingerprint": "4e51abd39647f5234db38ecaf07013348f8edd4bb657a65b398b72394863779b", + "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": "e03ef262-5284-5dd3-92d2-dbd85c6b6159", + "derived_uuid": "e03ef262-5284-5dd3-92d2-dbd85c6b6159", + "action": "unchanged" + }, + { + "repo": "markitect-main", + "path": "workplans/MARKITECT-WP-0002-testdrive-jsui-publication.md", + "kind": "task", + "record_id": "MARKITECT-WP-0002-T01", + "current_uuid": "1852eca1-92e2-518e-bb21-9dffbeb32a4f", + "derived_uuid": "1852eca1-92e2-518e-bb21-9dffbeb32a4f", + "action": "unchanged" + } + ] + }, + { + "repo": "net-kingdom", + "path": "/home/worsch/net-kingdom", + "planned_head_sha": "104d5c684c8758d135635b417775d6527c0bf85f", + "source_fingerprint": "e07be2dd9671054df1702ffb99ebd6f23b0c55c6f42775beba95c0c0b3e241bf", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "workplan", + "record_id": "NK-WP-0009", + "current_uuid": "66c9f1e9-6b2f-454b-a6d4-04e5fe42385a", + "derived_uuid": "d4d02dbf-3974-502d-8b87-b776fc63e17e", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T01", + "current_uuid": "79150b07-f25d-4407-a118-e08b6e588d37", + "derived_uuid": "3c6824a0-39e6-51f5-b46f-5861a9375439", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T02", + "current_uuid": "07647ba6-90e1-4569-947a-ebccce7a2d5e", + "derived_uuid": "d13760fd-2527-5a39-acb1-11c8091d65a1", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T03", + "current_uuid": "0f34eda3-f1f3-4c49-9eba-36167b6c5ea9", + "derived_uuid": "16cf51a4-0763-59e9-9b4c-d486f5bde908", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T04", + "current_uuid": "3c17d1ac-3232-43b4-b541-ea6538da2afb", + "derived_uuid": "1d28e3f1-fb39-5d0e-a7ee-ce2e9bc16ed5", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T05", + "current_uuid": "aff82173-0b8e-4216-855a-887ac68b63e0", + "derived_uuid": "c380ef19-4bc2-5ade-b127-baf18c64bf35", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0009-netkingdom-security-pattern-tutorials.md", + "kind": "task", + "record_id": "NK-WP-0009-T06", + "current_uuid": "df427aa3-233f-4479-aed9-706676f8e87d", + "derived_uuid": "5b6a1670-a283-56e9-892e-ef8b91194a7b", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "workplan", + "record_id": "NK-WP-0011", + "current_uuid": "a44beef8-c18b-4ae7-b7fe-a178cc4fcdf0", + "derived_uuid": "1075448f-d533-5f9e-94b7-c3adfe151a07", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T01", + "current_uuid": "934f9223-2b6f-4d01-b49b-406b5b98b6e4", + "derived_uuid": "a5807808-fb34-50de-8f67-9128011833d4", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T02", + "current_uuid": "7b514cda-41b3-492f-8731-5a131422059d", + "derived_uuid": "2fe6f100-3a5d-563e-b033-7d7b846ae487", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T03", + "current_uuid": "8c29602e-ab9b-446a-8fee-5e2d8fbcb100", + "derived_uuid": "32d1411b-10a4-5a8b-8f43-99ac46d83908", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T04", + "current_uuid": "d62d7683-24b1-458c-9fd6-96e576b52a64", + "derived_uuid": "6697a994-7343-5ea8-8b37-bc3b921e5a9b", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T05", + "current_uuid": "85319768-5d81-460d-89dc-8de76b63e0dc", + "derived_uuid": "d845380d-3dbc-5e59-8f2b-5a4d1b32d89d", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T06", + "current_uuid": "53801dc2-7bdb-4fa3-9fa0-c1450ef1003b", + "derived_uuid": "9cb7fd93-c16e-5102-83ce-195b3aa87446", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T07", + "current_uuid": "981f79bd-63ee-4da0-8d7d-9af8e468715e", + "derived_uuid": "38998c68-29bf-50d2-8c8d-0c75184d5833", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0011-enterprise-federation-saml.md", + "kind": "task", + "record_id": "NK-WP-0011-T08", + "current_uuid": "13634760-7817-40c0-b7db-5e0f4196dbf0", + "derived_uuid": "e5f44ddc-9645-5f61-b84c-da5ab9cccb6d", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0022-railiance01-identity-cutover-and-coulombcore-retirement.md", + "kind": "workplan", + "record_id": "NK-WP-0022", + "current_uuid": "3dadddeb-4cec-48e2-9c2c-788b26dd6e93", + "derived_uuid": "d76ddccc-00c8-548a-b141-2cd660fa38da", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0022-railiance01-identity-cutover-and-coulombcore-retirement.md", + "kind": "task", + "record_id": "NK-WP-0022-T08", + "current_uuid": "9f209f15-64a9-4324-bfa9-3ff21c52fc19", + "derived_uuid": "42a3b4c0-3481-5cfa-bdc2-66d05e751829", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "workplan", + "record_id": "NK-WP-0027", + "current_uuid": "a30a33e4-f980-4934-9efb-d61a75e6ae81", + "derived_uuid": "965ad365-6b81-50a1-a2a3-2d0c1fcce0b4", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "task", + "record_id": "NK-WP-0027-T02", + "current_uuid": "601a0c5f-3f77-419f-9731-25e247424b31", + "derived_uuid": "5b35b646-a525-55da-852a-6005613d42ea", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "task", + "record_id": "NK-WP-0027-T03", + "current_uuid": "b53bfb83-1df9-4548-a62f-628cb55ece4d", + "derived_uuid": "e3f0bb0f-0c85-5cb9-a5ab-75f668cd3447", + "action": "replace" + }, + { + "repo": "net-kingdom", + "path": "workplans/NK-WP-0027-reef-placement-reconciliation.md", + "kind": "task", + "record_id": "NK-WP-0027-T06", + "current_uuid": "bf8b3e1d-7ee0-5ad0-8705-5a580a9fb546", + "derived_uuid": "bf8b3e1d-7ee0-5ad0-8705-5a580a9fb546", + "action": "unchanged" + } + ] + }, + { + "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": "cdb44a8f23abf5ddd7927272b851a4d01b94bfbb", + "source_fingerprint": "bd17b7cac4f1412052626182599c85a89a59f3af8369d36afe4825db3382ab66", + "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-0027-credential-governance-lockdown.md", + "kind": "task", + "record_id": "WARDEN-WP-0027-T02", + "current_uuid": "9d004d8f-6215-4178-bd13-5785d24fd152", + "derived_uuid": "cae498ee-6307-5d32-9f1b-a471cfcc2536", + "action": "replace" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0033-native-lane-handoff.md", + "kind": "workplan", + "record_id": "WARDEN-WP-0033", + "current_uuid": "4627d89b-4b00-562a-81e9-76e96f90fa7e", + "derived_uuid": "4627d89b-4b00-562a-81e9-76e96f90fa7e", + "action": "unchanged" + }, + { + "repo": "ops-warden", + "path": "workplans/WARDEN-WP-0033-native-lane-handoff.md", + "kind": "task", + "record_id": "WARDEN-WP-0033-T04", + "current_uuid": "5acac140-a586-5db3-b231-bbf236710786", + "derived_uuid": "5acac140-a586-5db3-b231-bbf236710786", + "action": "unchanged" + } + ] + }, + { + "repo": "policy-nexus", + "path": "/home/worsch/policy-nexus", + "planned_head_sha": "32cea111ebfd8b686906a8e2ca1748bfe9955b45", + "source_fingerprint": "1a7488ae10d0f8234125b08ce91b0340ec36da26f7fd1d6dfc7afb881905b7dd", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md", + "kind": "workplan", + "record_id": "POLICY-NEXUS-WP-0002", + "current_uuid": null, + "derived_uuid": "cf780ff6-ccc1-58e5-aace-665ff9234f5c", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0002-T06", + "current_uuid": null, + "derived_uuid": "f4761eb6-ab53-5c02-8b7c-f301d3ca04fa", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0002-T07", + "current_uuid": null, + "derived_uuid": "4a07237f-715d-595a-9448-ae1e342ca633", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md", + "kind": "workplan", + "record_id": "POLICY-NEXUS-WP-0003", + "current_uuid": null, + "derived_uuid": "d1cfae73-460d-59f7-88c3-b251e563fb05", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0003-T06", + "current_uuid": null, + "derived_uuid": "a06165fe-dabd-58bb-a67a-50e97122a0cc", + "action": "assign" + }, + { + "repo": "policy-nexus", + "path": "workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md", + "kind": "task", + "record_id": "POLICY-NEXUS-WP-0003-T07", + "current_uuid": null, + "derived_uuid": "f752e1f3-881e-5c3e-bcd3-071283f7d40b", + "action": "assign" + } + ] + }, + { + "repo": "prj-canon-federation", + "path": "/home/worsch/prj-canon-federation", + "planned_head_sha": "2b6980bea9022bc16c5efa6ec87984842ae4d626", + "source_fingerprint": "f70680a4c532ed0b86bf8db1c964a42440a355b98a578fd81d746de0d045c64a", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "workplan", + "record_id": "CFED-WP-0001", + "current_uuid": "7a96da54-050d-4210-96f9-0bb411aaaec8", + "derived_uuid": "1c5615fc-03b7-5648-ba58-e828b8c0cb0f", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T02", + "current_uuid": "0ca7878c-f925-44f3-bf00-51b91fba0b3e", + "derived_uuid": "9c5ba080-e304-52cd-86d5-749a5a642387", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T03", + "current_uuid": "45cd377e-d6f1-4708-8fb4-a822b2930aed", + "derived_uuid": "57092ca3-e1a8-5469-83be-d0338a78c150", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T04", + "current_uuid": "743a2da9-56b3-4c3a-ba89-94a3525ce3b7", + "derived_uuid": "1be7aa81-4fc8-5a5a-8451-e288e660a326", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T05", + "current_uuid": "986a0ac6-12c2-4bae-a849-c23f1da10325", + "derived_uuid": "700a0c89-1b17-5993-a76e-7ef22b5847d9", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T06", + "current_uuid": "0a29bb3e-6460-4c4a-ba19-bcd2c38cd344", + "derived_uuid": "6bdb96c9-0524-5d3c-89e0-7c91df7ee56c", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T07", + "current_uuid": "776905c6-26a9-4754-b289-d9dd4d328fb5", + "derived_uuid": "26a96020-49bb-5a5e-97d1-c478b83bffd0", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T08", + "current_uuid": "3eee0510-cfa0-4571-a599-8654c3f01aa0", + "derived_uuid": "e0558c32-415f-5563-bca2-438b35fa6b53", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T09", + "current_uuid": "5d3e744e-b390-41e1-b7ca-caa4cf60664e", + "derived_uuid": "42ebf476-6a45-5e23-b507-eb90bc4f5c07", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T11", + "current_uuid": "4cff900d-aeb5-46ed-a59d-3aab5a2aa637", + "derived_uuid": "526843be-1dfa-5cd0-ba0c-123ea37d0f63", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T12", + "current_uuid": "8e238d89-da71-4126-b0a2-cca7f5eac657", + "derived_uuid": "f82385e9-5735-5147-aab6-d86653f33e26", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T13", + "current_uuid": "d87513dc-8bcf-470e-be3c-cb78f053e0a3", + "derived_uuid": "b6d097a3-1abc-584b-ab23-7a05c969670d", + "action": "replace" + }, + { + "repo": "prj-canon-federation", + "path": "workplans/CFED-WP-0001-foundation.md", + "kind": "task", + "record_id": "CFED-WP-0001-T10", + "current_uuid": "f89a08fe-c6ba-4f81-a063-6f49727eae2d", + "derived_uuid": "2faeb8fb-58cc-5ea8-b5a8-ea0ed9583b30", + "action": "replace" + } + ] + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "/home/worsch/prj-forgejo-org-refactor", + "planned_head_sha": "847ee07c5c0ae791d53ec8d00107e6b1b16717cc", + "source_fingerprint": "e8cdbeabb5f6b285569bf3d9cb2a02399f695ad54033b68a08127baf1aeae0e7", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "workplan", + "record_id": "ORGREF-WP-0001", + "current_uuid": "cfe053ed-4317-4977-b545-47fa997d6c77", + "derived_uuid": "c1dcd349-1a7a-51ae-8827-4ce96cfe0008", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T01", + "current_uuid": "c027b40f-f25a-403f-8d83-e29044bab20a", + "derived_uuid": "4964bf8f-96eb-59f0-8a50-5ecb5c7dbc8f", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T02", + "current_uuid": "90d6a61e-b715-4073-aa3e-e92340c78dc8", + "derived_uuid": "00d150ed-81dd-51ac-af7b-197900373cbe", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T03", + "current_uuid": "2e458360-3035-47e8-a0c5-33e2249ffaa0", + "derived_uuid": "4b57ef3f-2a7c-56ff-b19d-e751b0b4685d", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T04", + "current_uuid": "32030788-ed92-492f-920d-5b9a51663fc0", + "derived_uuid": "a55d95e2-6014-5d84-ba6e-b178c3901f3e", + "action": "replace" + }, + { + "repo": "prj-forgejo-org-refactor", + "path": "workplans/ORGREF-WP-0001-foundation-and-entry-gate.md", + "kind": "task", + "record_id": "ORGREF-WP-0001-T05", + "current_uuid": "4f5d510a-c52b-42d4-9a84-ecf432ce4866", + "derived_uuid": "3ad6090f-5aa9-5087-a670-37d7b2ffdb7c", + "action": "replace" + } + ] + }, + { + "repo": "prj-state-hub-retirement", + "path": "/home/worsch/prj-state-hub-retirement", + "planned_head_sha": "54f9706b294681964253e7991ff9876cf853cd7e", + "source_fingerprint": "9d355c3e663502c23d9b65292dd9d18b266be98ca9476af1513018c15f0dd3df", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "workplan", + "record_id": "SHR-WP-0002", + "current_uuid": "c94c3ba1-6c31-4989-a2eb-650726add747", + "derived_uuid": "53f42c0c-3a35-53b0-99c8-8eaee7b17354", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T01", + "current_uuid": "7bf75488-59c9-47ab-a2ff-6ae459dd1444", + "derived_uuid": "8c54ea9b-8a92-55bc-80ce-8425678f3efe", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T02", + "current_uuid": "d2dbe425-345f-46cf-af70-0ca4b69a336e", + "derived_uuid": "fdae9c55-5a85-5b11-91ed-0b724129d887", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T03", + "current_uuid": "3254b7d3-e319-44a6-ae63-23b0d080247a", + "derived_uuid": "06119690-312f-5d14-aee0-2fc4dac1e89e", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T04", + "current_uuid": "b2196340-fa22-4531-81a2-a34bc217d66c", + "derived_uuid": "3815d764-b484-5342-9c7d-2edacc02be13", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T05", + "current_uuid": "2b97a7c5-f877-4020-ba83-8eb00c3690e6", + "derived_uuid": "c2957182-4bb3-5aa9-9940-656956cfe52d", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T06", + "current_uuid": "9b390f80-1cbb-4485-a958-14b0e24a0b26", + "derived_uuid": "714ce904-bccd-5cd8-ae2e-a756f5c0bccc", + "action": "replace" + }, + { + "repo": "prj-state-hub-retirement", + "path": "workplans/SHR-WP-0002-predecessor-and-deployment-reality.md", + "kind": "task", + "record_id": "SHR-WP-0002-T07", + "current_uuid": "07636ddf-a26b-4760-8353-2532af9fd938", + "derived_uuid": "a89cf85d-d613-5434-92cb-11f850889b08", + "action": "replace" + } + ] + }, + { + "repo": "prj-unattended-progress-company", + "path": "/home/worsch/prj-unattended-progress-company", + "planned_head_sha": "7e547b3eb2b733d98a9085b36f7d82d84d69f04d", + "source_fingerprint": "5adadf8049df4dc8b7b2b43b751120bd1a71822acf1b50ad0a463af31514778b", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "workplan", + "record_id": "UPC-WP-0002", + "current_uuid": "b8f00a8a-646e-4a2e-861d-c96b43e794ff", + "derived_uuid": "8d47ba5f-0608-5f83-8b4b-7dee53ada6f6", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T01", + "current_uuid": "6da07153-7a6c-43c7-b580-7ea9f5a5195c", + "derived_uuid": "ab714cd3-9457-5386-8b3c-056702c234e4", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T02", + "current_uuid": "65dfcc19-3088-427c-98d4-125b39516565", + "derived_uuid": "0d10e613-a92e-5f3a-8152-d24e25c8aeae", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T03", + "current_uuid": "6bca2e44-6742-4668-9d20-ae7ce8b567b9", + "derived_uuid": "ac7e4972-d6bc-5e35-b34e-c51bfbcedf2b", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0002-company-vessel-closeout.md", + "kind": "task", + "record_id": "UPC-WP-0002-T04", + "current_uuid": "c6aca17d-b5d0-41eb-8175-61dc43d4b666", + "derived_uuid": "7fff1007-5283-5d3b-8408-d8a504b9542f", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "workplan", + "record_id": "UPC-WP-0003", + "current_uuid": "47871f09-f17c-414d-b3c4-dc6582ed3ddd", + "derived_uuid": "81b17b8a-4b22-5510-8830-a8d19aed821e", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "task", + "record_id": "UPC-WP-0003-T01", + "current_uuid": "e2437c6e-580d-4ad9-924d-d04b7e4a054b", + "derived_uuid": "57636795-371d-56ac-b4f4-cfcf2968e133", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "task", + "record_id": "UPC-WP-0003-T02", + "current_uuid": "c15f290f-04b5-4878-8a21-c6c9795a0811", + "derived_uuid": "b38eebc3-51a7-54e4-a4d3-8f8edfc16aac", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0003-unattended-and-load.md", + "kind": "task", + "record_id": "UPC-WP-0003-T03", + "current_uuid": "fee4912b-f0a1-4bae-8955-96c7f3e5e250", + "derived_uuid": "d79967eb-a270-53aa-a501-0a4f38d8c1cc", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "workplan", + "record_id": "UPC-WP-0004", + "current_uuid": "8d5d0db2-c334-49cb-ac55-11696026ff09", + "derived_uuid": "a6cf0a20-a3d5-56c6-8fc7-8cb167c71d66", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "task", + "record_id": "UPC-WP-0004-T01", + "current_uuid": "9cb476fe-9a1d-494b-96d8-04cb51b4bbed", + "derived_uuid": "cd349f71-aa8b-5480-80c2-38083aa16f58", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "task", + "record_id": "UPC-WP-0004-T02", + "current_uuid": "34954c9e-5022-409c-acf3-3195c0e1b797", + "derived_uuid": "86cf36f9-0330-538b-8c79-4f62b75bb331", + "action": "replace" + }, + { + "repo": "prj-unattended-progress-company", + "path": "workplans/UPC-WP-0004-first-offer-and-revenue.md", + "kind": "task", + "record_id": "UPC-WP-0004-T03", + "current_uuid": "0516cd4e-ab84-433b-9314-4b401c4d168f", + "derived_uuid": "0f7fd4f6-f320-5715-be1c-0a9536516e65", + "action": "replace" + } + ] + }, + { + "repo": "railiance-cluster", + "path": "/home/worsch/railiance-cluster", + "planned_head_sha": "434bbd9782860babe791148f1b12a4f9bcef9968", + "source_fingerprint": "678f8807972097f140a3b082cbe0e1a7388cb7a6952bf41513a81fe039a95b54", + "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": "16da36fe-5a10-522b-b6d6-02dbb6de6c14", + "derived_uuid": "16da36fe-5a10-522b-b6d6-02dbb6de6c14", + "action": "unchanged" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T01", + "current_uuid": "9d1f463f-e4d1-5e75-97fd-e57b833bc2b9", + "derived_uuid": "9d1f463f-e4d1-5e75-97fd-e57b833bc2b9", + "action": "unchanged" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T02", + "current_uuid": "a1f4fa2b-69a7-5de4-8c44-15e8f9baf0b2", + "derived_uuid": "a1f4fa2b-69a7-5de4-8c44-15e8f9baf0b2", + "action": "unchanged" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T05", + "current_uuid": "02cc3adb-9d42-5540-9f32-4e5f1198b79e", + "derived_uuid": "02cc3adb-9d42-5540-9f32-4e5f1198b79e", + "action": "unchanged" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T06", + "current_uuid": "4f033381-24aa-5773-bca6-337ccacc0e7a", + "derived_uuid": "4f033381-24aa-5773-bca6-337ccacc0e7a", + "action": "unchanged" + }, + { + "repo": "railiance-cluster", + "path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md", + "kind": "task", + "record_id": "RCLUSTER-WP-0007-T07", + "current_uuid": "b45b3086-3beb-56d4-a028-6bf651834992", + "derived_uuid": "b45b3086-3beb-56d4-a028-6bf651834992", + "action": "unchanged" + } + ] + }, + { + "repo": "railiance-master", + "path": "/home/worsch/railiance-master", + "planned_head_sha": "1f26e01dd7331d2350d0d69993bc1ba277a86610", + "source_fingerprint": "debefbd2568deb1913eebd5b85c76d3ee680205729234c0ed4d992aa6c3f5874", + "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-platform", + "path": "/home/worsch/railiance-platform", + "planned_head_sha": "d7dae015dfd700edb5194054ce162fdf167641af", + "source_fingerprint": "8dc530bc624a5d33993750f6b219ba612595c6d6ba68405de6508ae32d0bfa94", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0024-audit-core-custody-and-recovery-coordination.md", + "kind": "workplan", + "record_id": "RAILIANCE-WP-0024", + "current_uuid": "88c4ef7f-0af8-580e-90dc-a2bae2675a4d", + "derived_uuid": "88c4ef7f-0af8-580e-90dc-a2bae2675a4d", + "action": "unchanged" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0024-audit-core-custody-and-recovery-coordination.md", + "kind": "task", + "record_id": "RAILIANCE-WP-0024-T02", + "current_uuid": "caba7fcd-014e-5253-87f7-6993731cb0c4", + "derived_uuid": "caba7fcd-014e-5253-87f7-6993731cb0c4", + "action": "unchanged" + }, + { + "repo": "railiance-platform", + "path": "workplans/RAILIANCE-WP-0024-audit-core-custody-and-recovery-coordination.md", + "kind": "task", + "record_id": "RAILIANCE-WP-0024-T03", + "current_uuid": "09cf4065-4f8a-5b5f-beec-17f623efb56f", + "derived_uuid": "09cf4065-4f8a-5b5f-beec-17f623efb56f", + "action": "unchanged" + } + ] + }, + { + "repo": "railiance-telemetry", + "path": "/home/worsch/railiance-telemetry", + "planned_head_sha": "773f4822c37f4c9786cb129425b9086d2d6adf70", + "source_fingerprint": "8ee6c55dfee994a049861796d8ef1c7ab909db5cda286a3386a7d8e0fee40d7a", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "workplan", + "record_id": "RTELE-WP-0001", + "current_uuid": "60f5fe7c-9749-40be-9945-6ad608398b3f", + "derived_uuid": "3acd587b-3ac6-5eee-af31-05170ff8bcf7", + "action": "replace" + }, + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "task", + "record_id": "RTELE-WP-0001-T01", + "current_uuid": "de712c57-79fa-49be-97a2-873e9e1a8bec", + "derived_uuid": "4aca4677-6712-553b-ac26-0682fdf211de", + "action": "replace" + }, + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "task", + "record_id": "RTELE-WP-0001-T02", + "current_uuid": "79febfbb-6a67-40e0-9c24-96ff83ab706e", + "derived_uuid": "b6632ce1-dc84-532d-b277-adce8510a304", + "action": "replace" + }, + { + "repo": "railiance-telemetry", + "path": "workplans/RTELE-WP-0001-statehub-bootstrap.md", + "kind": "task", + "record_id": "RTELE-WP-0001-T03", + "current_uuid": "adea3657-c074-443b-9c5e-3c2095dd7c5b", + "derived_uuid": "4877f6e2-8298-5bab-b6a8-9a1ec1718289", + "action": "replace" + } + ] + }, + { + "repo": "rapp-core-hub", + "path": "/home/worsch/rapp-core-hub", + "planned_head_sha": "b17b586ebf0bf961de8f5c9957b77dc0578e5694", + "source_fingerprint": "0d2ae2228b446bbb552201b99a549737e5953ca876325778dde82f35824fc02e", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "rapp-core-hub", + "path": "workplans/RAPPCOREHUB-WP-0002-hub-core-candidate-and-cutover.md", + "kind": "workplan", + "record_id": "RAPPCOREHUB-WP-0002", + "current_uuid": null, + "derived_uuid": "626cb2d7-9525-5712-be9e-93c1ed840fc5", + "action": "assign" + }, + { + "repo": "rapp-core-hub", + "path": "workplans/RAPPCOREHUB-WP-0002-hub-core-candidate-and-cutover.md", + "kind": "task", + "record_id": "RAPPCOREHUB-WP-0002-T05", + "current_uuid": null, + "derived_uuid": "42a1e9a2-bc6f-5a6b-87a2-72e55634ca55", + "action": "assign" + } + ] + }, + { + "repo": "rapp-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": "afed794843ce15debd8bdfe14aa601f8a8263e04", + "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": "e6cc18bf182d8730e6dcadec138b03c750c0d006", + "source_fingerprint": "f4c42b5592cf3f4dc522ac1e070207fd3e3ef01129d4e179620b68b91841ba6f", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "workplan", + "record_id": "RMGR-WP-0005", + "current_uuid": "6dcf854e-9229-569d-90f0-2d9df235a61d", + "derived_uuid": "6dcf854e-9229-569d-90f0-2d9df235a61d", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T12", + "current_uuid": "0d69713d-0596-5415-b40c-8f5035641541", + "derived_uuid": "0d69713d-0596-5415-b40c-8f5035641541", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T02", + "current_uuid": "7892ca86-bd89-537e-9361-d648dff8e4b2", + "derived_uuid": "7892ca86-bd89-537e-9361-d648dff8e4b2", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T04", + "current_uuid": "3fd25c8f-25ea-566e-91c7-ac5ccba83009", + "derived_uuid": "3fd25c8f-25ea-566e-91c7-ac5ccba83009", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T05", + "current_uuid": "f2634e3a-b32e-5862-85bf-78437fc976dc", + "derived_uuid": "f2634e3a-b32e-5862-85bf-78437fc976dc", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md", + "kind": "task", + "record_id": "RMGR-WP-0005-T07", + "current_uuid": "e3c2a791-f632-59f3-9929-b179e45c77d0", + "derived_uuid": "e3c2a791-f632-59f3-9929-b179e45c77d0", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0011-sbom-nexus-production-client.md", + "kind": "workplan", + "record_id": "RMGR-WP-0011", + "current_uuid": "a6cd9248-e591-51fc-82b0-a0f3799c3939", + "derived_uuid": "a6cd9248-e591-51fc-82b0-a0f3799c3939", + "action": "unchanged" + }, + { + "repo": "repo-manager", + "path": "workplans/RMGR-WP-0011-sbom-nexus-production-client.md", + "kind": "task", + "record_id": "RMGR-WP-0011-T04", + "current_uuid": "81fed060-3431-5d9b-819b-fcc7d629c364", + "derived_uuid": "81fed060-3431-5d9b-819b-fcc7d629c364", + "action": "unchanged" + } + ] + }, + { + "repo": "risk-nexus", + "path": "/home/worsch/risk-nexus", + "planned_head_sha": "623f7ccb2eb8bd964ce30a032d05c315e72fd73b", + "source_fingerprint": "930c0e7d60dad90954ff6776efec8db80ca92d2ae31d8c00026d86ea5c8babf6", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "risk-nexus", + "path": "workplans/RISK-WP-0002-publication-handover.md", + "kind": "workplan", + "record_id": "RISK-WP-0002", + "current_uuid": null, + "derived_uuid": "b79af69c-5b08-55df-8caa-258eed3e397e", + "action": "assign" + }, + { + "repo": "risk-nexus", + "path": "workplans/RISK-WP-0002-publication-handover.md", + "kind": "task", + "record_id": "RISK-WP-0002-T01", + "current_uuid": null, + "derived_uuid": "9ac32008-76b6-591c-82a1-ad6e2f8368b7", + "action": "assign" + } + ] + }, + { + "repo": "sbom-nexus", + "path": "/home/worsch/sbom-nexus", + "planned_head_sha": "b95fba9a9f489b70e2640b62a0b3317583be742d", + "source_fingerprint": "1942080ec0353fab8ef628e47bc9cea20075c08c714467d603a7da96b4463c09", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0003-controlled-source-and-replay.md", + "kind": "workplan", + "record_id": "SBOM-WP-0003", + "current_uuid": null, + "derived_uuid": "dc07cc14-9a5d-568d-8e19-036661e52120", + "action": "assign" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0003-controlled-source-and-replay.md", + "kind": "task", + "record_id": "SBOM-WP-0003-T01", + "current_uuid": null, + "derived_uuid": "ad2b95fd-a7b1-5331-a8c3-1545fdb6db10", + "action": "assign" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0003-controlled-source-and-replay.md", + "kind": "task", + "record_id": "SBOM-WP-0003-T02", + "current_uuid": null, + "derived_uuid": "3a8734f2-c00e-584f-b5ff-f22370a5ce02", + "action": "assign" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0003-controlled-source-and-replay.md", + "kind": "task", + "record_id": "SBOM-WP-0003-T03", + "current_uuid": null, + "derived_uuid": "5be7b81e-0469-5d74-a28c-8802187a122a", + "action": "assign" + }, + { + "repo": "sbom-nexus", + "path": "workplans/SBOM-WP-0003-controlled-source-and-replay.md", + "kind": "task", + "record_id": "SBOM-WP-0003-T04", + "current_uuid": null, + "derived_uuid": "9c8a2b6c-2b99-5dd8-9c1c-b5ba4ad2367b", + "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": "2d114be84d1be1f222372593b851bafe9438c7b8", + "source_fingerprint": "48855a0004411fdca5be2abd1f3376f30c5ef62a33d05bce94ea8fa555aaa186", + "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": "test-driver", + "path": "/home/worsch/test-driver", + "planned_head_sha": "de25673c5da908d2e17af1f37aef5421fc9f151d", + "source_fingerprint": "fa7ad4ef779aa71a20dec1c81ad7aad11417fb0ae5233d69f1ae56a589ecb360", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "test-driver", + "path": "workplans/TD-WP-0001-statehub-bootstrap.md", + "kind": "workplan", + "record_id": "TD-WP-0001", + "current_uuid": "a8573acc-44b5-5364-b0e3-6797c3e2e426", + "derived_uuid": "a8573acc-44b5-5364-b0e3-6797c3e2e426", + "action": "unchanged" + }, + { + "repo": "test-driver", + "path": "workplans/TD-WP-0002-vertical-spike-crystallization.md", + "kind": "workplan", + "record_id": "TD-WP-0002", + "current_uuid": "68b252b8-03e7-55c7-8dec-ac13f6ca0aa1", + "derived_uuid": "68b252b8-03e7-55c7-8dec-ac13f6ca0aa1", + "action": "unchanged" + }, + { + "repo": "test-driver", + "path": "workplans/TD-WP-0002-vertical-spike-crystallization.md", + "kind": "task", + "record_id": "TD-WP-0002-T06", + "current_uuid": "4fb31485-8650-556c-bee4-b4e067a89d04", + "derived_uuid": "4fb31485-8650-556c-bee4-b4e067a89d04", + "action": "unchanged" + }, + { + "repo": "test-driver", + "path": "workplans/TD-WP-0002-vertical-spike-crystallization.md", + "kind": "task", + "record_id": "TD-WP-0002-T07", + "current_uuid": "b58cf7ce-dc18-5218-8eac-179291626467", + "derived_uuid": "b58cf7ce-dc18-5218-8eac-179291626467", + "action": "unchanged" + }, + { + "repo": "test-driver", + "path": "workplans/TD-WP-0002-vertical-spike-crystallization.md", + "kind": "task", + "record_id": "TD-WP-0002-T08", + "current_uuid": "e2403d3c-bc35-5dd3-b1c8-2474663e06d0", + "derived_uuid": "e2403d3c-bc35-5dd3-b1c8-2474663e06d0", + "action": "unchanged" + }, + { + "repo": "test-driver", + "path": "workplans/TD-WP-0002-vertical-spike-crystallization.md", + "kind": "task", + "record_id": "TD-WP-0002-T09", + "current_uuid": "855a1f41-b839-57fc-87b8-198ce2a9f6b1", + "derived_uuid": "855a1f41-b839-57fc-87b8-198ce2a9f6b1", + "action": "unchanged" + }, + { + "repo": "test-driver", + "path": "workplans/TD-WP-0002-vertical-spike-crystallization.md", + "kind": "task", + "record_id": "TD-WP-0002-T10", + "current_uuid": "884c2e91-b56d-5b5e-a2d3-52d2a2768cae", + "derived_uuid": "884c2e91-b56d-5b5e-a2d3-52d2a2768cae", + "action": "unchanged" + } + ] + }, + { + "repo": "the-custodian", + "path": "/home/worsch/the-custodian", + "planned_head_sha": "03e28cecf5ae24d713eda0deb040f9c6c5bf242b", + "source_fingerprint": "b7bf69a7532b332e3a7981a6ef8ecf38b14da7e1881e6c004178bc5202772dab", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0064-sbom-controlled-scan-inputs.md", + "kind": "workplan", + "record_id": "CUST-WP-0064", + "current_uuid": "c06ca8e9-8240-5cdf-8013-4e3a9ba8f1d8", + "derived_uuid": "c06ca8e9-8240-5cdf-8013-4e3a9ba8f1d8", + "action": "unchanged" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0064-sbom-controlled-scan-inputs.md", + "kind": "task", + "record_id": "CUST-WP-0064-T02", + "current_uuid": "2029e525-0573-5fea-881c-d3a418b91c9d", + "derived_uuid": "2029e525-0573-5fea-881c-d3a418b91c9d", + "action": "unchanged" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0064-sbom-controlled-scan-inputs.md", + "kind": "task", + "record_id": "CUST-WP-0064-T03", + "current_uuid": "6c645778-be59-57b1-bf44-d974a3a1e49f", + "derived_uuid": "6c645778-be59-57b1-bf44-d974a3a1e49f", + "action": "unchanged" + }, + { + "repo": "the-custodian", + "path": "workplans/CUST-WP-0064-sbom-controlled-scan-inputs.md", + "kind": "task", + "record_id": "CUST-WP-0064-T04", + "current_uuid": "664d90b0-1169-58fa-9a77-df53e739f957", + "derived_uuid": "664d90b0-1169-58fa-9a77-df53e739f957", + "action": "unchanged" + } + ] + }, + { + "repo": "whitehat-security", + "path": "/home/worsch/whitehat-security", + "planned_head_sha": "5fcb3ec28032ae75cd7c5785f89924093af246a9", + "source_fingerprint": "c6b2e1249b9e7df0f28ecb4c355b487debfdefaeed2a3060287454292c01b964", + "eligible": true, + "atomic_unit": true, + "blockers": [], + "mappings": [ + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "workplan", + "record_id": "WHITEHAT-WP-0001", + "current_uuid": "ecc16edc-9f9b-4fc4-8fb1-96b947a59299", + "derived_uuid": "3049aa1e-b188-514f-9ad7-bf3026094fb9", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T03", + "current_uuid": "742561f1-97b6-4fcc-8e06-d18508ddecae", + "derived_uuid": "e03edc76-a314-50dc-8625-3666c6351818", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T05", + "current_uuid": "6df676e7-bed5-4291-a128-eb6e9844edf2", + "derived_uuid": "7c2c3dab-a135-543b-86b1-d543ec6af0fc", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T06", + "current_uuid": "99254ab5-f08e-44c7-8399-be706dc03019", + "derived_uuid": "3a2d7a31-86b9-5c82-ab88-606b64381b2a", + "action": "replace" + }, + { + "repo": "whitehat-security", + "path": "workplans/WHITEHAT-WP-0001-cross-tenant-evidence.md", + "kind": "task", + "record_id": "WHITEHAT-WP-0001-T07", + "current_uuid": "54f33288-5361-4b20-8e1f-168866d64644", + "derived_uuid": "602d0f23-8406-5882-8f93-ec90151dd475", + "action": "replace" + } + ] + }, + { + "repo": "whynot-design", + "path": "/home/worsch/whynot-design", + "planned_head_sha": "a4273562b131cf41f3c8afdd385ea458bda62fa0", + "source_fingerprint": "df321bf3dcce20e6377d219524a9aef1448f7445f69ef74c0c0ad0a62f6c0b7c", + "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": "d3a6ec16-ac40-5ffb-99e7-07f997e59a4a", + "derived_uuid": "d3a6ec16-ac40-5ffb-99e7-07f997e59a4a", + "action": "unchanged" + } + ] + } + ], + "plan_sha256": "28cd01bdbc66c53ad5ef11b9821a74ebadd7c8cfdae4c227f37ce7f9d67cbf18" +} diff --git a/docs/work-record-uuid-derivation_v1.md b/docs/work-record-uuid-derivation_v1.md index c27900c..a215dc5 100644 --- a/docs/work-record-uuid-derivation_v1.md +++ b/docs/work-record-uuid-derivation_v1.md @@ -47,6 +47,8 @@ rmgr identifier migration-verify --plan uuid-migration.json --repo repo-manager rmgr identifier migration-batch-plan \ --plan uuid-migration.json \ --repo whynot-design \ + --projection-api-base http://127.0.0.1:8000 \ + --projection-api-base http://127.0.0.1:18000 \ --output batch.json rmgr identifier migration-batch-verify \ --plan uuid-migration.json \ @@ -73,7 +75,12 @@ package. Each selected repository must still match the planned Git HEAD, have a clean worktree, exactly match its configured upstream, and use a non-retired origin. The batch records these facts and its own SHA-256 seal, but always emits `apply_authorized: false`. An explicit decision must cite that batch hash before -any database or file mutation. +any database or file mutation. Repeat `--projection-api-base` for every hub in +the cutover: each replacement must resolve its current UUID with HTTP 200 and +its derived target with HTTP 404 on every named projection, or the manifest is +not ready for approval. Saved projection endpoints are rechecked by +`migration-batch-verify`; omitting the option retains the offline source/Git-only +planning mode. Activation and applying a bulk migration remain separate governed steps. Publishing or planning this function does not retroactively rewrite existing diff --git a/interfaces/state-hub-sealed-projection-repair-v1.yaml b/interfaces/state-hub-sealed-projection-repair-v1.yaml new file mode 100644 index 0000000..4ec2c2a --- /dev/null +++ b/interfaces/state-hub-sealed-projection-repair-v1.yaml @@ -0,0 +1,62 @@ +apiVersion: helixforge.repo-manager/v1 +kind: OwnerTaskInterface +metadata: + id: helixforge.identifiers.state-hub-sealed-projection-repair.v1 + title: Repair an absent pre-derivation projection from a sealed migration unit +source: + repo: repo-manager + workplan_task: RMGR-WP-0005-T04 +target: + repo: state-hub + owner_agent: state-hub + suggested_work_record: STATE-WP-0079 follow-up task or owner-selected workplan task +approval: + dispositions: [approved, amended, rejected] + record_in: State Hub file-backed workplan task or decision +task: + title: Add sealed repair for absent pre-derivation projection rows + priority: high + objective: >- + Allow an authoritative random UUID that predates deterministic derivation to + be restored into one partial projection only when a sealed Repo Manager + migration unit proves the exact repository, record identity, old UUID, and + derived target, so both projections can enter the existing transactional + cutover with matching source rows. + inputs: + - ref: repo-manager/docs/work-record-uuid-derivation_v1.md + authority: repo-manager + - ref: repo-manager/src/repo_manager/commands/registrar_reconcile.py + authority: repo-manager + - ref: state-hub/api/services/work_record_identifier_migration.py + authority: state-hub + deliverables: + - >- + Add an explicit registrar-only repair mode scoped to one canonical + workplan and one sealed repository migration unit; never widen ordinary + consistency repair for arbitrary random stale UUIDs. + - >- + Reconstruct the absent workplan and its mapped tasks with their exact old + UUIDs from the clean, synchronized authoritative file and existing + repository/topic projection, then verify exact API visibility. + - >- + Emit a non-secret receipt containing repository, canonical ids, old UUIDs, + plan seal, source Git revision, projection identity, and canonical UTC + observation time. + - Make retry idempotent and reject partial presence, target presence, source drift, or UUID conflict. + constraints: + - The normal C-03 random stale-reference refusal remains unchanged. + - Repair requires explicit primary confirmation and an exact sealed plan hash. + - Do not infer a repository, topic, canonical id, or UUID from path strings alone. + - Do not mutate the authoritative workplan file during projection repair. + - A failed repair must leave no partially created workplan or task rows. + acceptance: + - >- + A fixture with the old row present on one hub and absent on another repairs + only the absent projection and then passes current UUID=200 and derived UUID=404 preflight. + - A random stale UUID outside the sealed unit remains non-fixable C-03. + - Repeating the same repair returns a verified no-op receipt. + - A dirty or unsynchronized source, mismatched plan hash, or partially present unit is rejected. + - Existing empty-projection bootstrap and derived-row repair behavior remain unchanged. + verification: + - uv run pytest -q tests/test_consistency_check.py tests/test_work_record_identifier_migration.py + - make test diff --git a/src/repo_manager/cli.py b/src/repo_manager/cli.py index 25cbcf2..4d6e1f3 100644 --- a/src/repo_manager/cli.py +++ b/src/repo_manager/cli.py @@ -318,6 +318,13 @@ def main(argv: list[str] | None = None) -> int: ) p_id_batch.add_argument("--plan", required=True) p_id_batch.add_argument("--repo", action="append", required=True, dest="repos") + p_id_batch.add_argument( + "--projection-api-base", + action="append", + default=[], + dest="projection_api_bases", + help="Require current UUID=200 and derived UUID=404 on this projection", + ) p_id_batch.add_argument("--output", default=None) p_id_batch.add_argument("--force", action="store_true") p_id_batch_verify = identifier_sub.add_parser( @@ -772,7 +779,11 @@ def main(argv: list[str] | None = None) -> int: plan = json.loads(Path(args.plan).read_text(encoding="utf-8")) if not isinstance(plan, dict): raise TypeError("migration plan must be a JSON object") - result = plan_identifier_migration_batch(plan, repo_slugs=args.repos) + result = plan_identifier_migration_batch( + plan, + repo_slugs=args.repos, + projection_api_bases=args.projection_api_bases, + ) except (OSError, TypeError, ValueError, json.JSONDecodeError) as exc: print(json.dumps({"ok": False, "error": str(exc)}, indent=2)) return 1 diff --git a/src/repo_manager/commands/registrar_reconcile.py b/src/repo_manager/commands/registrar_reconcile.py index 6a8f4e4..a4cc881 100644 --- a/src/repo_manager/commands/registrar_reconcile.py +++ b/src/repo_manager/commands/registrar_reconcile.py @@ -551,7 +551,7 @@ def registrar_reconcile( bootstrap_verified = projection_error is None requested_verified = False - if completed.returncode == 1 and not any(after.values()): + if completed.returncode == 1 and any(before.values()) and not any(after.values()): ( requested_workplans, requested_tasks, @@ -578,7 +578,14 @@ def registrar_reconcile( # A repository-scoped projection repair may coexist with legacy stale # references that correctly keep the broader consistency report red. accepted_exit_codes.add(1) - if completed.returncode not in accepted_exit_codes or any(after.values()): + mode_verification_failed = bool(repair_projection_id and not repair_verified) or ( + bootstrap_empty_projection and not bootstrap_verified + ) + if ( + completed.returncode not in accepted_exit_codes + or any(after.values()) + or mode_verification_failed + ): return RegistrarResult( "failed", evidence, diff --git a/src/repo_manager/identifiers.py b/src/repo_manager/identifiers.py index 29472b3..515d42f 100644 --- a/src/repo_manager/identifiers.py +++ b/src/repo_manager/identifiers.py @@ -13,6 +13,7 @@ from collections import defaultdict from pathlib import Path from typing import Any +import httpx import yaml from repo_manager.cache import source_fingerprint @@ -359,8 +360,79 @@ def _git_cutover_preflight(repo: Path, *, expected_head_sha: str | None) -> dict } +def _projection_migration_preflight( + mappings: list[dict[str, Any]], api_bases: list[str] +) -> dict[str, Any]: + """Require every replacement source and no replacement target per projection.""" + projections: list[dict[str, Any]] = [] + errors: list[dict[str, str]] = [] + for raw_base in api_bases: + api_base = raw_base.strip().rstrip("/") + try: + url = httpx.URL(api_base) + if ( + url.scheme not in {"http", "https"} + or not url.host + or url.username + or url.password + or url.query + or url.fragment + ): + raise ValueError + except (TypeError, ValueError): + errors.append( + {"scope": raw_base, "reason": "projection API base must be a plain HTTP(S) origin"} + ) + continue + + checks: list[dict[str, Any]] = [] + try: + with httpx.Client(timeout=10.0, follow_redirects=False) as client: + for mapping in mappings: + if mapping.get("action") != "replace": + continue + route = "workplans" if mapping.get("kind") == "workplan" else "tasks" + current = client.get(f"{api_base}/{route}/{mapping.get('current_uuid')}") + derived = client.get(f"{api_base}/{route}/{mapping.get('derived_uuid')}") + check_ok = current.status_code == 200 and derived.status_code == 404 + check = { + "record_id": mapping.get("record_id"), + "kind": mapping.get("kind"), + "current_status": current.status_code, + "derived_status": derived.status_code, + "ok": check_ok, + } + checks.append(check) + if not check_ok: + errors.append( + { + "scope": f"{api_base}:{mapping.get('record_id')}", + "reason": "projection requires current UUID=200 and derived UUID=404", + } + ) + except httpx.HTTPError: + errors.append({"scope": api_base, "reason": "projection API is unavailable"}) + projections.append( + { + "api_base": api_base, + "ok": all(check["ok"] for check in checks), + "replacement_checks": checks, + } + ) + + return { + "required": True, + "ok": bool(projections) and not errors, + "projections": projections, + "errors": errors, + } + + def plan_identifier_migration_batch( - plan: dict[str, Any], *, repo_slugs: list[str] + plan: dict[str, Any], + *, + repo_slugs: list[str], + projection_api_bases: list[str] | None = None, ) -> dict[str, Any]: """Pin a reviewed repository batch after source and Git preflight. @@ -379,6 +451,7 @@ def plan_identifier_migration_batch( for repository in plan.get("repositories", []): repositories_by_slug[str(repository.get("repo") or "")].append(repository) + projection_api_bases = list(projection_api_bases or []) batch_repositories: list[dict[str, Any]] = [] totals = {"repositories": 0, "records": 0, "replace": 0, "assign": 0, "unchanged": 0} for slug in requested: @@ -410,6 +483,12 @@ def plan_identifier_migration_batch( errors.append({"scope": slug, "reason": error["reason"]}) for reason in git_preflight["errors"]: errors.append({"scope": slug, "reason": reason}) + projection_preflight = None + if projection_api_bases: + projection_preflight = _projection_migration_preflight( + mappings, projection_api_bases + ) + errors.extend(projection_preflight["errors"]) batch_repositories.append( { @@ -419,8 +498,14 @@ def plan_identifier_migration_batch( "source_fingerprint": repository.get("source_fingerprint"), "source_verified": source_verification["ok"], "git_preflight": git_preflight, + "projection_preflight": projection_preflight, "mapping_counts": {"records": len(mappings), **action_counts}, - "ready": source_verification["ok"] and git_preflight["ok"] and actionable > 0, + "ready": ( + source_verification["ok"] + and git_preflight["ok"] + and actionable > 0 + and (projection_preflight is None or projection_preflight["ok"]) + ), } ) totals["repositories"] += 1 @@ -434,6 +519,7 @@ def plan_identifier_migration_batch( "ready_for_approval": not errors, "apply_authorized": False, "approval_required": True, + "projection_api_bases": [base.strip().rstrip("/") for base in projection_api_bases], "namespace": plan.get("namespace"), "source_plan_sha256": plan_sha256, "batch_policy": "repository-atomic, sequential, stop on first failure", @@ -484,7 +570,11 @@ def verify_identifier_migration_batch( fresh = None else: try: - fresh = plan_identifier_migration_batch(plan, repo_slugs=repo_slugs) + fresh = plan_identifier_migration_batch( + plan, + repo_slugs=repo_slugs, + projection_api_bases=list(batch.get("projection_api_bases") or []), + ) except (OSError, ValueError) as exc: errors.append({"scope": "batch", "reason": str(exc)}) fresh = None diff --git a/tests/test_identifiers.py b/tests/test_identifiers.py index 4d5835f..47510e2 100644 --- a/tests/test_identifiers.py +++ b/tests/test_identifiers.py @@ -3,6 +3,7 @@ from __future__ import annotations import subprocess from pathlib import Path +import httpx import pytest from repo_manager.identifiers import ( @@ -213,10 +214,24 @@ def _push_fixture_to_upstream(repo: Path, remote: Path) -> None: subprocess.run(["git", "push", "-u", "origin", "HEAD:main"], cwd=repo, check=True) -def test_migration_batch_plan_pins_clean_synchronized_repo(tmp_path: Path) -> None: +def test_migration_batch_plan_pins_clean_synchronized_repo( + tmp_path: Path, monkeypatch +) -> None: repo = tmp_path / "one" path = repo / "workplans" / "one.md" _workplan(path, "ONE-WP-0001", "active") + path.write_text( + path.read_text(encoding="utf-8") + .replace( + "status: active\n---", + 'status: active\nstate_hub_workstream_id: "11111111-1111-4111-8111-111111111111"\n---', + ) + .replace( + "status: todo\n```", + 'status: todo\nstate_hub_task_id: "22222222-2222-4222-8222-222222222222"\n```', + ), + encoding="utf-8", + ) subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True) subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True) subprocess.run( @@ -228,15 +243,84 @@ def test_migration_batch_plan_pins_clean_synchronized_repo(tmp_path: Path) -> No _push_fixture_to_upstream(repo, tmp_path / "remote.git") plan = plan_identifier_migration(tmp_path, "helixforge") - batch = plan_identifier_migration_batch(plan, repo_slugs=["one"]) + current_uuids = { + mapping["current_uuid"] for mapping in plan["repositories"][0]["mappings"] + } + + def projection_get(self, url): + status = 200 if any(str(url).endswith(str(value)) for value in current_uuids) else 404 + return httpx.Response(status, request=httpx.Request("GET", url)) + + monkeypatch.setattr(httpx.Client, "get", projection_get) + batch = plan_identifier_migration_batch( + plan, + repo_slugs=["one"], + projection_api_bases=["http://hub-one.test", "http://hub-two.test"], + ) assert batch["ok"] is True assert batch["ready_for_approval"] is True assert batch["apply_authorized"] is False assert batch["approval_required"] is True + assert batch["projection_api_bases"] == [ + "http://hub-one.test", + "http://hub-two.test", + ] + assert batch["repositories"][0]["projection_preflight"]["ok"] is True assert batch["repositories"][0]["git_preflight"]["upstream"] == "origin/main" assert len(batch["batch_sha256"]) == 64 + def projection_drift(self, url): + return httpx.Response(404, request=httpx.Request("GET", url)) + + monkeypatch.setattr(httpx.Client, "get", projection_drift) + verification = verify_identifier_migration_batch(batch, plan=plan) + assert verification["ok"] is False + assert verification["ready_for_decision"] is False + + +def test_migration_batch_plan_rejects_projection_gap(tmp_path: Path, monkeypatch) -> None: + repo = tmp_path / "one" + path = repo / "workplans" / "one.md" + _workplan(path, "ONE-WP-0001", "active") + path.write_text( + path.read_text(encoding="utf-8") + .replace( + "status: active\n---", + 'status: active\nstate_hub_workstream_id: "11111111-1111-4111-8111-111111111111"\n---', + ) + .replace( + "status: todo\n```", + 'status: todo\nstate_hub_task_id: "22222222-2222-4222-8222-222222222222"\n```', + ), + encoding="utf-8", + ) + subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True) + subprocess.run( + ["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-m", "seed"], + cwd=repo, + check=True, + capture_output=True, + ) + _push_fixture_to_upstream(repo, tmp_path / "remote.git") + plan = plan_identifier_migration(tmp_path, "helixforge") + + def projection_get(self, url): + return httpx.Response(404, request=httpx.Request("GET", url)) + + monkeypatch.setattr(httpx.Client, "get", projection_get) + batch = plan_identifier_migration_batch( + plan, + repo_slugs=["one"], + projection_api_bases=["http://hub.test"], + ) + + assert batch["ok"] is False + assert batch["ready_for_approval"] is False + assert batch["repositories"][0]["projection_preflight"]["ok"] is False + assert any("current UUID=200" in error["reason"] for error in batch["errors"]) + def test_migration_batch_plan_rejects_dirty_or_duplicate_scope(tmp_path: Path) -> None: repo = tmp_path / "one" diff --git a/tests/test_registrar_reconcile.py b/tests/test_registrar_reconcile.py index 1b3593f..2f82bb5 100644 --- a/tests/test_registrar_reconcile.py +++ b/tests/test_registrar_reconcile.py @@ -294,6 +294,54 @@ def test_repairs_an_already_identified_workplan_projection(tmp_path: Path, monke assert brief.read_text(encoding="utf-8") == "authoritative local brief\n" +def test_repair_fails_when_exact_projection_remains_absent(tmp_path: Path, monkeypatch) -> None: + repo = _fixture(tmp_path) + workplan = repo / "workplans" / "DEMO-WP-0001.md" + text = workplan.read_text(encoding="utf-8") + text = text.replace( + "status: active\n---", + 'status: active\nstate_hub_workstream_id: "11111111-1111-4111-8111-111111111111"\n---', + ) + text = text.replace( + "priority: high\n```", + 'priority: high\nstate_hub_task_id: "22222222-2222-4222-8222-222222222222"\n```', + ) + workplan.write_text(text, encoding="utf-8") + _git(repo, "add", ".") + _git(repo, "commit", "-m", "add authoritative identifiers") + _git(repo, "push") + + monkeypatch.setattr( + rr, + "_check_primary", + lambda _api: ({"status": "ok", "db": "connected"}, None), + ) + monkeypatch.setattr( + rr, + "_projection_exists", + lambda _api, _projection_id: ({}, "workplan projection returned 404"), + ) + monkeypatch.setattr( + rr, + "_run_statehub", + lambda command, *, env: subprocess.CompletedProcess( + command, 1, "stale reference remains", "" + ), + ) + + result = rr.registrar_reconcile( + repo, + statehub_bin="statehub", + confirm_primary=True, + repair_workplan="DEMO-WP-0001", + ) + + assert result.status == "failed" + assert result.error and result.error["code"] == "registration_incomplete" + assert result.evidence["repair_projection_verified"] is False + assert "requested_projection_verified" not in result.evidence + + def test_bootstraps_and_verifies_a_completely_empty_projection(tmp_path: Path, monkeypatch) -> None: repo = _fixture(tmp_path) workplan = repo / "workplans" / "DEMO-WP-0001.md" diff --git a/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md b/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md index 4b9b764..f5c17cd 100644 --- a/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md +++ b/workplans/RMGR-WP-0005-registrar-consolidation-deterministic-ids.md @@ -541,6 +541,27 @@ note are in `docs/evidence/RMGR-WP-0005-batch-0004-railiance-cluster-cutover-2026-08-22.md`. T04 remains in progress for separately sealed and approved fleet batches. +**Batch 0005 preflight blocked safely (2026-08-22):** the refreshed zero-collision +fleet plan covers 39 repositories and 215 live records. A projection-aware +`adaptive-pricing` batch pinned its clean synchronized source and five UUID +replacements, then proved the workstation has all five old rows while production +has none. It therefore records `ready_for_approval: false` and authorizes no +mutation. A governed repair attempt retained State Hub's conservative C-03 +refusal for absent random pre-derivation UUIDs. + +That attempt exposed and fixed a Repo Manager fail-open result classification: +an empty ordinary-registration set could previously make an unverified exact +repair report `applied`. Repair and bootstrap modes now require their own exact +projection proof. Batch planning can also pin repeated +`--projection-api-base` endpoints and fails readiness unless every replacement +is current=200/derived=404 on every hub; verification repeats those live checks. + +The remaining cross-owner gap is directly adoptable as +`helixforge.identifiers.state-hub-sealed-projection-repair.v1`. It asks State Hub +for a registrar-only, sealed, atomic restoration path without weakening normal +random stale-reference refusal. Evidence: +`docs/evidence/RMGR-WP-0005-batch-0005-adaptive-pricing-preflight-2026-08-22.md`. + ## Retire the interim rule ```task