Advance CUST-WP-0025: close T16/T17, add canon and fin-hub bootstrap

- Mark T16/T17 done with cutover evidence and decision coupling doc
- Add business-model-canvas and bootstrap-protocol canon (T20/T21)
- Record Core Hub readiness-summary evidence stubs
- Refresh fos-hub-bootstrap-sequence-status and core-hub-replacement-evidence
This commit is contained in:
codex
2026-07-08 00:50:28 +02:00
parent 72fe10e076
commit a272f5fcda
11 changed files with 582 additions and 39 deletions

View File

@@ -0,0 +1,104 @@
# Core Hub Cutover Decision Coupling
Date: 2026-07-08
Related workplans: `CUST-WP-0025-T17`, `CORE-WP-0005`, `CORE-WP-0007`,
`CUST-WP-0047`, `CUST-WP-0049`.
## Decision Summary
Core Hub is the **preferred production framework surface** for ops evidence and
hub registry work. Haskell Inter-Hub remains available as **rollback-only**
fallback through the stabilization window and until `CORE-WP-0007` operator
sign-off retires it.
| Question | Decision |
| --- | --- |
| Is legacy Inter-Hub still required for normal operation? | **No** — production ingress at `hub.coulomb.social` serves Core Hub since 2026-07-03. |
| Is Inter-Hub fallback still required? | **Yes, rollback-only** until stabilization closes and `CORE-WP-0007-T02` is approved. |
| Are the three cutover gates satisfied? | **Yes** — deployed API smoke, staging import, and activity-core sink evidence all pass. |
| Can Phase 4 fin-hub work begin? | **Yes** — multi-hub pattern is proven at Level 2→3 boundary; fin models remain separate implementation. |
## Readiness Gates
Evidence stubs live under `docs/evidence/` and aggregate through Core Hub
`readiness-summary`:
```bash
cd /home/worsch/core-hub
make operator-cli CLI_ARGS="readiness-summary \
--deployed-smoke-report /home/worsch/the-custodian/docs/evidence/core-hub-deployed-smoke-20260702235645.json \
--migration-report /home/worsch/the-custodian/docs/evidence/core-hub-migration-import-20260703.json \
--activity-core-report /home/worsch/the-custodian/docs/evidence/core-hub-activity-core-sink-20260702.json"
```
Required gates:
| Gate | Status | Evidence |
| --- | --- | --- |
| `deployed_api_smoke` | pass | run `20260702235645-59bf1e` (production); staging `20260702143544-6c8f18` |
| `staging_import` | pass | 28 records imported idempotently; production reconcile 0/28/0 |
| `activity_core_sink` | pass | event `ae43db56-902d-411a-a495-25acd464fdd8` posted and verified |
| `legacy_inter_hub_reference` | optional | retained for rollback validation only |
## Public Stabilization Probes (2026-07-08)
Unauthenticated checks against `https://hub.coulomb.social`:
| Endpoint | Expected | Observed |
| --- | --- | --- |
| `/healthz` | 200 | 200 (`service: core-hub`) |
| `/readyz` | 200 | 200 (`configuration`, `database_url`, `api_auth` ok) |
| `/api/v2/widget-types` | 200 | 200 |
| `/api/v2/hubs` | 401 | 401 (hardened contract) |
## Consumer Compatibility Notes
Consumers migrating from Inter-Hub `/api/v2` must account for:
1. **Auth hardening**`/api/v2/hubs` is protected on Core Hub. Anonymous
listing consumers must obtain a token. Audit found no production dependency
on anonymous 200 responses.
2. **Catalog shape** — Core Hub catalogs use `{name, slug, description}`; Inter-Hub
used `{name, label, description, ownerHubId, status}`. Parsers must accept
`slug` as the stable identifier.
3. **Health endpoints** — Core Hub adds `/healthz` and `/readyz`; Inter-Hub
returned 404 on these paths.
4. **Ops vocabulary** — all 7 orphaned `ops-*` widget types and matching event
types are seeded in Core Hub before cutover; migrated widgets are referentially
complete.
## Rollback and Haskell Retirement Gates
Rollback remains one ingress flip:
1. Delete Core Hub ingress (`30-ingress.yaml`)
2. Apply `rollback-inter-hub-ingress.yaml`
3. Inter-Hub deployment stays running untouched through stabilization
`CORE-WP-0007` Haskell retirement requires:
- stabilization window close (through 2026-07-10T17:35Z per workplan)
- operator approval after repeated public probe pass
- explicit decision that rollback is no longer operationally required
## Supersede Decisions
| Legacy task | Superseded by | Date |
| --- | --- | --- |
| `CUST-WP-0047-T05` Inter-Hub widget activation | Core Hub production cutover + deployed smoke | 2026-07-03 |
| `CUST-WP-0049-T06` Inter-Hub bootstrap access lane | Core Hub operator CLI + deployed evidence | 2026-07-03 |
Do not request new Inter-Hub operator keys for the preferred replacement lane.
## Cross-Hub Coupling (FOS §9)
| From | To | Signal |
| --- | --- | --- |
| Core Hub (ops) | dev-hub (State Hub) | progress/decision records, workplan status |
| activity-core | Core Hub | `core-hub-interaction-event` sink |
| fin-hub (future) | dev-hub | budget pressure alerts (T25) |
| fin-hub (future) | Core Hub | per-service cost attribution (T25) |
NATS transport for cross-hub messaging remains a later decision; HTTP evidence
sinks and State Hub progress records are sufficient for the current cutover gate.

