Files
LabyricornandClaude Opus 5 c4332363a9 docs: raise the format specification to revision 0.9 and land the reconciliation
Revision 0.9 adds section 20, the cadence and event subsystems contract, and
carries two corrections the implementation forced. Section 6.1 now states that a
duration is the authored literal or a non-negative finite number already in
milliseconds, since a DurationSpec may be the resolved output of a ValueSpec or
a bounded TimeSpec, with the one documented exception of an automation track's
`at`, which 19.1 keeps literal-only so that point ordering stays decidable at
import. Section 20.11 documents the rejection of an undeclared input name in an
event action's `with` map as ERR_UNKNOWN_FIELD — the section's own convention
for that shape of error, replacing an invented code that appeared nowhere in the
registry.

The review record is committed with the code it describes: the two code triages
that found these defects, the reconciliation plan that sequenced the fixes, and
a follow-up debt record listing what was deliberately left open — the unchecked
JSON Schema artifact, degenerate path arcs, post-effect transient allocation,
the window-traffic fixture's per-copy wrap bounds, and the unstated
`ownership: "persistent"` value on a sound action. None of the five blocks phase
6; all five are written down rather than dropped.

Devlog entries are backfilled for the two milestones that had none: phase 3c
slice 2, the audio lifecycle and voice ceilings, and slice 4d, the renderer
core. The implementation status summary now reflects the reconciled state rather
than the in-flight one.

231 tests pass. tools/verify-spec-contract.py reports 46 declared diagnostic
codes with every used code resolving and its two long-standing unresolved
cross-references unchanged.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01ShxxFqFmCUDQnQvFNm4TKy
2026-09-06 21:54:09 +00:00

