diff --git a/specs/igla/own_model.t27 b/specs/igla/own_model.t27 index 775e6ee175..4f72e2aa42 100644 --- a/specs/igla/own_model.t27 +++ b/specs/igla/own_model.t27 @@ -71,13 +71,35 @@ ; 0 vacuous (cells 16-18); playra/tern-tc-9m and tern-tc-9m-t27 200, tern-tc-100m 401 (cells 7 ; and 8); the board /state 200 (cell 21). A review of that PR is what the engine asks of cells ; 7, 16, 17, 18 and 27; REVIEWED turns true only in a later PR that names the approving review. -; - live: GET huggingface.co/api/models/playra/tern-tc-9m and .../tern-tc-9m-t27 returned 200; -; .../tern-tc-100m returned 401, the same as a made-up name, so no 100M is public. +; - test on 2026-10-18, t27c with `--backend ml` (#10165), lab checkout at master 8887f17f4: +; ml/host_io_model 3/3 pass, 0 vacuous. `t27c compile specs/ml/host_io_model.t27 --backend ml` +; builds a binary that exits 0 and leaves a real 24-byte /tmp/t27_tokens.bin (bytes 00000000 +; 01000000 50c40000 ffffffff 07000000 78563412, sha256 48548924cac8...); with that path made a +; directory the binary aborts, exit 134. So t27c lowers file I/O (Linux syscalls on a real fd) +; and the arena of ml/arena_heap is plain t27 it already lowers: cell 24 has its passing test. +; The backend builds that file-I/O program only; the training binary is the next entry. +; - test on 2026-10-18, same t27c, lab checkout at master 2d358a708, after the PR that added +; ml/train_slice_model (#10186): 5/5 pass, 0 vacuous. `t27c compile +; specs/ml/train_slice_model.t27 --backend ml` builds a binary that runs 20 steps of the +; nn/hslm_backward training step through `use` (loss 3.2975044 to 0.32346588), writes the trained +; trits, biases and both losses to a 379-byte /tmp/t27_train_slice.bin, reads it back byte for +; byte and exits 0; with that path made a directory it aborts, exit 134. So t27c lowers a model +; spec to a training binary, for one 3-head slice; not for the whole 3-block model (cell 25). +; - published on 2026-10-18: playra/tern-tc-100m on Hugging Face, the 100M ternary model of the +; igla-coder-gpu ladder (n_layer 12, d_model 768), trained on RunPod; final.pt sha256 +; 620c80b642ff87f06f945f6dbedf122e69fd524e93b7b20d1fd9bfcfd3d08300, both run summaries pinned +; by sha256 in its model_card.t27 (14/14 on the lab). Validation bits per byte 0.4722 against +; 0.4217 for the fp twin of the same recipe: the ternary model is the worse of the two. +; - live: GET huggingface.co/api/models/playra/tern-tc-9m, .../tern-tc-9m-t27 and +; .../tern-tc-100m returned 200 (tern-tc-100m answered 401 before 2026-10-18). ; GET board-production-2dec.up.railway.app/state returned 200 and a made-up path 404; its ; snapshot is dated 2026-10-05, so the board is live and 12 days stale. ; - review: no PR behind any cell has a review, so no DELIVER cell is VERIFIED. #10164 merged on -; 2026-10-18 02:43Z without one. The evidence above is put to review in the PR that adds this -; line, re-taken on the lab at its own base; REVIEWED still waits for a PR that names its review. +; 2026-10-18 02:43Z without one, and #10179, which put the evidence to review, was merged at +; 03:16Z by an auto-merge another session enabled, before the reviewer reached it; #10186 +; (cell 25) merged at 03:42Z the same way. The PR that adds this line puts the evidence of +; cells 7, 8, 16, 17, 18, 25 and 27 to review again; REVIEWED still waits for a later PR that +; names the approving review. ; - board on 2026-10-18, cell 26: specs/fpga/ddr3_head_bandwidth.t27 (11/11 tests, 0 vacuous on the ; lab), lowered by t27b verilog around a LiteDRAM core, routed by openXC7 for xc7a200tfbg484-2 and ; flashed on the AX7203 with openFPGALoader -c digilent_hs2. Its UART receipt: 325000 beats @@ -90,7 +112,7 @@ ; from those that do. This is a sequential read of a pattern, no weight on the board and no ; compute from DDR3, so the cell is a draft at 10 percent, a DELIVER step waiting for its review. ; The engine asks an engineering LEARN step for a source link, a PRACTICE step for a passing test -; and a DELIVER step for a review. So: 1 published, 16 verified, 6 drafts, 4 gaps. +; and a DELIVER step for a review. So: 1 published, 17 verified, 8 drafts, 1 gap. ; PERCENT is a second, separate number per cell: an estimate of how much of that part exists, with ; its basis in SOURCES. It never feeds a status. The lens and overall figures are plain means, every @@ -100,9 +122,10 @@ ; (PPL 2.96 at ctx 27) were wiped by EXP-002 and survive only in the ledger. In t27 the loss, four ; optimizers and the HSLM spec's forward and backward passes pass, and that spec is now the trained ; model, its VSA path included (see MEASURED); the ternary STE, the training step and the data -; and checkpoint layout now pass too, on a model slice and on bytes; the STE over the whole model, -; heap and file I/O exist as pure t27 contracts (ml/arena_heap, ml/file_io_contract) that t27c does not -; lower, and `t27c --backend ml` does not exist. +; and checkpoint layout now pass too, on a model slice and on bytes; heap and file I/O are t27 +; (ml/arena_heap, ml/file_io_contract, ml/host_io_model) and `t27c --backend ml` lowers them to a +; binary that writes a real file, and to a training binary for one head slice +; (ml/train_slice_model); the STE and a training binary over the whole model are not done. A 100M ternary model is public; nothing past 100M parameters is. ; Not claimed: no model quality beyond the numbers in SOURCES; no GIF or MP4, stills only. ; phi^2 + 1/phi^2 = 3 | TRINITY @@ -192,7 +215,7 @@ pub const SOURCES : [27]str = [ "igla-coder-gpu results/report_pair_10b.md", "t27 specs/igla/coder/*.t27: 9 of 9 compile", "huggingface.co/playra/tern-tc-9m", - "", + "huggingface.co/playra/tern-tc-100m, final.pt sha256 620c80b6...d08300", "", "trinity docs/experiments/FOUND_EXPERIMENTS_SUMMARY.md", "trinity-training src/hslm, 64 Zig files", @@ -208,8 +231,8 @@ pub const SOURCES : [27]str = [ "board-production-2dec.up.railway.app/state", "t27 specs/port/trinity/fpga/openxc7-synth/ternary_matvec.t27", "t27c test-report on 17 ML specs: 17 compile", - "", - "", + "t27 specs/ml/host_io_model.t27 3/3 via t27c --backend ml (#10165); arena in ml/arena_heap.t27", + "t27 specs/ml/train_slice_model.t27 5/5; its --backend ml binary trains one slice 20 steps (#10186)", "t27 specs/fpga/ddr3_head_bandwidth.t27: head read 2769 MB/s on the AX7203; no weights on it", "t27 specs/igla/own_model.t27" ]; @@ -217,30 +240,30 @@ pub const SOURCES : [27]str = [ /// What would ground each gap; "" for a cell that has its source. pub const MISSING : [27]str = [ "", "", "", "", "", "", "", - "a public 100M checkpoint: playra/tern-tc-100m answers 401, like a made-up name", + "", "any run past 100M parameters: none exists", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "heap allocation and file I/O lowered by t27c: neither exists; ml/arena_heap.t27 and ml/file_io_contract.t27 are the contract it must meet", - "a t27c backend that lowers a model spec to a training binary: none exists", + "", + "", "", "" ]; /// The measurements per cell (see the header for how each was taken). -pub const GROUNDED : [27]bool = [true, true, true, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, true, true]; -pub const TEST_PASS : [27]bool = [false, false, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, false, false]; +pub const GROUNDED : [27]bool = [true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]; +pub const TEST_PASS : [27]bool = [false, false, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, false]; pub const REVIEWED : [27]bool = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]; -pub const LIVE : [27]bool = [false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false]; +pub const LIVE : [27]bool = [false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false]; /// What a host passes the viewer, per cell: the earned status code and the step number as a label. -pub const STATUS : [27]u8 = [4, 4, 4, 4, 4, 4, 3, 0, 0, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 4, 4, 0, 0, 3, 3]; +pub const STATUS : [27]u8 = [4, 4, 4, 4, 4, 4, 3, 3, 0, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 4, 4, 4, 3, 3, 3]; pub const LABELS : [27]str = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27"]; /// Percent of each part that exists, estimated from its source (see the header). Never a status. -pub const PCT : [27]u8 = [60, 70, 80, 80, 60, 100, 50, 0, 0, 100, 100, 20, 80, 65, 95, 75, 55, 40, 70, 15, 60, 40, 100, 0, 0, 10, 50]; +pub const PCT : [27]u8 = [60, 70, 80, 80, 60, 100, 50, 90, 0, 100, 100, 20, 80, 65, 95, 75, 55, 40, 70, 15, 60, 40, 100, 60, 30, 10, 50]; /// The t27c test-report counts the PRACTICE cells quote. pub const ML_SPECS_MEASURED : i32 = 17; @@ -265,11 +288,11 @@ pub const ROWS : [20]str = [ "In t27: loss, optimizers, HSLM pass", "17 of 17 ML specs compile on the lab", "9 of 9 IGLA CODER specs compile", - "1 published, 16 verified, 6 drafts", - "4 gaps, about 54 percent overall", + "1 published, 17 verified, 8 drafts", + "1 gap, about 61 percent overall", "Batched f32 HSLM trainer", "Shadow weights for the whole model", - "File I/O, heap, --backend ml", + "A whole-model training binary", "" ]; @@ -322,7 +345,7 @@ test every_step_is_a_cell { test a_gap_is_named_not_filled { assert gaps_are_named(SOURCES, MISSING, GROUNDED); - assert count_true(GROUNDED) == 23; + assert count_true(GROUNDED) == 26; var c : i32 = 0; while (c < CELL_COUNT) { const i : usize = @intCast(c); @@ -336,15 +359,16 @@ test a_gap_is_named_not_filled { test a_status_is_earned_not_chosen { assert statuses_earned(STATUS, DOMAIN, GROUNDED, TEST_PASS, REVIEWED, LIVE); - // the evidence slide's "1 published, 16 verified, 6 drafts" and "4 gaps" + // the evidence slide's "1 published, 17 verified, 8 drafts" and "1 gap" assert count_status(STATUS, STATUS_PUBLISHED) == 1; - assert count_status(STATUS, STATUS_VERIFIED) == 16; - assert count_status(STATUS, STATUS_DRAFT) == 6; - assert count_status(STATUS, STATUS_GAP) == 4; + assert count_status(STATUS, STATUS_VERIFIED) == 17; + assert count_status(STATUS, STATUS_DRAFT) == 8; + assert count_status(STATUS, STATUS_GAP) == 1; assert count_true(REVIEWED) == 0; // every passing test is a PRACTICE step: the t27 bench, MultiPL-E and coder specs (cells 4 to - // 6), loss, optimizers, forward pass, matvec, and the ML specs that compile (cell 23) - assert count_true(TEST_PASS) == 8; + // 6), loss, optimizers, forward pass, matvec, the ML specs that compile (cell 23) and the + // file I/O t27c lowers (cell 24) + assert count_true(TEST_PASS) == 9; var c : i32 = 0; while (c < CELL_COUNT) { const i : usize = @intCast(c); @@ -356,6 +380,14 @@ test a_status_is_earned_not_chosen { // the 9M model is live, but a live page does not stand in for a review assert LIVE[6]; assert STATUS[6] == STATUS_DRAFT; + // and the same holds for the public 100M model (step 8) + assert LIVE[7]; + assert STATUS[7] == STATUS_DRAFT; + assert STATUS[23] == STATUS_VERIFIED; + // the slice training binary (step 25) is grounded, but a DELIVER step waits for a review + assert GROUNDED[24]; + assert step_stage(24) == STAGE_DELIVER; + assert STATUS[24] == STATUS_DRAFT; // the board is live and was sourced, so it is the one published cell assert STATUS[20] == STATUS_PUBLISHED; } @@ -386,11 +418,11 @@ test the_compile_counts_are_the_measured_ones { } test percent_per_lens_is_a_plain_mean { - assert mean_pct(0, 9) == 55; + assert mean_pct(0, 9) == 65; assert mean_pct(9, 9) == 70; - assert mean_pct(18, 9) == 38; - // the evidence slide's "about 54 percent overall" - assert mean_pct(0, CELL_COUNT) == 54; + assert mean_pct(18, 9) == 48; + // the evidence slide's "about 61 percent overall" + assert mean_pct(0, CELL_COUNT) == 61; } test the_training_step_cells_are_drafts_until_reviewed { diff --git a/specs/igla/own_model_board.t27 b/specs/igla/own_model_board.t27 index 875f45d3d8..c93e4ff34a 100644 --- a/specs/igla/own_model_board.t27 +++ b/specs/igla/own_model_board.t27 @@ -48,23 +48,23 @@ pub const LENS_CELLS : i32 = 9; pub const JOB : str = "own_model"; pub const STAGE : str = "own_model"; -pub const MSG : str = "1 published, 16 verified, 6 drafts, 4 gaps; 54%"; +pub const MSG : str = "1 published, 17 verified, 8 drafts, 1 gaps; 61%"; /// What MSG says once its numbers are taken out. pub const MSG_WORDS : str = " published, verified, drafts, gaps; %"; -pub const OVERALL_PCT : u8 = 54; -pub const PROGRESS : f64 = 0.54; +pub const OVERALL_PCT : u8 = 61; +pub const PROGRESS : f64 = 0.61; pub const KEY_LENS : str = "lens_pct"; pub const KEY_CELLS : str = "cells"; pub const KEY_STATUS : str = "status"; pub const KEY_PCT : str = "pct"; -pub const LENS_PCT : [3]u8 = [55, 70, 38]; -pub const CELL_STATUS : [27]u8 = [4, 4, 4, 4, 4, 4, 3, 0, 0, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 4, 4, 0, 0, 3, 3]; -pub const CELL_PCT : [27]u8 = [60, 70, 80, 80, 60, 100, 50, 0, 0, 100, 100, 20, 80, 65, 95, 75, 55, 40, 70, 15, 60, 40, 100, 0, 0, 10, 50]; +pub const LENS_PCT : [3]u8 = [65, 70, 48]; +pub const CELL_STATUS : [27]u8 = [4, 4, 4, 4, 4, 4, 3, 3, 0, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 4, 4, 4, 3, 3, 3]; +pub const CELL_PCT : [27]u8 = [60, 70, 80, 80, 60, 100, 50, 90, 0, 100, 100, 20, 80, 65, 95, 75, 55, 40, 70, 15, 60, 40, 100, 60, 30, 10, 50]; /// The size of the compact metrics object, in bytes, computed from the keys and values above. -pub const METRICS_BYTES : i32 = 627; +pub const METRICS_BYTES : i32 = 630; pub fn is_digit(ch: u8) -> bool { return ch >= '0' and ch <= '9'; @@ -245,10 +245,10 @@ test a_gap_cell_is_never_above_zero_percent { assert CELL_PCT[i] <= 100; c = c + 1; } - // the public 100M model, cell 7, is a gap: drawn at 10 percent it is refused - assert CELL_STATUS[7] == STATUS_GAP; + // the run past 100M parameters, cell 8, is a gap: drawn at 10 percent it is refused + assert CELL_STATUS[8] == STATUS_GAP; var wrong : [27]u8 = CELL_PCT; - wrong[7] = 10; + wrong[8] = 10; assert gaps_at_zero(CELL_STATUS, wrong) == false; } @@ -261,9 +261,9 @@ test the_tally_sums_to_twenty_seven { assert count_status(CELL_STATUS, STATUS_OPEN) == 0; assert published + verified + drafts + gaps == CELL_COUNT; assert published == 1; - assert verified == 16; - assert drafts == 6; - assert gaps == 4; + assert verified == 17; + assert drafts == 8; + assert gaps == 1; } test the_message_is_the_tally { @@ -273,12 +273,12 @@ test the_message_is_the_tally { const n : i32 = @intCast(MSG.len); assert n <= MSG_MAX; // one number wrong, a word changed, or a number added: each refused - assert msg_matches("1 published, 15 verified, 6 drafts, 4 gaps; 54%", STATUS, overall) == false; - assert msg_matches("1 published, 16 verified, 6 drafts, 4 holes; 54%", STATUS, overall) == false; - assert msg_matches("1 published, 16 verified, 6 drafts, 4 gaps; 54% of 100", STATUS, overall) == false; - assert msg_matches(MSG, STATUS, 48) == false; - assert nth_number(MSG, 1) == 16; - assert nth_number(MSG, 4) == 54; + assert msg_matches("1 published, 17 verified, 7 drafts, 1 gaps; 61%", STATUS, overall) == false; + assert msg_matches("1 published, 17 verified, 8 drafts, 1 holes; 61%", STATUS, overall) == false; + assert msg_matches("1 published, 17 verified, 8 drafts, 1 gaps; 61% of 100", STATUS, overall) == false; + assert msg_matches(MSG, STATUS, 60) == false; + assert nth_number(MSG, 2) == 8; + assert nth_number(MSG, 4) == 61; assert nth_number(MSG, 5) == -1; }