Skip to content

feat(garage): the performance trend becomes Dyno, and moves into the garage - #295

Merged
oddharsh merged 1 commit into
mainfrom
feat/dyno
Aug 9, 2026
Merged

oddharsh merged 1 commit into
mainfrom
feat/dyno

Conversation

@oddharsh

@oddharsh oddharsh commented Aug 8, 2026

Copy link
Copy Markdown
Owner

/perf named a category. Dyno names the thing: a dyno tells you what an engine actually puts down, which is exactly what the page does. It straps the site to the rollers once a night and records a pull. And it belongs on the garage shelf with the other instruments.

The change

  • /garage/dyno + /garage/dyno.json, worker-rendered. An exact ROUTES entry beats the /garage/<page> PREFIX, so no static file is involved.
  • /perf and /perf.json 301 to them. The old names lived about an hour, so the redirects aren't for humans: agents: true publishes a surface into the MCP resources projection, and _headers caches the well-known cards for 30 days, so an agent can hold the old path long after a deploy could purge it.
  • section: garage, kind: content, gallery + sitemap on. It now appears on the garage shelf, in the garage Run sub-palette (19 entries), and in the sitemap. The Explorer chrome nests it properly: aadhar.sh › Garage › Dyno, with "Up to Garage" in the task pane.
  • No understanding check. Like /lens it's an instrument rather than an explainer, and check-page-contracts only walks HTML on disk.
  • Copy leans on the metaphor where the metaphor is honest. "Recent pulls," and the note on why sampled figures are absent now closes: a dyno with a wandering needle is a decoration.

Two things this turned up, both bigger than the rename

run_worker_first has a hard ceiling of 100 rules, and we're at exactly 100

Adding two paths took it to 102 and wrangler refused to boot:

Error: Too many `run_worker_first` rules were provided;
102 rules provided exceeds max of 100.

