Image token economy (vision routes)
On image-capable routes every attached screenshot keeps billing on every later request. 0.3.0 makes that spend deliberate:
imageBudget(default 3): max screenshots attached per session — state is keyed by the session object, so budgets never leak between conversations sharing one plugin instance- sha256 dedupe: an unchanged screen is never re-attached (free, disclosed as economy — not failure)
- exhaustion is honest: past budget you get the geometry table plus the billing rationale, never a silent skip
- Proven live on kimi-k2.7-code: attach→dedupe→attach→attach→exhausted, exactly 3 image blocks in requests, vision verified from pixels (evidence)
Gate hardening
- G1 cache window removed: the quick pre-act doctor costs 0.10–0.18s measured — every act now gets a fresh freshness verdict; the "touch a .ts inside the TTL" hole is gone
freshnessTtlSecondsremoved (dead knob); leftover keys in existing configs are harmlessSTEP_TIMEOUTmapped to its real remedy (a wedged DevTools render process times out only screenshots — restart DevTools, observed live)
Doctrine (from live evidence)
Native overlays (wx.showLoading, toasts) render in a layer DevTools screencaps do not capture — byte-identical PNGs proved the dedupe right. The skill now teaches: never assert a toast from a screenshot.
51/51 tests; tarball now ships test/ so npm test works in the installed package. Full audit trail in ATTACK-LEDGER.md (R5 + independent pre-tag fix-audit).