--- id: ACTIVITY-WP-0029 type: workplan title: "Hub port and schedule alignment for State Hub retirement" domain: infotech repo: activity-core status: finished owner: grok topic_slug: infotech created: "2026-08-09" updated: "2026-08-22" parent_project: prj-state-hub-retirement parent_workplan: SHR-WP-0001 stream: S5 related: - ACTIVITY-WP-0015 - ACTIVITY-WP-0017 - ACTIVITY-WP-0026 - HUB-WP-0004 - RMGR-WP-0001 - STATE-WP-0079 - CORE-WP-0010 - SHR-ARCH-HUB-0001 state_hub_workstream_id: "0890b1cf-fed0-5c5e-8f7a-d5799b997532" --- # Hub port and schedule alignment for State Hub retirement ## Goal Align activity-core **schedules, sinks, and the execution-queue boundary** with the post–State Hub owners so this repo stays the Event Bridge (when / what / where) and does not absorb work that now has a clearer home. Reviewed 2026-08-18 against `prj-state-hub-retirement` (SHR-ARCH-HUB-0001, SHR-INV-0001, child-workplan map S5), `repo-manager` INTENT, `info-tech-canon` (Task / Organization / Governance / Repository Layout), and `policy-nexus` INTENT. ## Responsibility map activity-core **owns** schedule fire, rule/instruction evaluation, bounded declared side-effects, spawn/run evidence, and the **ops_run claim queue** (ACTIVITY-WP-0026). It does not own the things it currently *calls*. | Concern | Owner | activity-core role | | --- | --- | --- | | Cron / event / one-shot fire | **activity-core** | Authority | | Ops-run claim / lease | **activity-core** | Authority (not a task database) | | Work-item semantics (Task, Commitment, TaskState) | **info-tech-canon** | Consume vocabulary; do not redefine | | Who is responsible / accountable | **info-tech-canon** Organization Model | Do not invent org roles here | | Policy *content* (canon, ADRs) | Owning repo | Local files stay source of truth | | Policy *publication* | **policy-nexus** | Do not publish or host policy | | Regulatory interpretation | **risk-nexus** | Out of scope | | Repo registry, file↔index consistency, work-record index | **repo-manager** | Schedule the sweep; do not own C-rules | | Messages, progress projections, hub ports | **hub-core** (surviving runtime) | Sink / consume after HUB-WP-0004 | | core-hub `/api/v2` | **CORE-WP-0010** → absorbed into hub-core | Temporary dual-run only | | Issue projection | **issue-core** | Optional `ISSUE_SINK_TYPE=rest` | | State Hub routes used today | **STATE-WP-0079** strangler | Compatibility until cutover | Naming: **hub-core** is the surviving framework *and* runtime (SHR-ARCH-HUB-0001). **core-hub** is the current production host to be archived. Do not treat them as interchangeable, and do not add permanent authorities on State Hub. Inventory split that T02 must honour (`job:consistency-sweep-remote-all`): activity-core **stays the executor**; the reconciliation engine **moves** to repo-manager (`route:POST:/consistency/sweep/remote-all`, disposition `move`). T04 is a **replace** of State Hub `/execution/*` onto activity-core. That is **schedule / launch / ops_run** ownership, not workplan file authority (repos) and not task lifecycle (issue-core / work records / ITC Task Model). Out of this workplan: SBOM catch-up (CUST-WP-0062 / ACTIVITY-WP-0030, parked). ## Map current State Hub / hub-core callers ```task id: ACTIVITY-WP-0029-T01 status: done priority: high state_hub_task_id: "eef44f5f-1866-5539-adcf-661eeca2419b" ``` Inventory schedules, sinks, and context resolvers that call State Hub or core-hub APIs. For each caller record: current URL, SHR-INV item if any, **target owner** (table above), and target port when HUB-WP-0004 has named it (`port.schedule` is ours to consume, not to invent in hub-core). Do not retarget a caller to activity-core just because we schedule it. ## Retarget consistency sweep ```task id: ACTIVITY-WP-0029-T02 status: done priority: high state_hub_task_id: "13465801-fe1c-519c-935e-652376b6126a" ``` Keep the activity-core schedule. Point the remote sweep at **repo-manager** (or the existing State Hub dual-run adapter until RMGR cutover) without losing C-rule coverage. RMGR-WP-0001 is finished; do not re-implement consistency inside this repo. ## Align ops evidence sink ```task id: ACTIVITY-WP-0029-T03 status: done priority: medium state_hub_task_id: "2d21912e-32af-5baa-b9f3-ec059d4aa69e" ``` HUB-WP-0004 finished and hub-core became production authority on 2026-08-21. Activity-core now implements `hub-core-interaction-event` against canonical `POST /ports/events/interaction`, then verifies the accepted id through `GET /ports/projections/interaction_events`. The Railiance projection points `HUB_CORE_BASE_URL` at the in-cluster hub-core runtime and uses this sink; it does not require the legacy Core Hub widget mapping/runtime-token contract. The old `core-hub-interaction-event` compatibility sink remains available for the no-writer rollback window, but is no longer the configured probe path. General progress callers not yet moved by the retirement strangler continue to use the State Hub beachhead rather than creating another permanent authority. Unit and deployment-wiring tests cover catalog envelope shape, readback, sanitization, missing configuration, and the in-cluster target. A disposable integration smoke against hub-core 0.2.0 returned `202 Accepted` from the canonical interaction port and verified the new event through the interaction projection. ## Execution queue boundary ```task id: ACTIVITY-WP-0029-T04 status: done priority: medium state_hub_task_id: "fc67e34c-25a1-5c3a-9766-fb79c76aef00" ``` Document the contract first, then replace State Hub `/execution/*` callers with activity-core (ops_run / launch), matching SHR-INV `workplan-execution-queue`. Explicit non-goals: repo-manager work-record index, issue-core lifecycle, ITC Task Model types, policy-nexus publication. ## Acceptance - [x] Caller map lists owner + current URL for every State Hub / core-hub call (`docs/state-hub-caller-map.md`) - [x] Sweep still fires from activity-core and hits repo-manager (or dual-run) (`CONSISTENCY_SWEEP_URL` / `REPO_MANAGER_URL`; default State Hub adapter) - [x] Ops evidence uses hub-core's canonical interaction port; the legacy Core Hub sink is rollback-only - [x] Execution boundary is written so `/execution/*` cannot be read as "activity-core owns tasks" (`docs/execution-queue-boundary.md`, `GET /execution/semantics`, 410 on workplan routes)