c4332363a953f7fe5a5f2db54f00a82a754518de
2
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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 |
||
|
|
6587d3e442 |
feat(visual): align the schema, validator, and resolution engine with the 0.8 visual contract
Stage 0 of the five-stage plan in reviews/02-application-code-triage.md: the shared pre-renderer alignment that has to land before slice 4d writes renderer code, so the runtime foundation and Format Specification revision 0.8 cannot drift while three slices are built on top of them. Nothing here draws. The JSON Schema's `visuals` definition was a Phase 0 stub of `camera`, `systems`, and `passes`. It is replaced by the real container - scene, layers, systems, fields, camera, effects, and the exhibit-scope `automation` array that 17.3 previously rejected while 19.1 authorized. Fourteen new definitions cover visual objects, paints, styles, transforms, behaviors, distributions, trails, links, automation tracks, the spawn container, and visual components, and `components.visual` is no longer an unconstrained object. Structural exclusions carry the contract's own prohibitions: no `id` on a visual object, no `links` on an emitter, no `trail` on a render object, and none of the four spawn-only lifecycle names at a system's top level. src/runtime/visual-contract.js is new and plays the role audio-contract.js plays for sections 14-16: the primitive, system, behavior, field, distribution, blend, filter, and post-effect vocabularies; the post-effect parameter tables with their ranges and pass costs; the centralized ceiling table of 19.5 split into authoring bounds and runtime ceilings; and matchVisualTarget, which resolves a path against the four section 8.1 visual target families and distinguishes a dangling reference from a target that exposes no capability. src/runtime/visual-validation.js is new and validates the shared surface: the visuals container, the scene model including the conditional viewport `fit` rule, layers including the rule that a present layer map makes a system's `layer` required, the common system fields and the `spawn` container, procedural fields including the conditional noise `direction`, the post-effect chain, and visual automation with its two declaration scopes, its automatable registry, its loop modes, and its authoring bound. Type-specific system fields are carried through unvalidated and are tightened by 4d, 4e, and 4f. The resolution engine now exposes the four visual families. `target()` returns a capability record with a per-family stage table, replacing the hardcoded `namespace === 'buses'` test for the automation and modulation stages, so a boolean system `visible` correctly has neither. Visual bases sample once from the `visual` stream domain at the exhibit-scope instantiation boundary, fall back to their documented defaults - including the scene center for an unauthored camera position - and clamp through the shared 8.1 safety stage, so a `focalLength` that resolves below 1 becomes 1 rather than dividing by zero. `requireAudioStage` becomes `requireStage(path, stage)` with the old name kept as its automation wrapper. The validator's binding-target check is no longer a regex over two families. It reports ERR_INVALID_REFERENCE for an undeclared layer, system, or effect index and ERR_UNSUPPORTED_TARGET for everything outside the four rows - per-object properties, field strengths, emitter rates - which is the distinction trace 14 of 17.16 and trace 4 of 19.7 both check. exhibits/minimal-visual.xzbt is a new fixture exercising the aligned surface: two layers, a graphic system with system-scope automation, a repeater over a component, a particle system reading a declared field, a spawned emitter with its spawn container, two post-effects, and three bindings reaching three of the four target families. test/phase4-visual-contract.test.mjs adds 29 tests. `npm test` goes from 102 to 131 passing with zero failures; no existing test changed. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0162Jb1J36judZNT8fHabGVt |