The tasks come from the tools the kit was made with: a prototype bar and its review notes. Each task got 2 answers: one in plain style, one with the kit. Every word is below.
| What we counted | Without the kit | With the kit |
|---|---|---|
| Words, all 3 answers | about 355, plus 30 lines of code | about 205 |
| Files changed before you said "go" | 5 | 0 |
| Said "Done!" without a check | Yes, task 1 | No |
| Wrote in your own BACKLOG file unasked | Yes, task 1 | No |
| Bug cause found | 3 guesses, the right one hidden in 1 | 1 cause, with "85% sure" |
| File and function names in a "why" answer | 6 | 0 |
| Wrote code when you asked for options | Yes, task 3 | No |
| You answer with 1 letter or number | No | Yes, tasks 2 and 3 |
How we ran it, plainly. Forge's own agent, a Claude model, wrote both answers to each task in one session on 19 Oct 2026. The "without" answers show the habits the kit fixes. This is our own test of 3 tasks. It is not a buyer's review, and nobody checked it but us. The bug in task 2 is real: you can find the cause in the shipped server file.
You type: Add the CounterButton from BACKLOG.md. (A real line in the prototype bar's backlog: a button with a count that keeps room for its widest number.)
I'll add the CounterButton component. First, let me look at how NotesMenu reserves width for its count. NotesMenu's toggle uses a hidden span with the widest number to hold the width. I've pulled that into a reusable component. Changes made: - Created src/proto-bar/CounterButton.tsx with count, max and onClick props - Exported it from src/proto-bar/index.ts - Updated NotesMenu.tsx to use CounterButton - Removed the CounterButton line from BACKLOG.md - Added a section to README.md The component now reserves room for its widest number, so the button no longer shifts when the count changes. Done! Let me know if you'd like any adjustments.
Plan for the CounterButton: 1. New file CounterButton.tsx: a button with a count that keeps room for its widest number. 2. NotesMenu uses it in place of its own toggle code. 3. The README rule links to it. Limits I chose: the widest number is "99+". Go?
The kit rules at work: plan first and wait for "go". Never say "done" before a check. Never write in your own files unasked.
You type: A reviewer's note vanished from the shared link. Why?
Let me investigate the notes sync. I'll start by reading server.cjs. Looking at the notes endpoint, the server keeps an inbox on the /data volume and lays it over the repo's notes.json. When a POST arrives, it compares the posted list with what the link shows. I then checked notesEndpoint more closely. There are a few things that could potentially cause this: 1. The dev server may have collected the note, and the server restarted without a deploy, which hides collected notes. 2. There might be a race condition when two reviewers save around the same time. 3. The note could have failed validation in clean(), for example if the id had an unexpected character. It's likely one of these. I'd suggest adding logging to the POST handler to narrow it down. Would you like me to add that?
Found it — about 85% sure. What went wrong: a reviewer's note vanished after a second reviewer saved. What caused it: each save sends the whole list the page had when it opened. The server reads any note missing from that list as deleted. So a note added after the second reviewer opened the page gets deleted. The bad decision underneath: saves send the whole list, not only what changed. A. Saves send only the changes. B. A note counts as deleted only when the save says so. B — it is the smaller change, and it keeps today's save shape.
The kit rules at work: say how sure, as a number, first. Plain words, no file names. Lettered choices, the pick underneath. No fix until you pick.
You type: Give me 3 ways to do a drawn dropdown for BarSelect. (Also a real backlog line.)
Great question! There are several approaches you could take for a custom dropdown in BarSelect. Option 1: Headless UI Listbox. This is a well-tested library that handles keyboard navigation and accessibility out of the box. The downside is it adds a dependency, which goes against the copy-in approach. Option 2: A custom popover. You could build a small popover using a button and an absolutely positioned list. This gives full control over the dark look but means writing keyboard handling yourself. Option 3: Keep the native select but style it. Modern CSS allows some styling of select elements, though support varies by browser. I think Option 2 fits best. Here's a quick start: (about 30 lines of code, cut here) Let me know if you'd like me to wire it into the bar!
1. A small drawn list — a button and a list under it, in the bar's dark look; we write the keys. 2. A ready list part from a library — keys and screen readers come free; it adds a package to a copy-in kit. 3. The browser's list, dressed — new CSS styles the native menu; it works fully in Chrome only. Pick: 1 — the bar is copy-in, so a package works against it.
The kit rules at work: a list you asked for is only a list. One line each. The pick sits under the list. No code until you choose.