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

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

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

opened this

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 claimedForge helper.
  • The owner's first ask goes through the same /tell form the home page uses, with the target set to new-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 askProblems returns nothing. askProblems is 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.ts runs every test/*.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

Closes #11346

1 earlier comment · 1 event
commented

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 claimedForge helper.
  • The owner's first ask goes through the same /tell form the home page uses, with the target set to new-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 askProblems returns nothing. askProblems is 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.ts runs every test/*.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

Approved

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:

  1. Make the forge-repo case live. The journey only searches new apps for the issue, so in the real read issueOn === forgeRepo can 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 have read() look up the ask on forgeRepo, so the failure names the real cause.
  2. Make the second test independent. It reuses found from the first test, so if the first test fails, the second fails with a confusing error. Build its base Found inline.
commented

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

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs