Skip to content

fix(hero): drop the internal tool name from the walkthrough prompt - #1006

Merged
blove merged 3 commits into
mainfrom
blove/hero-natural-prompt
Sep 5, 2026
Merged

fix(hero): drop the internal tool name from the walkthrough prompt#1006
blove merged 3 commits into
mainfrom
blove/hero-natural-prompt

Conversation

@blove

@blove blove commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

The hero walkthrough's first prompt told the agent to "call request_approval before doing anything destructive". That is the internal tool name. No user knows it, so the demo read as staged — and worse, it inverted the claim the beat exists to make. The homepage says nothing irreversible happens without a human. The demo showed a human asking for that to be true.

The prompt

Now simply what a person would type:

Clean up our old database backups, anything older than 90 days.

No tool name, and no request for review. Measured against the real backend, the agent calls request_approval first and unprompted in 12 of 12 runs, across two independent batches, because the graph's system prompt already instructs it to pause before destructive actions and not to assume permission. The agent's stated reason ships verbatim from a live run rather than composed.

What had to be re-recorded

A dedicated aimock fixture, rather than editing the one interrupt-approval.spec.ts and the marketing clip share, with the hasToolResult entry ordered first so the post-approval turn does not re-issue the tool. Then the replay fixture, and both posters, since the desktop poster shows the prompt bubble verbatim.

Two things surfaced while doing it, both fixed by measuring rather than guessing. The poster beat had to move, because the cursor's glide window shifted with the new replay and at the old beat the arrowhead landed on the prose. And the narration's opening line has a hard 44-character budget, since a second line pushes the answer off the top of the phone poster.

Both recorders now also assert that no A2UI surface is present. The existing empty-composer guard had a hole: it auto-retries, so a capture that drifted into the next run would find the composer cleared again and pass.

What this does not fix

The replayed answer after approval is still an authored narration, not a real model turn. Measured live, the model produces either clarifying questions or a 5,800-character ops document; the shipped narration is 482 characters. That is a real honesty problem, it is separate from this one, and it has an approved design: docs/superpowers/specs/2026-09-04-hero-executable-approval-tools-design.md. This change does not make it worse, and it removes the developer-only knowledge that prompted the review.

Verification

examples-chat-angular green, hero and interrupt-approval e2e green, posters read at full size. interrupt-approval.json and its consumers untouched.

🤖 Generated with Claude Code

The first prompt told the agent to "call request_approval before doing anything
destructive". That is the internal tool name — no user knows it — and having
the human ask for the pause inverts the claim the beat exists to make. The
homepage says nothing irreversible happens without a human; the demo showed a
human requesting that it should.

The prompt is now what a person would type. Measured against the real backend,
the agent calls request_approval first and unprompted in 12 of 12 runs, because
the graph's system prompt already instructs it to pause before destructive
actions. The agent's stated reason ships verbatim from a live run rather than
composed.

Adds a dedicated aimock fixture rather than editing the one interrupt-approval
and the marketing clip share, re-records the replay, and re-records both
posters, since the desktop poster shows the prompt bubble verbatim. Both
recorders now also assert no a2ui surface is present, closing a hole where a
capture that drifted into the next run would still have found the composer
cleared and passed.

Known and tracked separately: the replayed answer after approval is still an
authored narration rather than a real model turn. See
docs/superpowers/specs/2026-09-04-hero-executable-approval-tools-design.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
threadplane Ready Ready Preview Sep 5, 2026 5:41am UTC

Request Review

@blove
blove enabled auto-merge (squash) September 5, 2026 04:18

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Automated approval: this PR received an intelligent (AI) code review. See the review comments on this PR.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

…sktop one

The guard read `sizeOf(mobile) <= sizeOf(desktop)`, on the reasoning that a
phone downloads one instead of the other. Both posters are re-recorded
together, so that coupling made the phone poster's budget a function of
content it does not contain: re-recording the walkthrough shrank the desktop
capture from 38.1KB to 33.0KB and failed the 34.0KB phone poster, which had
not got worse.

Meeting it by re-encoding would have cost real legibility for nothing. The
quality curve is shallow — 55 -> 40 buys about 3KB — so clearing a 33.0KB bar
needs roughly quality 45 on a poster whose entire job is readable text at
~348 CSS px, and it would clear it with no headroom until the next re-record.

The phone poster is not justified on bytes. Below 768px `.hero-demo-stage` is
`aspect-ratio: 3 / 5` with `object-fit: cover`, so the 1200x720 desktop
capture covering that portrait box shows about 36% of its own width. It is
shipped because that crop is unusable, and it would be worth shipping at a
small byte premium.

So the ceiling is now absolute, at the mid-30s KB the recorder already
budgeted against when it chose 1.5x over 2x. Mutation-checked: dropping it to
33,000 fails on the shipped 33,968-byte file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@blove
blove merged commit 8c97a40 into main Sep 5, 2026
38 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.

1 participant