Skip to content

t27f: scene, motion, display_list -- the M2 rendering path (Closes #10261) - #11727

Merged
gHashTag merged 1 commit into
masterfrom
rel-10261-scene-motion-display
Oct 23, 2026
Merged

gHashTag merged 1 commit into
masterfrom
rel-10261-scene-motion-display

Conversation

@gHashTag

Copy link
Copy Markdown
Collaborator

M2 of T27F Live (epic #10266). Three new specs, one batch; no other file touched.

What

Spec Carries Refused by
scene.t27 closed vocabulary: 7 primitives, 5 style tokens, 8 fields; sequenced delta ops (add/set/remove/keyframe) validate_scene + apply_op error codes; over node cap refused, never truncated
motion.t27 tweens + springs indexed by frame number only, four easings, reduced-motion switch no clock exists to read; spring settles without overshoot
display_list.t27 13 flat opcodes, fixed payloads, 40-line loader bound; HUD fixture over the 128-opcode budget: refused with the stream byte-identical

FR-001 -- every field and primitive outside the allowlist is refused: the test sweeps field ids past the end (247 asserts) and the six ui_plan FORBIDDEN_NAMES resolve 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 + --verify on 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.
  • Hooks green: own-language, foreign-budget, secret-gate.

Not claimed here

…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
gHashTag enabled auto-merge (squash) October 23, 2026 05:12
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-23 05:30:29 UTC

Summary

Status Count
Total Open PRs 23
PRs with Failing Checks 21
PRs with All Checks Green 2
READY 0
FAILING 21
PENDING 0
NO CHECKS YET 2

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=5aec047d42ec != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag merged commit e356cfb into master Oct 23, 2026
22 of 29 checks passed
@gHashTag
gHashTag deleted the rel-10261-scene-motion-display branch October 26, 2026 03:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant