--- id: CORE-WP-0007 type: workplan title: "Retire Haskell/IHP infrastructure after Core Hub cutover" domain: infotech repo: core-hub status: active owner: codex topic_slug: custodian created: "2026-06-27" updated: "2026-07-08" state_hub_workstream_id: "a8d66822-e435-4b1e-ad81-37a298d1795e" --- # Retire Haskell/IHP infrastructure after Core Hub cutover Remove the Haskell dependency from the production interaction framework after the replacement is proven. `CORE-WP-0005` finished 2026-07-03: `hub.coulomb.social` ingress now serves Core Hub; Inter-Hub compatibility, staging import, dual-run smokes, and production cutover gates are closed. Haskell retirement no longer waits on migration work — it waits on a short post-cutover stabilization window, operator approval to retire the Inter-Hub rollback deployment, and the four tasks below. ## Retire Probe Repo ```task id: CORE-WP-0007-T01 status: done priority: medium state_hub_task_id: "d3a494a3-dc23-491f-af32-1d19120b3aae" ``` Rename or archive `ihp-railiance-probe` (`coulomb/ihp-railiance-probe`), preserving `INTENT.md` and `DeploymentBlueprint.md` notes about the failed IHP/GHC/Nix build path. `IRP-WP-0001` is already `done`; this task is unblocked and can proceed independently of T02–T04. ## Rename Production Inter-Hub Repo ```task id: CORE-WP-0007-T02 status: wait priority: high state_hub_task_id: "16eb7ce3-b574-4667-a189-c14ff5d0502b" ``` Rename `inter-hub` to `inter-hub-haskell` after operator stabilization sign-off and approval to retire the Inter-Hub rollback path. Compatibility, migration, and production cutover gates from `CORE-WP-0005` are satisfied; the Inter-Hub k8s deployment in namespace `inter-hub` still runs as rollback-only (ingress already moved — see `k8s/railiance-production/README.md`). Stabilization evidence is collected automatically through 2026-07-10 by the scheduled `core_hub_stabilization_check` / `core_hub_stabilization_closeout` jobs (see runbook `docs/deployment/stabilization-signoff.md`). T02 unblocks when the closeout passes (`operator_signoff_needed=true`) and the operator records retirement approval in State Hub. Scope when unblocked: Forgejo repo rename, registry/Helm/CI path updates in `railiance-apps` and `railiance-forge`, and eventual scale-down of the rollback deployment after the stabilization window closes. ## Decommission Haskell Build Lane ```task id: CORE-WP-0007-T03 status: wait priority: medium state_hub_task_id: "bea9943c-916f-402f-a6d9-7907bb48137c" ``` Retire or park haskelseed runner labels, the `haskell-build` VM profile, IHP/GHC/Nix/devenv docs, and build-machine workplans after T02 completes and no active repo still needs Haskell image builds. Primary touchpoints: `railiance-forge` runner substrate docs, `sand-boxer` `profile.vm-haskell-build`, and `ops-bridge` haskelseed tunnel notes. ## Update Cross-Repo References ```task id: CORE-WP-0007-T04 status: wait priority: medium state_hub_task_id: "ed7f8e01-5305-465c-8bfc-04bc47bfdf40" ``` After T02, update docs and workplans in consuming repos so production Inter-Hub references point to Core Hub and historical Haskell context explicitly names `inter-hub-haskell`. Known stale surfaces: `ops-hub` INTENT/SCOPE/README and readiness docs; `activity-core` railiance probes and sink vocabulary; `the-custodian` service catalog and drain plans. Core Hub specs and migration fixtures already use `inter-hub-haskell` as the bundle `source` name. ## Progress 2026-07-07 — upstream gate cleared `CORE-WP-0005` archived (`260703-CORE-WP-0005-data-migration-and-cutover.md`). Production cutover executed 2026-07-03: Core Hub serves `hub.coulomb.social`; post-flip reconcile import was idempotent (0 created / 28 updated / 0 errors); rollback remains one kubectl command while the Inter-Hub deployment stays running through stabilization. Revised sequencing: 1. **T01** — unblocked; archive `ihp-railiance-probe` first (low risk). 2. **T02** — cutover prerequisites met; blocked on operator stabilization sign-off and approval to retire the Inter-Hub rollback deployment. 3. **T03** — blocked on T02 and confirmation that no repo still schedules Haskell builds through haskelseed. 4. **T04** — blocked on T02 so references use the final repo name. Related finished workplans: `CORE-WP-0004` (compatibility smokes), `CORE-WP-0005` (migration/cutover), `CORE-WP-0008` (deployed ops evidence). ## Completion 2026-07-07 — T01 probe repo archived `ihp-railiance-probe` retired in-repo: - `README.md` marks the repo archived and points to preserved docs - `INTENT.md` and `SCOPE.md` updated with retirement context - `IRP-WP-0001` moved to `workplans/archived/260707-IRP-WP-0001-pipeline-validation.md` (`status: archived`) - Gitea/Forgejo CI workflows switched to `workflow_dispatch` only (no push triggers) Forgejo repo archived on `gitea.coulomb.social` (2026-07-07); git history and diagnostic docs remain available read-only. ## Progress 2026-07-07 — stabilization job live on railiance01 Post-cutover stabilization checks for T02 operator sign-off are implemented and deployed. Runbook: `docs/deployment/stabilization-signoff.md`. ### Window and schedule | Item | Value | | --- | --- | | Window start | 2026-07-03 (production cutover) | | Window end | 2026-07-10T17:35:00Z | | Daily check | 09:00 Europe/Berlin | | Closeout | one-shot at window end | Runs outside the window record `skipped` with `reason=outside_stabilization_window`. ### Automated checks (`core-hub` / `stabilization_check`) | Probe | Expected | | --- | --- | | `GET /healthz` | 200 | | `GET /readyz` | 200 | | `GET /api/v2/widget-types` | 200, count ≥ 26 | | `GET /api/v2/hubs` (unauthenticated) | 401 | Closeout sets `operator_signoff_needed=true` when `overall_pass=true`. ### Activity definitions (canonical in core-hub) | Job | ActivityDefinition id | State Hub `event_type` | | --- | --- | --- | | Daily | `b4c8e2f1-6a3d-4e5b-9f0c-2d7e8a1b3c4d` | `core_hub_stabilization_check` | | Closeout | `c5d9f3a2-7b4e-5f6c-0a1d-3e8f9b2c4d5e` | `core_hub_stabilization_closeout` | Files: `activity-definitions/core-hub-stabilization-{daily,closeout}.md`, projected into `activity-core/k8s/railiance/20-runtime.yaml`. Progress events bind to workstream `a8d66822…` / task `16eb7ce3…` (T02). ### Manual companion ```bash make stabilization-check # scripts/core_hub_stabilization_check.sh ``` Optional: `make deployed-smoke` with `CORE_HUB_OPERATOR_TOKEN_FILE` for full bootstrap evidence; `ops-hub` `make interhub-gate` against `hub.coulomb.social`. ### activity-core deployment (railiance01) - Image: `activity-core:railiance01-prod` rebuilt and imported into k3s - Resolver: `activity-core` `core-hub` context adapter (`stabilization_check`) - Evidence sink fix: `core-hub` sources now post State Hub progress (`activity-core` `726da05`) - Deployed: `actcore-api`, `actcore-worker`, `actcore-event-router` rolled out; `actcore-sync` registered both schedules on Temporal - First live event (cluster State Hub `http://state-hub.state-hub.svc.cluster.local:8000`, 2026-07-07T22:43:55Z): `Core Hub stabilization daily: pass; base=https://hub.coulomb.social; widget_types=26/26` Note: activity-core posts to the **cluster** State Hub on railiance01, not the workstation fallback at `127.0.0.1:8000`. Query via `state-hub-primary` tunnel or from inside the `activity-core` pod when reviewing evidence.