apply reef identifier batch 0006
Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a053ff-1d6f-7fe2-ac1c-a6eb40a42a0c
This commit is contained in:
parent
d63f8b27e7
commit
c52d222cc6
11 changed files with 109 additions and 16 deletions
|
|
@ -123,7 +123,7 @@ curl -s -X PATCH "http://127.0.0.1:8000/tasks/<task_id>" \
|
||||||
rmgr sync --path . --push
|
rmgr sync --path . --push
|
||||||
```
|
```
|
||||||
The command assigns only missing deterministic identifiers, verifies the
|
The command assigns only missing deterministic identifiers, verifies the
|
||||||
pushed Forgejo commit and `primary/railliance01`, then requests one central
|
pushed Forgejo commit and `primary/railiance01`, then requests one central
|
||||||
forge-derived reconciliation. A queued receipt is pending evidence; rerun
|
forge-derived reconciliation. A queued receipt is pending evidence; rerun
|
||||||
after connectivity returns. Use `statehub fix-consistency` separately for a
|
after connectivity returns. Use `statehub fix-consistency` separately for a
|
||||||
deep audit. `registrar-reconcile` is legacy migration/repair only.
|
deep audit. `registrar-reconcile` is legacy migration/repair only.
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ rmgr workplan delete --path . --workplan-id EX-WP-0001 --confirm # archives; ne
|
||||||
rmgr task add --path . --workplan-id EX-WP-0001 --title "Implement" --description "Deliver it."
|
rmgr task add --path . --workplan-id EX-WP-0001 --title "Implement" --description "Deliver it."
|
||||||
rmgr task update --path . --task-id EX-WP-0001-T01 --status progress
|
rmgr task update --path . --task-id EX-WP-0001-T01 --status progress
|
||||||
rmgr adhoc add --path . --title "Small fix" --description "Complete the bounded fix."
|
rmgr adhoc add --path . --title "Small fix" --description "Complete the bounded fix."
|
||||||
rmgr sync --path . --push # primary/railliance01 derives the exact pushed commit
|
rmgr sync --path . --push # primary/railiance01 derives the exact pushed commit
|
||||||
rmgr register put --path . --kind technical-debt --entry-id TD-001 \
|
rmgr register put --path . --kind technical-debt --entry-id TD-001 \
|
||||||
--title "Debt item" --data-json '{"severity":"high"}'
|
--title "Debt item" --data-json '{"severity":"high"}'
|
||||||
rmgr register list --path . --kind technical-debt
|
rmgr register list --path . --kind technical-debt
|
||||||
|
|
@ -57,7 +57,7 @@ rmgr scaffold --path . --refresh-hub-access --no-commit # State Hub access tabl
|
||||||
|
|
||||||
`rmgr sync` is the normal work-record closeout path. It uses the canonical kind
|
`rmgr sync` is the normal work-record closeout path. It uses the canonical kind
|
||||||
registry, fills only missing deterministic UUIDv5 identifiers, refuses dirty or
|
registry, fills only missing deterministic UUIDv5 identifiers, refuses dirty or
|
||||||
behind workplan sources, verifies that the API is `primary/railliance01`, and
|
behind workplan sources, verifies that the API is `primary/railiance01`, and
|
||||||
requests one central forge-derived reconciliation. A local/cache State Hub is
|
requests one central forge-derived reconciliation. A local/cache State Hub is
|
||||||
never populated. `registrar-reconcile` remains only for sealed legacy UUID
|
never populated. `registrar-reconcile` remains only for sealed legacy UUID
|
||||||
migration and repair.
|
migration and repair.
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
id: RMGR-DEC-2026-005
|
id: RMGR-DEC-2026-005
|
||||||
kind: decision
|
kind: decision
|
||||||
title: Approve deterministic identifier batch 0006 for reef-railiance
|
title: Approve deterministic identifier batch 0006 for reef-railiance
|
||||||
status: open
|
status: resolved
|
||||||
decision_type: pending
|
decision_type: approved
|
||||||
owner: Bernd Worsch
|
owner: Bernd Worsch
|
||||||
repo: repo-manager
|
repo: repo-manager
|
||||||
workplan: RMGR-WP-0005
|
workplan: RMGR-WP-0005
|
||||||
|
|
@ -22,7 +22,7 @@ scope:
|
||||||
repositories: [reef-railiance]
|
repositories: [reef-railiance]
|
||||||
replacements: 2
|
replacements: 2
|
||||||
assignments: 0
|
assignments: 0
|
||||||
apply_authorized: false
|
apply_authorized: true
|
||||||
approval_effect: >-
|
approval_effect: >-
|
||||||
Approved authorizes one repository-atomic forward cutover of exactly the
|
Approved authorizes one repository-atomic forward cutover of exactly the
|
||||||
pinned batch in the railiance01 primary projection and authoritative
|
pinned batch in the railiance01 primary projection and authoritative
|
||||||
|
|
@ -33,8 +33,17 @@ rollback: >-
|
||||||
transaction using its durable aliases.
|
transaction using its durable aliases.
|
||||||
evidence: docs/evidence/RMGR-WP-0005-batch-0006-reef-railiance-preflight-2026-08-31.json
|
evidence: docs/evidence/RMGR-WP-0005-batch-0006-reef-railiance-preflight-2026-08-31.json
|
||||||
created: "2026-08-31"
|
created: "2026-08-31"
|
||||||
updated: "2026-08-31"
|
updated: "2026-08-31T11:23:46.601904Z"
|
||||||
state_hub_decision_id: "a0616e13-cd0c-441a-8339-f0e502bb2bbf"
|
state_hub_decision_id: "a0616e13-cd0c-441a-8339-f0e502bb2bbf"
|
||||||
|
approved_batch_sha256: 102061f3ed93eac091e9ceb05d9d3130241a23134b9f7d5a624d91c4ef824759
|
||||||
|
approval_source: operator chat approval on 2026-08-31
|
||||||
|
rationale: >-
|
||||||
|
Bernd Worsch approved exactly batch SHA-256
|
||||||
|
102061f3ed93eac091e9ceb05d9d3130241a23134b9f7d5a624d91c4ef824759
|
||||||
|
for the reef-railiance-only cutover. No assignments, later fleet plan, or
|
||||||
|
broader repository scope is authorized.
|
||||||
|
decided_by: Bernd Worsch
|
||||||
|
decided_at: "2026-08-31T11:23:46.601904Z"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Decision requested
|
## Decision requested
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
# RMGR-WP-0005 batch 0006 reef-railiance cutover
|
||||||
|
|
||||||
|
Date: 2026-08-31
|
||||||
|
|
||||||
|
## Authorization
|
||||||
|
|
||||||
|
Bernd Worsch approved `RMGR-DEC-2026-005` as written. The approval is limited
|
||||||
|
to batch seal
|
||||||
|
`102061f3ed93eac091e9ceb05d9d3130241a23134b9f7d5a624d91c4ef824759`,
|
||||||
|
source-plan seal
|
||||||
|
`af3c8e3fe6f423845a97258a10322eeded4b7814d13bf9541b5d550c285cc0b9`,
|
||||||
|
repository `reef-railiance`, two replacements, and zero assignments. State Hub
|
||||||
|
decision `a0616e13-cd0c-441a-8339-f0e502bb2bbf` is resolved with
|
||||||
|
`decision_type: made` and `decided_by: Bernd Worsch`.
|
||||||
|
|
||||||
|
## Final preflight
|
||||||
|
|
||||||
|
`rmgr identifier migration-batch-verify` returned `ok: true`,
|
||||||
|
`ready_for_decision: true`, the exact batch and plan seals above, repository
|
||||||
|
`reef-railiance`, and no errors. The file phase dry-run reported one file, two
|
||||||
|
replacements, zero assignments, and no write.
|
||||||
|
|
||||||
|
The source was clean and synchronized at sealed HEAD
|
||||||
|
`3e98b10d81990c45465f3f620441d97347670b52`. The primary health identity was:
|
||||||
|
|
||||||
|
- role: `primary`
|
||||||
|
- label: `railiance01`
|
||||||
|
- schema: `a4d5e6f7b8c9` current
|
||||||
|
|
||||||
|
## Execution
|
||||||
|
|
||||||
|
The first projection command omitted the explicit instance-label override. It
|
||||||
|
refused before mutation because the Repo Manager default was misspelled
|
||||||
|
`railliance01`. Repeating the command with
|
||||||
|
`--expected-instance-label railiance01` passed every source and Git precondition.
|
||||||
|
The default spelling is corrected in this closeout change set.
|
||||||
|
|
||||||
|
The forward projection receipt reported:
|
||||||
|
|
||||||
|
- `replacements: 2`
|
||||||
|
- `migrated: 2`
|
||||||
|
- `already_derived: 0`
|
||||||
|
- `assignments_deferred: 0`
|
||||||
|
|
||||||
|
The atomic file phase then touched only
|
||||||
|
`workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md`, replacing:
|
||||||
|
|
||||||
|
| Record | Legacy UUID | Deterministic UUID |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `REEF-RAILIANCE-WP-0003` | `c3f9fbfd-3db1-4387-8b65-7d53ba57138d` | `8ac413ad-2f57-53e6-b586-c5bec9cfbd1f` |
|
||||||
|
| `REEF-RAILIANCE-WP-0003-T04` | `9d0c1f61-0ed8-4d5c-b4c2-2578424ad3b4` | `9d792070-5f2b-5b3d-ba52-92c8b0d4a6b8` |
|
||||||
|
|
||||||
|
`statehub fix-consistency` completed after the rewrite and refreshed the reef
|
||||||
|
brief in automatic commit `cec61da`. The authoritative UUID change is pushed to
|
||||||
|
Forgejo in reef commit `dcf51b3`.
|
||||||
|
|
||||||
|
## Post-cutover verification
|
||||||
|
|
||||||
|
- The deterministic workplan and task endpoints return their original record
|
||||||
|
identities, content, and lifecycle states.
|
||||||
|
- The migrated task has
|
||||||
|
`workplan_id: 8ac413ad-2f57-53e6-b586-c5bec9cfbd1f`.
|
||||||
|
- The two legacy UUID endpoints return 404, as expected: durable migration
|
||||||
|
aliases support governed reversal but are not public read redirects.
|
||||||
|
- The reef repository is clean and synchronized with `origin/main` after push.
|
||||||
|
- The authoritative diff contains exactly two UUID replacements and no content
|
||||||
|
or status changes.
|
||||||
|
- Repo Manager verification passed: `148 passed` and Ruff reported no issues.
|
||||||
|
|
||||||
|
No rollback was required.
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Date: 2026-08-31
|
Date: 2026-08-31
|
||||||
|
|
||||||
The workstation no longer runs a State Hub API. `127.0.0.1:8000` is the
|
The workstation no longer runs a State Hub API. `127.0.0.1:8000` is the
|
||||||
operator's SSH relay to the sole `railliance01` primary, whose health reports
|
operator's SSH relay to the sole `railiance01` primary, whose health reports
|
||||||
`instance_role: primary`, `instance_label: railiance01`, and a current schema.
|
`instance_role: primary`, `instance_label: railiance01`, and a current schema.
|
||||||
The retired production sweep remains disabled and has no checkout or SSH
|
The retired production sweep remains disabled and has no checkout or SSH
|
||||||
hostPath mount.
|
hostPath mount.
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ def main(argv: list[str] | None = None) -> int:
|
||||||
p_sync.add_argument("--path", default=".")
|
p_sync.add_argument("--path", default=".")
|
||||||
p_sync.add_argument("--slug", default=None)
|
p_sync.add_argument("--slug", default=None)
|
||||||
p_sync.add_argument("--api-base", default=os.environ.get("STATE_HUB_API_BASE", "http://127.0.0.1:8000"))
|
p_sync.add_argument("--api-base", default=os.environ.get("STATE_HUB_API_BASE", "http://127.0.0.1:8000"))
|
||||||
p_sync.add_argument("--expected-instance-label", default="railliance01")
|
p_sync.add_argument("--expected-instance-label", default="railiance01")
|
||||||
p_sync.add_argument("--push", action="store_true", help="Push ahead commits before reconciliation")
|
p_sync.add_argument("--push", action="store_true", help="Push ahead commits before reconciliation")
|
||||||
p_sync.add_argument("--no-commit-identifiers", action="store_true")
|
p_sync.add_argument("--no-commit-identifiers", action="store_true")
|
||||||
p_sync.add_argument("--acknowledge-retirements", action="store_true")
|
p_sync.add_argument("--acknowledge-retirements", action="store_true")
|
||||||
|
|
@ -456,7 +456,7 @@ def main(argv: list[str] | None = None) -> int:
|
||||||
p_id_projection.add_argument("--repo", required=True)
|
p_id_projection.add_argument("--repo", required=True)
|
||||||
p_id_projection.add_argument("--confirm-plan-sha256", required=True)
|
p_id_projection.add_argument("--confirm-plan-sha256", required=True)
|
||||||
p_id_projection.add_argument("--api-base", required=True)
|
p_id_projection.add_argument("--api-base", required=True)
|
||||||
p_id_projection.add_argument("--expected-instance-label", default="railliance01")
|
p_id_projection.add_argument("--expected-instance-label", default="railiance01")
|
||||||
p_id_projection.add_argument(
|
p_id_projection.add_argument(
|
||||||
"--direction", choices=["forward", "reverse"], default="forward"
|
"--direction", choices=["forward", "reverse"], default="forward"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -990,7 +990,7 @@ def migrate_repository_projection(
|
||||||
confirm_plan_sha256: str,
|
confirm_plan_sha256: str,
|
||||||
api_base: str,
|
api_base: str,
|
||||||
direction: str = "forward",
|
direction: str = "forward",
|
||||||
expected_instance_label: str | None = "railliance01",
|
expected_instance_label: str | None = "railiance01",
|
||||||
transport: httpx.BaseTransport | None = None,
|
transport: httpx.BaseTransport | None = None,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
"""Apply or reverse the sealed projection half on the authoritative hub."""
|
"""Apply or reverse the sealed projection half on the authoritative hub."""
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ def sync_repository_projection(
|
||||||
*,
|
*,
|
||||||
api_base: str,
|
api_base: str,
|
||||||
repo_slug: str | None = None,
|
repo_slug: str | None = None,
|
||||||
expected_instance_label: str | None = "railliance01",
|
expected_instance_label: str | None = "railiance01",
|
||||||
commit_identifiers: bool = True,
|
commit_identifiers: bool = True,
|
||||||
push: bool = False,
|
push: bool = False,
|
||||||
acknowledge_retirements: bool = False,
|
acknowledge_retirements: bool = False,
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@ def test_sync_uses_two_requests_and_exact_pushed_commit(tmp_path: Path) -> None:
|
||||||
if request.url.path == "/state/health":
|
if request.url.path == "/state/health":
|
||||||
return httpx.Response(
|
return httpx.Response(
|
||||||
200,
|
200,
|
||||||
json={"status": "ok", "instance_role": "primary", "instance_label": "railliance01"},
|
json={"status": "ok", "instance_role": "primary", "instance_label": "railiance01"},
|
||||||
)
|
)
|
||||||
payload = __import__("json").loads(request.content)
|
payload = __import__("json").loads(request.content)
|
||||||
assert (
|
assert (
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ def test_projection_migration_client_requires_primary_and_exact_seal(tmp_path: P
|
||||||
json={
|
json={
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"instance_role": "primary",
|
"instance_role": "primary",
|
||||||
"instance_label": "railliance01",
|
"instance_label": "railiance01",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
assert request.url.path == "/identifier-migrations/repositories/one/apply"
|
assert request.url.path == "/identifier-migrations/repositories/one/apply"
|
||||||
|
|
|
||||||
|
|
@ -660,7 +660,21 @@ unauthorized; exact batch seal:
|
||||||
`docs/evidence/RMGR-WP-0005-batch-0006-reef-railiance-preflight-2026-08-31.json`.
|
`docs/evidence/RMGR-WP-0005-batch-0006-reef-railiance-preflight-2026-08-31.json`.
|
||||||
The inevitable Repo Manager evidence commit invalidates whole-fleet source
|
The inevitable Repo Manager evidence commit invalidates whole-fleet source
|
||||||
verification for `repo-manager` itself, but repository-filtered verification of
|
verification for `repo-manager` itself, but repository-filtered verification of
|
||||||
the sealed source plan for `reef-railiance` remains clean. No mutation has run.
|
the sealed source plan for `reef-railiance` remains clean.
|
||||||
|
|
||||||
|
**Batch 0006 applied (2026-08-31):** Bernd Worsch approved exactly batch seal
|
||||||
|
`102061f3ed93eac091e9ceb05d9d3130241a23134b9f7d5a624d91c4ef824759`
|
||||||
|
through `RMGR-DEC-2026-005`. The final batch verification passed with no drift.
|
||||||
|
The railiance01 primary then migrated both legacy rows transactionally, with
|
||||||
|
zero assignments or already-derived rows, and the atomic file phase changed
|
||||||
|
only the two sealed UUID fields in
|
||||||
|
`REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md`. Post-cutover checks
|
||||||
|
confirmed both derived records, the task-to-workplan relationship, unchanged
|
||||||
|
lifecycle state, a clean consistency audit, and the pushed reef commit
|
||||||
|
`dcf51b3`. The initial projection attempt refused safely before mutation because
|
||||||
|
the CLI default misspelled the primary label as `railliance01`; the corrected
|
||||||
|
`railiance01` default is covered by the same change set. Evidence:
|
||||||
|
`docs/evidence/RMGR-WP-0005-batch-0006-reef-railiance-cutover-2026-08-31.md`.
|
||||||
|
|
||||||
## Retire the interim rule
|
## Retire the interim rule
|
||||||
|
|
||||||
|
|
@ -746,7 +760,7 @@ repeat comparison passes. Evidence and the non-destructive procedure are in
|
||||||
`docs/cache-rebuild_v1.md`.
|
`docs/cache-rebuild_v1.md`.
|
||||||
|
|
||||||
**Done with explicit disposition 2026-08-31.** The workstation State Hub API is
|
**Done with explicit disposition 2026-08-31.** The workstation State Hub API is
|
||||||
gone; its loopback address is now a relay to the sole `railliance01` primary.
|
gone; its loopback address is now a relay to the sole `railiance01` primary.
|
||||||
Repo Manager's advisory cache rebuilt 96 current records at commit `e8e2747`
|
Repo Manager's advisory cache rebuilt 96 current records at commit `e8e2747`
|
||||||
and immediately reported fresh with matching source fingerprints. The old
|
and immediately reported fresh with matching source fingerprints. The old
|
||||||
local-only hub-native rows were not migrated before the local database was
|
local-only hub-native rows were not migrated before the local database was
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue