Symptom
tower-cron's team-update task appends its hourly event line to codev/team/messages.md — a tracked file in the main checkout. Every eventful hour re-dirties the worktree, and the pre-spawn dirty-check then blocks every afx spawn until someone hand-commits a cron log line (hit twice on 2026-09-11: the #1668 spawn was refused on the 03:00 append; the 10:00 tick re-dirtied the tree minutes after it was committed).
Tension
The team feed is versioned by design (it ships in the repo), but a daemon writing to tracked files in the developer's checkout means the workspace can never stay clean, and the entity creating the dirt (cron) is not the entity the guard asks to resolve it (the human/architect mid-spawn).
Options (lane's judgment)
- Feed becomes append-through-Tower: cron posts to global.db (like mailbox rows);
codev/team/messages.md is materialized/committed deliberately (e.g. by team update run by a human, or at release time). Matches the state-lives-in-DB invariant.
- Spawn guard exempts the feed path (smallest change; leaves the perpetual-dirt annoyance and weakens the guard).
- Cron auto-commits its own appends (a daemon committing to main — against the workspace's commit conventions; listed for completeness, not recommended).
Option 1 fits existing architecture best. Related: #1660 (only-post-when-events, which reduced but cannot eliminate the frequency), #1662 (content quality).
Symptom
tower-cron's team-update task appends its hourly event line tocodev/team/messages.md— a tracked file in the main checkout. Every eventful hour re-dirties the worktree, and the pre-spawn dirty-check then blocks everyafx spawnuntil someone hand-commits a cron log line (hit twice on 2026-09-11: the #1668 spawn was refused on the 03:00 append; the 10:00 tick re-dirtied the tree minutes after it was committed).Tension
The team feed is versioned by design (it ships in the repo), but a daemon writing to tracked files in the developer's checkout means the workspace can never stay clean, and the entity creating the dirt (cron) is not the entity the guard asks to resolve it (the human/architect mid-spawn).
Options (lane's judgment)
codev/team/messages.mdis materialized/committed deliberately (e.g. byteam updaterun by a human, or at release time). Matches the state-lives-in-DB invariant.Option 1 fits existing architecture best. Related: #1660 (only-post-when-events, which reduced but cannot eliminate the frequency), #1662 (content quality).