Commit Graph
26 Commits
Author SHA1 Message Date
LabyricornandClaude Opus 5 d3cd688a3c docs(visual): close the visual contract with the phase 4c automation, lifecycle, camera, effects, and ceiling rules
Format Specification revision 0.7 adds section 19, the third and final
visual contract section, covering PRD 85-89 and 119-120.

Visual automation reuses the audio track shape of 16.1 and adds only
`loop`. It is declared in two scopes: `visuals.automation`, measured from
activation, and `visuals.systems.<id>.automation`, measured from that
system's instantiation boundary, so a track on a spawned system behaves
identically however late the spawn happens.

Section 8.1 gains exactly four visual rows, all system-level: camera
fields, layer opacity, system visibility, and post-effect parameters. No
per-object geometry, transform, or style property becomes externally
addressable in 0.1, so the statements in 17.14 and trace 19 of 18.10
survive unchanged. This is the decision 17.14 and 18.6 both deferred.

Systems are persistent or spawned by an explicit `lifecycle` enum. A
spawned system is a template, instantiated only by a spawn action, with a
five-state machine plus FAILED, a `0ms` default release, and a spawn
ceiling that refuses rather than evicts.

The camera matrix is normative, including that parallax multiplies the
camera translation only. `projection` is authored once and is neither
automatable nor bindable.

Seven post-effects, applied in normative array order with a stated
approximation boundary. `grain` is explicitly exempt from reproducibility
and consumes no procedural stream.

Section 19.5 is the centralized ceiling table PRD 120 requires. It
separates authoring bounds, which reject an exhibit at import, from
runtime ceilings, which shed work by a documented deterministic rule and
keep the exhibit running, and it restates every ceiling first fixed in
sections 10 and 14 through 18. Its aggregate values are provisional
pending the slice 4h GC6 measurement.

Two diagnostic codes added: ERR_INVALID_EFFECT_TYPE and
WARN_VISUAL_CEILING. ERR_AUTOMATION_CONFLICT widens to cover a visual
scope and the behavior collision rather than minting a second code.

Documentation only: no runtime, schema, fixture, or test file was
touched. The visual contract now contains no unresolved forward
reference, and npm test still passes 102 tests with zero failures.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01AzX3848PwqYwzdUCWvjegL
2026-09-06 04:29:40 +00:00
LabyricornandClaude Opus 5 2deec016d6 docs(devlog): cover the phase 4a and 4b visual contract
One entry for the visual contract milestone: why two documentation
slices precede the renderer, the decisions sections 17 and 18 fix, and
what is explicitly not claimed - no renderer, no schema definitions, no
visual fixture, and two user-observed gates still open at the end of
Phase 4.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_019dTNHWyTdFobdevrKspoV6
2026-09-06 04:14:33 +00:00
LabyricornandClaude Opus 5 245af6ece3 docs(visual): specify the phase 4b component, procedural system, and behavior contract
Format Specification section 18 (PRD 77-84) closes slice 4b: visual
components and their inputs scope, particle systems with a normative
integrator and life ramps, the nine placement distributions, emitters
with exact fractional-accumulator emission timing, repeaters and the
copy-scoped repeat.* namespace, the seventeen-behavior vocabulary and
its channel set, the six procedural fields with a normative coherent
noise function, and trails, ribbons, and links.

Seven diagnostic codes are added to the section 7 table. Section 17 is
amended in four places the new section requires: the visuals.fields
container, the component visual object type beside the closed fourteen
primitives, the now-declared behaviors field, and the widened visual
limit row. Revision 0.5 -> 0.6.

