Repository navigation
feat(t27f): petal_menu.t27 is Icarus-lowerable and simulates 10/10 (M4 of #10782) - #10786
Merged
Merged
Conversation
specs/t27f/petal_menu.t27 (module T27fPetalMenu) is the single home of the 999 triangle menu that trios draws through QueenUILib (TriangleLogo.swift, ported from photon_trinity_canvas.zig). Layers L1-L7: geometry (27 quads, milli-units), meaning (3 realms x 9), look (glass-menu fills), fit (0.63 of the 596x526 box), input (division-free ray-cast hit test), state (home / petal open / back) and the menu (an empty 3x3 card grid in the MVP). Integer-only so it can lower to the FPGA later. Documents the 28-vs-27 defect in Screen.screenForBlock (settings unreachable). frontend.t27 registers SF_PETAL_MENU and the I_OS_HOME intent; nothing draws it yet. test-report on the lab: petal_menu 10/10, frontend 8/8, 0 vacuous. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The structural Icarus classifier rejected the spec because of the @divTrunc builtin calls in fit_permille, to_box, hit_px, card_x and card_y (a call to a name that is neither a module function nor an Icarus builtin). The str constants and u32 colour arrays were never the blocker: const declarations are always accepted. Those functions now divide with `/`. gen-zig still lowers `/` on i64 to @divTrunc inside function bodies, so the semantics are unchanged; the two test-block centroids keep @divTrunc because tests are outside the classifier and gen-zig does not rewrite `/` there. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The petal centroid moves from the two test blocks into module functions centre_x/centre_y. In the tests it hit two backend limits: gen-zig does not rewrite `/` on an untyped call sum, and the Verilog testbench emitted @divTrunc verbatim and declared a reg after a statement inside the loop. A typed local before `/` and inline calls in the asserts avoid both. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 19, 2026
Merged
Contributor
This was referenced Oct 19, 2026
gHashTag
enabled auto-merge (squash)
October 19, 2026 02:50
gHashTag
added a commit
that referenced
this pull request
Oct 19, 2026
On the x86_64 lab, the t27b front-end check (--check) prints every blocker before it stops at "the t27b JIT runs only on arm64". glyph57.t27 and petal_menu.t27 (new on master from #10786, also unlisted) reach that line with no blocker. The control, frame_shard.t27, prints ExprCall(rejected fn). Both rows are pass; this branch's arm64 run confirms them. max_not_pass stays 138. The t27f skill's ratchet note said the lab cannot give a verdict. That was wrong; it now gives the --check method and its control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
added a commit
that referenced
this pull request
Oct 19, 2026
…lic font of particles (Closes #10788) (#10792) * t27f: idea factory -- any idea in any style preset, every element a particle (Closes #10771) particle_ds.t27 is the particle design system: five presets (noir-gold, neon-vortex, trit-charge, paper-ink, rain) as rows of integers -- palette, blend, radius, gain, spring, dashpot, force law, kick, card -- and one Q8 integer step, kernel, tone curve and finish. idea_factory.t27 is the factory: (idea, preset) -> 1080x1920 RGB24 frames. It wraps the idea into lines and scenes, sets each scene in the 3x5 font, gives every particle a target cell or a card-border point at each cut, and closes on the address. Lab: test-report 12/12 and 8/8 pass, 0 vacuous; seals saved and verified; dupe_scan clean; 5-preset preview rendered at 1080x1920. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: idea factory and the particle design system, preset sweep on the lab, legibility by luma (Refs #10771) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: Russian ideas in the factory -- UTF-8 and a 5x7 Latin and Cyrillic font of particles (Closes #10788) glyph57.t27 decodes UTF-8, folds lower case to capitals and stores a 5x7 font: ASCII 32..95 plus the 21 Cyrillic capitals with no Latin twin. The 11 look-alikes and Yo reuse Latin glyphs through a 32-entry map. idea_factory now wraps by characters, keeps positions in bytes, and sets text in the 5x7 font (advance 6, line pitch 9). t27c keeps "\xNN" in a string as four characters, so non-ASCII samples are u8 arrays (RU_IDEA, 80 bytes). Lab: glyph57 7/7, idea_factory 10/10, 0 vacuous; seals verified; dupe_scan clean. The t27f skill records the trap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: a new spec's t27b ledger row comes from the arm64 run, keep the PR a draft until then (Refs #10788) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: glyph57 and petal_menu pass the t27b front end (Refs #10788) On the x86_64 lab, the t27b front-end check (--check) prints every blocker before it stops at "the t27b JIT runs only on arm64". glyph57.t27 and petal_menu.t27 (new on master from #10786, also unlisted) reach that line with no blocker. The control, frame_shard.t27, prints ExprCall(rejected fn). Both rows are pass; this branch's arm64 run confirms them. max_not_pass stays 138. The t27f skill's ratchet note said the lab cannot give a verdict. That was wrong; it now gives the --check method and its control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger rows for mos_psp103 and re-sealed frontend, both inherited from master (Refs #10788) Two of the three red checks on this PR came from master, not from the glyph57 change. specs/analog/mos_psp103.t27 and mos_psp103_data.t27 landed on master without t27b ledger rows, so the ratchet reported them UNLISTED. They are added in sorted position as pass. The t27b front end on the lab (--check) reports 0 unsupported constructs for both, matching the pass the CI run measured. frontend.t27 does not import glyph57, but a module it uses moved on master after its seal, so all four gen hashes were stale. It is re-sealed on the lab against this branch's tree, and --verify reports all hashes MATCH. The coverage gate failed on the same seal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger row for sar_switch, another master spec landed without one (Refs #10788) specs/analog/sar_switch.t27 (analog M4c) reached master without a t27b row, so this PR's ratchet reported it UNLISTED. The arm64 run on 7f33764 measured it as a t27b pass, so the row says pass. Master is merged in first so the row names a file this branch contains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: sar_switch sorts after sar_comparator (Refs #10788) 4f739c1 put the sar_switch row before sar_comparator, so the loop-tools gate failed 'ledger: sorted, one entry per spec'. This commit also carries the merge of master, which brings move_gate's row and the cap of 139. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's glyph57 row, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
added a commit
that referenced
this pull request
Oct 19, 2026
…ticle preset (Closes #10796) (#10800) * t27f: idea factory -- any idea in any style preset, every element a particle (Closes #10771) particle_ds.t27 is the particle design system: five presets (noir-gold, neon-vortex, trit-charge, paper-ink, rain) as rows of integers -- palette, blend, radius, gain, spring, dashpot, force law, kick, card -- and one Q8 integer step, kernel, tone curve and finish. idea_factory.t27 is the factory: (idea, preset) -> 1080x1920 RGB24 frames. It wraps the idea into lines and scenes, sets each scene in the 3x5 font, gives every particle a target cell or a card-border point at each cut, and closes on the address. Lab: test-report 12/12 and 8/8 pass, 0 vacuous; seals saved and verified; dupe_scan clean; 5-preset preview rendered at 1080x1920. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: idea factory and the particle design system, preset sweep on the lab, legibility by luma (Refs #10771) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: Russian ideas in the factory -- UTF-8 and a 5x7 Latin and Cyrillic font of particles (Closes #10788) glyph57.t27 decodes UTF-8, folds lower case to capitals and stores a 5x7 font: ASCII 32..95 plus the 21 Cyrillic capitals with no Latin twin. The 11 look-alikes and Yo reuse Latin glyphs through a 32-entry map. idea_factory now wraps by characters, keeps positions in bytes, and sets text in the 5x7 font (advance 6, line pitch 9). t27c keeps "\xNN" in a string as four characters, so non-ASCII samples are u8 arrays (RU_IDEA, 80 bytes). Lab: glyph57 7/7, idea_factory 10/10, 0 vacuous; seals verified; dupe_scan clean. The t27f skill records the trap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: a new spec's t27b ledger row comes from the arm64 run, keep the PR a draft until then (Refs #10788) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: glyph57 and petal_menu pass the t27b front end (Refs #10788) On the x86_64 lab, the t27b front-end check (--check) prints every blocker before it stops at "the t27b JIT runs only on arm64". glyph57.t27 and petal_menu.t27 (new on master from #10786, also unlisted) reach that line with no blocker. The control, frame_shard.t27, prints ExprCall(rejected fn). Both rows are pass; this branch's arm64 run confirms them. max_not_pass stays 138. The t27f skill's ratchet note said the lab cannot give a verdict. That was wrong; it now gives the --check method and its control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * skills: t27/idea-factory card -- TRI CLAW unpacks any idea in any particle preset (Closes #10796) specs/skills/t27-idea-factory.t27 is a spec-only skill card in the shape of t27-reel-beat. It points at idea_factory.t27, glyph57.t27 and particle_ds.t27 and copies none of their law. It names the five presets in preset-number order and says how to pass a Russian idea (a u8 array of UTF-8 bytes, never "\xNN"). It claims no voice, music or synthesised FPGA design. Cards import nothing, so the preset list is checked on the lab against particle_ds.PRESET_NAMES, byte for byte: PRESETS_MATCH. Railway lab: 2/2 tests, 16 runtime asserts, 0 vacuous. Seal saved, all hashes MATCH. The t27b front end raises no blocker, so the row is pass; max_not_pass stays 138. The t27f skill points at the card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger rows for mos_psp103 and re-sealed frontend, both inherited from master (Refs #10788) Two of the three red checks on this PR came from master, not from the glyph57 change. specs/analog/mos_psp103.t27 and mos_psp103_data.t27 landed on master without t27b ledger rows, so the ratchet reported them UNLISTED. They are added in sorted position as pass. The t27b front end on the lab (--check) reports 0 unsupported constructs for both, matching the pass the CI run measured. frontend.t27 does not import glyph57, but a module it uses moved on master after its seal, so all four gen hashes were stale. It is re-sealed on the lab against this branch's tree, and --verify reports all hashes MATCH. The coverage gate failed on the same seal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger row for sar_switch, another master spec landed without one (Refs #10788) specs/analog/sar_switch.t27 (analog M4c) reached master without a t27b row, so this PR's ratchet reported it UNLISTED. The arm64 run on 7f33764 measured it as a t27b pass, so the row says pass. Master is merged in first so the row names a file this branch contains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: sar_switch sorts after sar_comparator (Refs #10788) 4f739c1 put the sar_switch row before sar_comparator, so the loop-tools gate failed 'ledger: sorted, one entry per spec'. This commit also carries the merge of master, which brings move_gate's row and the cap of 139. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's own rows, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
added a commit
that referenced
this pull request
Oct 19, 2026
…ESET_AUTO (Closes #10803) (#10806) * t27f: idea factory -- any idea in any style preset, every element a particle (Closes #10771) particle_ds.t27 is the particle design system: five presets (noir-gold, neon-vortex, trit-charge, paper-ink, rain) as rows of integers -- palette, blend, radius, gain, spring, dashpot, force law, kick, card -- and one Q8 integer step, kernel, tone curve and finish. idea_factory.t27 is the factory: (idea, preset) -> 1080x1920 RGB24 frames. It wraps the idea into lines and scenes, sets each scene in the 3x5 font, gives every particle a target cell or a card-border point at each cut, and closes on the address. Lab: test-report 12/12 and 8/8 pass, 0 vacuous; seals saved and verified; dupe_scan clean; 5-preset preview rendered at 1080x1920. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: idea factory and the particle design system, preset sweep on the lab, legibility by luma (Refs #10771) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: Russian ideas in the factory -- UTF-8 and a 5x7 Latin and Cyrillic font of particles (Closes #10788) glyph57.t27 decodes UTF-8, folds lower case to capitals and stores a 5x7 font: ASCII 32..95 plus the 21 Cyrillic capitals with no Latin twin. The 11 look-alikes and Yo reuse Latin glyphs through a 32-entry map. idea_factory now wraps by characters, keeps positions in bytes, and sets text in the 5x7 font (advance 6, line pitch 9). t27c keeps "\xNN" in a string as four characters, so non-ASCII samples are u8 arrays (RU_IDEA, 80 bytes). Lab: glyph57 7/7, idea_factory 10/10, 0 vacuous; seals verified; dupe_scan clean. The t27f skill records the trap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: a new spec's t27b ledger row comes from the arm64 run, keep the PR a draft until then (Refs #10788) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: glyph57 and petal_menu pass the t27b front end (Refs #10788) On the x86_64 lab, the t27b front-end check (--check) prints every blocker before it stops at "the t27b JIT runs only on arm64". glyph57.t27 and petal_menu.t27 (new on master from #10786, also unlisted) reach that line with no blocker. The control, frame_shard.t27, prints ExprCall(rejected fn). Both rows are pass; this branch's arm64 run confirms them. max_not_pass stays 138. The t27f skill's ratchet note said the lab cannot give a verdict. That was wrong; it now gives the --check method and its control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory picks its style preset from a hash of the idea, PRESET_AUTO (Closes #10803) A batch of ideas rendered with the factory all came out in PRESET 0 unless someone edited the constant by hand. Now PRESET = PRESET_AUTO (255) makes main run pick_preset(IDEA, PRESET). That uses preset_of(IDEA), which is FNV-1a 32 over the idea's bytes (UTF-8 for Russian) mod PRESETS, so the same idea always gets the same style and different ideas spread over the five. Any other PRESET is kept as given, and PRESET stays 0, so today's render is unchanged. This is Remotion's random(seed), applied to style. Railway lab: t27c test-report 13/13 pass, 0 vacuous. The fnv1a32 test checks the published FNV-1a 32 vectors ("", a, b, foobar). Across the one-letter ideas A..Z every preset is picked. 5 of 5 mutants are killed: basis, prime, FNV-1 order, AUTO -> 0, mod 4. t27b raises no blocker, so the pass row stands. gen emits pick_preset. Seal re-saved, all hashes MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger rows for mos_psp103 and re-sealed frontend, both inherited from master (Refs #10788) Two of the three red checks on this PR came from master, not from the glyph57 change. specs/analog/mos_psp103.t27 and mos_psp103_data.t27 landed on master without t27b ledger rows, so the ratchet reported them UNLISTED. They are added in sorted position as pass. The t27b front end on the lab (--check) reports 0 unsupported constructs for both, matching the pass the CI run measured. frontend.t27 does not import glyph57, but a module it uses moved on master after its seal, so all four gen hashes were stale. It is re-sealed on the lab against this branch's tree, and --verify reports all hashes MATCH. The coverage gate failed on the same seal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger row for sar_switch, another master spec landed without one (Refs #10788) specs/analog/sar_switch.t27 (analog M4c) reached master without a t27b row, so this PR's ratchet reported it UNLISTED. The arm64 run on 7f33764 measured it as a t27b pass, so the row says pass. Master is merged in first so the row names a file this branch contains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: sar_switch sorts after sar_comparator (Refs #10788) 4f739c1 put the sar_switch row before sar_comparator, so the loop-tools gate failed 'ledger: sorted, one entry per spec'. This commit also carries the merge of master, which brings move_gate's row and the cap of 139. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's glyph57 row, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: take master's idea_factory seal so master merges in cleanly; re-saved after the merge (Refs #10803) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-save the idea_factory seal after merging master (Refs #10803) Saved on the Railway lab with t27c built from master (bootstrap/ unchanged since d01578d); master's own seal verifies MATCH with the same binary. idea_factory: 13 tests, 0 vacuous; seal --verify: all hashes MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
added a commit
that referenced
this pull request
Oct 19, 2026
…e compiled binary agrees with the spec (Closes #10815) (#10816) * t27f: idea factory -- any idea in any style preset, every element a particle (Closes #10771) particle_ds.t27 is the particle design system: five presets (noir-gold, neon-vortex, trit-charge, paper-ink, rain) as rows of integers -- palette, blend, radius, gain, spring, dashpot, force law, kick, card -- and one Q8 integer step, kernel, tone curve and finish. idea_factory.t27 is the factory: (idea, preset) -> 1080x1920 RGB24 frames. It wraps the idea into lines and scenes, sets each scene in the 3x5 font, gives every particle a target cell or a card-border point at each cut, and closes on the address. Lab: test-report 12/12 and 8/8 pass, 0 vacuous; seals saved and verified; dupe_scan clean; 5-preset preview rendered at 1080x1920. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: idea factory and the particle design system, preset sweep on the lab, legibility by luma (Refs #10771) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: Russian ideas in the factory -- UTF-8 and a 5x7 Latin and Cyrillic font of particles (Closes #10788) glyph57.t27 decodes UTF-8, folds lower case to capitals and stores a 5x7 font: ASCII 32..95 plus the 21 Cyrillic capitals with no Latin twin. The 11 look-alikes and Yo reuse Latin glyphs through a 32-entry map. idea_factory now wraps by characters, keeps positions in bytes, and sets text in the 5x7 font (advance 6, line pitch 9). t27c keeps "\xNN" in a string as four characters, so non-ASCII samples are u8 arrays (RU_IDEA, 80 bytes). Lab: glyph57 7/7, idea_factory 10/10, 0 vacuous; seals verified; dupe_scan clean. The t27f skill records the trap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: a new spec's t27b ledger row comes from the arm64 run, keep the PR a draft until then (Refs #10788) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: glyph57 and petal_menu pass the t27b front end (Refs #10788) On the x86_64 lab, the t27b front-end check (--check) prints every blocker before it stops at "the t27b JIT runs only on arm64". glyph57.t27 and petal_menu.t27 (new on master from #10786, also unlisted) reach that line with no blocker. The control, frame_shard.t27, prints ExprCall(rejected fn). Both rows are pass; this branch's arm64 run confirms them. max_not_pass stays 138. The t27f skill's ratchet note said the lab cannot give a verdict. That was wrong; it now gives the --check method and its control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory picks its style preset from a hash of the idea, PRESET_AUTO (Closes #10803) A batch of ideas rendered with the factory all came out in PRESET 0 unless someone edited the constant by hand. Now PRESET = PRESET_AUTO (255) makes main run pick_preset(IDEA, PRESET). That uses preset_of(IDEA), which is FNV-1a 32 over the idea's bytes (UTF-8 for Russian) mod PRESETS, so the same idea always gets the same style and different ideas spread over the five. Any other PRESET is kept as given, and PRESET stays 0, so today's render is unchanged. This is Remotion's random(seed), applied to style. Railway lab: t27c test-report 13/13 pass, 0 vacuous. The fnv1a32 test checks the published FNV-1a 32 vectors ("", a, b, foobar). Across the one-letter ideas A..Z every preset is picked. 5 of 5 mutants are killed: basis, prime, FNV-1 order, AUTO -> 0, mod 4. t27b raises no blocker, so the pass row stands. gen emits pick_preset. Seal re-saved, all hashes MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger rows for mos_psp103 and re-sealed frontend, both inherited from master (Refs #10788) Two of the three red checks on this PR came from master, not from the glyph57 change. specs/analog/mos_psp103.t27 and mos_psp103_data.t27 landed on master without t27b ledger rows, so the ratchet reported them UNLISTED. They are added in sorted position as pass. The t27b front end on the lab (--check) reports 0 unsupported constructs for both, matching the pass the CI run measured. frontend.t27 does not import glyph57, but a module it uses moved on master after its seal, so all four gen hashes were stale. It is re-sealed on the lab against this branch's tree, and --verify reports all hashes MATCH. The coverage gate failed on the same seal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory batch -- five ideas cover all five presets, and the compiled binary agrees with the spec (Closes #10815) PRESET_AUTO (#10806) was checked only in the t27c interpreter. A new test pins a batch of five ideas whose AUTO presets are noir, neon, trit, paper and rain. On the Railway lab each idea was built twice from the generated Zig, once with PRESET = PRESET_AUTO and once with the pinned preset written in, and the two frame streams have the same md5 for 5 of 5 ideas. Idea 1 with preset 1 gives a different stream, the control. So gen and the interpreter pick the same style. Lab: t27c test-report 14/14 pass, 0 vacuous. Mutants killed: a pinned preset swapped (paper -> rain) and one idea byte changed. The t27b front end reports 0 unsupported constructs. Seal re-saved, all hashes MATCH. The t27f skill records the recipe and the trap that cost one run: five parallel libx264 encoders failed to open, the tee closed, and md5 hashed truncated streams, so 3 of 5 read DIFF until md5 ran on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger row for sar_switch, another master spec landed without one (Refs #10788) specs/analog/sar_switch.t27 (analog M4c) reached master without a t27b row, so this PR's ratchet reported it UNLISTED. The arm64 run on 7f33764 measured it as a t27b pass, so the row says pass. Master is merged in first so the row names a file this branch contains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: sar_switch sorts after sar_comparator (Refs #10788) 4f739c1 put the sar_switch row before sar_comparator, so the loop-tools gate failed 'ledger: sorted, one entry per spec'. This commit also carries the merge of master, which brings move_gate's row and the cap of 139. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's glyph57 row, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-save the idea_factory seal on the lab after the master merge, 14/14 pass, MATCH (Refs #10815) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2 of 15 tasks
gHashTag
added a commit
that referenced
this pull request
Oct 19, 2026
…before writing a frame (#10822) * t27f: idea factory -- any idea in any style preset, every element a particle (Closes #10771) particle_ds.t27 is the particle design system: five presets (noir-gold, neon-vortex, trit-charge, paper-ink, rain) as rows of integers -- palette, blend, radius, gain, spring, dashpot, force law, kick, card -- and one Q8 integer step, kernel, tone curve and finish. idea_factory.t27 is the factory: (idea, preset) -> 1080x1920 RGB24 frames. It wraps the idea into lines and scenes, sets each scene in the 3x5 font, gives every particle a target cell or a card-border point at each cut, and closes on the address. Lab: test-report 12/12 and 8/8 pass, 0 vacuous; seals saved and verified; dupe_scan clean; 5-preset preview rendered at 1080x1920. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: idea factory and the particle design system, preset sweep on the lab, legibility by luma (Refs #10771) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: Russian ideas in the factory -- UTF-8 and a 5x7 Latin and Cyrillic font of particles (Closes #10788) glyph57.t27 decodes UTF-8, folds lower case to capitals and stores a 5x7 font: ASCII 32..95 plus the 21 Cyrillic capitals with no Latin twin. The 11 look-alikes and Yo reuse Latin glyphs through a 32-entry map. idea_factory now wraps by characters, keeps positions in bytes, and sets text in the 5x7 font (advance 6, line pitch 9). t27c keeps "\xNN" in a string as four characters, so non-ASCII samples are u8 arrays (RU_IDEA, 80 bytes). Lab: glyph57 7/7, idea_factory 10/10, 0 vacuous; seals verified; dupe_scan clean. The t27f skill records the trap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: a new spec's t27b ledger row comes from the arm64 run, keep the PR a draft until then (Refs #10788) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: glyph57 and petal_menu pass the t27b front end (Refs #10788) On the x86_64 lab, the t27b front-end check (--check) prints every blocker before it stops at "the t27b JIT runs only on arm64". glyph57.t27 and petal_menu.t27 (new on master from #10786, also unlisted) reach that line with no blocker. The control, frame_shard.t27, prints ExprCall(rejected fn). Both rows are pass; this branch's arm64 run confirms them. max_not_pass stays 138. The t27f skill's ratchet note said the lab cannot give a verdict. That was wrong; it now gives the --check method and its control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory picks its style preset from a hash of the idea, PRESET_AUTO (Closes #10803) A batch of ideas rendered with the factory all came out in PRESET 0 unless someone edited the constant by hand. Now PRESET = PRESET_AUTO (255) makes main run pick_preset(IDEA, PRESET). That uses preset_of(IDEA), which is FNV-1a 32 over the idea's bytes (UTF-8 for Russian) mod PRESETS, so the same idea always gets the same style and different ideas spread over the five. Any other PRESET is kept as given, and PRESET stays 0, so today's render is unchanged. This is Remotion's random(seed), applied to style. Railway lab: t27c test-report 13/13 pass, 0 vacuous. The fnv1a32 test checks the published FNV-1a 32 vectors ("", a, b, foobar). Across the one-letter ideas A..Z every preset is picked. 5 of 5 mutants are killed: basis, prime, FNV-1 order, AUTO -> 0, mod 4. t27b raises no blocker, so the pass row stands. gen emits pick_preset. Seal re-saved, all hashes MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger rows for mos_psp103 and re-sealed frontend, both inherited from master (Refs #10788) Two of the three red checks on this PR came from master, not from the glyph57 change. specs/analog/mos_psp103.t27 and mos_psp103_data.t27 landed on master without t27b ledger rows, so the ratchet reported them UNLISTED. They are added in sorted position as pass. The t27b front end on the lab (--check) reports 0 unsupported constructs for both, matching the pass the CI run measured. frontend.t27 does not import glyph57, but a module it uses moved on master after its seal, so all four gen hashes were stale. It is re-sealed on the lab against this branch's tree, and --verify reports all hashes MATCH. The coverage gate failed on the same seal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory batch -- five ideas cover all five presets, and the compiled binary agrees with the spec (Closes #10815) PRESET_AUTO (#10806) was checked only in the t27c interpreter. A new test pins a batch of five ideas whose AUTO presets are noir, neon, trit, paper and rain. On the Railway lab each idea was built twice from the generated Zig, once with PRESET = PRESET_AUTO and once with the pinned preset written in, and the two frame streams have the same md5 for 5 of 5 ideas. Idea 1 with preset 1 gives a different stream, the control. So gen and the interpreter pick the same style. Lab: t27c test-report 14/14 pass, 0 vacuous. Mutants killed: a pinned preset swapped (paper -> rain) and one idea byte changed. The t27b front end reports 0 unsupported constructs. Seal re-saved, all hashes MATCH. The t27f skill records the recipe and the trap that cost one run: five parallel libx264 encoders failed to open, the tee closed, and md5 hashed truncated streams, so 3 of 5 read DIFF until md5 ran on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger row for sar_switch, another master spec landed without one (Refs #10788) specs/analog/sar_switch.t27 (analog M4c) reached master without a t27b row, so this PR's ratchet reported it UNLISTED. The arm64 run on 7f33764 measured it as a t27b pass, so the row says pass. Master is merged in first so the row names a file this branch contains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory pre-flight -- refuse an idea the font cannot draw before writing a frame (Closes #10820) glyph57 draws a character it lacks as '?', so an idea with a phi, a euro sign or a brace used to ship with the wrong letter on screen. preflight(t) now returns PF_EMPTY (no scene), PF_GLYPH (missing_glyphs > 0; first_missing gives the byte offset), PF_LONG (reel past MAX_S = 60 s) or PF_OK, in that order, and main writes no frame unless it is PF_OK. A real '?', a '|' cut and a space do not count as missing; a malformed UTF-8 byte does. Railway lab, on top of 0a5dad1: 17/17 tests pass, 0 vacuous. Mutants: 9 of 10 killed. The survivor, MAX_S = 61, is equivalent, since reels grow in 72-frame steps and 60..62 s refuse the same ideas. Generated binaries: A{B} and a 25-scene idea write 0 bytes; the same A{B} with the guard removed writes 144 whole frames (the control); the sample idea writes 216 whole frames. t27b front end: 0 unsupported constructs. Seal re-saved, all hashes MATCH. The t27f skill records the check and the equivalent-mutant note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: sar_switch sorts after sar_comparator (Refs #10788) 4f739c1 put the sar_switch row before sar_comparator, so the loop-tools gate failed 'ledger: sorted, one entry per spec'. This commit also carries the merge of master, which brings move_gate's row and the cap of 139. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's glyph57 row, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's glyph57 row, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-save the idea_factory seal on the lab after the master merge, 14/14 pass, MATCH (Refs #10815) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-save the idea_factory seal on the lab after the merge, 17/17 pass, MATCH (Refs #10820) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-seal idea_factory after the merge with master (Refs #10820) Saved and verified on the Railway lab: test-report 0 FAIL, 17 tests, 0 vacuous; seal --verify MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
added a commit
that referenced
this pull request
Oct 19, 2026
…itle frame, byte for byte (Closes #10828) (#10830) * t27f: idea factory -- any idea in any style preset, every element a particle (Closes #10771) particle_ds.t27 is the particle design system: five presets (noir-gold, neon-vortex, trit-charge, paper-ink, rain) as rows of integers -- palette, blend, radius, gain, spring, dashpot, force law, kick, card -- and one Q8 integer step, kernel, tone curve and finish. idea_factory.t27 is the factory: (idea, preset) -> 1080x1920 RGB24 frames. It wraps the idea into lines and scenes, sets each scene in the 3x5 font, gives every particle a target cell or a card-border point at each cut, and closes on the address. Lab: test-report 12/12 and 8/8 pass, 0 vacuous; seals saved and verified; dupe_scan clean; 5-preset preview rendered at 1080x1920. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: idea factory and the particle design system, preset sweep on the lab, legibility by luma (Refs #10771) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: Russian ideas in the factory -- UTF-8 and a 5x7 Latin and Cyrillic font of particles (Closes #10788) glyph57.t27 decodes UTF-8, folds lower case to capitals and stores a 5x7 font: ASCII 32..95 plus the 21 Cyrillic capitals with no Latin twin. The 11 look-alikes and Yo reuse Latin glyphs through a 32-entry map. idea_factory now wraps by characters, keeps positions in bytes, and sets text in the 5x7 font (advance 6, line pitch 9). t27c keeps "\xNN" in a string as four characters, so non-ASCII samples are u8 arrays (RU_IDEA, 80 bytes). Lab: glyph57 7/7, idea_factory 10/10, 0 vacuous; seals verified; dupe_scan clean. The t27f skill records the trap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f skill: a new spec's t27b ledger row comes from the arm64 run, keep the PR a draft until then (Refs #10788) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: glyph57 and petal_menu pass the t27b front end (Refs #10788) On the x86_64 lab, the t27b front-end check (--check) prints every blocker before it stops at "the t27b JIT runs only on arm64". glyph57.t27 and petal_menu.t27 (new on master from #10786, also unlisted) reach that line with no blocker. The control, frame_shard.t27, prints ExprCall(rejected fn). Both rows are pass; this branch's arm64 run confirms them. max_not_pass stays 138. The t27f skill's ratchet note said the lab cannot give a verdict. That was wrong; it now gives the --check method and its control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory picks its style preset from a hash of the idea, PRESET_AUTO (Closes #10803) A batch of ideas rendered with the factory all came out in PRESET 0 unless someone edited the constant by hand. Now PRESET = PRESET_AUTO (255) makes main run pick_preset(IDEA, PRESET). That uses preset_of(IDEA), which is FNV-1a 32 over the idea's bytes (UTF-8 for Russian) mod PRESETS, so the same idea always gets the same style and different ideas spread over the five. Any other PRESET is kept as given, and PRESET stays 0, so today's render is unchanged. This is Remotion's random(seed), applied to style. Railway lab: t27c test-report 13/13 pass, 0 vacuous. The fnv1a32 test checks the published FNV-1a 32 vectors ("", a, b, foobar). Across the one-letter ideas A..Z every preset is picked. 5 of 5 mutants are killed: basis, prime, FNV-1 order, AUTO -> 0, mod 4. t27b raises no blocker, so the pass row stands. gen emits pick_preset. Seal re-saved, all hashes MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger rows for mos_psp103 and re-sealed frontend, both inherited from master (Refs #10788) Two of the three red checks on this PR came from master, not from the glyph57 change. specs/analog/mos_psp103.t27 and mos_psp103_data.t27 landed on master without t27b ledger rows, so the ratchet reported them UNLISTED. They are added in sorted position as pass. The t27b front end on the lab (--check) reports 0 unsupported constructs for both, matching the pass the CI run measured. frontend.t27 does not import glyph57, but a module it uses moved on master after its seal, so all four gen hashes were stale. It is re-sealed on the lab against this branch's tree, and --verify reports all hashes MATCH. The coverage gate failed on the same seal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory batch -- five ideas cover all five presets, and the compiled binary agrees with the spec (Closes #10815) PRESET_AUTO (#10806) was checked only in the t27c interpreter. A new test pins a batch of five ideas whose AUTO presets are noir, neon, trit, paper and rain. On the Railway lab each idea was built twice from the generated Zig, once with PRESET = PRESET_AUTO and once with the pinned preset written in, and the two frame streams have the same md5 for 5 of 5 ideas. Idea 1 with preset 1 gives a different stream, the control. So gen and the interpreter pick the same style. Lab: t27c test-report 14/14 pass, 0 vacuous. Mutants killed: a pinned preset swapped (paper -> rain) and one idea byte changed. The t27b front end reports 0 unsupported constructs. Seal re-saved, all hashes MATCH. The t27f skill records the recipe and the trap that cost one run: five parallel libx264 encoders failed to open, the tee closed, and md5 hashed truncated streams, so 3 of 5 read DIFF until md5 ran on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger row for sar_switch, another master spec landed without one (Refs #10788) specs/analog/sar_switch.t27 (analog M4c) reached master without a t27b row, so this PR's ratchet reported it UNLISTED. The arm64 run on 7f33764 measured it as a t27b pass, so the row says pass. Master is merged in first so the row names a file this branch contains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory pre-flight -- refuse an idea the font cannot draw before writing a frame (Closes #10820) glyph57 draws a character it lacks as '?', so an idea with a phi, a euro sign or a brace used to ship with the wrong letter on screen. preflight(t) now returns PF_EMPTY (no scene), PF_GLYPH (missing_glyphs > 0; first_missing gives the byte offset), PF_LONG (reel past MAX_S = 60 s) or PF_OK, in that order, and main writes no frame unless it is PF_OK. A real '?', a '|' cut and a space do not count as missing; a malformed UTF-8 byte does. Railway lab, on top of 0a5dad1: 17/17 tests pass, 0 vacuous. Mutants: 9 of 10 killed. The survivor, MAX_S = 61, is equivalent, since reels grow in 72-frame steps and 60..62 s refuse the same ideas. Generated binaries: A{B} and a 25-scene idea write 0 bytes; the same A{B} with the guard removed writes 144 whole frames (the control); the sample idea writes 216 whole frames. t27b front end: 0 unsupported constructs. Seal re-saved, all hashes MATCH. The t27f skill records the check and the equivalent-mutant note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ledger: sar_switch sorts after sar_comparator (Refs #10788) 4f739c1 put the sar_switch row before sar_comparator, so the loop-tools gate failed 'ledger: sorted, one entry per spec'. This commit also carries the merge of master, which brings move_gate's row and the cap of 139. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: idea factory cover still -- COVER=1 writes the reel's settled title frame, byte for byte (Closes #10828) Reels, Shorts and TikTok show a cover before a reel plays. Until now someone had to cut it out with ffmpeg and guess the frame. COVER = 1 makes main run the physics of every frame up to cover_frame(IDEA), the first scene's last frame (71), and raster only that one. The still is then frame 71 of the reel, with the same idea and preset, and cannot drift from it. Remotion's renderStill is the model. Railway lab, on top of e9b55d6: 18/18 tests pass, 0 vacuous. 4 of 4 mutants are killed. The t27b front end reports 0 unsupported constructs. Generated binaries: - COVER = 0 is md5-identical to the binary before this change. - COVER = 1 writes 6220800 bytes, and cmp finds it equal to frame 71 cut from the full 216-frame reel. - The control, with the guard moved to frames - 2, differs from frame 71 and equals frame 70. - A refused idea (A{B}) still writes 0 bytes. - The AUTO-preset idea SEALED|EVERY HASH writes one frame. Seal re-saved; all hashes MATCH. The t27f skill records the cover recipe. It also records the ledger sort trap that turned #10792 red: a row was inserted out of order, and `sort -c` catches it before the commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's glyph57 row, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's glyph57 row, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27b ledger: master's rows plus this lane's own rows, so the branch merges clean (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-save the idea_factory seal on the lab after the master merge, 14/14 pass, MATCH (Refs #10815) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-save the idea_factory seal on the lab after the merge, 17/17 pass, MATCH (Refs #10820) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-save the idea_factory seal on the lab after the merge, MATCH (Refs #10828) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-seal idea_factory after the merge with master (Refs #10820) Saved and verified on the Railway lab: test-report 0 FAIL, 17 tests, 0 vacuous; seal --verify MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-seal idea_factory after the merge with preflight and master (Refs #10828) Saved and verified on the Railway lab: test-report 0 FAIL, 18 tests, 0 vacuous; seal --verify MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * t27f: re-seal idea_factory after the merge with master (Refs #10828) Saved and verified on the Railway lab: test-report 0 FAIL, 18 tests, 0 vacuous; seal --verify MATCH. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
12 tasks
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.
Refs #10782 (milestone M4). Stacked on #10783: this branch contains its commit, and the base is
master(not the #10783 branch) so it does not land on a dead base. Once #10783 merges, the diff here shrinks to the M4 change alone.What blocked lowering
t27c icarus-lowerable specs/t27f/petal_menu.t27printednot_lowerable. The cause was not thestrconstants or theu32colour arrays: the structural classifier accepts everyconstdeclaration. Probes on the Railway lab isolated it to the@divTrunc(...)calls. A call to a name that is neither a module function nor an Icarus builtin is rejected.No companion module was needed, so the spec stays one file.
Change (
.t27only)fit_permille,to_box,hit_px,card_xandcard_ynow divide with/. gen-zig still lowers/on i64 to@divTruncinside function bodies, and Verilog signed/truncates towards zero too, so behaviour is unchanged.centre_x(p)andcentre_y(p). In the tests it ran into two backend limits:/on an untyped sum of calls. A typed local fixes this.@divTruncverbatim and declared aregafter a statement inside a loop. Calling the functions inline in the asserts fixes this./is used and not@divTrunc.Verification (Railway lab, t27c release build, zig at /opt/zig; nothing ran on the Mac)
t27c icarus-lowerable specs/t27f/petal_menu.t27lowerable(wasnot_lowerable)t27c test-report specs/t27f/petal_menu.t27t27c test-report specs/t27f/frontend.t27t27c icarus-simulate specs/t27f/petal_menu.t27[TEST] ... PASSEDunder iverilog/vvpFAILEDand exits non-zeroNot in this PR
The generated
hitis still a combinationalfunctionwith awhileloop. For synthesis, the gen-verilog header says that loop needs a compile-time bound or anon_clockentry point. That is the next step on the board path. This PR only covers the simulation model.🤖 Generated with Claude Code