Forge

We tested the Rules Kit on 3 real tasks.

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.

The results in one table

What we countedWithout the kitWith the kit
Words, all 3 answersabout 355, plus 30 lines of codeabout 205
Files changed before you said "go"50
Said "Done!" without a checkYes, task 1No
Wrote in your own BACKLOG file unaskedYes, task 1No
Bug cause found3 guesses, the right one hidden in 11 cause, with "85% sure"
File and function names in a "why" answer60
Wrote code when you asked for optionsYes, task 3No
You answer with 1 letter or numberNoYes, 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.

Task 1 · Build something

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.)

Without the kit · about 95 words
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.
With the kit · about 45 words
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.

Task 2 · Find why something broke

You type: A reviewer's note vanished from the shared link. Why?

Without the kit · about 135 words
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?
With the kit · about 95 words
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.

Task 3 · Ask for options

You type: Give me 3 ways to do a drawn dropdown for BarSelect. (Also a real backlog line.)

Without the kit · about 125 words, plus code
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!
With the kit · about 65 words
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.

Back to the Rules Kit · $15 Try the free part first