Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
d21f483
t27f: idea factory -- any idea in any style preset, every element a p…
gHashTag Oct 19, 2026
2c619fd
t27f skill: idea factory and the particle design system, preset sweep…
gHashTag Oct 19, 2026
5e07615
t27f: Russian ideas in the factory -- UTF-8 and a 5x7 Latin and Cyril…
gHashTag Oct 19, 2026
ba365d1
Merge master into claude/t27f-cyrillic; list five t27b-pass specs in …
gHashTag Oct 19, 2026
9ec9e29
t27f skill: a new spec's t27b ledger row comes from the arm64 run, ke…
gHashTag Oct 19, 2026
8efa4bc
Merge branch 'master' of github.com:gHashTag/t27 into claude/t27f-cyr…
gHashTag Oct 19, 2026
dae06a9
Ledger: glyph57 and petal_menu pass the t27b front end (Refs #10788)
gHashTag Oct 19, 2026
29f8511
t27f: idea factory picks its style preset from a hash of the idea, PR…
gHashTag Oct 19, 2026
7f33764
Ledger rows for mos_psp103 and re-sealed frontend, both inherited fro…
gHashTag Oct 19, 2026
549fe2c
Merge branch 'claude/t27f-cyrillic' into claude/t27f-preset-hash
gHashTag Oct 19, 2026
879ff99
t27f: idea factory batch -- five ideas cover all five presets, and th…
gHashTag Oct 19, 2026
d5dc2c9
Merge remote-tracking branch 'origin/master' into claude/t27f-cyrillic
gHashTag Oct 19, 2026
4f739c1
Ledger row for sar_switch, another master spec landed without one (Re…
gHashTag Oct 19, 2026
4d5b412
Merge branch 'claude/t27f-cyrillic' into claude/t27f-preset-hash
gHashTag Oct 19, 2026
0a5dad1
Merge branch 'claude/t27f-preset-hash' into claude/t27f-batch
gHashTag Oct 19, 2026
e9b55d6
t27f: idea factory pre-flight -- refuse an idea the font cannot draw …
gHashTag Oct 19, 2026
f8c3822
Merge remote-tracking branch 'origin/master' into claude/t27f-cyrillic
gHashTag Oct 19, 2026
fe4fd88
Ledger: sar_switch sorts after sar_comparator (Refs #10788)
gHashTag Oct 19, 2026
5929aa0
t27f: idea factory cover still -- COVER=1 writes the reel's settled t…
gHashTag Oct 19, 2026
2b94b35
Merge remote-tracking branch 'origin/claude/t27f-cyrillic' into claud…
gHashTag Oct 19, 2026
56d6d78
Merge branch 'claude/t27f-preset-hash' into claude/t27f-batch
gHashTag Oct 19, 2026
7312b77
Merge branch 'claude/t27f-batch' into claude/t27f-preflight
gHashTag Oct 19, 2026
7255e11
Merge remote-tracking branch 'origin/claude/t27f-preflight' into clau…
gHashTag Oct 19, 2026
e1d344e
Merge remote-tracking branch 'origin/master' into claude/t27f-cyrillic
gHashTag Oct 19, 2026
b1312de
Merge branch 'claude/t27f-cyrillic' into claude/t27f-preset-hash
gHashTag Oct 19, 2026
863d00e
Merge branch 'claude/t27f-preset-hash' into claude/t27f-batch
gHashTag Oct 19, 2026
5ea0c54
Merge branch 'claude/t27f-batch' into claude/t27f-preflight
gHashTag Oct 19, 2026
eb69da0
Merge branch 'claude/t27f-preflight' into claude/t27f-cover
gHashTag Oct 19, 2026
ea41efb
t27b ledger: master's rows plus this lane's glyph57 row, so the branc…
gHashTag Oct 19, 2026
b07f7bf
t27b ledger: master's rows plus this lane's glyph57 row, so the branc…
gHashTag Oct 19, 2026
c158873
t27b ledger: master's rows plus this lane's own rows, so the branch m…
gHashTag Oct 19, 2026
ef673a2
Merge master into claude/t27f-batch after #10806 landed (Refs #10815)
gHashTag Oct 19, 2026
893c929
t27f: re-save the idea_factory seal on the lab after the master merge…
gHashTag Oct 19, 2026
c7daeb9
Merge claude/t27f-batch into claude/t27f-preflight after #10806 lande…
gHashTag Oct 19, 2026
ba3bd65
t27f: re-save the idea_factory seal on the lab after the merge, 17/17…
gHashTag Oct 19, 2026
2e7262a
Merge claude/t27f-preflight into claude/t27f-cover after #10806 lande…
gHashTag Oct 19, 2026
7b2dcb0
t27f: re-save the idea_factory seal on the lab after the merge, MATCH…
gHashTag Oct 19, 2026
737d2cb
Merge origin/master into claude/t27f-preflight (#10816 landed)
gHashTag Oct 19, 2026
18f9209
t27f: re-seal idea_factory after the merge with master (Refs #10820)
gHashTag Oct 19, 2026
f5638dd
Merge claude/t27f-preflight (with master, #10816 landed) into claude/…
gHashTag Oct 19, 2026
1f48803
t27f: re-seal idea_factory after the merge with preflight and master …
gHashTag Oct 19, 2026
d0dff49
Merge master (#10822 landed) into claude/t27f-cover
gHashTag Oct 19, 2026
7f2bc73
t27f: re-seal idea_factory after the merge with master (Refs #10828)
gHashTag Oct 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .claude/skills/t27f/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,21 @@ card's `PRESETS`; its lab check compares that list to `PRESET_NAMES` byte for by
**A mutant can survive and still be equivalent:** reels grow in 72-frame steps, so `MAX_S` from
60 to 62 refuses exactly the same ideas. Say that in the report, and do not add a test that only
restates the constant.
- **Cut the cover still with `COVER = 1`, not with ffmpeg** (gHashTag/t27#10828). `main` still runs
the physics of every frame up to `cover_frame(IDEA)`, which is the first scene's last frame, 71.
It rasters only that frame and writes one 6220800-byte frame. The still is therefore byte for
byte frame 71 of the reel, with the same idea and preset, and it cannot drift. **Prove it with
`cmp`, plus a control.** Cut frame 71 out of the `COVER = 0` output (`dd bs=6220800 skip=71
count=1`) and `cmp` it with the cover. A control with the guard moved to `frames - 2` must
`cmp` equal to frame 70 instead. Without that control, an identical result could mean
both sides are broken the same way.
Skipping a frame's rows is `py = FRAME_H` before the row loop. That changes no indentation and
needs no `!` (codegen trap #6549).
- **Insert ledger rows in sort order.** `loop-tools-gate` fails "ledger: sorted, one entry per
spec" when a row is out of order, and a nearby row looks right by eye
(`sar_switch` was put before `sar_comparator`). Check the order before you commit, on the Mac,
without running anything heavier than `sort`:
`grep -o '"path": "[^"]*"' docs/reports/t27b_expectations.json | LC_ALL=C sort -c`.

**Keep it FPGA-shaped.** Use Q8 fixed point. The per-step and per-pixel paths use only add,
multiply, compare, table lookup (`kt` kernel ROM, `tt` tone ROM) and power-of-two division.
Expand Down
16 changes: 8 additions & 8 deletions .trinity/seals/t27f_idea_factory.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,23 @@
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:b4cb42ec55deec10b3180769d04e36217f39dc786c7756387880cf26bc7f3f15",
"gen_hash_rust": "sha256:7632796cc4ee12e7d310e8115091e72248074a2e25ff02e8773ea5776ec6b2d1",
"gen_hash_verilog": "sha256:a1e8068e1df97e43a750658c626f76e47f52b7d62f249bc598af057a78a9e35f",
"gen_hash_zig": "sha256:6b2f7675bb3198c6045686c29eac989768cb5d3e0b00b14795be854be56a8c9f",
"gen_hash_c": "sha256:659b08e2a43b61540ea16001090a6e5b8f647335d528534343fffbafbe3e279e",
"gen_hash_rust": "sha256:afa2cf2329d20364792c727055b28f6512a7816e1d0cab5f727045d0ff925e0c",
"gen_hash_verilog": "sha256:4ff96840d918523ff0918749b04d454ba967695dc5cf1ce9c129e1d2f1a22096",
"gen_hash_zig": "sha256:93dc9379ca8639ced871e177a0581962af0938ca10c3386d904c55e1b8c191b8",
"module": "idea_factory",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-19T07:36:57Z",
"sealed_at": "2026-10-19T07:53:34Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:44432d34553ebeb531b415544066d45f5928975c5a98fb95aa7bd69267430a5a",
"spec_hash": "sha256:876f5856b3c313835cbb0b2e3c9c4d47db4c25fde46efd288126cdd0c4f218c4",
"spec_path": "specs/t27f/idea_factory.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 17,
"total": 17,
"passed": 18,
"total": 18,
"vacuous": 0
},
"toolchain": {
Expand Down
31 changes: 30 additions & 1 deletion specs/t27f/idea_factory.t27
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
// PRE-FLIGHT: main draws nothing for an idea preflight refuses -- empty, a character the font
// lacks, or a reel longer than MAX_S.
//
// COVER: COVER = 1 writes one frame, cover_frame(IDEA) -- the still a platform shows before the reel
// plays (Remotion's renderStill). main still runs the physics of every frame before it, so the
// still is byte for byte that frame of the reel, never a second render that could drift.
//
// NOT CLAIMED: capitals only (lower case folds); no voice or music (lesson_reel mode 5 has those);
// the Verilog is emitted, not synthesised, and no board has drawn it.
// phi^2 + 1/phi^2 = 3 | TRINITY
Expand Down Expand Up @@ -351,6 +355,15 @@ pub fn preflight(t: []const u8) -> i32 {
return PF_OK;
}

// ---- cover ----

pub const COVER : i32 = 0; // 1: write only the cover frame

// The cover: the first scene's last frame, when the law's clock has run out and the title has settled.
pub fn cover_frame(t: []const u8) -> i32 {
return imin(SCENE_F, reel_frames(t)) - 1;
}

// ---- assign ----

// Where card particle m of mm sits on the border of the rectangle (x0, y0)-(x1, y1): what 0 = x,
Expand Down Expand Up @@ -430,7 +443,8 @@ pub fn main() -> void {
const gmax = GRAIN[p];
const ncards = @divTrunc(NP, 4);

const frames = reel_frames(IDEA);
var frames = reel_frames(IDEA);
if (COVER == 1) { frames = cover_frame(IDEA) + 1; } // run up to the cover, raster only it
var frame : i32 = 0;
while (frame < frames) {
const s = @divTrunc(frame, SCENE_F);
Expand Down Expand Up @@ -520,6 +534,7 @@ pub fn main() -> void {
// ---- raster: one row at a time ----
var gseed : i32 = 1000003 + frame * 7919;
var py : i32 = 0;
if (COVER == 1 && frame != frames - 1) { py = FRAME_H; } // not the cover: no rows
while (py < FRAME_H) {
var q : i32 = 0;
while (q < FRAME_W) {
Expand Down Expand Up @@ -818,3 +833,17 @@ test "every idea this file renders passes pre-flight" {
assert(preflight("THE FPGA RUNS|THE SPEC") == PF_OK);
assert(preflight("SEALED|EVERY HASH") == PF_OK);
}

test "the cover is the first scene's last frame, inside the reel, after the law's clock runs out" {
assert(cover_frame(IDEA) == 71);
assert(cover_frame(IDEA) == SCENE_F - 1);
assert(@divTrunc(cover_frame(IDEA), SCENE_F) == 0);
assert(cover_frame(IDEA) < reel_frames(IDEA));
assert(live(cover_frame(IDEA)) == 0);
assert(cover_frame(CTA) == 71);
assert(cover_frame(CTA) < reel_frames(CTA));
assert(cover_frame(RU_IDEA[0..80]) == 71);
assert(cover_frame("SPEC IS THE SOURCE|EVERY VIEW DERIVED") == 71);
assert(cover_frame("SEALED|EVERY HASH") < reel_frames("SEALED|EVERY HASH"));
assert(COVER == 0);
}
Loading