Repository navigation
What's new
Wider consumer surface (#356/#357) — the settled 10/30 contract:
OnMemofolds up to 10 results per consumer with element widths 1/2/4/8 bytes (8-byte results fold into adjacent 4-byte lane pairs).OnActivetakes up to 30 live gameplay parameters (memo feeds included), bound byTypeKeythrough the caller-assembledColumnSet(Add<T>(span)cold assembly; warm read is the direct pointer row).- Same-type duplicate columns are rejected at generation (TLGEN81); TLGEN68's bound message now names 30. The 40-slot consumer slot row and the byte-identical warm path are receipted.
Run-aware cascade (#351/#358) — PMU counter harness (perf stat/perf record protocol documented) and run-aware routing for run-heavy mixed chunks: −31% cycles/row on block shapes, scalar bands unmoved, 0 B warm. Cycle counters are the perf baseline of record (ns/row platform drift documented on the issue).
ApplyLive frame sized to composition (#362) — the live-compose stackalloc drops from the 45,544 B worst case to the call's actual composition (canonical 2-consumer shape: 1,765 B, −96%; true in-contract worst case ≈ 25 kB). Stateless sizing (no install-invalidation hazard), 0 heap, warm row loop untouched.
Smaller public surface (#361) — 8 dead Timeline<TTrack,TClip> Apply/Advance rungs removed (24 → 16); every surviving rung byte-identical on the hot path (reviewer token-diff + interleaved A/B within ±0.05).
Repo hygiene (#353/#355, #359/#360, #363) — Inspect Code record 972 → 280 findings with strictness fixes; the analyzer now sees the whole repository including the Playground (Blazor WASM) with a cold-sweep protocol; a live-frame Timer callback bug in the Playground was fixed; deferred internal naming renames executed with zero API change.
Budget — production source 299,978 → 294,361 B under the 300,000 cap.
Migration (pre-1.0 policy: direct removal, no shims)
- Removed public rungs (#361): dispatch single/scalar (
Apply(ReadOnlySpan<ushort>, ReadOnlySpan<ushort>, bool),Apply(ushort, ReadOnlySpan<ushort>, bool),Apply(ushort, ushort, bool), genericApply<TIndex,TPosition>(ref, ref, bool)), range batch/scalar (Apply(ros, ros, ros, bool),Apply(ushort, ushort, ushort, bool)), asset dispatch (Apply(TimelineAsset, ros, bool)), and asset-fused (Apply(TimelineAsset, ros, Span<ushort>, bool, Span<float>)). Callers re-point to the surviving generic dispatch/fused rungs — identical bodies; e.g. asset callers passasset.Index, scalar-dispatch callers pass a 1-element span. - Consumer bounds (#356):
OnMemoresult cap 4 → 10 (widths 1/2/4/8),OnActiveparameter cap 4 → 30, newColumnSetfor multiple distinct in/ref types; same-type duplicate columns are now a generation error (TLGEN81). tlb --json: output fields widened where consumers carry the larger surface (carry-forward from earlier alphas).- ApplyLive (#362): the generator-authored surface is unchanged; hand-written thunks outside the generated contract fail fast with located throws instead of running with oversized frames.
Validation
Tag v1.2.0 at commit bc05420. Release-branch gate: suite 1,985/0, checked 1,092/0, NativeAOT linux-x64 exit 0, capacity checksum −4004417433036324864 exact, samples/Mixed byte-identical, eng/release-artifacts --tag v1.2.0 all-OK (tag/commit/version agreement asserted); publish-nuget validate + publish green; packages verified live on nuget.org (flat-container); quick-start pin lane green post-publish; playground redeployed from the merge push. Speed receipts on the issues (cycle counters; 0 B warm on every shape).
SHA256SUMS covers every asset below.