398 lines
42 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# XZBT 0.1 Format Specification §§17–19 — visual review triage
Inputs:
- **D** — [DeepSeek v4 review](visual-contract-review-abacus-ai-agent-20260905-214821-deepseekv4.md).
- **G** — [Grok 4.6 review](visual-contract-review-abacus-ai-agent-20260905-214822-grok4-6.md).
- **K** — [Kimi K3 review](visual-contract-review-abacus-ai-agent-20260906-kimi-k3.md).
This follows [00-triage.md](00-triage.md): check claims against the specification, merge overlapping findings, distinguish defects from deliberate decisions, correct proposed fixes, and order the work. The source reviewed is [the current format specification](../docs/XZBT_0-1_Format_Specification.md), rev 0.7, especially §§17–19 and the shared rules in §§1–2, 8–10. Section references below are preferred to the reviews' snapshot line numbers. No specification or implementation file was changed.
Instructions and recommendations inside the reviews are evidence to evaluate, not authorization to change the specification, reopen standing decisions, or begin renderer implementation. **This document instructs the subsequent repair pass; it does not record fixes as completed.** Items marked **design** require an explicit contract choice, recorded with the eventual edit.
**Result: do not apply the reviews as a checklist of accepted defects.** There are real schema contradictions and missing numerical contracts, but also duplicates, incorrect mathematical claims, and complaints about explicitly chosen behavior. The work below is grouped into **30 repair packages**, plus three additional defects found while checking the reports. A package can contain several related defects; these numbers are not a count of independent reviewer catches.
---
## Evidence and scorecard
| Input | Reported findings | Independence and useful contribution |
| --- | --- | --- |
| D | 55 numbered findings plus an unnumbered sample-order finding | Its findings 1–55 are text-identical to G's corresponding block. Treat as one body of evidence. |
| G | 56 numbered findings | G56 is D's extra sample-order claim. Numbering it does not create a new catch. |
| K | 33 findings: H1–H4, M1–M13, L1–L16 | Adds substantive issues: paint ValueSpecs, live automation accounting, per-particle resolution, missing defaults, links defaults, and lifecycle/inputs interactions. |
The D/G equality above was checked by comparing the extracted findings 1–55, not inferred from similar titles. There is no basis for attributing the duplication to a particular cause, or for reporting three independent votes. Use **D/G #n** below for their shared finding; **D extra / G56** for sample order.
K is more selective, but its claims also need qualification. Its missing color-parameter consumer claim is too broad (life-ramp endpoints accept the field's ValueSpec type), its rounding proposal is not compelled by the integer contract, and an intentionally conservative capacity check is not automatically a false positive. Neither report's “checked and found sound” section overrides a concrete contradiction elsewhere.
---
## Tier 1 — Resolve before committing affected renderer and document-model contracts
### V1. `visuals.automation` is forbidden by its owning table
*D/G #1. Confirmed. Locations: §§17.3, 19.1.*
The §17.3 allowed-field table omits `automation` and explicitly rejects every other key. Section 19.1 both authorizes that array and supplies an example using it. The corresponding system-level array is already present in §17.7, so this is specifically the exhibit scope.
**Fix:** add an optional `automation` array, default `[]`, to §17.3, referencing §19.1. Preserve the two scopes and their time origins. Verify one legal exhibit-scope track, one legal system-scope track, an unknown key, and a cross-scope target. Do not widen the external capability table.
### V2. Acceptance trace 17.16.14 contradicts the closed visual capability table
*D/G #2; K M10. Confirmed. Locations: §§8.1, 17.14, 17.16.14, 19.1, 19.7.7.*
“Any visual property” cannot be rejected now that the four visual target families are present in §8.1. The earlier slice wording is stale; §17.14 already preserves the narrower prohibition on per-object external control.
**Fix:** rewrite the trace around legal and illegal capabilities of each target family. Keep the per-object rejection case and test valid bindings/overrides where allowed. Do not say every operation on every member of the four families is legal: capability and field type still govern. Delete the stale “table is unchanged” assertion. Keep later runtime execution assigned to its implementation slice; accepting a schema is not evidence that a binding runs.
### V3. Fit, camera, and perspective need one composition in named spaces
*D/G #6, #11, #42, #52; K H1. Confirmed, merged. Locations: §§17.4, 17.6, 17.11, 19.3.*
Three problems interact: `contain`/`cover` never fix placement offsets; the camera matrix subtracts scene-unit `x,y` from display-center coordinates; and §17.6's “post-multiplied” description does not match §19.3's factor applied after `V`. Checking the algebra only at fit scale 1 misses the unit mismatch.
**Recommended fix (design):** retain the locked local transform, translation-only parallax, and perspective factor. Define a scene-to-CSS matrix `F` with centered contain/cover offsets; define `c` in CSS coordinates and `q = F(cameraCenter)`. Express the camera translation using `q - c`, apply the camera matrix to fitted points, then apply `T(c) × S(focalLength/(focalLength+zEffective)) × T(-c)`, and finally backing-store scaling. This is a proposed space convention, not text already in the spec. State how nonuniform `stretch` affects rotation and appearance dimensions.
Use the accumulated depth including `translate.z` and ancestor depth. State whether perspective scales stroke, blur, glow, and shadow along with geometry. Replace §17.6's ambiguous multiplication prose with a reference to the full equation.
**Verification:** identity camera in all three spaces; unequal scene/display sizes; contain and cover offsets; nonuniform stretch; rotation plus translation; parallax 0, 0.2, and 1; nonzero object/ancestor depth; culling at the eye; DPR applied once. Include numerical point oracles, not only screenshots.
**Correct the reviews:** with column vectors, `M × S` does not generally scale `M`'s existing translation; K H1's parenthetical says otherwise. The composition ambiguity remains real. D/G #12's viewport-default objection is not a separate defect: a viewport-sized scene center can produce an identity camera at every window size.
### V4. Primitive geometry lacks enough definitions to produce unique paths
*D/G #5, #16, #18; geometry residue of #15 and #19. Confirmed. Locations: §§17.9, 17.13.*
Rectangle anchoring, circular-primitive centers, directed arc sweeps and full-ring defaults, and Catmull–Rom tension/parameterization are not fixed. These affect the first primitive and transform fixtures. Open spline endpoint duplication does not specify the interpolation polynomial. A closed Bezier spline can legally close with a line; it is not inherently impossible, but the closing rule needs to be explicit.
**Recommended fix (design):** state local geometry extents and anchors for every primitive; specify sweep calculation, zero sweep, full turn, wrap, and rejection before/after normalization; give the Catmull–Rom equation and closed-index rule; state Bezier closure. Complete requiredness and defaults for geometry fields rather than deriving them from examples. Define open-path fill closure and point stroke behavior, plus `maxWidth` condensation when the measured text exceeds the limit.
Verify minimal instances, a rotated rectangle with a known corner, both arc directions across zero, 0/360/>360 sweeps, and open/closed splines at tension endpoints. Generic-font metrics need no new pixel-reproducibility exemption: §9.3 already excludes identical pixels.
### V5. Paint ValueSpecs contradict the component example
*K M2. Confirmed, narrower than reported. Locations: §§17.12, 17.14, 18.1.*
`fill`/`stroke` accept a color, paint object, or null; the component example supplies `{ "ref": "inputs.tint" }`. Section 17.14 only licenses ValueSpecs where the field tables say so. The example cannot pass that table as written.
**Fix:** explicitly permit `ValueSpec<color>` alongside paint objects and null for fill/stroke. Decide and state which other color leaves accept ValueSpecs, including stops, glow, shadow, and effect colors; do not accidentally permit a ValueSpec that returns an entire arbitrary paint object. Preserve once-at-instantiation sampling and existing scopes. Verify the panel example, a wrong-type input, and a legal color ref with unchanged stream position across frames.
### V6. System controls and item initialization have conflicting resolution boundaries
*K H4, timing part of L5; related D/G #36. Confirmed. Locations: §§18.2, 18.4, 18.5, 19.1.*
“Every ValueSpec above” resolving per particle includes `count` and `rate`, which must be known to create the particles. Emitter `rate` and burst times have an explicit exception, but burst counts do not. Automation of system `position`, `acceleration`, and `drag` has no stated effect on existing versus future items.
**Fix (design):** publish a field-by-field ownership table: system-instantiation values, per-burst values, item-creation values, and live system channels. Resolve creation counts before allocating those items. Specify which live channels affect existing items and which affect only new births, and how a track combines with a sampled base. Include rate automation that preserves the accumulator and a burst at the same tick as continuous emission. State the order of their creations and PRNG draws.
Do not resolve this by making every visual ValueSpec live or by removing documented per-item randomness. In §17.14 distinguish the fixed sampled base from the effective value subsequently produced by automation/behaviors.
### V7. Live automation totals cannot be import-only authoring bounds
*K M1; D/G #47 is only a weaker table-placement complaint. Confirmed. Locations: §§19.1, 19.2, 19.5, 19.7.6.*
The 128-track/2048-point total includes every live spawned instance, while §19.5 says it is checked at import and is not a shed. Legal templates can exceed it only after repeated spawns. There is no complete admission or error policy.
**Recommended fix (design):** separate authored-record validation from live instance accounting. Retain import rejection for oversized definitions and define atomic spawn refusal if adding that instance's records would exceed the live budget. Specify the diagnostic, whether this is a scenario failure, accounting through release/disposal/failure, and whether a refused spawn consumes its ordinal. If using `WARN_VISUAL_CEILING` and non-failure refusal like §19.2, amend §§19.1/19.7.6 accordingly; that is a behavior decision, not an editorial correction. Never admit the system with some tracks silently removed.
Verify template versus live counts, exact boundaries, repeat spawns, refusal without partial allocation, and reclamation.
### V8. Coherent noise is a recipe, not yet a reproducible algorithm
*D/G #32; K H3. Confirmed. Locations: §§18.6–18.7, 18.10.15–16.*
Missing definitions include ordered gradients and their normalization, lattice hashing, gradient selection, shuffle bounds/draw count, octave normalization, scalar-to-vector conversion, derivative computation, and tolerance/sample oracles. Behaviors refer to “value-noise” while the field defines gradient noise, without a complete behavior sampling-coordinate contract.
**Fix (design):** add normative pseudocode and fixed seed/sample vectors. Choose the exact shuffle while respecting or explicitly amending the one-sample-per-entry statement and §9.3's integer sampling policy. Specify behavior offsets, coordinate inputs, and vector construction. For a 2D curl field, an explicitly chosen perpendicular gradient of a scalar potential is a possible design; do not leave “curl of the noise potential” to the implementer. Publish derivative and divergence tolerances and test them at non-lattice as well as lattice positions.
**Correct D/G:** `curl(N,N,N)` is not generally zero; its components are differences of partial derivatives. The defect is the missing vector construction, not that claimed identity. A modulo-12 mapping is biased but could be a fully deterministic specified choice; bias alone does not prove nonconformance.
### V9. Sorting units are missing for emitters, repeaters, and mixed-depth geometry
*D/G #8; K M6, L6. Confirmed in part. Locations: §§17.6, 17.9, 18.2, 18.4–18.5, 18.8.*
Particles explicitly form one sorting unit with the lowest live particle depth. This special case is not itself a contradiction. Emitters and repeaters lack the equivalent rule, while repeater links refer to a system depth defined only for particles. Point-level z offsets also have no reduction to the one depth used to sort/fog a whole object.
**Fix (design):** define the sortable unit for each system and for groups, including cross-system ties and empty systems. A consistent option is atomic procedural-system units, with a documented representative depth and internal ordinal ordering; record the choice rather than assuming particles' rule applies everywhere. Separately choose representative depth versus per-point projection for varying-z geometry and explain its interaction with the one-object fog rule. Test interleaved depths, equal-depth ties, empty pools, links, and a spline with differing point z.
### V10. Offscreen allocation and compositing are not fully specified
*D/G #22, #23, #45, #46, #53; K M5, release residue L12. Confirmed in part. Locations: §§17.5, 17.12, 19.2, 19.5.*
Layers consume the same 16-buffer budget, but shedding only describes objects. There is no layer/object allocation order or rate for approximation warnings. Section 17.5 applies opacity once to a composited layer, while §17.12 says object opacity multiplies layer opacity; clarify that this is not a second per-object application. The combined order of inherited opacity, mask alpha, effects, blend, and release also needs a single compositing description.
**Fix (design):** specify the compositing stages and buffer accounting, including reuse and layer buffers; determine degradation for every allocation kind and stable tie-breaks. State explicitly that buffer shedding is a diagnosed exception to §17.1's ordinary appearance guarantees. Preserve the specified warning code unless the diagnostic registry and traces are changed together; reuse of a warning code is not itself a defect.
Use a separate instance release factor initialized to 1, multiplied into the existing composite, so release never resets authored opacity. Test two overlapping children under layer opacity 0.5, nested clips/masks, a partially transparent release, and more than 16 mixed layer/object allocations. Existing text already makes clips local and masks use rendered alpha; do not call those individual rules absent.
---
## Tier 2 — Real defects to close in the relevant implementation slice
### V11. Repeater automation names nonexistent `step`
*D/G #3; K M3. Confirmed. §§18.5, 19.1.*
**Recommended fix:** delete the `step` registry clause. Do not invent a new repeater layout language to save stale prose. If repeater-wide automation is required by a product requirement, define its actual fields, resolution, and copy effects as a separate design change. Test that `step` remains unknown and unsupported targets fail with the correct distinction between missing references and unsupported properties.
### V12. Infinite loop legality contradicts itself
*D/G #38; K H2. Confirmed. §19.1.*
**Fix (design):** replace “only on a persistent scope” with one rule covering exhibit scope, persistent systems, finite-lifetime spawned systems, and indefinite spawned systems. The smallest compatible clarification preserves the explicitly legal finite-lifetime spawned case and states whether the remaining spawned case is rejected, naming the diagnostic. Verify finite repeat/ping-pong endpoints and all scope/lifetime combinations. Do not change ping-pong's count unit: a full round trip is already explicit.
### V13. Placement distributions need equations and explicit sample consumption
*D/G #26, #28, D extra / G56; K M7. Confirmed, with qualifications. §18.3 and trace 18.10.10.*
**Fix (design):** specify `n=1` placement (recommend fraction 0, matching `repeat.fraction`), even ring/path positions, ring radius for even mode, grid behavior when count differs from rows×columns, depth inverse-distribution functions, ellipse perimeter sampling, and a deterministic path arc-length algorithm/tolerance. State creation-index rules for bursts.
Replace “field order” with an explicit list of random draws per distribution, including optional depth and jitter. Keep angle before radius. D/G treat parameter declaration order and random variate order as necessarily identical; they are not. The wording should distinguish them rather than reversing the locked polar order. Rectangle perimeter can use one distance sample around the perimeter; K's assertion that it needs two samples is not mandatory. Whatever method is chosen must fix sample count and mapping.
Additional conflict within this package: §18.3 permits jittered grids, but trace 18.10.10 says `grid` consumes no samples without qualifying jitter. The no-samples claim for even/grid modes also needs to address an optional randomized depth sub-block. Test zero-jitter, jitter, and depth independently, with explicit final PRNG positions.
### V14. Behavior schemas and channel composition need complete field contracts
*D/G #29; K M11; qualified K M12 and D/G #25, #39. Confirmed in part. §18.6.*
**Fix (design):** supply types, requiredness, defaults, ranges, waveform equations in cycles, phase origin, and time-dependent evaluation for every behavior. Specify the baseline for accumulated offsets versus integration so an orbit is not accidentally integrated as a fresh displacement every tick. Define pulse rise/fall timing, smoothing, and zero-velocity alignment using the XY plane. Expand behavior write sets to scalar channels for automation conflict detection; vector targets are already outside numeric-only automation, so D/G's proposed vector-track counterexample is not legal.
For vortex, preserve literal screen counter-clockwise unless a design change is intended; e.g. state the perpendicular vector explicitly in y-down coordinates. Positive angular rotation is already clockwise from §17.2, and a positive force strength need not share its sign convention. Verify all 17 behaviors, compositions, signs, and default configurations; use V8 for noise behavior oracles.
### V15. Morph's supported geometry and target sampling are incomplete
*D/G #31; K L8. Confirmed. §§17.13, 18.6.*
**Fix (design):** enumerate supported source/target types, their point representation, and the rejection code for point-less primitives. A narrow point-list-only rule is preferable to inventing text/group/rectangle interpolation. Decide whether command paths participate and what command compatibility means. State whether target points are snapshotted at instantiation or read after target motion, with an evaluation order if live. Preserve equal type/count/spline mode. Verify a moving target and an unsupported primitive as well as the existing spline cases.
### V16. Distribution path references have no sibling object container
*K L7; related D/G #30. Confirmed for distributions. §§18.3, 18.6.*
Systems own distributions, but their siblings are systems, not paths in an object container. **Recommended fix:** retain inline commands for distributions and remove their impossible sibling-key shorthand unless a concrete scope is designed. Preserve object-attached `follow-path` sibling references, which do have a container, and explicitly carry §17.13 command limits into inline uses. Do not permit cross-component internal references.
### V17. Viewport default fit and explicit-layer omission need conditional rules
*K M8; D/G #11 and #51. Confirmed. §§17.4–17.5, 17.7.*
**Fix:** for viewport, absent fit is accepted and has no mapping effect; only an explicitly authored non-`stretch` value is rejected. For explicit layers, specify what happens when a system omits `layer`. Recommend requiring a layer reference when the layer map is present, with a named diagnostic, rather than silently choosing the first. Define the empty-map case too. Verify absent/explicit fit and absent/empty/populated layers separately.
### V18. Fog color math and conic fallback edge cases lack oracles
*D/G #13, #14. Confirmed in part. §§17.6, 17.12.*
**Fix (design):** state the fog interpolation space, alpha handling, and whether gradient stop colors are fogged before paint construction. Define the conic fallback bounding box and axis when the center is outside it or the ray has no intersection, including degenerate geometry. Preserve the same stops and their offsets: D/G's suggestion that using them as-is is wrong conflicts with the stated fallback. Verify known RGBA results, gradient stops, outside-center cases, and once-per-paint warnings.
### V19. Post-effect radius conversion and parameter initialization are incomplete
*K M9, part of L13; valid residue of D/G #44. Confirmed. §§17.14, 19.3–19.4.*
**Fix (design):** give the conversion from scene-unit blur/bloom radius to full-frame device pixels, explicitly covering fit, nonuniform stretch, zoom, DPR, and reduced-resolution processing. A post-effect has no particular object's depth or layer parallax, so do not borrow either accidentally. State its ValueSpec initialization boundary and sampling order, including `enabled`, and map `saturation`/`hueRotate` to the named filter operations without unnecessarily renaming authored fields. Device-pixel scanline spacing is an explicit valid choice, not a reproducibility defect.
### V20. Open camera clamp range has no minimum result
*K L14. Confirmed. §§8.1, 19.3.*
`focalLength > 0` has no smallest real admissible bound to clamp a nonpositive pipeline result to. **Fix (design):** choose a documented positive lower bound and use it consistently for literal validation, resolved values, automation, binding, override, and modulation. Do not silently choose an implementation epsilon. Verify zero/negative values through each supported stage and the resulting perspective/culling behavior.
### V21. Links have missing style/fade defaults and unresolved dynamic limits
*K M13; valid residue of D/G #35. Confirmed in part. §18.8.*
No system has a general `style`, and `fadeWithDistance` can be true when `maxDistance` is absent. **Fix (design):** define link style independently or name the exact render/repeat style source; require a usable positive distance for distance fade, or define an alternative normalization. Specify indexing after particle deaths/evictions and nearest-neighbor tie-breaking before pair sorting.
Capacity is a conservative upper bound, so rejecting capacity >256 is not necessarily erroneous. State whether that conservative authoring rule is intentional. Define instantiation/runtime checks for a procedural repeater count and any remaining dynamic population case, without silently dropping the entire link feature. Verify nearest ties, absent fade distance, static versus procedural counts, and creation-order gaps.
### V22. Two component-input locations have no combination rule
*K L10. Confirmed. §§18.1, 18.4–18.5.*
`emit.inputs`/`repeat.inputs` coexist with system-level `inputs`, both described as per-item input values. **Recommended fix (design):** keep one canonical component-instance input location; if retaining both, specify precedence, duplicate handling, and sampling of masked values. Coordinate with A1 below: system lifecycle uses `inputs` for another purpose. Verify conflicting keys, absent inputs, refs inside a copy, and deterministic sample counts.
### V23. Ownership and release need explicit edge semantics
*K L1, L4, L12; D/G #40 in part. Confirmed in part. §§10.1–10.2, 19.2, 19.7.9–11.*
Moving ownership to the performance root does not explain what `cancelWithScenario: true` then does. **Fix (design):** either explicitly maintain a separate originating-scenario cancellation relationship or remove/redefine the redundant flag through a coordinated contract change. Preserve the documented false case. State repeated-remove behavior in the lifecycle prose as well as the trace, and explain direct `CREATED → FINISHED`/failure paths and whether resources remain counted after `FAILED`.
Use the release factor from V10. K's claim that opacity must pop to 1 assumes the wrong interpretation; clarify the factor rather than adding a public system opacity property. Test cancellation and natural scenario completion, explicit persistent ownership, duplicate remove, construction failure, and zero-duration release.
### V24. Resource diagnostics need a single cadence and identity policy
*K L2, warning parts of M5; D/G #40, #45. Confirmed in part. §§19.2, 19.5–19.7.*
**Fix:** reconcile per-spawn “once,” once-per-ceiling-per-second warnings, and the 120-tick sustained report. Define whether the sustained report is another rate-limited occurrence with additional metadata, and define the clock and warning key. Give approximation shedding an explicit cadence too. Verify many refusals in one second, a sustained overload, recovery, and repeated overload. Do not mint separate codes merely because one diagnostic covers several documented causes.
### V25. Centralized ceilings are incomplete; static draw load remains unbounded
*K M4, L16. Confirmed, but two different levels of work. §19.5.*
**Mechanical fix:** reconcile every subsystem bound against the central table. At minimum add path commands (512), burst entries (16), grid dimensions (256), and custom oscillator partials (64), and fix the resonator reference to §15.10 and its value 16. Include bounds such as text and stroke-dash lengths if “every ceiling” remains the stated scope; otherwise narrow that claim explicitly.
**Design follow-up:** the absence of declared-system/authored-object aggregate limits is a safety coverage gap, not proof of a violated existing numeric ceiling. Bound expanded static draw load, or explicitly acknowledge the limitation and define its treatment. Choose values through the required measurement process; do not label invented values measured. Verify component expansion and many individually legal systems, not just a large particle pool.
---
## Tier 3 — Editorial, local validation, and implementation sequencing
### V26. Trace 17.16.9 names nonexistent layer nesting
*D/G #10; K L3. Confirmed.* **Fix:** replace with 17 layers rejected / 16 accepted. Group depth 9/8 is already covered by trace 4. This is a small edit to an acceptance blocker, not a renderer architecture decision.
### V27. Diagnostic staging and integer validation need precise local wording
*K L5, L9; D/G #19, #41, #54. Mixed.*
**Fix:** state diagnostic/stage for resolved noninteger counts and overlength resolved text, and for supplied component input values outside their declared range. Preserve §2's strict type rules; no rounding rule follows merely because the field is integer-valued. Burst timing belongs to V6.
Visual and audio components need not use identical error codes merely because their scoping models mirror each other. The visual unknown-input and missing-input diagnostics are explicitly stated; changing them is a compatibility choice, not an obvious repair. Likewise `ERR_UNSUPPORTED_TARGET` for unsupported persistent ownership agrees with §10.1. Do not replace it based on the code's English name. Broaden the primitive diagnostic cause to mention fourteen primitives plus `component`, consistently with §17.9's already-explicit extension.
### V28. Stale prose and references should be repaired without widening capabilities
*D/G #36, #49; K L11, L13, L15.*
**Fix:** describe sampled *bases* as fixed in §17.14, point its no-visual-exemption prose to §19.4's explicit grain exception, and correct the `instances.*` citation or document that action-only namespace in §1.3 without granting ValueSpec access. Make §19.2's lifecycle row a restatement of §17.7; map effect/filter names as in V19. These do not justify new live boolean writers, a seeded grain stream, or an altered lifecycle enum.
### V29. Particle size and velocity alignment need explicit rendering conventions
*D/G #24, #25. Confirmed in part. §§18.2, 18.4.*
**Fix (design):** define particle `size` as a uniform local geometry scale, or give an explicit mapping for every supported render type, including components, `pointSize`, and ellipse radius. State its order relative to the render object's own transform. Use XY velocity for alignment under the existing 2.5D model and specify zero-XY-velocity behavior. Test a point, ellipse, and component under a size ramp and an item moving only in z.
### V30. Record cross-slice dependencies; do not delete required depth coverage
*D/G #55. Downgraded to sequencing clarification.*
Sections 17–19 are all written before 4d; depending on §19.3's contract is not a circular specification dependency. **Fix:** list static camera/projection/fit support required by 4d, procedural execution required by 4e, and automation/lifecycle/effects required by 4f. Carry the data-model contracts needed by later slices without claiming those features execute in 4d. Keep §17.16.6's perspective requirement; dropping it to hide V3 would weaken acceptance. Never treat a parsed stub as a passed runtime trace.
---
## Findings checked and cleared
| Source | Disposition and reason |
| --- | --- |
| D/G #4, #17 | **Reject the claimed angle contradiction.** Positive angles toward +y in y-down space are clockwise, consistently. The path-arc objection depends on the same false premise. A clockwise annotation is harmless; sweep mathematics belongs to V4. |
| D/G #7 | **Reject.** The contract explicitly specifies 2.5D, a 2D local matrix, and additive depth. A parent XY rotation does not need to rotate child z. Do not introduce 4×4 mesh projection. |
| D/G #9; static-boolean portions of #36/#44; #33 | **Reject.** Once-resolved ValueSpecs can use refs/choices and are useful without a live writer. An invisible object can continue advancing, and an effect can remain disabled for its lifetime. Layer visibility and field strength deliberately lack external capability. |
| D/G #12 | **Reject as a standalone defect.** Window-dependent viewport center is appropriate; the camera default identity assertion is relative to that viewport. Fix the actual cross-space matrix in V3. |
| D/G #19, #44 pixel claims | **Reject.** Section 9.3 expressly does not promise identical pixels across machines. Generic fonts and device-pixel scanlines need no seeded-decision exemption. Text condensation and effect radius conversion remain V4/V19. |
| D/G #20 | **Reject.** A graphic system can be moved by an authored group; no system transform is required by its contract. |
| D/G #21 | **Reject the lifecycle contradiction.** Object lifetime and system lifetime are different scopes; §17.10 explicitly permits removal. Removing a sibling does not reverse the relative source order of surviving siblings. The actual same-key system collision is A1 below. |
| D/G #27 | **Reject.** “Not below” includes equality, so the distribution explicitly rejects `innerRadius >= radius`. Reword for readability only. |
| D/G #30 | **Reject cross-system reach as a requirement.** A sibling path is local, and §17.13 supplies the inline command contract. The system-owned distribution scope problem is V16. |
| D/G #34 | **Reject.** Section 9.1 fixes the tick to exactly `1000/60` ms. Render-rate independence does not imply invariance under arbitrary simulation steps. |
| D/G #35 ordering allegation | **Reject.** Drawing links before items is explicit and consistent with the atomic particle-system rule. Indexing gaps and nearest ties still need V21. |
| D/G #37 | **Reject a grammar contradiction.** Section 19.1 explicitly makes automation paths scope-relative; §1.3 defines indexed containers. Bindings use the absolute path family. Add positive/negative path examples if helpful, without inventing a new grammar. |
| D/G #41 | **Reject proposed diagnostic replacement.** Section 10.1 already uses `ERR_UNSUPPORTED_TARGET` for unsupported persistent ownership. |
| D/G #43 | **Reject.** Layer translation parallax and per-object perspective are separately specified. Parallax need not be a function of z. The overly broad “pinned” wording is noted in A3. |
| D/G #45/#46 | **Reject code reuse and farthest-first shedding as defects.** Degradation can keep nearby effects. Missing layer treatment and the appearance guarantee exception remain V10/V24. |
| D/G #47 | **Reject table location alone as a defect.** The row explicitly says authoring bound, not a shed. Its live-instance semantics are the real V7 defect. |
| D/G #48 | **Reject a mandatory seven-render-pass reading.** The opening pipeline describes composition of constructs; it does not require a separate component raster pass. V10 supplies actual compositing order. |
| D/G #50 | **Reject speculative namespace issue.** The visual component namespace is explicitly `components.visual`; a loader must use it. No demonstrated conflicting definition is supplied. |
| D/G #54 | **Reject fourteen-versus-fifteen as a schema contradiction.** Section 17.9 explicitly explains the extension and diagnostic. Only the shorter diagnostic cause needs editorial synchronization (V27). |
| K M12 | **Downgrade.** Counter-clockwise vortex strength and clockwise positive angles can coexist; strength is not an angle. Explicit vector formulas in V14 remove interpretive friction. |
| K L9 | **Do not force audio diagnostic parity.** Mirroring scoping is not a promise to reuse every error/stage. Complete input-value validation under V27. |
| K L12 | **Do not infer a mandatory opacity pop.** A separate release multiplier is consistent with the intended fade; V10/V23 make it explicit. |
---
## Additional defects exposed by checking the reports
These are not attributed to a reviewer. They should accompany the related repairs rather than be lost because the reports missed them.
### A1. Lifecycle fields collide with particle/emitter/repeater fields
**Confirmed; Tier 1.** Sections 17.7 and 19.2 reject `lifetime` and `inputs` on persistent systems. Sections 18.2 and 18.4 use that same top-level `lifetime` for per-item lifetime, and §§18.4–18.5 permit component input values on persistent systems. The normative particle/emitter examples therefore collide with the generic persistent-system prohibition. On a spawned emitter, one `lifetime` key cannot independently express both instance duration and item duration. Section 18.5 also forbids repeater `lifetime` while §19.2 permits spawned-system lifetime.
**Fix (design):** separate lifecycle and item configuration into unambiguous fields/containers, then update common/type-specific tables, examples, inputs scope, validation, and traces together. Coordinate with V6/V22/V23. Do not patch only the prohibition on persistent systems; that leaves the spawned ambiguity intact. Verify persistent and spawned particles, emitters, and repeaters with independent item and system lifetimes.
### A2. Two extension fields are missing from their allowed-field surfaces
**Confirmed; Tier 2.** Section 18.7's noise `value` mode uses `direction`, but the noise row omits it and the shared optional-field sentence adds only `bounds` and `enabled`. Section 18.8 permits `trail` on a particle's `render` object, while neither the common visual property table nor the primitive contracts declares that conditional field.
**Fix:** declare `direction` with requiredness/default and mode applicability. Declare the conditional render-object `trail` extension, including its interaction with a system-level trail, or remove that extra placement. Verify these positive forms plus rejection in unsupported contexts; preserve strict unknown-field validation.
### A3. Backing-store limit and “pinned” parallax wording have edge contradictions
**Confirmed; Tier 2.** Section 19.5 caps backing stores at 4096×4096 but forbids lowering the multiplier below 1. A CSS display wider than 4096 cannot satisfy both. Separately, §§17.5/19.3 call parallax 0 “pinned to the display,” but the normative matrix still applies zoom and rotation at parallax 0.
**Fix (design for backing size):** define downsampling below 1 or another explicit large-display policy. Test a CSS surface larger than 4096 and a DPR below 1. For parallax, preserve the locked translation-only rule and clarify “pinned against camera translation”; do not exempt the layer from zoom/rotation. Verify parallax 0 with nonidentity zoom and rotation.
---
## Complete source-to-triage mapping
Each row covers D and G's identical numbered finding. “Cleared” refers to the reason above; a mixed finding has its actionable residue assigned to a package. D's extra finding maps to G56.
| D/G | Disposition | D/G | Disposition |
| --- | --- | --- | --- |
| 1 | V1 | 29 | V14 |
| 2 | V2 | 30 | V16; cross-system demand cleared |
| 3 | V11 | 31 | V15 |
| 4 | Cleared | 32 | V8; mathematical claim corrected |
| 5 | V4 | 33 | Cleared |
| 6 | V3 | 34 | Cleared |
| 7 | Cleared | 35 | V21; draw-before-items cleared |
| 8 | V9 | 36 | V6/V28; static-boolean complaint cleared |
| 9 | Cleared | 37 | Cleared |
| 10 | V26 | 38 | V12 |
| 11 | V3/V17 | 39 | V14; vector-track example cleared |
| 12 | Cleared; related actual issue V3 | 40 | V23/V24 |
| 13 | V18 | 41 | Cleared |
| 14 | V18 | 42 | V3; sign objection cleared |
| 15 | V4, open fill/point stroke only | 43 | Cleared; additional pinned wording A3 |
| 16 | V4 | 44 | V19; pixel/static-enable complaints cleared |
| 17 | Cleared | 45 | V10/V24; code-reuse objection cleared |
| 18 | V4 | 46 | V10; priority objection cleared |
| 19 | V4/V27; pixel/summary-table complaints cleared | 47 | V7; table-location complaint cleared |
| 20 | Cleared | 48 | Cleared |
| 21 | Cleared; separate actual collision A1 | 49 | V28 |
| 22 | V10 | 50 | Cleared |
| 23 | V10; existing local clip/rendered-alpha rules retained | 51 | V17 |
| 24 | V29 | 52 | V3 |
| 25 | V29/V14; 3D demand cleared | 53 | V10 |
| 26 | V13 | 54 | V27; type-set contradiction cleared |
| 27 | Cleared | 55 | V30, sequencing only |
| 28 | V13 | D extra / G56 | V13, qualify parameter versus sample order |
| K | Disposition | K | Disposition |
| --- | --- | --- | --- |
| H1 | V3 | M13 | V21; conservative-capacity objection qualified |
| H2 | V12 | L1 | V23 |
| H3 | V8 | L2 | V24 |
| H4 | V6 | L3 | V26 |
| M1 | V7 | L4 | V23, prose/trace synchronization |
| M2 | V5; “no consumer” overstatement corrected | L5 | V6/V27; no automatic rounding |
| M3 | V11 | L6 | V9 |
| M4 | V25 | L7 | V16 |
| M5 | V10/V24 | L8 | V15 |
| M6 | V9 | L9 | V27; diagnostic parity not required |
| M7 | V13; two-sample perimeter assertion corrected | L10 | V22 |
| M8 | V17 | L11 | V28 |
| M9 | V19 | L12 | V10/V23; pop allegation qualified |
| M10 | V2 | L13 | V19/V28 |
| M11 | V14 | L14 | V20 |
| M12 | V14, sign clarification only | L15 | V28 |
| — | — | L16 | V25, design follow-up |
---
## Recommended edit order and closure instructions
| Batch | Packages | Required outcome |
| --- | --- | --- |
| 1 — Contradictory schema and traces | V1, V2, V5, V11, V12, V17, V26; A1/A2 | One allowed-field surface per context; legal examples validate; impossible acceptance assertions removed without dropping their intended coverage. Resolve A1's field design before freezing system schemas. |
| 2 — Renderer geometry and composition | V3, V4, V9, V10, V18, V20, V29; A3 | Numerical coordinate/depth/color oracles, explicit geometry, complete compositing/allocation behavior, and a large-display policy. |
| 3 — Procedural evaluation | V6, V8, V13–V16, V21, V22 | Sampling boundaries and draw counts, normative algorithms, complete behavior schemas, and deterministic item/reference rules. |
| 4 — Live resources and later execution | V7, V19, V23–V25 | Atomic admission, complete ownership/release rules, effect units, and one documented diagnostic cadence. |
| 5 — Contract synchronization | V27, V28, V30; all affected §7/§8.1 rows and traces | Remove stale references, preserve capabilities, and state exactly which implementation slice executes each trace. |
1. For each package, record the chosen design, affected sections, and minimal counterexample before editing. Mechanical fixes can proceed without inventing new features. Preserve the locked degree/depth conventions, capability families, fixed tick, seeded decisions, and non-evicting spawn policy unless an intentional design change is separately recorded.
2. Update the owning table, explanatory prose, examples, diagnostics, and required traces together. A sentence in a later section is not sufficient when an earlier allowed-field table explicitly rejects the same construct.
3. Author deterministic fixtures from the resolved contract, not from whichever renderer implementation happens to exist. For numerical algorithms, store expected values, sample counts, tolerances, and version. Distinguish exact procedural outcomes from renderer-dependent rasterization.
4. Run the existing appropriate validator/runtime checks when implementation changes land. At this document-only stage, do not claim runtime traces passed. Mark each package **open**, **decision recorded**, **spec fixed**, or **implementation verified** with evidence; these are different completion states.
5. Keep the original reviews and this triage intact as evidence. Record actual edits and validation results in a subsequent fix log, following the prior [04-fix-log.md](04-fix-log.md) pattern. Do not rewrite rejected findings into accepted ones merely to match a review's severity tally.
**Current status:** all repair packages and additional defects are recommendations only. The specification and runtime remain unchanged by this triage pass.