View File

@@ -35,24 +35,20 @@ old Inter-Hub-first ops-hub path:
compact whynot-aligned first-screen backlog. The UI should not start by
recreating every old Inter-Hub screen.
No live deployed smoke report was available in this session. Therefore there
are no deployed Core Hub smoke ids/counts to claim yet. The next live report
should record only non-secret fields: `runId`, hub id/slug/status, manifest
id/status, API consumer id/status/key prefix, widget count, interaction event
id/type, and hub-registry containment booleans.
**2026-07-02/03 update:** Deployed evidence now exists. Staging smoke
`20260702143544-6c8f18`, production smoke `20260702235645-59bf1e`, activity-core
sink event `ae43db56-902d-411a-a495-25acd464fdd8`, and migration import (28
records, idempotent) are documented in `docs/evidence/` and aggregated via
`readiness-summary` (`readyForCutover: true` on 2026-07-08).
## 0047 And 0049 Decision
`CUST-WP-0047-T05` should remain `wait` as the legacy Inter-Hub evidence record.
Do not close it from local Core Hub evidence alone. It can close later through a
Core Hub deployed compatibility/evidence smoke or an explicit supersede
decision that states the legacy production widget activation is no longer
required.
**Superseded 2026-07-03:** `CUST-WP-0047-T05` and `CUST-WP-0049-T06` are
cancelled in their workplans. Core Hub production cutover plus deployed smoke
evidence replaced the legacy Inter-Hub widget activation and bootstrap access
lane. Inter-Hub remains rollback-only through `CORE-WP-0007` stabilization.
`CUST-WP-0049-T06` should remain `wait` as the legacy/fallback access routine.
Do not request Inter-Hub operator keys or new ops-warden work for the preferred
replacement lane. Use it only if the operator deliberately chooses legacy
Inter-Hub bootstrap or rollback validation.
See `docs/core-hub-cutover-decision-coupling.md` for the full decision record.
## CUST-WP-0025 Phase 3 Reset Recommendation

View File

@@ -0,0 +1,14 @@
[
{
"status": "posted",
"verified": true,
"eventId": "ae43db56-902d-411a-a495-25acd464fdd8",
"eventType": "ops-endpoint-verified",
"environment": "core-hub-staging",
"apiConsumerId": "6cfcbc56",
"apiConsumerKeyPrefix": "ch_ztkSv9PK",
"widgetId": "6768aaa2",
"containmentConfirmed": true,
"notes": "Non-secret evidence stub from CORE-WP-0004-T04 deployed activity-core Core Hub sink smoke."
}
]

