@kentcdodds/invisible-software
Invisible software: a phone-only step-through demo plus a chart of AI agent benchmark progress.
AGENTS.md
51 lines · 4.6 KB · MarkdownAgent guide: invisible-software
This package app serves one self-contained, phone-only product demo. The story is told only through the phone: Victoria, Max, Grok Bot, ChatGPT, their apps, and their notifications. Keep it that way. Don't add architecture or behind-the-scenes material. The page makes no external requests (no CDNs or remote fonts), and every image and font is inlined.
Layout
Pages:
/issrc/pages/home.html,/demois the deck (src/deck.html+ slides),/graphissrc/pages/graph.html. Anything else 404s, except/c/<path>assets under any page.Graph data:
data/*.csvanddata/make_trend.pyare the source (Epoch AI + METR).src/data-trend.jsonis derived fromdata/benchmark-trend-data.csvand inlined into the graph at build time. Credit Epoch AI and METR on the chart; no model IDs on screen.app/router.ts: the app entry, which default-exports{ fetch }./c/<path>serves an inlined image or font./healthreturns JSON.- Every other path serves
index.html.
app/assets.generated.ts: generated bynpm run build(scripts/build-assets.mjs). Never edit it by hand. Rebuild and commit it after any change undersrc/.src/deck.html: the page shell.- Only each slide's
.phoneis shown, centered and scaled to fit. Everything else in a slide is hidden. - It plays one slide timeline at a time and holds each step on its last frame.
- It keeps the hash in sync as
#<label>.<n>. Steps are pushed to history, andhashchangejumps to the new step. - It exposes
window.__slideshowfor tests.
- Only each slide's
src/slides/*.html: one<section class="slide">per slide, in file-name order. Each has these attributes:data-label: its URL name.data-duration.data-steps: motion segments[[from, to], ...], each starting and ending at rest.data-human: the 1-based segments that begin with a person's action.data-opener(optional): 1-based segments that start a step with no human action (a scene opener).
Steps: a deck step is one human segment plus every automatic segment after it, even across slides (a step can also run into the next slide). One press plays all of it; the next press waits for the next human action. Only the scene openers have no human segment: 2.1 (first slide), 6.1 and 7.1 (
data-opener). A step that ends on a result (Booked, Sent, a loaded page) rests there; the next scene waits for the arrow.- Current slides:
2Grok Bot ping,3Victoria's app,5Max forks through ChatGPT,6Grok Bot merges both wishes,7Max asks Muse, which can't reach his ChatGPT-built scheduler. - Labels are kept stable, so existing links still work.
- Current slides:
src/c/: the shared timeline runtime (lib.js,lib.css), Victoria's app (vc-finder.js,vc-app.css), the chat apps (chat.css), photos, icons and fonts.
Rules
- The phone tells the whole story. No code, editors, architecture diagrams, build or hosting details, or behind-the-scenes screens.
- Every step except the 2.1, 6.1 and 7.1 openers must begin with a human action (a tap, typing or sending, or opening a link). Computer activity, such as replies, apps opening and notifications, goes in automatic segments.
- Every step must visibly change the phone. If a step doesn't change the phone, merge it or drop it, then run
npm run steps -- --writeandnpm run build. - A step never stops mid-motion.
- Brand marks: Grok Bot uses
src/c/assets/grokbot.svg(Kent prefers it). ChatGPT and Muse use official assets (OpenAI Blossom, Muse avatar from Meta's App Store screenshots). Never redraw them. - Name: always "Grok Bot" on screen and in docs.
- Muse follows Muse's own chat look (near-white, round top buttons, gray bubbles, Message bar, 5-icon tab bar) with the official Muse avatar. Keep it a plain chat.
- Grok Bot never sends texts. It gives Victoria a link to her app.
- Max's app opens at
schedule.maxbarber.example, never a kody.run URL. - No IDs, hashes or tokens on screen. Say "credentials", never "secrets".
- Keep every URL relative. Kody mounts the app under
/packages/invisible-software/; the demo is/demoand the chart/graph.
Verify
Run npm run build && npm run serve, then npm run verify. Verify needs playwright; set CHROMIUM_PATH to choose a browser. It fails on any of these:
- console errors or external requests;
- a step that doesn't hold, or that starts or ends mid-motion;
- a hash or deep link that doesn't match its step;
- an opener other than 2.1, 6.1 or 7.1, or any other step that has no tap within 1.5 s of its start, or that doesn't play its automatic segments to the end from a single press.