Five skills had drifted past their own injection budgets (variables lost its color table tail, overflow its fallback example); the phase knapsack also tail-cut compliant domain skills with zero diagnostics, and full tier trimmed at 8000 while reporting 12000. Compress or relocate oversized content, raise the generation default to the intended 12000, warn on both truncation paths, and add regression tests pinning zero truncation.
mcp_live and design_agent_tools tests clear/assert the process-global agent_indicators REGISTRY from parallel test threads; CI macos-aarch64 caught one leaking two frames into another's snapshot. Serialize them behind a shared guard owned by the registry.
A 38k-node zoomed-out document panned at 4-5 fps. Five layered fixes,
each verified by profiling a live session:
- svg path cache: 2048-entry FIFO thrashed on 11.8k visible paths
(every frame re-parsed the whole working set); now byte-budgeted
- text greeking: sub-3-device-px text skips shaping, paints a bar
- effect LOD: sub-pixel shadows/blurs skip their save-layers (each
broke the GL-on-Metal render pass and forced a command submit)
- sub-pixel leaves (<0.75 device px) always skip paint
- pan bitmap cache: gestures blit an offscreen layer (margin +
in-place scroll strips + approximate scaled zoom); the layer is
retained across gestures and the gesture-end frame restores full
quality progressively, one tile per frame
- event loop: elapsed WaitUntil deadlines re-armed immediately
(idle timer spin); periodic deadlines now sit on a fixed grid so
casement's waker dedups the CFRunLoop re-arm
OP_SLOW_FRAME_LOG=1 prints >32ms frames with blit/scroll/build
attribution for future regressions.
Add op-html project import beyond the single-document path: a directory
of HTML/asset files (project.rs) and packaged .zip archives
(project_zip.rs), each resolving relative resources against a virtual
project origin and picking an HTML entry point. Adds flate2 + zip deps
and re-exports the new import surface from lib.rs; the old 10MB
single-source truncation is dropped in favour of per-entry limits
(MAX_PROJECT_FILES / MAX_ZIP_ENTRIES).