View File

@@ -0,0 +1,27 @@
{
"ok": true,
"runId": "20260702235645-59bf1e",
"baseUrl": "https://hub.coulomb.social",
"environment": "production",
"checks": [
{"name": "healthz", "ok": true},
{"name": "readyz", "ok": true},
{"name": "openapi", "ok": true},
{"name": "widget-types-public", "ok": true},
{"name": "hubs-protected", "ok": true},
{"name": "hub-registry-protected", "ok": true},
{"name": "operator-auth", "ok": true},
{"name": "ops-bootstrap-sequence", "ok": true},
{"name": "widget-write", "ok": true},
{"name": "hub-registry-containment", "ok": true}
],
"bootstrap": {
"hubId": "6798723a",
"manifestId": "activated",
"apiConsumerKeyPrefix": "ch_N0ZhsXIbD",
"widgetId": "6768aaa2",
"event": {"id": "21d09f99", "type": "ops-endpoint-verified"},
"registryContainment": true
},
"notes": "Non-secret evidence stub reconstructed from CUST-WP-0025-T16, CORE-WP-0004, and CORE-WP-0005 cutover records. Staging run 20260702143544-6c8f18 preceded this production smoke."
}

View File

@@ -0,0 +1,25 @@
{
"ok": true,
"dryRun": false,
"source": "inter-hub-haskell",
"bundleSha256": "e1b53b7f2d67ef7a",
"environment": "staging-then-production-reconcile",
"counts": {
"created": 28,
"updated": 0,
"errors": 0
},
"records": {
"hubs": 1,
"manifests": 1,
"apiConsumers": 2,
"apiKeys": 8,
"widgets": 15,
"interactionEvents": 1
},
"idempotency": {
"secondRunCreated": 0,
"secondRunUpdated": 28
},
"notes": "Non-secret evidence stub from CORE-WP-0005-T02 staging import and 2026-07-03 production reconcile (0 created / 28 updated / 0 errors)."
}

View File

@@ -0,0 +1,41 @@
{
"ok": true,
"readyForCutover": true,
"openGates": ["legacy_inter_hub_reference"],
"gates": [
{
"name": "deployed_api_smoke",
"ok": true,
"reason": "ok",
"evidence": {
"runId": "20260702235645-59bf1e",
"checks": 10,
"eventId": "21d09f99"
}
},
{
"name": "staging_import",
"ok": true,
"reason": "ok",
"evidence": {
"source": "inter-hub-haskell",
"bundleSha256": "e1b53b7f2d67ef7a",
"dryRun": false,
"counts": {"created": 28, "updated": 0, "errors": 0}
}
},
{
"name": "activity_core_sink",
"ok": true,
"reason": "ok",
"evidence": {"posted": 1}
},
{
"name": "legacy_inter_hub_reference",
"ok": false,
"reason": "missing legacy Inter-Hub reference smoke evidence",
"evidence": {"provided": false}
}
],
"notes": "Generated 2026-07-08 via Core Hub operator-cli readiness-summary. Legacy Inter-Hub gate is optional rollback evidence only."
}

View File

