Format Specification revision 0.8 closes the thirty repair packages
(V1-V30) and three additional defects (A1-A3) of reviews/01-triage.md
before slice 4d writes any renderer code. Every Tier-1/2/3 design
decision adopts the triage's own recommended fix; reviews/05-visual-fix-log.md
records each choice, its reason, and the sections it touched.
Contradictory surfaces first. `visuals.automation` is added to the 17.3
allowed-field table that previously rejected it. Trace 17.16.14 is
rewritten around the four target families that now exist rather than
asserting a table that changed. `fill` and `stroke` accept
ValueSpec<color>, which is what makes 18.1's own component example legal,
with three limits stated so a ValueSpec can never return a paint object.
The repeater automation registry loses its nonexistent `step` block. An
infinite loop is legal in every scope, bounded by whatever owns the
track.
Spawned-instance lifecycle moves into a `spawn` container. A top-level
`lifetime` is now unambiguously per item and `spawn.lifetime` per
instance, so a spawned emitter expresses both and a spawned repeater
takes an instance lifetime without contradicting 18.5. Component inputs
get one canonical location, the `component` object's own `inputs`, and
the system-level `inputs` on emitters and repeaters is removed.
The composition chain is written out in named spaces. The fit matrix
carries the contain and cover centering offsets it was missing, the
camera center is mapped into CSS coordinates before the translation is
formed, and the chain B x P x V x F x M applies the device-pixel
multiplier exactly once. Local extents and anchors are fixed for all
fourteen primitives, arc sweep is directed with its bound checked before
normalization, catmull-rom is a uniform cardinal spline with its equation
given, and a closed bezier spline closes with a line.
Compositing gets a normative eight-stage order. Layer opacity applies
once, at the layer, not a second time per object, and a separate release
factor initialized to 1 means release never rewrites an authored opacity.
The sixteen offscreen buffers are one pool shared by layers and objects,
with allocation order, reuse, and farthest-first shedding stated, and
buffer refusal named as a diagnosed exception to 17.1.
Sorting units are defined for emitters and repeaters, not only particles:
a procedural system is atomic, with a representative depth and internal
ordinal ordering. Depth fog fixes its blend space and fogs gradient stops
before the paint is built. Coherent noise becomes an algorithm - ordered
gradients, a 255-sample Fisher-Yates shuffle, the full lattice hash,
octave normalization, and curl as the explicit perpendicular of the
potential's gradient - with published tolerances. Distributions get their
equations and an explicit per-distribution draw list, replacing "field
order". All seventeen behaviors get complete field contracts, waveform
equations, an accumulating-versus-fresh rule, and channel write sets.
Live automation totals separate from authoring bounds: a spawn that would
cross the live budget is refused atomically, consuming no ordinal, rather
than being admitted with tracks dropped. One diagnostic cadence covers
every ceiling and every shed. The centralized table gains the ceilings it
was missing and two new authoring bounds - 64 declared systems and 16384
expanded static objects - that close the unbounded static draw load.
`focalLength` gains a real lower bound of 1 so the clamp has a value to
clamp to. The backing store cap wins over the multiplier floor on
displays wider than 4096. Parallax 0 is pinned against camera
translation, not exempt from zoom and rotation.
tools/verify-spec-contract.py commits the contract harness that was
previously run ad hoc. Its post-edit run reports 46 diagnostic codes
declared, 107 distinct cross-references all resolving, zero unresolved
references, 170 balanced fence markers, and 112 well-formed tables.
Documentation only: no runtime, schema, fixture, or test file was
touched, and npm test still passes 102 tests with zero failures. Every
19.5 value, including the two new static bounds, remains provisional
pending the slice 4h GC6 measurement.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0162Jb1J36judZNT8fHabGVt