Skip to content

fix(showcase): add showcase-harness-worker to Railway SSOT (railway-envs.ts)#5280

Merged
jpr5 merged 2 commits into
mainfrom
fix/showcase-harness-worker-ssot
Jun 5, 2026
Merged

fix(showcase): add showcase-harness-worker to Railway SSOT (railway-envs.ts)#5280
jpr5 merged 2 commits into
mainfrom
fix/showcase-harness-worker-ssot

Conversation

@jpr5

@jpr5 jpr5 commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Summary

The pool-fleet cutover manually created a new staging-only Railway service showcase-harness-worker (HARNESS_ROLE=worker, 2 replicas) and flipped the existing harness service to HARNESS_ROLE=control-plane. The new service was not in the SSOT (showcase/scripts/railway-envs.ts), so verify-railway-image-refs.ts failed the "Showcase: Build & Push" workflow on every push to main:

✗ [railway] showcase-harness-worker
    reason: Railway service "showcase-harness-worker" is not in the SSOT.

Because the build job needs: [verify-image-refs], that gate failure skipped the harness build — meaning recent harness fixes (e.g. #5279's chat-rung probe) never rebuilt to staging. The secondary Aggregate build results ENOENT failure was a downstream consequence of the skipped build.

This PR adds showcase-harness-worker to SERVICES, matching the live Railway service:

  • ciBuilt: false — the worker runs the SAME showcase-harness GHCR image the existing harness build slot produces; there is no separate worker build slot.
  • gateIgnore: true / gateValidated: false — the worker is staging-only (no prod serviceInstance) and domain-less (it pulls jobs from the control-plane queue rather than serving HTTP), so it does not fit the symmetric dual-env / public-domain shape the image-ref gate validates. gateIgnore clears the "untracked Railway service" failure (any SSOT entry counts as known) without triggering a false "missing from prod" failure (findMissingServices only checks gateValidated: true entries).
  • repoNameOverrideshowcase-harness so the image-ref shape resolves correctly.
  • probe disabled in both envs — no externally-reachable health endpoint.

The existing harness (now control-plane) entry is unchanged and remains correct (it still builds + serves the showcase-harness image on its public domain).

Also regenerates railway-envs.generated.json and updates the SSOT-count / gate-coverage test invariants (27 → 28 services; the worker is the sole intentional gateIgnore/gateValidated:false entry).

Proof

Against live Railway (CLI auth):

  • Before: ✗ Railway image-ref drift detected (... 1 untracked Railway services ...)
  • After: ✓ 54 env-scoped instances verified (1 skipped) — worker is the 1 skipped (gateIgnore), 0 untracked.
  • emit-railway-envs-json.ts --check: up to date.

Test plan

  • verify-railway-image-refs.ts passes against live Railway (0 untracked)
  • emit-railway-envs-json.ts --check passes (generated JSON regenerated)
  • Full showcase/scripts vitest suite: 1772 passed (49 files)
  • CI green on "Showcase: Build & Push" after merge (the gate failure that skipped the harness build is removed)

…nvs.ts)

The pool-fleet cutover manually created the staging-only
`showcase-harness-worker` Railway service (HARNESS_ROLE=worker, 2
replicas) and flipped the existing `harness` service to
HARNESS_ROLE=control-plane. The new service was untracked in the SSOT,
so verify-railway-image-refs.ts failed the "Showcase: Build & Push"
workflow on every push to main (1 untracked Railway service), which
skipped the harness `build` job and blocked harness image rebuilds.

Add the worker to SERVICES as a staging-only, domain-less queue worker:
- ciBuilt:false — it runs the SAME `showcase-harness` image the existing
  harness build slot produces; there is no separate worker build.
- gateIgnore:true / gateValidated:false — no prod instance and no public
  domain, so it does not fit the symmetric dual-env shape the image-ref
  gate validates. gateIgnore clears the "untracked Railway service"
  failure (any SSOT entry counts as known) without tripping a false
  "missing from prod" failure.
- repoNameOverride → showcase-harness so the image-ref shape resolves.
- probe disabled in both envs (no externally-reachable health endpoint).

Regenerate railway-envs.generated.json and update the SSOT-count and
gate-coverage test invariants (27→28 services; worker is the sole
intentional gateIgnore/gateValidated:false entry).
@vercel

vercel Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview, Comment Jun 5, 2026 8:03pm
research-canvas Ready Ready Preview, Comment Jun 5, 2026 8:03pm
travel Ready Ready Preview, Comment Jun 5, 2026 8:03pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
chat-with-your-data Skipped Skipped Jun 5, 2026 8:03pm
form-filling Skipped Skipped Jun 5, 2026 8:03pm

Request Review

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

📣 Social Copy Generator

Generate social media copies (Twitter/X, LinkedIn, Blog Post) for this PR using Claude.

  • Generate social media copies

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Production Digest-Pinning Audit