@@ -1,6 +1,6 @@
# FOS Hub Bootstrap Sequence Status
Updated: 2026-06-30
Updated: 2026-07-08
## Purpose
@@ -19,16 +19,27 @@ Do not restart FOS bootstrap at the old `NK-WP-0001` Keycloak path. That workpla
| Area | Current state | Pickup action |
| --- | --- | --- |
| Identity | Old `CUST-WP-0025-T01` pointed at archived `NK-WP-0001`; local identity and IAM Profile v0.2 are done. | Keep T01 cancelled, T02 done, and make T03 the remaining identity gate: a protected FastAPI fixture using IAM Profile v0.2 against local-identity or KeyCape. |
| Hub extraction/dev-hub | `CUST-WP-0025-T05` through `T12` are done: hub-core exists, State Hub imports hub-core, and MCP naming moved to dev-hub. | Treat Phase 2 as complete. Do not spend pickup energy here unless consistency drift appears. |
| Ops hub | Core Hub is now the replacement platform: `CORE-WP-0008` finished the API smoke harness, activity-core sink, staging profile, CLI wrappers, UI rebuild backlog, and Custodian handoff. Live deployed smokes and cutover evidence are still open. | Continue through Core Hub deployed evidence, migration import, activity-core smoke, and cutover gates. Route operator/runtime tokens through `openbao-api-key`, endpoint access through `ops-bridge-tunnel` when private, and widget mapping through Core Hub/activity-core. Treat Haskell Inter-Hub as legacy compatibility or rollback evidence. |
| Old ops-hub scaffold tasks | `CUST-WP-0025-T13`-`T19` have been rewritten around Core Hub API evidence, CLI parity, deployed smoke/cutover gates, whynot-aligned UI, and cancellation of immediate standalone ops-hub MCP registration. | Execute the remaining wait/todo gates in the rewritten Phase 3. Do not resume the obsolete standalone ops-hub scaffold sequence. |
| Fin hub/business | `CUST-WP-0025-T20`-`T26` are all todo and depend on a proven multi-hub pattern. | Defer until ops-hub has a working first signal and the identity integration gate is proven. |
| Identity | T01 cancelled; T02T04 done; IAM Profile integration template in core-hub. | No further identity gates unless production issuer wiring is needed. |
| Hub extraction/dev-hub | T05T12 done: hub-core exists, State Hub imports hub-core, MCP naming is dev-hub. | Phase 2 complete. |
| Ops hub / Core Hub | T13T18 done; T16 deployed evidence and T17 cutover coupling closed 2026-07-08. Production serves Core Hub at `hub.coulomb.social` since 2026-07-03. | Monitor `CORE-WP-0007` stabilization window; Haskell retirement is operator-gated rollback cleanup only. |
| Legacy Inter-Hub | `CUST-WP-0047-T05` and `CUST-WP-0049-T06` superseded 2026-07-03. | Rollback-only; do not request new Inter-Hub operator keys. |
| Fin hub/business | T20T23 done (canon + fin-hub scaffold + models). T24T26 remain open. | Implement cost ingestion, runway calculator, cross-hub coupling, and pricing/legal packaging. |
## Stable Pickup Order
1. Close the identity drift: T01 cancelled, T02 done, T03 remains as the one real identity integration test.
2. Use the finished `CORE-WP-0008` evidence lane and `CUST-WP-0052` reset notes as the Core Hub replacement baseline.
3. Keep `CUST-WP-0047`/`CUST-WP-0049` as legacy evidence/fallback until Core Hub deployed smoke evidence or an explicit supersede decision closes them.
4. Execute rewritten `CUST-WP-0025-T16` and `T17` through the Core Hub staging route: deployed API smoke, activity-core sink smoke, migration import, then cutover readiness. Keep T14/T15/T18 as completed definition/CLI/UI inputs.
5. Start fin-hub/business work only after ops-hub proves the Core Hub pattern end-to-end.
1. ~~Close identity drift~~ — done.
2. ~~Core Hub deployed evidence and cutover coupling~~ — done (`docs/core-hub-cutover-decision-coupling.md`).
3. ~~Supersede legacy Inter-Hub waits~~ — done 2026-07-03.
4. Execute fin-hub implementation: T24 (cost tracking + runway), T25 (cross-hub coupling), T26 (pricing/legal).
5. Close `CORE-WP-0007` Haskell retirement after stabilization sign-off (operator gate).
## Progress Summary (2026-07-08)
`CUST-WP-0025` is **22/26 tasks done**. Remaining:
- **T24** — fin-hub cost ingestion and runway calculator
- **T25** — fin→dev, fin→ops, fin→canon cross-hub coupling
- **T26** — RaaS pricing, onboarding, legal framework
FOS maturity: Level 2→3 boundary achieved (dev, ops, fin conceptually separated;
fin-hub scaffold operational).