The two remaining audit decisions, both decided this session: preset behavior follows the descriptions, and restrictedMode goes.
Presets: the description is now the contract
Six presets declared strategy: 'all' against their own descriptions, and since #1412 wired presets that data is live — a fresh buddy setup on Standard ("Daily patch updates, weekly minor updates, monthly major updates") proposed majors three times a week.
The mechanism: the generated workflow's scheduled tick now tells the update job which strategy fired. schedulePlan folds the preset's custom cadences in as real schedule slots (they previously reached only the generated config, where nothing in the unified workflow read them), each slot records its strategy, determine-jobs surfaces it as a new update_strategy output, and the update job's strategy resolution becomes inputs.strategy || update_strategy || preset default.
The data, per preset:
| Preset | Before | After |
|---|---|---|
| standard | one Mon/Wed/Fri slot, all | daily patch, weekly-minor (Mon), monthly-major (1st) |
| minimal | one weekly slot, all | weekly patch + monthly-updates catch-all |
| high-frequency | every-6h all slot beside its four documented slots | the four slots are the cadence (patch 6/12/18h, minor at midnight); the catch-all that double-ran with a wider strategy is gone |
| security | every-4h all + a security-patches slot duplicating it | every-4h patch + weekly-minor; the duplicate is gone |
docker / monorepo / custom / testing promise no tiers and are unchanged. Also corrects docs/cli/setup.md's claim that "the workflow it writes is the same either way" — true before #1412, false since.
restrictedMode: deleted
Documented in docs/ai/agent.md as "what a run triggered by someone without write access gets" — and no code path could ever select it: its only reference was the package re-export, because checkPermission refuses non-collaborators every agent-running command before a mode is chosen. The mode, its registry entry, its export and its docs row are gone; the docs paragraph now describes the gate that actually fires. The reads-only-tier test repoints at plan, which has the same tier list and is reachable.
Tests
New per-slot update strategies describe pins: every standard slot carries its strategy, the dispatch emits update_strategy on the right cron, high-frequency is exactly its four slots, security no longer duplicates its cadence. Updated the assertions that pinned the old data. bun test: 2236 pass / 0 fail; typecheck, pickier, check-docs green.
🤖 Generated with Claude Code