diff --git a/.trinity/seals/igla_own_model.json b/.trinity/seals/igla_own_model.json index 6ee1451b5d..74393654fd 100644 --- a/.trinity/seals/igla_own_model.json +++ b/.trinity/seals/igla_own_model.json @@ -1,5 +1,5 @@ { - "built_by": "t27c-bootstrap@0.5.2+4ab200073", + "built_by": "t27c-bootstrap@0.5.2+fd332dfd5", "closure": [ { "spec": "specs/t27f/reel.t27", @@ -15,16 +15,16 @@ } ], "config": "gen=c,rust,verilog,zig;tests=zig", - "gen_hash_c": "sha256:7749a3a3eee34f915a1dd07db7b752032481c5abc90a670209c993416aa1773f", - "gen_hash_rust": "sha256:88adf9c918ec50be845725e9cd197b18fb3701004e43e23b225aca912631146b", - "gen_hash_verilog": "sha256:3081084523bf60707644f1a5c073b5d3a5571319408889af08a7b1973ac3c65f", - "gen_hash_zig": "sha256:613a50a9a748b999c289d93274de064d0f30d425a7ec256e00b56fc3f5959811", + "gen_hash_c": "sha256:34f442903c5b74b1ddc28b310d9782b0f61c45098e4ff931771176583341057d", + "gen_hash_rust": "sha256:a0e037fe6d5dd9b82586a2bf2a80c27ff50f6c9ba7b9babe60e9b52349efaa5c", + "gen_hash_verilog": "sha256:64cba74ad08af9252262494d75e1ec94d598f81d5fa4b06bc3bff797d5ca5ad8", + "gen_hash_zig": "sha256:a180869d634e33aeca7c64cde565c2115d43ded528f7613a9ce9ad084ab787be", "module": "own_model", "ring": 12, "seal_schema": 2, - "sealed_at": "2026-10-18T09:41:47Z", + "sealed_at": "2026-10-18T13:33:41Z", "sealed_by": "t27c-bootstrap@0.5.2", - "spec_hash": "sha256:f7471c56c57c69f08cc607d930968459f470372c17ed6eb75368b6c82a6245c2", + "spec_hash": "sha256:2c3daec9e62ce9123e19cad921e57af75beb25a1870c234230ae5505a7d7ac79", "spec_path": "specs/igla/own_model.t27", "tests": { "failed": 0, diff --git a/.trinity/seals/igla_own_model_board.json b/.trinity/seals/igla_own_model_board.json index 934c8a75a9..20c6c66218 100644 --- a/.trinity/seals/igla_own_model_board.json +++ b/.trinity/seals/igla_own_model_board.json @@ -1,9 +1,9 @@ { - "built_by": "t27c-bootstrap@0.5.2+4ab200073", + "built_by": "t27c-bootstrap@0.5.2+fd332dfd5", "closure": [ { "spec": "specs/igla/own_model.t27", - "spec_hash": "sha256:f7471c56c57c69f08cc607d930968459f470372c17ed6eb75368b6c82a6245c2" + "spec_hash": "sha256:2c3daec9e62ce9123e19cad921e57af75beb25a1870c234230ae5505a7d7ac79" }, { "spec": "specs/t27f/reel.t27", @@ -19,16 +19,16 @@ } ], "config": "gen=c,rust,verilog,zig;tests=zig", - "gen_hash_c": "sha256:9c6f443ba6f6d8214d1e979c90105be99ecba919716e547d0e896d89ed0b75e1", - "gen_hash_rust": "sha256:94f42c2726ffcc3015a5d346b36565f343ce57600604b4931c7430c693cb1158", - "gen_hash_verilog": "sha256:cb284309b32ad27988df63ab1e7696c2ae0b549978afb80a6f83b8c8d1a8972e", - "gen_hash_zig": "sha256:0969cbc653c06569242e3c9a58023b001c5c1a143c276a5e917e12d79924b189", + "gen_hash_c": "sha256:a0125cda52bdb9a87de3b170cc991ad71fc627caf8c60e4bc41a2f4a9a3a86e8", + "gen_hash_rust": "sha256:dc61033d126c3f954f8b6ae3f33c33f773edd8f5eda07530cf3576e56d39dd73", + "gen_hash_verilog": "sha256:0d56c85728676e996f03f9636d7492c02c2901cd034348565c28a657aa86731f", + "gen_hash_zig": "sha256:c742951d611cb908f642a7262478d7219717d0b3b3284c123aebd0d4cd63bff5", "module": "own_model_board", "ring": 12, "seal_schema": 2, - "sealed_at": "2026-10-18T09:41:48Z", + "sealed_at": "2026-10-18T13:33:45Z", "sealed_by": "t27c-bootstrap@0.5.2", - "spec_hash": "sha256:ba4e797ce2ea44fe5ea6265fb4c54bbbc8117cb914de18f9ff90bf0890109cbb", + "spec_hash": "sha256:69e4e67d00d0a17aed8d5e9ed45d7c745c970d069388db37f7835ff39179adae", "spec_path": "specs/igla/own_model_board.t27", "tests": { "failed": 0, diff --git a/gen/json/igla/own_model_board.json b/gen/json/igla/own_model_board.json index 441d3752c8..4303344605 100644 --- a/gen/json/igla/own_model_board.json +++ b/gen/json/igla/own_model_board.json @@ -1 +1 @@ -{"job":"own_model","stage":"own_model","msg":"3 published, 22 verified, 1 drafts, 1 gaps; 61%","progress":0.61,"metrics":{"lens_pct":[65,70,48],"cells":[{"status":4,"pct":60},{"status":4,"pct":70},{"status":4,"pct":80},{"status":4,"pct":80},{"status":4,"pct":60},{"status":4,"pct":100},{"status":5,"pct":50},{"status":5,"pct":90},{"status":0,"pct":0},{"status":4,"pct":100},{"status":4,"pct":100},{"status":4,"pct":20},{"status":4,"pct":80},{"status":4,"pct":65},{"status":4,"pct":95},{"status":4,"pct":75},{"status":4,"pct":55},{"status":4,"pct":40},{"status":4,"pct":70},{"status":4,"pct":15},{"status":5,"pct":60},{"status":4,"pct":40},{"status":4,"pct":100},{"status":4,"pct":60},{"status":4,"pct":30},{"status":3,"pct":10},{"status":4,"pct":50}]}} +{"job":"own_model","stage":"own_model","msg":"4 published, 22 verified, 1 drafts, 0 gaps; 62%","progress":0.62,"metrics":{"lens_pct":[68,70,48],"cells":[{"status":4,"pct":60},{"status":4,"pct":70},{"status":4,"pct":80},{"status":4,"pct":80},{"status":4,"pct":60},{"status":4,"pct":100},{"status":5,"pct":50},{"status":5,"pct":90},{"status":5,"pct":30},{"status":4,"pct":100},{"status":4,"pct":100},{"status":4,"pct":20},{"status":4,"pct":80},{"status":4,"pct":65},{"status":4,"pct":95},{"status":4,"pct":75},{"status":4,"pct":55},{"status":4,"pct":40},{"status":4,"pct":70},{"status":4,"pct":15},{"status":5,"pct":60},{"status":4,"pct":40},{"status":4,"pct":100},{"status":4,"pct":60},{"status":4,"pct":30},{"status":3,"pct":10},{"status":4,"pct":50}]}} diff --git a/specs/igla/own_model.t27 b/specs/igla/own_model.t27 index 2d9c5d8bc8..4bde11faa8 100644 --- a/specs/igla/own_model.t27 +++ b/specs/igla/own_model.t27 @@ -11,6 +11,7 @@ ; experiment ledger) and data/wave9/worker-2/hslm_step_10000.bin (the one HSLM checkpoint left). ; - gHashTag/trinity-training at TRAINING_COMMIT: src/hslm, 64 Zig files, the HSLM trainer. ; - gHashTag/trinity-fpga at FPGA_COMMIT: 8 tokens on the AX7203, 7682304/7682304 receipts. +; - gHashTag/igla-coder-gpu at CARD_500M_COMMIT: specs/hf/model_card_500m.t27 (cell 9). ; - gHashTag/t27 at SOURCE_COMMIT: the ML specs named per cell. ; MEASURED on 2026-10-17: @@ -90,8 +91,25 @@ ; 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. +; - trained on 2026-10-18, cell 9: tern-tc-500m, a 512,881,920-parameter ternary model of the +; same family (n_layer 24, d_model 1280, GQA 20 to 4 heads, d_ff 4096), on the owner's yes to +; 0.5B parameters x 1.2B tokens. RunPod pod pkv4k8xhs8jo2b (RTX PRO 6000 Blackwell, EU-RO-1): +; 2288 steps, 1,199,570,944 tokens, 5.235 h, 69.4k tokens/s at 48 percent MFU, 13.65 USD from the +; balance (LEDGER.md). Validation bits per byte 0.5307 on 2M held-out tokens per language, worse +; than tern-tc-100m's 0.4722 after 10B tokens: more parameters did not make up for 8.3 times +; fewer tokens. final.pt is 2,051,594,699 bytes, sha256 +; e6925b7c30e3a6c680fdb3591feeae7a1a99a19fe194405daf51ddbb1d8c15bc. Every number is in +; specs/hf/model_card_500m.t27 of igla-coder-gpu at CARD_500M_COMMIT, 12/12 tests and 0 vacuous on +; the lab; a copy with the byte overhead and the bits per byte each one off fails 2 of the 12. Live +; since 2026-10-18: playra/tern-tc-500m at Hugging Face commit HF_500M_COMMIT, whose final.pt +; carries LFS sha256 e6925b7c...1d8c15bc and whose eight other files match the release machine +; byte for byte. Its evidence went to review in PR REVIEW_500M_PR: review REVIEW_500M_ID is the +; reviewer bee on head 88f47f32d, whose model verdict was approve; the bee posted it as +; NEEDS_PERSON, not APPROVE, because that head changes seal and gen files, and the PR merged over +; that hold under the owner's standing instruction, as #10275 did. Live and reviewed, so the cell +; is published at 30 percent: one run at the low end of 0.5-1.5B, under-trained. ; - 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). +; .../tern-tc-100m and .../tern-tc-500m 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 ; live jobs include own_model since 2026-10-18 06:33 UTC, the event t27c gen-json makes from ; specs/igla/own_model_board.t27 (it was stale since 2026-10-05 before that). @@ -113,7 +131,7 @@ ; compute from DDR3, so the cell is a draft at 10 percent, a DELIVER step waiting for its review. ; Cell 26 has no review: its PR, #10248, merged without one, so it stays a draft. ; 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: 3 published, 22 verified, 1 draft, 1 gap. +; and a DELIVER step for a review. So: 4 published, 22 verified, 1 draft, 0 gaps. ; 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 @@ -126,7 +144,7 @@ ; 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. +; (ml/train_slice_model); the STE and a training binary over the whole model are not done. A 100M ternary model is public; a 0.5B ternary model is public too (1.2B tokens, weaker than the 100M one) and not yet reviewed. ; Not claimed: no model quality beyond the numbers in SOURCES; no GIF or MP4, stills only. ; phi^2 + 1/phi^2 = 3 | TRINITY @@ -166,6 +184,10 @@ pub const CODER_COMMIT : str = "f60ac0c623e5ac24d74fdcde2dccb2d8e55e6d83"; pub const TRINITY_COMMIT : str = "ee512359254bcd7438bb6a79c8a4a7f8b554b620"; pub const TRAINING_COMMIT : str = "3e9648c1817a97c5f9b8c727b0f8e2291928eead"; pub const FPGA_COMMIT : str = "b2bd5a30cefe32eb7e57e9f2025626f6f0cf4b25"; +/// igla-coder-gpu branch hf/card-tern-tc-500m: the commit whose card pins the 0.5B run (cell 9). +pub const CARD_500M_COMMIT : str = "510a22c7520df01e9c768b972ed79ae58eaadead"; +/// playra/tern-tc-500m on Hugging Face: the commit that put the 0.5B release live (cell 9). +pub const HF_500M_COMMIT : str = "7f203b66d53459f8edcfbc5c39c0e0060914875f"; /// The realtime harness: the IGLA board's state endpoint, which trinity compiles in the browser. pub const LIVE_STATE_URL : str = "https://board-production-2dec.up.railway.app/state"; pub const MEASURED_ON : str = "2026-10-17"; @@ -217,7 +239,7 @@ pub const SOURCES : [27]str = [ "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", - "", + "igla-coder-gpu specs/hf/model_card_500m.t27: 0.5B ternary, 1.2B tokens, bpb 0.5307, final.pt sha256 e6925b7c...8c15bc", "trinity docs/experiments/FOUND_EXPERIMENTS_SUMMARY.md", "trinity-training src/hslm, 64 Zig files", "trinity data/wave9/worker-2/hslm_step_10000.bin", @@ -242,7 +264,7 @@ pub const SOURCES : [27]str = [ pub const MISSING : [27]str = [ "", "", "", "", "", "", "", "", - "any run past 100M parameters: none exists", + "", "", "", "", "", "", "", "", "", "", @@ -254,21 +276,26 @@ pub const MISSING : [27]str = [ ]; /// The measurements per cell (see the header for how each was taken). -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 GROUNDED : [27]bool = [true, true, true, true, true, true, true, true, true, 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, true, true, false, false, false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, true]; +pub const REVIEWED : [27]bool = [false, false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, true]; /// The approving review behind REVIEWED: PR and review id on gHashTag/t27 (5561941493: t27-bees /// APPROVE of 014a34d21, glm-4.7-flash and glm-4.5-flash independently, 2026-10-18 07:28 UTC). pub const REVIEW_PR : i32 = 10275; pub const REVIEW_ID : str = "5561941493"; -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]; +/// The review behind REVIEWED[8], cell 9: PR and review id on gHashTag/t27 (5563181513: t27-bees on +/// 88f47f32d, 2026-10-18 13:29 UTC, model verdict approve, posted as NEEDS_PERSON because the head +/// changes .trinity/seals and gen/json files; merged over that hold on the owner's instruction). +pub const REVIEW_500M_PR : i32 = 10428; +pub const REVIEW_500M_ID : str = "5563181513"; +pub const LIVE : [27]bool = [false, false, false, false, false, false, true, true, true, 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, 5, 5, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 4]; +pub const STATUS : [27]u8 = [4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 4]; 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, 90, 0, 100, 100, 20, 80, 65, 95, 75, 55, 40, 70, 15, 60, 40, 100, 60, 30, 10, 50]; +pub const PCT : [27]u8 = [60, 70, 80, 80, 60, 100, 50, 90, 30, 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; @@ -293,8 +320,8 @@ 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", - "3 published, 22 verified, 1 draft", - "1 gap, about 61 percent overall", + "4 published, 22 verified, 1 draft", + "0 gaps, about 62 percent overall", "Batched f32 HSLM trainer", "Shadow weights for the whole model", "A whole-model training binary", @@ -350,7 +377,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) == 26; + assert count_true(GROUNDED) == 27; var c : i32 = 0; while (c < CELL_COUNT) { const i : usize = @intCast(c); @@ -364,12 +391,12 @@ 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 "3 published, 22 verified, 1 draft" and "1 gap" - assert count_status(STATUS, STATUS_PUBLISHED) == 3; + // the evidence slide's "4 published, 22 verified, 1 draft" and "0 gaps" + assert count_status(STATUS, STATUS_PUBLISHED) == 4; assert count_status(STATUS, STATUS_VERIFIED) == 22; assert count_status(STATUS, STATUS_DRAFT) == 1; - assert count_status(STATUS, STATUS_GAP) == 1; - assert count_true(REVIEWED) == 7; + assert count_status(STATUS, STATUS_GAP) == 0; + assert count_true(REVIEWED) == 8; // every passing test is a PRACTICE step: the t27 bench, MultiPL-E and coder specs (cells 4 to // 6), loss, optimizers, forward pass, matvec, the ML specs that compile (cell 23) and the // file I/O t27c lowers (cell 24) @@ -397,15 +424,18 @@ test a_status_is_earned_not_chosen { assert LIVE[24] == false; assert step_stage(24) == STAGE_DELIVER; assert STATUS[24] == STATUS_VERIFIED; - // the board is live and was sourced: the third published cell + // the board is live and was sourced: a third published cell assert STATUS[20] == STATUS_PUBLISHED; } test a_review_is_named_not_assumed { - // REVIEWED is true exactly at the grounded DELIVER cells PR REVIEW_PR put to review: every - // grounded DELIVER cell except step 26, whose evidence came in a PR with no review + // REVIEWED is true exactly at the grounded DELIVER cells put to review: the seven of PR + // REVIEW_PR, step 9 from PR REVIEW_500M_PR, and not step 26, whose evidence came in a PR with + // no review assert REVIEW_PR == 10275; assert REVIEW_ID.len > 0; + assert REVIEW_500M_PR == 10428; + assert REVIEW_500M_ID.len > 0; var c : i32 = 0; while (c < CELL_COUNT) { const i : usize = @intCast(c); @@ -416,10 +446,15 @@ test a_review_is_named_not_assumed { assert REVIEWED[i] == want; c = c + 1; } - // the gap, step 9, is a DELIVER step with nothing to review + // step 9, the 0.5B run, is grounded by its model card (a full commit id) and live on Hugging + // Face (a full commit id), and reviewed in PR REVIEW_500M_PR: live and reviewed is published + assert CARD_500M_COMMIT.len == 40; + assert HF_500M_COMMIT.len == 40; assert step_stage(8) == STAGE_DELIVER; - assert GROUNDED[8] == false; - assert REVIEWED[8] == false; + assert GROUNDED[8]; + assert REVIEWED[8]; + assert LIVE[8]; + assert STATUS[8] == STATUS_PUBLISHED; // step 26 is grounded but not reviewed, so it stays a draft assert step_stage(25) == STAGE_DELIVER; assert GROUNDED[25]; @@ -453,11 +488,11 @@ test the_compile_counts_are_the_measured_ones { } test percent_per_lens_is_a_plain_mean { - assert mean_pct(0, 9) == 65; + assert mean_pct(0, 9) == 68; assert mean_pct(9, 9) == 70; assert mean_pct(18, 9) == 48; - // the evidence slide's "about 61 percent overall" - assert mean_pct(0, CELL_COUNT) == 61; + // the evidence slide's "about 62 percent overall" + assert mean_pct(0, CELL_COUNT) == 62; } test the_training_step_cells_are_verified_once_reviewed { diff --git a/specs/igla/own_model_board.t27 b/specs/igla/own_model_board.t27 index 92f824a653..451fbe3164 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 = "3 published, 22 verified, 1 drafts, 1 gaps; 61%"; +pub const MSG : str = "4 published, 22 verified, 1 drafts, 0 gaps; 62%"; /// What MSG says once its numbers are taken out. pub const MSG_WORDS : str = " published, verified, drafts, gaps; %"; -pub const OVERALL_PCT : u8 = 61; -pub const PROGRESS : f64 = 0.61; +pub const OVERALL_PCT : u8 = 62; +pub const PROGRESS : f64 = 0.62; 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 = [65, 70, 48]; -pub const CELL_STATUS : [27]u8 = [4, 4, 4, 4, 4, 4, 5, 5, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 4]; -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]; +pub const LENS_PCT : [3]u8 = [68, 70, 48]; +pub const CELL_STATUS : [27]u8 = [4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 4]; +pub const CELL_PCT : [27]u8 = [60, 70, 80, 80, 60, 100, 50, 90, 30, 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 = 630; +pub const METRICS_BYTES : i32 = 631; pub fn is_digit(ch: u8) -> bool { return ch >= '0' and ch <= '9'; @@ -245,11 +245,13 @@ test a_gap_cell_is_never_above_zero_percent { assert CELL_PCT[i] <= 100; c = c + 1; } - // 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[8] = 10; - assert gaps_at_zero(CELL_STATUS, wrong) == false; + // no cell is a gap any more; the run past 100M parameters, cell 8, drawn as a gap at its + // 30 percent is refused + assert count_status(CELL_STATUS, STATUS_GAP) == 0; + assert CELL_STATUS[8] == STATUS_PUBLISHED; + var wrong : [27]u8 = CELL_STATUS; + wrong[8] = STATUS_GAP; + assert gaps_at_zero(wrong, CELL_PCT) == false; } test the_tally_sums_to_twenty_seven { @@ -260,10 +262,10 @@ test the_tally_sums_to_twenty_seven { assert count_status(CELL_STATUS, STATUS_LOCKED) == 0; assert count_status(CELL_STATUS, STATUS_OPEN) == 0; assert published + verified + drafts + gaps == CELL_COUNT; - assert published == 3; + assert published == 4; assert verified == 22; assert drafts == 1; - assert gaps == 1; + assert gaps == 0; } test the_message_is_the_tally { @@ -273,12 +275,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("3 published, 22 verified, 0 drafts, 1 gaps; 61%", STATUS, overall) == false; - assert msg_matches("3 published, 22 verified, 1 drafts, 1 holes; 61%", STATUS, overall) == false; - assert msg_matches("3 published, 22 verified, 1 drafts, 1 gaps; 61% of 100", STATUS, overall) == false; - assert msg_matches(MSG, STATUS, 60) == false; + assert msg_matches("4 published, 22 verified, 2 drafts, 0 gaps; 62%", STATUS, overall) == false; + assert msg_matches("4 published, 22 verified, 1 drafts, 0 holes; 62%", STATUS, overall) == false; + assert msg_matches("4 published, 22 verified, 1 drafts, 0 gaps; 62% of 100", STATUS, overall) == false; + assert msg_matches(MSG, STATUS, 61) == false; assert nth_number(MSG, 2) == 1; - assert nth_number(MSG, 4) == 61; + assert nth_number(MSG, 4) == 62; assert nth_number(MSG, 5) == -1; }