Repository navigation
t27f: idea factory pre-flight -- refuse an idea the font cannot draw before writing a frame - #10822
Conversation
…article (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>
… on the lab, legibility by luma (Refs #10771) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lic 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>
…the ledger (Refs #10788) #10784 merged with t27b-native-ratchet red: five specs that pass under t27b had no row in docs/reports/t27b_expectations.json (UNLISTED). Rows added, sorted by path, all "pass" as the ratchet reported them: specs/fpga/analog_cell_ax7203.t27 specs/port/trios-railway/crates/trios-igla-race/src/bin/debug_queue.t27 specs/port/trios-railway/crates/trios-igla-race/src/bin/smoke_agent.t27 specs/t27f/idea_factory.t27 specs/t27f/particle_ds.t27 max_not_pass stays 138. glyph57.t27's row waits for this branch's arm64 run: the lab is x86_64 and the t27b JIT runs only on arm64. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ep the PR a draft until then (Refs #10788) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
…ESET_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>
…m 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>
…e 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>
#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>
…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>
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>
# Conflicts: # .trinity/seals/t27f_T27fFrontend.json
|
The red check here is inherited from master, not caused by this PR. Master fails loop-tools-tracked with "the cap equals reality (128, cap 129)", fails scan on a dev-home path in specs/tri/worktrees/reap.t27, and fails the native ratchet on 3 UNLISTED rows. #10889 fixes all three. This draft is stacked on #10806 and gets resynced (update-branch plus a lab re-seal) after #10806 merges; resyncing earlier would conflict again. |
Master's ledger and idea_factory seal are taken as is; the seal is re-saved in the next commit. The branch now differs from master only by the batch test and its SKILL.md note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, 14/14 pass, MATCH (Refs #10815) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d (Refs #10820) Ledger and seal taken from the batch branch, which equals master's ledger; the seal is re-saved next. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… pass, MATCH (Refs #10820) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
PR DashboardGenerated at: 2026-10-19 07:46:17 UTC
Summary
Seal Status
|
|
Both reds on 18f9209 are master's, tracked in #10935. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #10820. Part of epic #10560. #10806 and #10792 have merged; this sits on #10816 (the batch), so until #10816 merges the diff also shows the batch test. The idea_factory seal was re-saved on the Railway lab after the merge: 17/17 pass, MATCH.
What this does
glyph57 draws a character it does not have as
?. Today an idea with a phi, a euro sign,{or~ships with the wrong letter on screen, and no test notices. This PR adds a pre-flight, the content-factory notes' competitor rule 11: a batch item fails before render, not after.missing_glyphs(t)andfirst_missing(t)count the characters the font would draw as?, and give the byte offset of the first one. Counting goes by code point, so a real?, a|cut and a space do not count, and a malformed UTF-8 byte does.preflight(t)checks in this order:PF_EMPTY, thenPF_GLYPH, thenPF_LONG(the reel runs pastMAX_S= 60 s), elsePF_OK.mainwrites no frame unless the idea passes. An empty output therefore means the idea was refused.Evidence (Railway lab, on top of 0a5dad1)
t27c test-reportpasses 17 of 17 tests, 0 vacuous. That is 3 new tests with 32 asserts. They cover Latin, Russian, phi, euro, a brace, a stray byte, the 1800-frame boundary, and the batch and sample ideas.?or|exemption,>to>=, counting bytes instead of characters, an off-by-one in the offset, swapping the GLYPH/LONG order and dropping the empty check.MAX_S = 61, is equivalent. Reels grow in 72-frame steps, so 60, 61 and 62 s refuse exactly the same ideas.t27c gen+zig build-exe -O ReleaseFast):A{B}A{B}--verifyreports all hashes MATCH.Not claimed
preflight's return value, read by tests or by a caller.specs/skills/t27-idea-factory.t27, skills: t27/idea-factory card -- TRI CLAW unpacks any idea in any particle preset (Closes #10796) #10800) does not mention the pre-flight yet. That is a follow-up once skills: t27/idea-factory card -- TRI CLAW unpacks any idea in any particle preset (Closes #10796) #10800 merges.This is a draft until its base PRs land, so the issue gate cannot merge it ahead of them.
🤖 Generated with Claude Code