Repository navigation
t27f: scene, motion, display_list -- the M2 rendering path (Closes #10261) - #11727
Merged
Merged
Conversation
…0261) M2 of T27F Live (epic #10266). Three new specs, one batch; no other file touched. - specs/t27f/scene.t27: the closed vocabulary -- 7 primitives, 5 style tokens, 8 fields -- and validate_scene, which refuses what the allowlist does not name (FR-001). The six ui_plan FORBIDDEN_NAMES resolve to nothing here (forbidden_in_vocabulary == 0, by invariant), so the vocabulary extends ui_plan's rather than forking it. Scene changes by sequenced delta ops (add/set/remove/keyframe) whose seq must strictly increase; a replayed op is refused and changes nothing. Over the node cap is refused, never truncated; removed slots are ghosts; a live node over an emptied parent is refused; geometry is non-negative because the display-list encoding carries unsigned payload bytes. - specs/t27f/motion.t27: tweens and springs indexed by frame number only -- no wall clock anywhere (FR-002). Four easings pinned at both ends and monotone; the spring is a heavily damped discrete integrator that reaches its target without overshooting. Reduced motion (FR-003) is a switch at the one place a caller asks for a value: every value IS its end state on every frame, springs included. - specs/t27f/display_list.t27: the flat opcode stream -- 13 opcodes, fixed payloads, a loader bounded at 40 lines. Flattening is one left-to-right walk with an open-container stack (parents precede children by construction). Over the 128-opcode frame budget the scene is refused with the stream left byte-identical -- refused, never truncated (FR-004); 32 plain rects want 160, so the refusal is exercised, not dead code. The HUD fixture flattens to 13 opcodes / 61 bytes and its sha256 is recorded and checked by a test block, so any encoding change that moves one byte fails loudly. Local evidence, t27c 0.5.2: 21 tests, 0 FAIL, 0 vacuous across the three specs (motion 7/7 with 2232 runtime asserts, scene 8/8 with 339, display_list 6/6 with 104); 3 invariants proved comptime; three seals saved and verified, all hashes MATCH; dupe scan adds no duplicate group. Not claimed here: the 4 ms p99 flatten over 1000 frames is a Railway-lab measurement; this change does not measure it and does not claim it.
gHashTag
enabled auto-merge (squash)
October 23, 2026 05:12
This was referenced Oct 23, 2026
This was referenced Oct 23, 2026
Merged
Merged
Contributor
This was referenced Oct 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
M2 of T27F Live (epic #10266). Three new specs, one batch; no other file touched.
What
scene.t27validate_scene+apply_operror codes; over node cap refused, never truncatedmotion.t27display_list.t27FR-001 -- every field and primitive outside the allowlist is refused: the test sweeps field ids past the end (247 asserts) and the six
ui_planFORBIDDEN_NAMESresolve to nothing here (forbidden_in_vocabulary() == 0, invariant), so the vocabulary extends ui_plan's rather than forking it.FR-002 -- motion is a pure function of frame number: no wall clock exists in
motion.t27; the spring is walked frame by frame and the test asserts monotonicity and purity across targets and frames.FR-003 -- reduced motion jumps to the end state: walked over every easing and frame, springs included (
spring_value_at(true, t, 0) == t).FR-004 -- over budget is refused, never truncated: 32 plain rects want 160 opcodes against a 128 budget; the stream comes back with
ops == 0,n == 0.The recorded digest -- the HUD fixture flattens to 13 opcodes / 61 bytes; its sha256 (
ef8e8292...882a3d) is recorded in the spec and recomputed by a test block, so any encoding change that moves one byte fails loudly. The test also asserts a one-unit scene move changes the digest, so it is a hash of the bytes and not of nothing.Evidence (local, t27c 0.5.2)
t27c test-report-- 21 tests, 0 FAIL, 0 vacuous (motion 7/7 with 2,232 runtime asserts; scene 8/8 with 339; display_list 6/6 with 104); 3 invariants proved comptime.t27c seal --save+--verifyon all three -- all hashes MATCH.tools/ci/check_specs_still_parse.py --base origin/master HEAD-- 3 changed specs, 0 newly unparseable.tools/dupe_scan.py --report-- these specs add no duplicate group.Not claimed here
t27bledger rows -- those are derived by the steward from lab corpus runs; the same choice made in t27f: face -- the Queen Trinity as a parametric vector face (Closes #10264) #11675 and t27f: live_stream -- the T27F Live wire, with seq, keyframes and resume (Closes #10263) #11690, and since vindicated for both (t27f: post_caption, the social-pack card, factory options, cover at a scene (Closes #10916 #10917 #11027 #11028) #11668's rows readt27b passin runc986d53696).