Documentation only; no runtime, schema, fixture, or test file changed.
npm test remains 102 passing.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_019dTNHWyTdFobdevrKspoV6
2026-09-06 04:13:36 +00:00
LabyricornandClaude Opus 5 3e27a668e2 docs(visual): specify the phase 4a scene, primitive, and appearance contract
Open the Visual subsystem contract at Format Specification revision 0.5 with
section 17, covering PRD 69-76: the renderer-neutral pipeline, canonical units
on a single degrees convention, the visuals container, layers, the scene model
with three coordinate spaces and three fit modes, 2.5D depth with a fixed sign,
stable sorting, parallax, perspective factor and per-object fog, the fourteen
primitives of Visual Primitive Set 0.1, common visual properties, a normative
transform composition order, appearance with the eight-mode safe blend set and
gradient paint, paths and splines with independently addressable points, text
restricted to the three generic font families, and the once-at-instantiation
resolution boundary for visual ValueSpec fields.

Visual objects are keyed rather than listed and carry no id field, matching the
audio node-identity rule that a Phase 3a blocking defect established. No visual
property becomes externally addressable in this slice; a binding, set, or
override naming one remains ERR_UNSUPPORTED_TARGET, and section 8.1 is
unchanged until section 19.1 adds its rows.

Add five diagnostic codes to the section 7 table, record the eight-slice Phase 4
delivery plan, mark the section 11 Visuals register row in progress, and refresh
the implementation status, which had not been updated since the 3c-1 contract.

Documentation only; no runtime, schema, fixture, or test file is touched.
npm test passes 102 tests with zero failures.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GwmTQU6zLwh3qbBvq5zf5B
2026-09-06 03:57:46 +00:00
Labyricorn 6aab663981 docs(devlog): cover phase 3c master protection 2026-09-05 20:46:08 -07:00
Labyricorn 90fcbbe467 feat(audio): implement phase 3c master protection 2026-09-05 20:45:47 -07:00
Labyricorn 249328e595 docs(devlog): cover phase 3c automation 2026-09-05 20:43:35 -07:00
Labyricorn 04d4e49e9f feat(audio): complete phase 3c slice 3 automation 2026-09-05 20:22:22 -07:00
Labyricorn 9ae2c76075 feat(audio): implement phase 3c slice 2 lifecycle and voices 2026-09-05 19:38:38 -07:00
LabyricornandClaude Opus 5 94aafeae27 docs(audio): close seven defects across the phase 3a-3c contract
Triage of three independent reviews of sections 14-16 (reviews/00-triage.md)
confirmed 13 distinct defects. Seven are doc-only and land here; the rest are
held for design decisions or for reconciliation with the slice 3c-2 runtime.

- T4  ERR_INVALID_RANGE_ORDER refiled Semantic / Runtime in section 7, covering
      both sample-hold min/max (literal at import, resolved at instantiation)
      and automation `at` ordering (import). 14.12 states the split.
- T5  16.1 documents the sampling boundary and order for automation point
      values, satisfying 9.3's requirement of a documented boundary.
- T6  15.14 no longer classes the automation track/point limits as runtime
      ceilings; section 7's ERR_NODE_LIMIT_EXCEEDED cause list extended.
- T10 16.2 notes that the override stage is always absent for node properties.
- T11 14.9's impulse envelope column relabelled "Value as p -> 1-" with the
      pre-fade values, resolving the exponential row's self-contradiction.
- T12 15.16 names ERR_SCHEMA_VALIDATION for the name and tags caps, which the
      schema already enforces on definitions/Sound.
- T13 16.2's masking cross-reference corrected from 8.1 to 8.3/8.4.

Committed path-scoped on main: other modified files are in-flight slice 3c-2
runtime work and are deliberately left in the working tree.

Follow-up: T4 is now spec-mandated but unimplemented. audio-graph.js guards the
range-order check on both bounds being literal numbers, so procedural bounds
pass silently and no instantiation-time check exists.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TvjMnfLaSNVVvzKJbdm6Wj
2026-09-06 02:38:18 +00:00
Labyricorn e5ed468744 docs(audio): reconcile phase 3c eviction, pause discard, and recipe fields
Close four specification gaps found during pre-implementation review of section 16.

Add the missing \
elease\ field to the recipe graph object table in 15.16, completing the allowed-field table for the container introduced in 16.4.

