The release-gate campaign confirmed two skill bugs with transcripts.
Sandboxed harnesses reject absolute paths, so following the CHOSEN
CARD directive with the absolute card-base path failed view_image; the
directive and the quality-bar clause now say download into the
workspace and open the relative path. And under the openai worker's
turn cap, models spent the budget on init, cards, and comp generation
and never built the page (a third of small-n supplement slices); the
visualize mandate gains its one exception: at a hard cap the shipped
page outranks optional imagery.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The local-image map fell through to image/jpeg for anything that was
not webp or png, so an svg hero (the fake comp generator's native
format) silently failed to render on the decision page.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
From Paul's approved UX and the eb686f36 session post-mortem:
The standing exit: direction rounds carry a quiet, permanent "Play it
straight" action (payload flag canon, reserved id) on the decision page
and as the last structured-tool option. It is the user's door, never
the model's: never recommended, never weighed against the roll, and
choosing it swaps the bar rather than lowering it, two or three named
reference products become the craft level, canon executed at full
commitment. Safer/conventional steers resolve here, never to a
stranger re-roll.
Session fixes, each mechanical where possible: the ANSWER line now
names the chosen card's hero and board and directs opening them before
code (the session built from text alone after viewing a different
world's card); generation scale joins the imagery rule (a library of
centered 128px subjects foreclosed the atmospheric hero); DESIGN.md
rules are checked against the world's native devices and never added
to silence a hook finding (the session banned arcade lettering's own
offset shadow and laundered 8px through the ramp); staging joins the
FORM contract block (the axis was dropped silently at world-choice);
the finishing reviewer audits the ceiling against the QUALITY BAR card
after persistence (floor rigor was disguising unreached ambition); the
icon-tile clause names hand-drawn icons as remedy, not target.
Dist rebuild deferred: the release-gate campaign reads the pinned dist.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A grounded direction with no hero rendered a blank 16:9 void where the
card image belongs (seen live: the assigned Xerox Zine card led the
hand as a black hole next to two rendered challengers). An option with
no imagery now drops the media region entirely and leads with its
kicker and text; an option with only a board shows the board as its
front image with no flip.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The new self-detection ran before mode dispatch, so it also caught --wait,
--stop, and --schema. CI failed on the start/wait cycle test: --wait
returned 2 (no browser) where the documented poll loop expects 3
(WAITING). Under CI=1 the suite went 4 pass / 2 fail; it is 6 / 0 now.
Two of those modes were user-facing bugs, not just test breakage. --stop
exited 2 without killing the daemon it was asked to kill, leaking a
server process (verified: one daemon running, CI=1 --stop, still one).
--schema only prints a payload example, and new-work.md tells the agent
to read it before building a payload.
Detection can only tell whether this process can auto-open a browser, not
whether the user has one: SSH with a forwarded port and a harness with an
in-app browser both have a browser and no DISPLAY. The file already
treats serve-without-opening as first class, since --start spawns its own
daemon with --no-open. So the check now gates acquiring a session, not
managing or ending one. The blocking serve path still exits 2 on a
headless box, with a test pinning that.
Co-Authored-By: Claude <noreply@anthropic.com>
The env-var bypass (IMPECCABLE_QUESTION_DISABLED) relied on the harness
remembering to set it. The script now also self-detects CI, SSH-without-
display, and displayless Linux and exits 2 with the structured-question
advice; --no-open skips detection (caller opens the URL itself, as the
tests do) and IMPECCABLE_QUESTION_FORCE=1 overrides it. new-work.md now
frames the decision-page rule by capability: open a browser if you can,
structured question tool if you cannot, exit 2 means fallback not error.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
IMPECCABLE_CARD_BASE overrides the quality-bar URL prefix so eval
workers serve cards from the local checkout while impeccable.style
stays undeployed. IMPECCABLE_QUESTION_DISABLED makes serve-question
exit immediately with the structured-question fallback line, so
headless workers never block on a browser page nobody will answer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's question exposed the blind spot: a closed tab left the agent
waiting out the full timeout. The page now sends a heartbeat every five
seconds while open; the server stamps lastBeat into the state file, and
--wait reports PAGE CLOSED with exit 4 when the beats stop for fifteen
seconds without an answer. The prose defines the fallback ladder:
re-present once through the structured question tool, then proceed
unattended with the assigned direction, stating assumptions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The loading hand now has the true proportions: 16:9 shimmer media, a
tier line, a title line, three detail lines, and a button-shaped block
pinned to the card bottom, with each skeleton inheriting the measured
height of the card it replaces.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Live-fire bug from the demo: collecting a re-roll answer deleted the
state file, so --update could not find the still-running server and the
next hand had nowhere to land. Cleanup is now terminal-only: a re-roll
consumes just the answer file and leaves the server state for --update;
any other choice cleans up fully as before.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two upgrades from the live session. Re-roll no longer ends the page: in
detached mode the server stays alive, the client gathers the cards back
into the center stack, deals skeleton cards with the site's shimmer,
and polls /next-status; the new --update mode delivers the next hand
and the page reloads into the fresh deal. Choices other than re-roll
still resolve and exit as before.
And the headline bug had a root cause: the fonts link never loaded the
weights in use, so the browser synthesized a fake 300 that read
off-brand and muddy. The link now loads Alumni 100 and 400 exactly, and
the h1 wears the homepage hero display role: weight 100 at
clamp(2.6rem, 5vw, 4.2rem), champagne.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#lightbox { display: flex } outspecified the UA's [hidden] rule, so an
invisible full-viewport layer sat over the page and blocked all hover
and click. #lightbox[hidden] { display: none } restores reality.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's motion and exploration pass. The reveal is now a real deal: the
cards begin piled at the grid center, blurred and slightly rotated, and
travel to their seats with a 110ms stagger on the brand ease (JS
measures each card's seat, so the pile works at any grid shape;
reduced motion skips it). Hovering a card bleeds its hero into the page
ground behind a lacquer scrim. An expand chip beside Board opens
whichever face is showing in a zoom-out lightbox with Escape to close.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
No cropping and no pillarboxing: the board spans the card width at its
native 16:9 exactly like the hero on the front, with the deep-lacquer
ground below and the label-and-CTA bar pinned to the card's bottom edge.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The design-system board is an information sheet; the back face now
contains it fully on a deep-lacquer ground rather than cover-cropping
its top and bottom.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's read: flipping only the image inside a static frame looked
unconvincing. The card is now the object: front face carries hero,
lineage, title, and CTA; the back face is the design-system board at
full card height with a slim bar keeping the label and Build-this
reachable. The outer card keeps fan, deal, and hover; each face carries
its own lacquer chrome and the rolled card's gold ring rides both
faces. 700ms preserve-3d turn, instant under reduced motion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Third polish pass with Paul live. The details collapsible is gone: the
card media is now a 3D flip, hero on the front and the design-system
board on the back, toggled by a small mono Board/Hero chip with a 600ms
preserve-3d turn that reduced-motion collapses to an instant swap. The
headline and question sit directly above the dealt hand inside the
centered stage while the logo holds the top-left corner. Re-roll
stretches to the steer input's height and says just Re-roll beside the
five-pip die.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's second polish pass. The h1 uses DESIGN.md's headline role
(Alumni 300 at clamp(2rem, 4vw, 3.4rem), tracking 0) instead of a bold
weight the brand no longer uses; card headings use the title role
(Albert 500, 1.125rem) which also holds at small sizes; the rolled
card's border and ring use actual kinpaku gold, not the deep variant;
and the dealt hand centers vertically in the viewport with header and
footer framing it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's review against DESIGN.md and the design-system page: the real
24px logo mark with the uppercase tracked Alumni 400 wordmark (was a
bootleg lowercase 600); the five-pip stroke die from the homepage
worlds-roll as the headline accent and re-roll icon (the tilted numeral
cube was off-brand); the re-roll button is the worlds-reroll pattern
verbatim (mono 0.72rem uppercase tracked, rule border); Build-this uses
the DESIGN.md button-primary spec (title typography, 38px padding,
kinpaku-pale hover); THE ROLL kicker is the worlds-played-chip pattern.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The decision page now mirrors impeccable.style's Neo kinpaku system:
the split logo mark and Alumni Sans wordmark in kinpaku gold, lacquer
ground with raised-panel cards, the gold die beside the headline
(count of dealt options, rotated like the research page dice), THE ROLL
badge as a mini die, worlds-roll card treatment (rule borders, fan
rotation, deal-in stagger honoring reduced motion, hover lift), mono
tracked lineage lines, champagne display type, gold CTA with dark ink,
and a die-glyph re-roll button. Tokens mirrored from kinpaku-tokens.css.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's call: start mode never auto-opens; the agent is alive and opens
the printed URL itself, in-app browser first, then the system opener,
then showing the URL (--open forces the system browser from the script).
The prose now leads with the start/open/wait flow and keeps the blocking
auto-open path for harnesses that can background a shell.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's two concerns with the blocking design. --schema prints the exact
payload example so the model never guesses the shape (new-work.md points
at it). And harnesses that cannot leave a shell blocked (or cannot open
a browser while blocked) get a two-phase path: --start daemonizes the
server and returns the URL plus a key immediately, --wait polls for the
answer with exit 3 meaning ask again, exit 2 meaning the server died,
and --stop for cleanup. The browser open happens from the detached
server process, so it works even when the agent thread is short-lived.
State lives under .impeccable/questions/.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul's design, three pieces:
serve-question.mjs: the world decision presented as a themed page instead
of a text prompt. The script serves an impeccable-styled option board
(assigned direction leading with THE ROLL badge, dealt challengers as
alternates carrying their QUALITY BAR cards, re-roll and steer built in),
prints the URL, opens the browser, and blocks until the user chooses;
the answer lands on stdout as ANSWER JSON, so the shell call itself is
the wait and no harness machinery is needed. Local images are served by
the ephemeral server; nothing leaves the machine.
generate-image.mjs + context.mjs IMAGE_GEN_AVAILABLE: when an OpenAI key
is in the environment, context reports that image generation works even
without a harness-native tool (gpt-image-2, billed to the user's key,
stated before first use; Google skipped by decision). Harness-native
tools always win when present.
new-work.md: visualize-before-build is now the default whenever any
image generation exists, not a codex.md special case; the attended
presentation prefers the visual decision page and falls back to the
structured question tool. Evals keep the unattended path untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>