--- id: ACTIVITY-WP-0029 type: workplan title: "Hub port and schedule alignment for State Hub retirement" domain: infotech repo: activity-core status: active owner: grok topic_slug: infotech created: "2026-08-09" updated: "2026-08-18" 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: "1b18849c-db3a-40a0-8f22-7af7fd4dbcfc" --- # 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: "03021be2-5d60-455b-9c9c-b8681d65911c" ``` 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: "f8107e2b-ab1f-4a3b-9348-8d5dcfb647b4" ``` 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: wait priority: medium state_hub_task_id: "3fbadbfe-9107-4869-b53f-3b9b46e0555a" ``` Wait on **HUB-WP-0004** (ports still `proposed`) and the CORE-WP-0010 absorption path. Interaction-event / progress evidence follows the **hub-core** runtime, not a permanent core-hub or State Hub host. Update smokes when the port exists. Until then, keep the State Hub beachhead (ACTIVITY-WP-0015) as the compatibility sink. ## Execution queue boundary ```task id: ACTIVITY-WP-0029-T04 status: done priority: medium state_hub_task_id: "a34b42c3-8a08-482b-936f-14675ee254ca" ``` 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] Evidence sink plan names hub-core as the permanent host; T03 stays wait until that port exists - [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)