Neither npm run build nor wrangler deploy --dry-run catches this. The route harness does, because it starts a real Worker. The two entries turned out to be redundant anyway (/garage/* already covers them), so this ships at 100 unchanged.

The next person to add a worker-first path has zero headroom. The list also carries 7 duplicate entries (/garage/*, /garage, /lens, /lens/, /photos, /photos/, /rn.md each appear twice) which wrangler dedupes away rather than spends — so deduping buys nothing, and real headroom needs consolidation onto wildcards. Flagging rather than fixing here; it deserves its own change.

The rename shipped a ReferenceError past a green test suite

renderPerf got renamed at its declaration but not at its one call site inside handleDyno:

ReferenceError: renderPerf is not defined
    at handleDyno (dyno.js:302:3)

All 200 contract tests passed, because they import and call renderDyno directly and never go through the handler. /garage/dyno.json returned 200 the whole time; only the HTML route 500'd. The route oracle caught it.

A test that exercises a function is not a test that exercises the wiring around it.

Verification

  • npm run routes:check — 122 routes, 0 hard failures, including /garage/dyno 200, /garage/dyno.json 200, and both old paths 301
  • npm test 200 pass · npm run build invariants ok · typecheck · pages:check · perf-budget green
  • Rendered in a real Worker and checked in the browser: chart, breadcrumb, task pane, garage shelf card

🤖 Generated with Claude Code

…garage

/perf was a name that described a category rather than a thing. A dyno tells
you what an engine actually puts down, which is exactly what the page does:
it straps the site to the rollers once a night and records a pull. And it
belongs on the garage shelf with the other instruments rather than off on its
own under status.

- /garage/dyno + /garage/dyno.json, worker-rendered; an exact ROUTES entry
  beats the /garage/<page> PREFIX, so no static file is involved.
- /perf and /perf.json 301 to them. The old names lived about an hour, so the
  redirects are not for humans: `agents: true` publishes a surface into the MCP
  resources projection and _headers caches the well-known cards for 30 days, so
  an agent can hold the old path long after a deploy could purge it.
- section garage, kind content, gallery + sitemap on, so it appears on the
  garage shelf, in the garage Run sub-palette (19 entries now), and in the
  sitemap. No understanding check: like /lens it is an instrument rather than
  an explainer, and check-page-contracts only walks HTML on disk.
- Copy leans on the metaphor where the metaphor is honest. "Recent pulls",
  and the footnote about why sampled figures are absent now ends "a dyno with
  a wandering needle is a decoration."

TWO THINGS THIS TURNED UP, both worth more than the rename.

run_worker_first has a HARD CEILING OF 100 RULES and this repo is at exactly
100 unique. Adding /garage/dyno and /garage/dyno.json took it to 102 and
wrangler refused to boot: "Too many `run_worker_first` rules were provided".
Neither `npm run build` nor `wrangler deploy --dry-run` catches it; the route
harness does, because it starts a real Worker. The two entries turned out to be
redundant anyway (/garage/* already covers them), so this ships at 100. The
next person to add a worker-first path has no headroom, and the list carries 7
duplicate entries that wrangler dedupes away rather than spends.

And the rename shipped a ReferenceError past a green test suite. `renderPerf`
was renamed at its declaration but not at its one call site inside handleDyno.
The contract tests import and call renderDyno DIRECTLY, so all 200 passed while
the actual route 500'd. The route oracle caught it. A test that exercises a
function is not a test that exercises the handler wiring it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 8, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
aadhar-sh 4fbe2b4 Aug 08 2026, 10:02 PM

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Wire-size diff vs merge base

740f345 → 4708e7d

Brotli q11, the quality the edge serves. Every number here is deterministic:
an unchanged file produces no row. Advisory — this check fails on nothing.

Client assets

Total Brotli: 58.02 KiB → 58.02 KiB (+0.00 KiB, +0.0%) across 11 files, 1 changed.

file base head Δ
nav.js 13.44 KiB 13.44 KiB +0.00 KiB (+0.0%)

Pages

Total Brotli: 470.35 KiB → 470.59 KiB (+0.24 KiB, +0.1%) across 46 files, 39 changed.

file base head Δ
garage/index.html 9.95 KiB 10.19 KiB +0.24 KiB (+2.5%)

Plus 38 files under the 0.13 KiB floor, net -0.01 KiB — usually content-hash churn in /a/ references, counted in the total above.

Worker bundle

266.33 KiB → 266.64 KiB gzip (+0.31 KiB, +0.1%)

Largest module deltas (raw bytes in bundle):

file base head Δ
.build/holding/_worker.js/dyno.js — 11.47 KiB new
.build/holding/_worker.js/perf.js 11.28 KiB — removed
.build/holding/_worker.js/dyno-seed.json — 0.94 KiB new
.build/holding/_worker.js/perf-seed.json 0.94 KiB — removed
.build/holding/_worker.js/index.js 23.75 KiB 24.31 KiB +0.56 KiB (+2.4%)
.build/holding/_worker.js/lib/site-manifest.js 12.45 KiB 12.45 KiB -0.00 KiB (-0.0%)

Dictionary deltas (pd/)

134 → 134 deltas, 385.14 KiB → 385.97 KiB (+0.83 KiB).

@oddharsh
oddharsh merged commit 0cce9af into main Aug 9, 2026
7 of 8 checks passed
@oddharsh
oddharsh deleted the feat/dyno branch August 9, 2026 00:43
oddharsh added a commit that referenced this pull request Aug 9, 2026
…rnoon (#296)

Two releases shipped unlogged (Dyno at #295, the lens docs fix at #288), so
/updates still names v179 as the running build while describing /perf, a path
that now redirects. This stages the entry that covers both.

It also records two findings from that work in CLAUDE.md, because neither is
derivable from the tree and both cost real time:

26. `run_worker_first` caps at 100 rules and this repo sits at exactly 100.
    Adding two took it to 102 and wrangler refused to boot. Neither
    `npm run build` nor `wrangler deploy --dry-run` catches it, because
    parseStaticRouting runs at session creation; `npm run routes:check` does,
    because createTestHarness() starts a real Worker. That is a second reason
    the route oracle earns its keep. The note also says why deduping buys
    nothing (7 duplicates, wrangler counts the 100 unique) and to check the
    existing wildcards before adding a rule, which is how the Dyno change
    shipped at 100 instead of 102.

27. A red `github-advanced-security` check is usually GitHub's Copilot Autofix
    failing on its own infrastructure. Seen twice on 2026-08-08 across two
    unrelated PRs, both with CodeQL green. The signature is an empty output
    title plus an annotation pointing at `.github:<line>`, which is a directory
    and cannot have one. Read the sibling CodeQL check before touching code;
    it is not a required check and both PRs merged and shipped with it red.

Co-authored-by: Aadharsh Pannirselvam <19518661+oddharsh@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
oddharsh added a commit that referenced this pull request Aug 24, 2026
The index was roughly reverse-chronological and had drifted far enough
to be noticeable: octane (07-31) sat fifteenth, compression (07-27) sat
second, and the two cards added today landed sixth and seventh. All 23
cards are now sorted on the `added` date each one already carries, with
ties keeping their prior relative order.

Two cards had no meta line at all, so nothing could place them. Their
dates come from git (useragent #504 on 2026-08-21, dyno #295 on
2026-08-08) and their shape lines match the format every other card
uses.

The reorder is content-preserving: 23 cards before and after, and only
the two that gained a meta block differ. The section feed is generated
from sitemap lastmod rather than from this list, so /garage/feed.xml is
untouched.
oddharsh added a commit that referenced this pull request Aug 24, 2026
The index was roughly reverse-chronological and had drifted far enough
to be noticeable: octane (07-31) sat fifteenth, compression (07-27) sat
second, and the two cards added today landed sixth and seventh. All 23
cards are now sorted on the `added` date each one already carries, with
ties keeping their prior relative order.

Two cards had no meta line at all, so nothing could place them. Their
dates come from git (useragent #504 on 2026-08-21, dyno #295 on
2026-08-08) and their shape lines match the format every other card
uses.

The reorder is content-preserving: 23 cards before and after, and only
the two that gained a meta block differ. The section feed is generated
from sitemap lastmod rather than from this list, so /garage/feed.xml is
untouched.

Co-authored-by: Aadharsh Pannirselvam <19518661+oddharsh@users.noreply.github.com>
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