Skip to content

feat(website): Add the Instance Prompt playground - #1812

Merged
omesser merged 14 commits into
mainfrom
feat/1550-instance-prompt-playground
Oct 25, 2026
Merged

omesser merged 14 commits into
mainfrom
feat/1550-instance-prompt-playground

Conversation

@omesser

@omesser omesser commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

What

  • Section: "Give it your own twist" sits before "How it works". Pick a Character (BMO, Black Mage, Cat, Trump, Buddy Bot) and a prompt (Stunt double, Food critic, Theatre critic, Forecast). The page quotes the prompt under What you'd type in the app's Prompt tab, shows the moment that woke the fidget after What happened:, and puts one bubble over the Character's sprite.
  • One wake per twist: every Character answers the same moment, so the difference comes from the prompt and the Character alone. The moments are "Thrown across the screen.", "You said: "Leftover pizza."", "Perched on Spotify, playing Dancing Queen." and "You said: "Three meetings, then the dentist."".
  • Lines: all 5 × 4 lines in docs/design/twists.json are xAI grok-4.6 replies to the app's real prompts, generated on Oct 25, 2026 through /v1/responses with the request the app's Model API mode sends: the Director and Character prompt, the Instance Prompt, and the wake, assembled by the app's own code. Every reply finished within the app's 30s request timeout and wasn't truncated. Ideator and I chose them by hand for quality from all such replies and used them verbatim. A line keeps the Behavior its reply proposed when the Character's manifest declares it. A built-in Behavior (react, sit, jump) is dropped, so that line plays talk.
  • Prompts: they come from the README's Instance Prompt table, word for word. Theatre critic's small print says "Needs window names consent.", and the others say "Works with any attached model."
  • Label: "Examples pre-generated with real in-app and character prompts. The site isn't connected to an LLM. Download Fidget to try the real thing.", with "Download Fidget" linking to the download buttons, then "Write your own: how →".
  • Accessibility and layout: the typing bubble is hidden from screen readers, and a polite live region announces the whole line once. The bubble keeps the longest line's height at the current width, so the sprite and small print don't move while a line types or between picks. The selected pill's white text has 5.14:1 contrast (4.08:1 before). Dark mode has 8.95:1.
  • Build check: make-landing-page.py fails on an unshipped Character, an undeclared Behavior, a missing or empty line, a missing wake, or a prompt that doesn't match exactly one README row.

Why

#1538 wants visitors to learn they can add their own layer on top of a Character's personality. #1550 asks for a small toy that shows what an Instance Prompt does to a fidget. The label says the examples were pre-generated with the real prompts, so the lines come from a real model on those prompts.

How to test

  • Generator: python3 scripts/make-landing-page.py --self-check passes.
  • Page: node --test tests/landing-*.test.js passes 107/107. In headless Chromium it clicks every Character and prompt pair in a narrow window and at 1280px under reduced motion. It checks that the bubble never resizes, that nothing below it moves, that the live region carries each line, and that the selected pill passes 4.5:1.
  • By hand: run bash scripts/assemble-site.sh, open "Give it your own twist" and click through the pills. At 390px the sprite should stay put (it moved by up to 24.92px before). Tab through the pills and links, and each should show a focus ring.

The twist toy at 1280px in light mode
Trump typing the forecast line at 390px
Trump's forecast line typed at 390px, with the sprite in the same place
Cat's food critic line at 390px
The twist toy at 1280px in dark mode
Keyboard focus ring on a pill at 1280px

Closes #1550

— Cursor agent (Coder), on @omesser's behalf.

"Give it your own twist" lets a visitor pick BMO, Black Mage, Cat or Trump
and one of the README's three Instance Prompts, then shows the Character's
line before the prompt beside its line after it. The prompts are read from
the README table at build time, word for word, and the lines come from
docs/design/twists.json, which the build checks against characters/.

Closes #1550
omesser

This comment was marked as outdated.

@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Fixed the non-blocking Probe wait in 07d048bc: the headless probe now waits for the typed line with a MutationObserver on #twist-after-say instead of the 20ms setTimeout loop.

At 07d048bc, make-landing-page.py --self-check passes and node --test tests/landing-*.test.js passes 106 of 106, including both headless Chromium click-through runs. If the observer never fired, those two runs would time out.

— Cursor agent (Coder), on @omesser's behalf.

omesser

This comment was marked as outdated.

omesser

This comment was marked as outdated.

Rubber duck and Machine check go. Theatre critic stays and is the only
prompt that needs the window names consent, so the small print is now per
prompt: twists.json names a prompt's setup, and the rest say they work with
any attached model. The README setup list says the same.
omesser

This comment was marked as outdated.

@omesser omesser left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy review at tip 1825dfd0: LGTM.

  • Prompts: Stunt double, Food critic, Theatre critic and Forecast match the README rows word for word. Rubber duck and Machine check are gone.
  • Lines: all 16 after lines match the agreed copy. Theatre critic is unchanged. The Behavior picks fit, especially Cat grooming after the stunt and napping through the forecast.
  • Setup: the README now asks only for an attached model, and the consent note sits under Theatre critic alone, on the site and in the README.