Reconcile the 16.6 eviction policy: step 2 previously called for evicting an instance in RELEASING without specifying how an already-releasing voice could be evicted under the non-hard-stop rule. Clarify that evicting an already-releasing voice advances its release ramp to immediate completion and disposes it, guaranteeing that the eviction policy terminates and reclaims resources in all cases.

Resolve the incoherence between 16.8 unlock and 16.9 pause discard batching by adding INFO_AUDIO_PAUSE_SKIP to section 7 and 16.10, and recording that resume discards report their own batch rather than sharing an unlock batch.

Clarify that 16.5 ending bound computation operates on the expanded audio graph, resolving paths through component inputs and internal sources deterministically across feed-forward structures, and remove the impossible author remedy of gating an oscillator through an impulse.
2026-09-05 16:38:17 -07:00
LabyricornandClaude Opus 5 50fb72c0e8 docs(audio): close three defects in the phase 3c contract
Re-read section 16 before handing the implementation slice onward. Three
defects, all of the same classes the Phase 3a review turned up.

The 16.5 ending-bound table gave a contribution for every node type
except the one that contains other nodes, so a one-shot whose tail lived
inside a component had no defined bound. Components now contribute the
bound of their own graph by the same rule, terminating on the existing
nesting cap.

The 16.3 state machine offered no exit from CREATED for a stop arriving
before scheduling except FAILED, which would have reported an ordinary
cancellation as a fault. Permit CREATED -> FINISHED, and say why it
differs from SCHEDULED -> RELEASING: a created instance is connected to
nothing, so there is no signal to ramp down.

Automation point ordering was a stage conflation. Points had to be in
strictly increasing `at` order while `at` was a DurationSpec, which
section 6.2 permits to be a procedural TimeSpec resolved at
instantiation — so the ordering rule could not have been enforced at the
semantic stage where it was filed. This is structurally the same defect
as the audioMaxFrequency one closed in Phase 3a. Fix `at` as a duration
literal; point values remain full ValueSpecs.

Still contract only. No runtime change, and no sound has been heard from
any build.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_011FWPdCqKaaDnP9NC3JAwh6
2026-09-05 23:29:23 +00:00
LabyricornandClaude Opus 5 42e4b32fd6 docs(audio): specify the phase 3c contract
Phase 3c is delivered in four slices so an interrupted phase never leaves
the runtime worse than it started: contract, lifecycle and voices,
automation, and measured master protection. Slice 2 replaces working
scaffolding, and slice 4 cannot close without user-observed measurement.
Record that split in the implementation plan.

This commit is slice 1, the contract. Format Specification section 16
adds automation tracks with three modes and four interpolation curves,
their placement in the shared resolution pipeline, the seven-state
lifecycle with its permitted transitions, the engine-owned internal
release gain, a per-node table for computing determinable one-shot
endings, voice ceilings with an eviction order that always releases
rather than hard-stops, the master protection contract, and unlock and
pause behavior for audio.

Automation reuses the modulation registry rather than introducing a
second answer to which properties vary over time, and a track is
declared inside the graph that owns its target, so section 14.4 stands:
automation does not widen the external surface of a node property. Close
the container gap the new fields opened by adding `automation` to the
graph object in 14.3 and `release` to the recipe object in 15.16.

Master protection is specified in shape and provisional in value.
Finite-sample handling is normative because a NaN in the output buffer
is unacceptable at any ceiling; the peak ceiling, numerical tolerance,
and release behavior await GC6 measurement.

No runtime change. There is no lifecycle state machine, no voice ceiling
is enforced, and `automation` and `release` are still rejected as
unknown fields. No sound has been heard from any build.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_011FWPdCqKaaDnP9NC3JAwh6
2026-09-05 23:20:01 +00:00
Labyricorn cc36878a0f docs(labyricorn): update project page description and phase status 2026-09-05 15:11:45 -07:00
LabyricornandClaude Opus 5 7812d70557 docs(devlog): cover the phase 3 audio subsystem
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_011FWPdCqKaaDnP9NC3JAwh6
2026-09-05 22:04:27 +00:00
LabyricornandClaude Opus 5 f07fc777f3 feat(audio): complete phase 3a/3b audio subsystem contract and runtime
Review Phase 3a before building on it, then implement Phase 3b.

