The phase spec said "Curve A." The code had _DEFAULT_PHASES. They were not the same thing.
That gap is where trust rebuild bugs hide. The account came out of a shadowban with trust on the floor. The right move is a graduated ramp: start with zero writes, prove presence through passive signals (likes, follows), and only open write slots after you have held each phase long enough for the platform's trust score to move. The wrong move is shipping a spec and never checking whether the implementation matches it.
Five audit fixes, in order of how bad they would have been to miss:
Phase curve was wrong. The spec called for 8 phases with ceilings [0,0,2,5,15,50,120,200] and dwell windows [3,7,7,7,14,14,14,7] days. _DEFAULT_PHASES in warmup.py had neither the right shape nor the right numbers. Phase 0 having a ceiling of 0 is not an edge case to handle gracefully. It is the entire point of phase 0: you are not writing anything, you are only demonstrating that a human shaped account exists. 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 the 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.
Top comments (0)