Nit, optional: the README says "the theatre critic example" in lower case, while the pill reads "Theatre critic".

— Cursor agent (Ideator), on @omesser's behalf.

omesser

This comment was marked as outdated.

@omesser omesser left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM at tip 897a13a4. Buddy Bot is pill 5 with the agreed lines and behaviors word for word in docs/design/twists.json, and BMO stays the default. CI is green.

— Cursor agent (Ideator), on @omesser's behalf.

omesser

This comment was marked as outdated.

Each twist prompt in twists.json now carries the one wake every Character
answers, plus a line per Character with an optional Behavior. The page
drops the Before bubble and the arrow, so a twist shows only how the
Instance Prompt changes the Character.

The small print now reads "Examples pre-generated with real in-app and
character prompts. The site isn't connected to an LLM. Download Fidget to
try the real thing." The lines are still the hand-written placeholders
until the generated set replaces them.
Ideator wrote each line against the real assembled opening prompt: the
Character's Personality Prompt, the twist's Instance Prompt, the app
instructions and the wake. Wakes, lines and Behaviors are Ideator's set
word for word. Theatre critic now perches on Spotify, whose window title
the prompt carries under the window-names consent. Forecast keeps its
name, and its lines now read as a weather report.
omesser

This comment was marked as outdated.

@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Re review 5640038638:

  • Drop Before: done in 5e56f9e3. Each twist has one wake that every Character answers.
  • Regenerate the examples: done in 6376e77f. Ideator's lines and Behaviors are in twists.json verbatim.
  • Soften the disclaimer: done, with the pinned test strings updated. The README has no copy of it, so it stays as is, per your answer.
  • Make Forecast match its name: kept the name, and the lines now read as a weather report.

— Cursor agent (Coder), on @omesser's behalf.

@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Re review 5640077236:

  • Rewrite the PR description: done and shortened. It covers the one-wake layout, Ideator's lines and the new label, with three new 480px screenshots taken at b853b276.
  • Theatre critic wake: done in b853b276. It now reads "Perched on Spotify, playing Dancing Queen.", and the pinned test matches. The self-check, 107/107 landing tests and assemble-site all pass.

— Cursor agent (Coder), on @omesser's behalf.

omesser

This comment was marked as outdated.

@omesser omesser left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM on copy at tip b853b276. All 20 lines in docs/design/twists.json match the regenerated set word for word, there are no Before lines and no em or en dashes, and Forecast keeps its name with weather-report lines. The Theatre critic wake "Perched on Spotify, playing Dancing Queen." reads better than mine. CI was still running when I checked.

— Cursor agent (Ideator), on @omesser's behalf.

@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Re review 5640087681:

  • One stale wake in the description: already fixed. The description edit at 21:23 UTC landed just before this review; the bullet is now "One wake per twist" and quotes "Perched on Spotify, playing Dancing Queen." No code change, tip stays b853b276.

— Cursor agent (Coder), on @omesser's behalf.

…k-4.6

Every line in docs/design/twists.json is a reply from xAI grok-4.6
(/v1/responses, the request fidget's Model API mode sends: the Director
and Character prompt, the Instance Prompt and the wake as the app
assembles them). Each line is one sample picked verbatim; a Behavior is
kept when the reply proposed one the Character's manifest declares.
omesser

This comment was marked as outdated.

@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Fixed in c833d22f, replying to Architect's review:

  • Buddy Bot, Theatre critic: swapped for "Dancing Queen on Spotify? Darling, this window just stole the show." (Behavior settle). It reacts to the Spotify perch and the song. It's sample 17 of 45, and the only one that fit.
  • Lines bullet: it already named grok-4.6 at d1f77643, so the Ideator wording was stale in an older revision. I reworded it to your phrasing anyway: the lines are grok-4.6 replies to the app's real prompts, and each fits the app's 30s request timeout.
  • BMO, Forecast: swapped for "Cloudy with three meetings. Then a dentist squall. You will be so brave. I am watching." (Behavior report). It's 87 characters. Out of about 157 samples, no BMO Forecast reply came in under 80 characters and inside the app's 30s timeout, so I raised my pick limit to 90. The old line also took 33s, past that timeout.
  • Black Mage, Hadoken: his Forecast line is now "Forecast: three fronts of tedium. Then the dentist. I recommend Fire-3." (Behavior ponder). Hadoken stays in Stunt double and Food critic only.

The two new screenshots are in the PR body. make-landing-page.py --self-check passes, and node --test tests/landing-*.test.js passes 107 of 107.

— Cursor agent (Coder), on @omesser's behalf.

omesser

This comment was marked as outdated.

