feat(web): the homepage shows B4's guardrails and route shapes - #851
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
… shapes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s decisions Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…by route discovery Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sion, sandbox and delegation code Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under load, the act() flush after a pick can take longer than the 200ms fade, so checking for a still-running tween failed intermittently. The test now spies on gsap.fromTo; the kill-and-clear checks are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…able traces The motion test checks each trace was started over its own board (read from the timelines the island created) rather than that a 180ms tween is still running after act(), which a slow flush under load can outlast. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The bash caption claimed the default network policy blocks 169.254.169.254;
Docker's allow mode is a plain bridge network and enforces no denylist. A new
test resolves an app without a network line through the CLI's own
resolveSandboxManager and asserts the keeper container starts with
--network bridge and no 169.254 anywhere, and the caption now says just that.
refund now runs through wrapToolWithApproval, as the runtime serves it:
Allow once returns the tool's { refunded: 500 } and saves nothing; Deny
returns exactly "[B4_E3001] Permission denied by user: tool refund", which
the board quotes. readFile runs through the same pausable graph on the
fixture's sandbox: no interrupt, every docker exec in the keeper container.
The keeper docker run is selected by --name, and the recording sandboxes take
scope and image from the options the fixture config passed to dockerSandbox.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Safari and Firefox on macOS don't focus a radio when its label is clicked. With focus on Allow once, Ask again or the caption's docs link, picking a call that doesn't pause made that control inert and dropped focus to <body>. When focus is inside the tracer but outside the radio group, the pick now moves it to the newly checked radio. The focus effect runs as a layout effect, so focus moves before paint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The motion test checked only that killed traces left no inline opacity. It now checks transform as well, so a stopTrace that forgot to clear the y offset fails the test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tour Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r on a label click WebKit moves focus on mousedown to the nearest focusable ancestor of the clicked label (the page's <main tabindex="-1">) or to <body> before the radio changes, so picking read after refund left focus on <main>. Treat focus on an ancestor of the tracer, or none, as stranded too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 375px the four options wrap to two rows; .option + .option shifted the row-two cell 1px left and the rows' borders doubled. Every cell now overlaps its right and bottom neighbours by 1px, with the padding giving the last overlap back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
blove
force-pushed
the
blove/homepage-tracer-shapes-impl
branch
from
September 25, 2026 21:29
61bb2a2 to
59f6bb7
Compare
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR 2 of 3 from
docs/superpowers/specs/2026-09-25-homepage-files-tour-design.md. It adds two sections between the folder tour (#845) and the closing call to action. The plan isdocs/superpowers/plans/2026-09-25-homepage-files-tour-pr2.md.Guardrails (
#guardrails): "Four checks decide what a call can do."You pick one of five calls a support agent might make. The page then shows what each of B4's four checks (tool scope, permission, sandbox, delegation) does with it, under one real app config.
readFilepasses every check and runs inside the sandbox.refundpauses for approval. Allow once runs it and saves nothing, so the next refund asks again. Deny returns[B4_E3001] Permission denied by user: tool refundto the model.runBash("curl … | sh")has no allow rule, so it pauses. Allow once runs it in the Docker sandbox with no network, because the config setsnetwork: { mode: "deny" }. Deny stops it.deleteUseris withheld by tool scope, so the model never sees it.taskto thetranslatorsubagent is stopped by a delegation rule, with the real[B4_E3002]message.Every result on the page is produced by B4's own code in the tests:
resolveToolScopedecides tool scope.wrapToolWithApprovalrun inside a real LangGraph graph that pauses and resumes.docker runarguments, and the tests record them with a fake Docker client.resolveGuardedSubagentdecides delegation.A mutation check backs this up. Adding a
curlallow rule makes the pause, allow-once and deny tests fail, even with the pinned config text taken out.Route shapes (
#route-shapes): "Pick the shape per route."The scaffold's hello route is written four ways:
agent,workflow, a LangGraphgraphand a LangChainchain. B4'sdiscoverRoutesclassifies each fixture, and the graph, chain and workflow versions each run and greet "Ada".Spec corrections (details in the plan)
task, was added, as Brian decided.runBashasks for approval instead of being allow-listed. Brian decided this so the page doesn't read as advice to allow-listcurl.sandboxbelongs inb4.config.ts, not in the route.denydelegation rule hides the subagent from the model entirely, so the fixture uses aconstrainrule instead.sandbox.mdxis flagged as a separate follow-up.aria-pressed", which mixes two ARIA patterns. Both switchers use native radios in a<fieldset>instead.UI/UX (ui-ux-pro-max)
ariaattributes and announcement all update on the click; GSAP only animates, and the next action stops it. There's one announcement per action.inert.New devDependencies (
apps/web)@b4run/cli,@b4run/permissions,@b4run/sandbox,@langchain/core@1.2.12,@langchain/langgraph@1.4.17. They add 15 lines to the lockfile and no new packages.Verification
pnpm --dir apps/web testpasses (60 files: 920 passed, 1 skipped).lint,typecheck,node scripts/check-docs.mjsandpnpm check:build-cacheall pass.refundandrunBash/entry changes.🤖 Generated with Claude Code