fix(tuval): cron is opt-in — the box config no longer starts a token-spending job by default - #9247
Conversation
…spending job by default The `cron` row shipped stated ON in `.tuval/tuval.config.ts`, and its node is planned, so `pnpm dev` in `apps/tuval` stood the scheduler up at boot and spent Claude tokens every ten minutes without anyone asking for it. A row whose job costs money is one a desk opts into, the way `prReviewExample` is. The flag is off in this layer now. The comments that justified default-on say the opt-in instead: flip the line, restart the desk, and the row, its graph node and `:cron run` appear. `src/features.ts` already declared the key off; its docblock no longer claims this repo's config flips it on. `boot.unit.test.ts` goes back to its pre-#9226 shape — eight programs, three processes, no `cron run` in the box's spell count, no cron process line. Cron's own coverage stays whole in `src/cron/cron.unit.test.ts`; its one registration case now pins the off default rather than the on one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
🚀 Preview deployed
|
|
review-code: PASS @ 1ed5896 content:2b5f55fce292 — merge-ready Graded against #9248 ( Per-criterion
Standing checks
Fan-out
Deviations
Note for the record: #9248 carries Verdict-written: 2026-09-15T20:24:10Z Superseded verdict — 2026-09-15review-code: FAIL @ 1ed5896 content:2b5f55fce292 — deviations section malformed; opt-in default has no contract row Graded against #9225 ( Findings
Per-criterion
Standing checks
Deviations
Verdict-written: 2026-09-15T20:19:22Z |
|
routed-elsewhere: review-ui @ 1ed5896 — flag default and docblocks only — no component, style or composition changed, nothing renders differently Four files changed; the one raising the The remaining three are outside the rendered surface entirely: No component, stylesheet, token or composition file is in the range. The five declared tuval LAW-SOURCE: manifest-prose (untyped registry, exit 13) — consulted, no row engaged because no pixels moved. |
cron(#9226) shipped stated ON inapps/tuval/.tuval/tuval.config.ts, and its node is planned, soanyone who ran
pnpm devinapps/tuvalgot a scheduler standing up at boot and spending Claudetokens every ten minutes without opting in. A row whose job costs money is a row you ask for, the
way
prReviewExampleis.features.cronisfalsein this layer now. The comments that justified default-on state theopt-in instead — the file header, the
cronJobdocblock and the row's own comment: flip the line,restart the desk, and the row, its graph node and
:cron runappear.src/features.tsalreadydeclared the key off; its docblock no longer claims this repo's config flips it on, since it no
longer does.
src/boot.unit.test.tsgoes back to its pre-#9226 shape:8 program(s),3 process(es), noCRON_SPELLSinBOX_SPELLS, noprocess cron …line, and the case name that names threeprocesses rather than four. Cron's own coverage is untouched in
src/cron/cron.unit.test.ts— all28 cases, including the "puts the job on the row's fill" and
:cron runones — except its singleregistration case, which pinned
config.features?.cron === trueand now pins the off default andthe absence of the row and its graph node.
No boot case proves the row with the flag on, and that is a real gap rather than one this PR could
close cheaply:
boot.unit.test.tsboots the checked-in.tuval/tuval.config.tsby path through thebin (
--config <boxConfig>), so there is no copy of the config to flip a flag on. The on-path proofstays where it was strongest anyway —
cron.unit.test.tsdrives the row's tick, spawn, fill, promptand result cells directly against a live
claudeSessionrow.Gates from
apps/tuvalat this head:pnpm typecheck0 errors;npx biome check .tuval src/boot.unit.test.ts src/features.ts src/cron/cron.unit.test.ts—Checked 4 files. No fixes applied.;pnpm vitest run --project unit—Test Files 323 passed (323) / Tests 3385 passed (3385). (An earlier run of the same head flaked on the knownattached-desk.unit.test.tsx › closes on Escape; the run above is the clean one.) The boot case is the end-to-end proof of the default:8 program(s) … 3 process(es) liveand no cron process line. No Claude tokens were spent.src/config.unit.test.tsandsrc/page/dev-server.unit.test.tsenumerate the flag keys, not theirvalues, and are unchanged and green.
Reviewer's first stop: the
featuresblock and its three comments inapps/tuval/.tuval/tuval.config.ts.This off default reverses criteria 6 and 7 of #9225, which is closed and cannot take a new row;
#9248 is the contract it is graded against instead, and this PR closes it.
Deviations
src/features.tsis leave-alone, and thecron: falseline is untouched. Did: two lines of its docblock were rewritten; they said the flag is
"flipped on by this repo's own config". Why: this PR makes that claim false, and a docblock
that lies about the config is worse than a file left pristine. Disposition: rewritten to
state the opt-in default; the declaration, the
featuresDefaultentry and the ADR 0375 row-flagreference are unchanged.
src/boot.unit.test.ts:262asserted theprocess cron …line in the boot output, and the case name that names four processes.Did: that assertion is gone; the file reverts to its pre-feat(tuval): cron wakes on a timer, starts a job program and reports the run on its tile #9226 shape —
8 program(s),3 process(es), noCRON_SPELLSinBOX_SPELLS. Why: the default reversed on purpose, so abox boot no longer launches cron and the old line cannot appear. Disposition: replaced by
assertions pinning the off box — the program and process counts, the absent
CRON_SPELLSand theabsent cron process line are now the end-to-end proof of the off default. No boot case proves the
row with the flag on; the bin boots the checked-in config by path, so there is no copy to flip —
filed as No boot case proves the Tuval cron row with its flag flipped on #9249, non-blocking here.
src/cron/cron.unit.test.ts:360-362assertedconfig.features?.cron === trueand that the rowlist and the graph node list each
toContain("cron"). Did: all three are replaced with theirnegations. Why: the default reversed on purpose; those three pinned default-on and would now
be false. Disposition: the replacement assertions pin the off default —
features.cronnottrue, no
cronrow, nocrongraph node. The other 27 cases in the file are untouched and staythe on-path proof: tick, spawn, fill, prompt, result and
:cron runstill drive a liveclaudeSessionrow.Part of #9225.Did: it links
Fixes #9248instead. Why: Tuval has no scheduler: a cron program on defineProgram that starts a job program on a timer and reports each run on its tile #9225's criteria 6 and 7 state the on default,which this PR reverses, and the issue is closed so the new default cannot be appended there.
Disposition: Tuval's cron row is flipped to opt-in with no criterion stating the off default #9248 carries the off-default contract — config
cron: false, the flip-onrestore of row, node and
:cron run, the boot test pinning the off box, and cron's unit testspinning the off default while remaining the on-path proof. Tuval has no scheduler: a cron program on defineProgram that starts a job program on a timer and reports each run on its tile #9225 stays the history and is cited
in prose above, not as a second link line.
Fixes #9248
Base is
main