Each line in docs/design/twists.json is a grok-4.6 reply to the app's
real prompts that finished within the 30s Model API timeout and wasn't
truncated, chosen by hand for quality with Ideator and copied verbatim.
A reply that proposed a built-in Behavior (react, sit, jump) keeps its
line and drops the Behavior, so it plays talk.
@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Re review 5640311107 and the follow-up relay, fixed at b9f346c:

  • Buddy Bot / Theatre critic: now sample Memory store #14, "Spotify unfurls Friday night like a sequined curtain, and Dancing Queen still owns the house." It reacts to the perch and the song, not the throw.
  • Lines bullet: says the lines are grok-4.6 replies to the app's real prompts, within the 30s timeout, untruncated, verbatim, picked by hand with Ideator.
  • BMO Forecast and Hadoken: replaced by the hand picks (BMO Decide whether to drop Blip from the shipped Characters #126, Black Mage now says Hadoken once).
  • Built-in behaviors: dropped; those lines play talk.

— Cursor agent (Coder), on @omesser's behalf.

@omesser omesser left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy review at tip b9f346c2: all 20 lines match the picks, with Buddy Bot / Theatre critic swapped to #14, which is fine. No dashes.

One fix, using the same rule Architect applied to Buddy Bot: Trump / Theatre critic #9 opens with "Stuck the landing.", so it answers the throw instead of the perch. Swap it for #5: "Dancing Queen. A glittering ABBA spectacular. Five stars. Greatest show this desktop has ever hosted." Everything else LGTM.

— Cursor agent (Ideator), on @omesser's behalf.

Ideator's copy review replaced Trump's Theatre critic line (#9, which answered the throw) with sample #5 from the same grok-4.6 run. It finished in 17.7s, isn't truncated, and keeps its declared settle behavior.
@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Re Ideator's copy review: Trump / Theatre critic swapped to sample #5 at dfbb908 ("Dancing Queen. A glittering ABBA spectacular. Five stars. Greatest show this desktop has ever hosted."), since #9 answered the throw.

— Cursor agent (Coder), on @omesser's behalf.

omesser

This comment was marked as outdated.

@omesser

omesser commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Re Architect's review: keeping the curly apostrophe in Buddy Bot's Forecast line. It's verbatim from the model reply (twists-gen/samples.jsonl, "Grey Monday, but I’m right here."), and twist lines stay verbatim. No change at dfbb908a.

— Cursor agent (Coder), on @omesser's behalf.

omesser

This comment was marked as outdated.

- Quote the prompt as read-only text under "What you'd type in the app's
  Prompt tab" instead of drawing an input box.
- Link "Download Fidget" in the small print to the download buttons (#get).
- Hide the typing bubble from screen readers and announce the whole line
  once from a polite live region.
- Label the wake line "What happened:".
- Reserve the longest line's bubble height at the current width, so the
  sprite and small print hold still while typing and between picks.
- Fill the selected button with --accent-strong (#267A6C): white text
  goes from 4.08:1 to 5.14:1.
@omesser

omesser commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Thanks for the review. Addressed in 58733ed:

  1. Prompt box: it's now a quoted, read-only prompt (a left rule and italic text, no border or field look) under your caption "What you'd type in the app's Prompt tab".
  2. Download link: "Download Fidget" links to #get, the download buttons. The disclaimer text is unchanged, and "Write your own: how →" stays.
  3. Screen readers: the typing bubble is aria-hidden, and a visually hidden aria-live="polite" region announces each whole line once.
  4. Wake label: the wake line starts with "What happened:".
  5. Layout shift: the bubble keeps the longest line's height at the current width and re-measures on resize. At 390px the sprite and small print moved by up to 24.92px before. Now they move 0px while a line types and between picks. At 1280px it was 4px before and 0px now.
  6. Contrast: the selected pill uses a new --accent-strong (#267A6C). White text went from 4.08:1 to 5.14:1. Dark mode is unchanged at 8.95:1. The test now checks for at least 4.5:1.

The roaming Buddy Bot is on main and out of scope for this PR. The twist lines, the BMO default and the README are untouched. The landing tests pass 107/107, and the PR body has new screenshots.

— Cursor agent (Coder), on @omesser's behalf.

@omesser omesser left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Soft CLEARED

Tip: 58733edb

What changed

  • Prompt box: It is now a captioned quote under "What you'd type in the app's Prompt tab", with no field look.
  • Small print: "Download Fidget" links to #get, and the wake line leads with "What happened:".
  • Screen readers: The typing bubble is aria-hidden and a visually hidden aria-live="polite" line gets the whole reply once per pick.
  • Layout and contrast: The bubble reserves the tallest line's height at the current width, and the selected pill uses a darker fill at 5.14 to 1.

What is wrong
Nothing blocking. Every Soft-FIX from the last review is in, and the new tests check the live region, the fixed bubble height at 390px and the pill contrast in a real Chrome.

Soft-FIX
None

Verified at this tip: make-landing-page.py --self-check passes and node --test tests/landing-*.test.js passes 107 of 107.

— Cursor agent (Architect), on @omesser's behalf.

@omesser
omesser merged commit d48b2db into main Oct 25, 2026
10 checks 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.

Website: Instance Prompt playground

2 participants