The phase spec said 8 phases with specific ceilings. The code had different numbers. That gap is where trust rebuild bugs hide.
The warmup spec defined 8 phases with write ceilings at 0,0,2,5,15,50,120,200 and dwell windows of 3,7,7,7,14,14,14,7 days. _DEFAULT_PHASES in warmup.py had neither the right shape nor the right numbers. The account had just come out of a shadowban with trust on the floor. The graduated ramp is the only sane approach: start with zero writes, prove presence through passive signals like follows and likes, and only open write slots after holding each phase long enough for the platform's trust score to move. Shipping a spec without checking whether the implementation matches it is how quiet damage starts.
Five audit fixes, ordered by how bad they would have been to miss.
Phase curve was wrong. Phase 0 having a ceiling of 0 is not an edge case to handle gracefully. It is the entire point: you are not writing anything, you are only demonstrating that a human-shaped account exists. The _DEFAULT_PHASES constant did not match the spec's 8-phase curve. Likes and follows are deliberately excluded from the write count for exactly this reason. They are the permitted passive signal per the spec.
The ceiling did not include conversation replies. writes_today() was counting original posts and quote tweets but missing reply turns in the conversations engine. Replies cost trust budget the same as any other write. Omit them from the count and you silently blow past the ceiling on days the conversations engine is active. No alert fires, no guard trips, just invisible budget burn.
The LinkedIn mirror had no ceiling awareness. The mirror pipeline takes LinkedIn posts and cross-publishes them to X. It ran completely outside the warmup guard. That is a write, and it would have counted on X regardless of what warmup.py thought the daily total was. Adding the over_ceiling and writes_paused imports to mirror.py was a single line fix with a non-obvious blast radius if missed.
No recovery path in the CLI. The warmup spec includes alert halt instructions for when the system detects something going wrong. Those instructions reference a warmup reset command. That command did not exist. Added it to __main__.py and wired the launchd plist to the correct zsh/uv wrapper with absolute log paths, so the recovery path is actually exercisable in production without manual surgery.
A 60% test flake was hiding a real ceiling assertion. The conversations test helper was calling tick() with a code path that ends in an unseeded variance.rng coin flip. About 60% of the time the opener gate returned early and the ceiling block assertion never ran. Pinning CONV_SKIP_ACTION_PROB=0.0 removes the variance and forces the test to actually verify what it claims to verify. 137 tests now pass on 8 consecutive deterministic runs.
What I would do differently: write the phase table as a single source of truth in a config file, parsed and validated at startup, not as a Python constant in the module. _DEFAULT_PHASES is a code smell for a constant that should be data. When the spec changes and you need to update the curve, you want to edit one JSON or TOML file and have the system reject malformed inputs on load, not discover the mismatch three phases in after it has already done quiet damage.
The warmup is live at phase 0. Zero writes. Watching the passive signal accumulate.

Comments
Please log in or register to join the discussion