The Phase 3a draft had four blocking defects: nodes were described as a
keyed map while every documented example carried an inline `id` field,
so under the strict unknown-field policy each minimal example would have
failed its own acceptance trace; no section said where a node lives; the
`audioMaxFrequency` ceiling was declared a semantic-stage error while
depending on a live AudioContext sample rate; and the sample-hold PRNG
child key that section 9.3 requires was undocumented. Close all four,
plus nine further gaps in noise seeding, spectral definitions, impulse
decay math, Nyquist handling, missing-field codes, LFO phase origin, the
units table, node-type staging, and a duplicated diagnostics table.

Add Format Specification section 15 for Phase 3b: nine processing and
routing node contracts, the component instance node, audio routing and
modulation with an explicit modulatable-property registry, twelve graph
legality rules, authoring limits, components with a component-scoped
`inputs.*` namespace, sound definitions and recipes, and buses.

Implement the subsystem in three modules. audio-contract.js holds the
declarative node, limit, and modulation tables every consumer reads.
audio-graph.js validates, expands components, and checks legality
without ever opening an AudioContext. audio-engine.js resolves node
fields once from the seeded stream, clamps frequencies to the live
device ceiling, realizes the graph through Web Audio, and owns the
runtime AudioSubsystem. Extend the schema, delegate the standalone
validator's audio checks to the shared module rather than carrying a
second implementation, and add a generic audio fixture.

Phase 3 is not accepted. Automation precedence, the lifecycle state
machine, unlock behavior, voice ceilings, and master protection are
Phase 3c. No sound has been heard from any build, so the audio
acceptance challenge, peak and finite-sample capture, and listening
observations remain open.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_011FWPdCqKaaDnP9NC3JAwh6
2026-09-05 22:03:18 +00:00
Labyricorn 12140055f7 docs(devlog): cover runtime phases 1 and 2 2026-09-05 13:00:23 -07:00
Labyricorn c010e415a2 feat(runtime): implement phases 1 and 2 2026-09-05 12:59:15 -07:00
Labyricorn 75b4da0df4 docs(devlog): record Phase 0 completion 2026-09-05 12:09:37 -07:00
Labyricorn 63895c4fe7 feat(phase0): complete shared contracts and milestone plan 2026-09-05 12:08:36 -07:00
Labyricorn ee774d0307 docs(devlog): record stall recovery and Phase 0 contract milestone 2026-09-05 11:39:01 -07:00
Labyricorn e02d49a739 feat(phase0): complete GC1 feasibility and GC2 shared format contracts
- Record user evidence for directory fallback to complete GC1 (10/10 checks passed)

- Expand Format Specification 0.1 to Revision 0.2 with normative shared contracts

- Author JSON Schema Draft-07 at schema/xzbt-0.1.schema.json

- Implement zero-dependency semantic validator at tools/validate-exhibit.mjs

- Create 12-case conformance fixture suite and automated test runner (12/12 passing)

- Update implementation status, verification gates, and gap closure decisions

- Add devlog entry covering stall recovery and Phase 0 current state
2026-09-05 11:38:48 -07:00
Labyricorn ca2830174f docs: add XZBT project page and initial development log 2026-09-04 20:32:33 -07:00
Labyricorn 7b2e486095 test: record Phase 0 feasibility probe and manual evidence 2026-09-04 20:31:56 -07:00
Labyricorn 05fe2b4e02 docs: establish XZBT 0.1 MVP planning baseline 2026-09-04 18:42:21 -07:00
Labyricorn 35866e0e74 Initial commit 2026-09-04 18:15:54 -07:00