Audit could not run this round.

Error
graphql error: GraphQL: ServiceInstance not found

Run 2026-06-05 13:00:32 PDT — 0 finding(s).

@vercel vercel Bot temporarily deployed to Preview – chat-with-your-data June 5, 2026 20:00 Inactive
@vercel vercel Bot temporarily deployed to Preview – form-filling June 5, 2026 20:00 Inactive
@jpr5 jpr5 merged commit de643ec into main Jun 5, 2026
6 checks passed
@jpr5 jpr5 deleted the fix/showcase-harness-worker-ssot branch June 5, 2026 20:05
jpr5 added a commit that referenced this pull request Jun 5, 2026
…SOT (unblock harness builds) (#5286)

## Summary

The `showcase_build` workflow's pre-build `verify-image-refs` gate (SSOT
= `showcase/scripts/railway-envs.ts`) was **failing all staging
deploys** with `1 untracked Railway services`. The interim
`harness-legacy` staging service (id
`11279eba-97eb-417e-82a5-7cb4254eb147`, project `showcase`, env
`staging`) exists on Railway but had no SSOT entry, so the Railway→SSOT
drift check failed → build skipped → nothing deployed (this blocked PR
#5283's merge build).

`harness-legacy` is the **interim legacy all-probe harness**
(`HARNESS_ROLE` unset) stood up to keep non-d6 coverage live during the
fleet migration. It is **not CI-built** (runs a pinned pre-fleet image
digest set out-of-band) and will be torn down at migration end.

## Change

- Adds a `harness-legacy` entry to `SERVICES` mirroring the
`showcase-harness-worker` precedent (PR #5280):
- `ciBuilt: false` — not built by `showcase_build`; no dedicated build
slot.
- `gateIgnore: true` — deliberately-untracked for the image-ref gate.
`findUntrackedServices` treats any SSOT entry as known, so this clears
the "untracked" failure; `gateValidated: false` keeps
`findMissingServices` from flagging it.
- `repoNameOverride` → `showcase-harness` for both envs (same image-ref
shape as the control-plane harness).
- Real serviceInstance IDs recorded for both envs (resolved via Railway
GraphQL); probe disabled in both envs.
- Regenerates `railway-envs.generated.json`.
- Updates service-count and gate-ignored carve-out assertions across the
three affected test files (28 → 29 services; `harness-legacy` added to
the two `GATE_IGNORED` sets).

## Verification

- **Live gate (red→green):** without the entry,
`verify-railway-image-refs.ts` exits **1** with `harness-legacy is not
in the SSOT`; with the entry it exits **0** — `✓ 54 env-scoped instances
verified (2 skipped)`.
- **Full scripts test suite green:** 1771 passed (49 files), including
`railway-envs.test.ts`, `verify-railway-image-refs.test.ts`, and
`emit-railway-envs-json.test.ts`.
- **`emit --check`** confirms `railway-envs.generated.json` is in sync.
- **tsc** clean (`tsc --noEmit -p showcase/scripts/tsconfig.json`).

## Test plan

- [x] `npx tsx showcase/scripts/verify-railway-image-refs.ts` exits 0
against live Railway
- [x] `vitest run` in `showcase/scripts` fully green
- [x] `npx tsx showcase/scripts/emit-railway-envs-json.ts --check`
passes
- [x] `tsc --noEmit -p showcase/scripts/tsconfig.json` clean
- [ ] CI green on this PR

🤖 Generated with [Claude Code](https://claude.com/claude-code)
pull Bot pushed a commit to TheRakeshPurohit/CopilotKit that referenced this pull request Jun 5, 2026
…SOT (unblock harness builds)

The showcase_build verify-image-refs gate (SSOT = showcase/scripts/railway-envs.ts)
was failing with "1 untracked Railway services" because the interim
harness-legacy staging service (the legacy all-probe harness kept live during
the pool-fleet migration) exists on Railway but had no SSOT entry. That
Railway->SSOT drift check skips the build, so nothing deploys.

Adds a harness-legacy SERVICES entry mirroring the showcase-harness-worker
precedent (PR CopilotKit#5280): ciBuilt:false (not built by showcase_build, runs a pinned
out-of-band digest) and gateIgnore:true (deliberately-untracked for the image-ref
gate). findUntrackedServices treats any SSOT entry as known, so this clears the
untracked failure; gateValidated:false keeps findMissingServices from flagging
it. Real serviceInstance IDs for both envs recorded from Railway GraphQL.
Regenerates railway-envs.generated.json and updates the service-count /
gate-ignored carve-out assertions (28->29 services).

Verified: live verify-railway-image-refs.ts now exits 0 ("54 env-scoped
instances verified, 2 skipped"); without the entry it exits 1 with the
harness-legacy untracked failure. Full scripts test suite green (1771 passed).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant