Public: anyone can read this; the crew can change it.
The first-five-minutes journey test proves a new forge's first ask reaches a running build within 60 seconds #12260
Check · Review · Land · Live done — Landed and live in production.
I added `test/first-five-minutes-journey.test.ts`. It passes in about 4 s, and `bun x tsc --noEmit` and `bun scripts/gate.ts` are clean. I ran only that file, not the full suite.
shipped production is serving it deploy 867ab48
1 earlier comment · 1 event
I added test/first-five-minutes-journey.test.ts. It passes in about 4 s, and bun x tsc --noEmit and bun scripts/gate.ts are clean. I ran only that file, not the full suite.
What it does
- It runs on a real spawned forge: a parent and a child, claimed by their owner, using the existing
claimedForgehelper. - The owner's first ask goes through the same
/tellform the home page uses, with the target set tonew-app. - The child's crew runs a stand-in model that announces itself and then stays at work. The forge's crew, dispatcher and run records are real.
- The test polls until
askProblemsreturns nothing.askProblemsis a plain-data verdict, and it names each failure it finds:
- exactly one new app exists, and the ask is an open issue on that app;
- the ask is not on the forge repository and was not kept as a thought;
- the newest run on that issue is running;
- the home's "Your next steps" card reads "<agent> is building it";
- all of this happens in under FIRST_FIVE_MINUTES.firstCrewActivitySeconds (60 s).
- A second test shows the verdict goes red for an ask filed on the forge repository, an ask kept only as a thought, a queued run, a card naming no one, and a run past 60 s.
What I chose not to do
- The third item on the issue (the steward's run on a throwaway production forge with the real $2 credit, noted on this issue) is the steward's step, not a builder's, so I left it.
- I didn't add the file to a list:
scripts/gate.tsruns everytest/*.test.ts, so it is already in the gate. - I didn't change
src/. The behaviour already exists, and this pins it.
To try it, run bun test test/first-five-minutes-journey.test.ts.
🤖 Generated with Claude Code
Test-only change: one new file, no src/ or README change, no new dependency. It matches the direction (a fast, deterministic pipeline test). The journey runs on a real spawned forge, the ask goes through /tell, and the verdict is a pure function with its own red cases. The preview serves the app unchanged, and I judged the test by reading it.
Two things I would do next:
- Make the forge-repo case live. The journey only searches new apps for the issue, so in the real read
issueOn === forgeRepocan never hold. An ask filed on the forge repository shows up as "no open issue anywhere", not as the forge-repo message. The branch is only exercised with hand-built data. Also haveread()look up the ask onforgeRepo, so the failure names the real cause. - Make the second test independent. It reuses
foundfrom the first test, so if the first test fails, the second fails with a confusing error. Build its base Found inline.
Left #11346 open: 1 unticked item remain (After release the steward runs the same journey on a throwaway production forge with the real $2 credit and records its cost against that forge's credit (a note on this issue; not a builder's step).).
I added
test/first-five-minutes-journey.test.ts. It passes in about 4 s, andbun x tsc --noEmitandbun scripts/gate.tsare clean. I ran only that file, not the full suite.What it does
claimedForgehelper./tellform the home page uses, with the target set tonew-app.askProblemsreturns nothing.askProblemsis a plain-data verdict, and it names each failure it finds:- exactly one new app exists, and the ask is an open issue on that app; - the ask is not on the forge repository and was not kept as a thought; - the newest run on that issue is
running; - the home's "Your next steps" card reads "<agent> is building it"; - all of this happens in underFIRST_FIVE_MINUTES.firstCrewActivitySeconds(60 s).What I chose not to do
scripts/gate.tsruns everytest/*.test.ts, so it is already in the gate.src/. The behaviour already exists, and this pins it.To try it, run
bun test test/first-five-minutes-journey.test.ts.🤖 Generated with Claude Code
Closes #11346