GloriousFlywheel MassageIthaca Dogfood Playbook 2026-04-17

GloriousFlywheel MassageIthaca Dogfood Playbook 2026-04-17

Superseded on 2026-04-23 by the pooled substrate dogfood reset. Hosted beta-validation escape hatches are not acceptable as the canonical contract for MassageIthaca.

Correction on 2026-04-23: Repo-specific runner labels such as massageithaca-* are not the intended GloriousFlywheel architecture. Treat earlier repo-shaped lane language in this note as historical drift, not as the active platform direction.

Additional correction on 2026-04-24: Preserve this note only for the beta-validation evidence and branch/runtime facts it captured. Its earlier repo-owned dogfood framing is retired; do not use this note to justify MassageIthaca-specific runner taxonomy or repo-owned canaries.

Snapshot date: 2026-04-17

Correction on 2026-04-24:

  • the later Phase 2 live test showed the historical multilabel array ["self-hosted","Linux","X64","honey","massageithaca"] was not a broker-assigned contract
  • the current proven repo variable is ["massageithaca"]
  • treat the older array below as unproven intent, not current authority truth

Purpose

Capture a historical snapshot of how MassageIthaca exposed beta-validation gaps and repo-shaped runner drift during April 2026.

This note is useful as evidence for why the pooled-substrate reset happened. It is not active architecture guidance, and it should not be read as advocating a repo-local runner contract.

GitHub owner: #210

Why MassageIthaca Matters

Jesssullivan/MassageIthaca is not just another downstream repo:

  • it exposed that repo-local labels and variables had been allowed to stand in for the shared capability-class contract
  • it is a real product repo with deploy, smoke, and Playwright-style beta validation instead of only build-only CI
  • it exposes the remaining contract gap cleanly inside one repo: core CI was already attempting self-hosted execution, while beta validation still escaped to GitHub-hosted runners

Observed Workflow Reality

From direct workflow, variable, and run inspection on 2026-04-17:

  • .github/workflows/ci.yml
    • test-unit, theme-validate, check, and build all use: runs-on: ${{ fromJSON(vars.PRIMARY_LINUX_RUNNER_LABELS_JSON || '["ubuntu-latest"]') }}
    • repository variable PRIMARY_LINUX_RUNNER_LABELS_JSON is set to: ["self-hosted","Linux","X64","honey","massageithaca"]
    • smoke-beta and e2e-beta still use plain ubuntu-latest
  • dev/main run 24561967515
    • green: Theme Validation (71812543065), Unit Tests (71812543084), Type Check (71812629814), and Build (71812629852)
    • failed before runner assignment: E2E Tests (Beta) (71812744601) and Smoke Test (Beta) (71812744629)
    • GitHub’s job annotation says those jobs were not started because recent account payments failed or the spending limit needs to be increased
  • newer PR run 24562197983 for MassageIthaca#186 is green, so the repo is still moving and the blocker is not a fresh application regression
  • theme-validate already succeeds on the repo-local lane arrangement that was in use with Playwright Chromium install, which shows the remaining problem is narrower than “Playwright cannot run on self-hosted runners”
  • e2e-beta still uses npx playwright install --with-deps chromium, which is a strong sign that browser/bootstrap assumptions still lean on the GitHub-hosted image path

Current Problem Shape

The problem is not runner registration and it is not app logic.

The actual problem is that the downstream repo still mixed a repo-local runner story with hosted fallback:

  • primary CI already uses dedicated self-hosted labels
  • beta post-deploy validation still depends on GitHub-hosted ubuntu-latest
  • GitHub billing can therefore block the visible promotion path even when the self-hosted lane is healthy

Historical First Patch Goal, Now Retired

The durable lesson is not “preserve a MassageIthaca lane.”

The durable lesson is that GloriousFlywheel needed one shared substrate story for both core CI and post-deploy beta validation, with any temporary compatibility bridge called out as debt rather than canon.

That means:

  1. move smoke-beta and e2e-beta toward the same shared-substrate-backed selector, or document any temporary repo-local bridge as debt
  2. make browser/bootstrap expectations explicit for self-hosted beta checks instead of inheriting ubuntu-latest image folklore
  3. keep GitHub-hosted fallback, if still needed, as explicit compatibility rather than the authoritative dogfood path

Historical Interpretation, Corrected

MassageIthaca remains useful as evidence for a specific false turn and gap because:

  • it recorded that a repo-local lane arrangement had become part of the story
  • its current failure is isolated to historical hosted beta-validation fallback paths
  • it showed why GloriousFlywheel needed to tighten the pooled-substrate contract without preserving repo-owned canaries

What Not To Do First

  • do not call this a new application regression when the failed jobs never started
  • do not use GitHub billing noise as evidence that the self-hosted dogfood lane is unstable
  • do not patch unrelated green jobs before closing the beta-validation authority gap
  • do not describe repo-local labels or ubuntu-latest beta jobs as if they were the actual GloriousFlywheel dogfood contract

Historical Takeaways To Preserve

  • this note remains readable as evidence that hosted beta-validation fallback masked a real shared-substrate gap
  • future readers can see that repo-local labels were part of the drift, not the target architecture
  • follow-on work is steered toward pooled capability classes and explicit browser/bootstrap assumptions instead of repo-owned canaries

GloriousFlywheel