--- id: CORE-WP-0004 type: workplan title: "Implement Inter-Hub compatibility and consumer smokes" domain: infotech repo: core-hub status: active owner: codex topic_slug: custodian created: "2026-06-27" updated: "2026-06-27" state_hub_workstream_id: "ef13b0e9-f626-4d2c-9e00-ccb4906c3a3d" --- # Implement Inter-Hub compatibility and consumer smokes Preserve the Inter-Hub `/api/v2` behavior required by current consumers while Core Hub-native contracts mature. ## Public Registry Compatibility ```task id: CORE-WP-0004-T01 status: done priority: high state_hub_task_id: "4e24ab14-d5cf-4466-8287-21eaf075cb44" ``` Result 2026-06-27: Aligned catalog/docs/OpenAPI behavior with the active ops-hub gate. Static catalogs and docs are public; hub registry/bootstrap data is protected. `/api/v2/openapi.json` now includes the unprefixed path aliases expected by ops-hub gate checks. Local gate probe passed against Core Hub. ## Protected Bootstrap Compatibility ```task id: CORE-WP-0004-T02 status: done priority: high state_hub_task_id: "87073ee7-0213-4eed-881a-b18ab764ae65" ``` Result 2026-06-27: Replaced placeholders with persistence-backed protected routes for hubs, manifests, API consumers, API keys, widgets, interaction events, and hub registry. Runtime API keys are generated display-once and stored hashed. The real `ops-hub/scripts/ops-hub-bootstrap-api.py` passed against local Core Hub, creating ops-hub, an active manifest, API consumer, runtime key, 14 widgets, and one readiness event. ## ops-hub Smoke ```task id: CORE-WP-0004-T03 status: done priority: high state_hub_task_id: "2d18f575-135b-4ba8-9537-6920d0c61e1b" ``` 2026-06-27: Local smoke passed with a throwaway operator token and SQLite smoke DB. Remaining closure requires deployed Core Hub runtime plus approved credential routing. No secrets in logs, workplans, or chat. 2026-06-27 continuation: `CORE-WP-0008-T02` owns the deployed API smoke harness that should close this task once it passes against a deployed Core Hub runtime. ## activity-core Smoke ```task id: CORE-WP-0004-T04 status: wait priority: medium state_hub_task_id: "c3d1c153-0059-470c-bb2d-0b14f2d77b94" ``` Waiting on a deployed Core Hub runtime or an explicit State Hub fallback decision for the transition path. 2026-06-27 continuation: `CORE-WP-0008-T03` owns the activity-core Core Hub sink or explicit fallback decision. 2026-06-27 continuation update: `CORE-WP-0008-T03` and `ACTIVITY-WP-0017` implemented and locally proved the direct activity-core -> Core Hub interaction-event sink. This removes the consumer implementation blocker; this task still waits for a deployed Core Hub runtime plus approved runtime token and widget mapping before it can be marked done. ## Progress 2026-07-02 — deployed staging smoke passed Core Hub staging is live on the CoulombCore cluster (operator-approved decision set: CoulombCore + generated staging Secrets + Gitea registry): namespace `core-hub-staging`, image `gitea.coulomb.social/coulomb/core-hub:3ed8531`, dedicated `core_hub_staging` database on apps-pg (namespace labeled `railiance.io/postgres-client=apps-pg` to satisfy the default-deny NetworkPolicy), Alembic migrate job `Completed`, API rolled out healthy. T03 closed: `core_hub_deployed_smoke` ran in-cluster (token via `secretKeyRef`, never leaving the namespace) — run `20260702143544-6c8f18`, `ok=true`, 10/10 checks (health, ready, OpenAPI, four public catalogs, protected-401s, operator auth) plus the full ops-hub bootstrap sequence: hub `6798723a`, activated manifest, API consumer key prefix `ch_N0ZhsXIbD`, widget, interaction event `21d09f99` (`ops-endpoint-verified`), hub registry containing both. Two fixes landed en route: `psycopg2-binary` added to main deps (migrations image lacked the sync driver — commit `3ed8531`) and the NetworkPolicy label requirement documented above. T04 remaining (unchanged owner): run the ACTIVITY-WP-0017 activity-core sink against this deployed staging API with an approved runtime token and widget mapping. The deployed-runtime precondition is now met.