Bounded graphics decode extension crate (landed CTX-0003, independently verified CTX-0004). Png-only decode unit plus the raster mechanics subset; placement policy, rect helpers and renderer upload validation stay in Core. Read AGENTS. Task management lives in CarryCtx.
Prerequisite: W-133 accepted contract specifications/graphics-extraction-contract.md (bitty-terminal-docs specify c28681db closed #170, promotion 3479ce12 closed #184). Bounded protocol intake, placement, resource enforcement and upload validation remain Core responsibilities unless an accepted contract says otherwise.
Local phases CTX-0001 -> CTX-0002 -> CTX-0003 -> CTX-0004 map to Issues #4 -> #3 -> #2 -> #1. CarryCtx reports all four phases complete; GitHub Issues #4, #2 and #1 are closed. This change closes #3 on the accepted W-133 contract.
Component name graphics (owner decision 2026-10-16: strip the bitty- prefix, per the net precedent). The packed binary is bitty-graphics; the install spelling is bitty extension install graphics --version 0.0.24.
- Descriptor: bitty-component.toml is the canonical record of the fixed fields. The
sha256there is a placeholder;scripts/pack-component.shrenders the per-target digest at pack time and refuses to pack on any other drift. - Pack locally:
just component-pack x86_64-unknown-linux-gnuwritesdist/<target>.tar.gzplus the sidecar andSHA256SUMSvia the vendoredscripts/make-component-dist.sh. Windows archives containbitty-graphics.exe; Linux and macOS archives contain the extensionlessbitty-graphicsmember required by the same Core descriptor contract. URLs:just component-url x86_64-unknown-linux-gnu. - CI: the
component-distjob in ci.yml exercises the release packer on every PR (no upload). The component release workflow is the only tag publisher: on a strictv*tag it verifies the tag against the descriptor, runsjust checkandjust product, buildsx86_64-unknown-linux-gnu, packages withscripts/package-component.sh, and uploadsbitty/extensions/graphics/<version>/(tarball, sidecar,SHA256SUMS) withscripts/publish-component.shunder the immutable cache policy plus read-back byte verification. - Owner step: pushing the
v0.0.24tag is the irreversible publish point. It consumes the organization-levelCLOUDFLARE_API_TOKENandCLOUDFLARE_ACCOUNT_IDsecrets (or repository/org variables of the same names) by name only. No tag, no publish, no merge happens from an ordinary PR. - Pilot binary scope:
bitty-graphicsreports--versionand refuses anything else (exit 2). The stdio serve loop lands with the Core-owned host binding (graphics#14 follow-up); publishing 0.0.24 exercises the distribution contract only and does not claim a served worker (graphics#17).