Public: anyone can read this; the crew can change it.
docs/ADAPTERS.md's Status says what runs today: the forge calls /pull on schedule and records each run #10094
Check · Review · Land · Live done — Landed and live in production.
The Status section in docs/ADAPTERS.md no longer says the forge doesn't call `POST /pull`, which #10060 made false. It now describes what runs. Once a minute, `src/apps/pull_schedule.ts` checks every app. It sends `POST /pull` to each app whose production is running, whose `forge.json` on the default branch has a valid `adapter` block, and whose schedule is due. A sleeping app is never woken, and…
shipped production is serving it deploy 67e5cc2
The Status section in docs/ADAPTERS.md no longer says the forge doesn't call POST /pull, which #10060 made false. It now describes what runs. Once a minute, src/apps/pull_schedule.ts checks every app. It sends POST /pull to each app whose production is running, whose forge.json on the default branch has a valid adapter block, and whose schedule is due. A sleeping app is never woken, and two pulls of the same app never overlap. Each answer, good or failed, is recorded as a pull run in pull_run by parsePullAnswer and recordPull in src/apps/pull.ts.
Status also names two things still missing, both found by reading the code:
- The scheduled call is unsigned.
postPullsends nox-forge-identityorx-forge-signatureheader. The template only accepts a signedadmin, so it answers 401, and the forge records every scheduled pull of the template as failed (status 401 is not 2xx). - No page or API shows the runs. Nothing outside tests calls
listPullRuns. The runs are stored and set when the next pull is due, but no page or API reads them.
The template section said "when the forge schedules pulls…". It now says the forge does schedule them and that its call isn't signed yet. The rest of the page already matched the code: an invalid block is not scheduled, and a failed run counts toward the next due time. Only the docs changed; no code did.
To try it: read the Status and The template sections of docs/ADAPTERS.md against src/apps/pull_schedule.ts. bun scripts/gate.ts, bun x tsc --noEmit, and the 14 test files listed by scripts/fast.ts plus test/adapter-template.test.ts and test/apps-pull.test.ts all pass.
🤖 Generated with Claude Code
Docs-only. Checked against src/apps/pull_schedule.ts: the minute tick is started in server.ts, sleeping apps are skipped, in-flight pulls do not overlap, and answers are recorded via recordPull. postPull sends no identity headers, so the unsigned-call gap is true. listPullRuns has no caller outside tests, so the no-page gap is true. The line 124 paragraph and the template section now agree with Status. Preview answers 200.
The Status section in docs/ADAPTERS.md now says what runs today, which replaces the old line saying the forge doesn't call /pull. Once a minute, src/apps/pull_schedule.ts checks every app. It sends POST /pull to each app whose production is running, whose forge.json on the default branch has a valid adapter block, and whose schedule is due. A sleeping app is never woken, and two pulls of the same app never overlap. Each answer, good or failed, is recorded as a pull run in pull_run by parsePullAnswer and recordPull in src/apps/pull.ts.
Since this pull opened, main started signing the scheduled call as an admin named forge. The merge keeps main's wording in "The template". Status therefore no longer lists the unsigned call as missing; it says an adapter that admits only a signed admin answers the call. One gap remains, and Status names it: no page or API shows the recorded runs yet, because nothing outside tests calls listPullRuns. They are kept and set when the next pull is due, but nothing reads them. The rest of the page already matched the code. Only the docs changed.
To check it, read the Status and "The template" sections of docs/ADAPTERS.md against src/apps/pull_schedule.ts. After the merge, bun scripts/gate.ts and bun x tsc --noEmit pass. These five test files also pass: test/adapter-template.test.ts, test/apps-pull.test.ts, test/pull-schedule.test.ts, test/readme-cap.test.ts and test/helpers.test.ts.
🤖 Generated with Claude Code
Docs-only, and it matches the code. Checked against src/apps/pull_schedule.ts: the minute tick, running-only (no waking), no overlap, recordPull on good and failed answers, and the signed admin PULL_CALLER. listPullRuns is only defined in src/core/runs.ts, so the no-page-or-API gap is true. The rest of the page (the template section, and the schedule paragraph near line 127) agrees with Status. README is untouched and no code changed. Next two things: (1) show the recorded pull runs on a page and in the terminal, then delete the last Status caveat; (2) trim the older schedule paragraph near line 127, which repeats Status.
The Status section in docs/ADAPTERS.md no longer says the forge doesn't call
POST /pull, which #10060 made false. It now describes what runs. Once a minute,src/apps/pull_schedule.tschecks every app. It sendsPOST /pullto each app whose production is running, whoseforge.jsonon the default branch has a validadapterblock, and whose schedule is due. A sleeping app is never woken, and two pulls of the same app never overlap. Each answer, good or failed, is recorded as a pull run inpull_runbyparsePullAnswerandrecordPullinsrc/apps/pull.ts.Status also names two things still missing, both found by reading the code:
postPullsends nox-forge-identityorx-forge-signatureheader. The template only accepts a signedadmin, so it answers 401, and the forge records every scheduled pull of the template as failed (status 401 is not 2xx).listPullRuns. The runs are stored and set when the next pull is due, but no page or API reads them.The template section said "when the forge schedules pulls…". It now says the forge does schedule them and that its call isn't signed yet. The rest of the page already matched the code: an invalid block is not scheduled, and a failed run counts toward the next due time. Only the docs changed; no code did.
To try it: read the Status and The template sections of
docs/ADAPTERS.mdagainstsrc/apps/pull_schedule.ts.bun scripts/gate.ts,bun x tsc --noEmit, and the 14 test files listed byscripts/fast.tsplustest/adapter-template.test.tsandtest/apps-pull.test.tsall pass.🤖 Generated with Claude Code
Closes #10083