Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
938 commits
Select commit Hold shift + click to select a range
2b32d5d
server: enforce the window clamp and the path ban instead of narratin…
justinchuby Jul 30, 2026
eb20426
test(dashboard): audit ui/ too, and fail on any non-literal field() a…
justinchuby Jul 30, 2026
73e54cb
test(dashboard): guard the SERVED TREE for path disclosure, not just …
justinchuby Jul 30, 2026
e52441d
brief: RULE 45-46 -- I observed the index hazard live, and index 0 is…
justinchuby Jul 30, 2026
b737847
docs(PR): known gap -- authorship is not recoverable from this reposi…
justinchuby Jul 30, 2026
5b3373b
guards: AC192 -- close the telemetry key namespace in BOTH directions
justinchuby Jul 30, 2026
ef4c37e
tests: a missing fixture is not an impossible one
justinchuby Jul 30, 2026
292a085
docs(PR): I quoted half an error message and characterised the whole …
justinchuby Jul 30, 2026
798abff
brief: RULE 47 -- cut the review pin at 1f9fc70b as review-1f9fc70b, …
justinchuby Jul 30, 2026
d1c8fff
docs(PR): known gap -- the spec specifies where assets come from and …
justinchuby Jul 30, 2026
7eddc5e
guard: an ownership reason bought a permanent exemption, and the file…
justinchuby Jul 30, 2026
92b8637
brief: RULE 48 -- the P0 is closed on the wire, and RULE 43 is void
justinchuby Jul 30, 2026
77975ba
guards: a stale ceiling must match whether the panel reads telemetry …
justinchuby Jul 30, 2026
d1cce40
test(scripts): pin the stop-token mirror to the Rust runtime it imitates
justinchuby Jul 30, 2026
11c9adf
design: name the reference surface and its two knife edges (tokens.css)
justinchuby Jul 30, 2026
91e32ea
brief: RULE 49 -- cargo at the pin exited 101, then 0 twice, on ident…
justinchuby Jul 30, 2026
6e58a20
design: guard the prose ratios I shipped unguarded three minutes ago
justinchuby Jul 30, 2026
84da572
brief: RULE 50 -- I never ran the JS suite, and my flake defeats the …
justinchuby Jul 30, 2026
4383d69
guard: a check that could not run was reported as a check that found …
justinchuby Jul 30, 2026
fbc18e7
readability: R56-R62 -- seven findings that existed only in chat, and…
justinchuby Jul 30, 2026
ddef039
docs(demo-spec): mark the whole document a historical record; imperat…
justinchuby Jul 30, 2026
a0a96da
guards: find the facts the server measures and no pixel ever shows
justinchuby Jul 30, 2026
66363bb
demo: an empty 404 is not an error page, it is no error page
justinchuby Jul 30, 2026
16140b9
design: widen the ratio guard from one stylesheet to all three
justinchuby Jul 30, 2026
b5124ca
brief: RULE 51 -- a same-line retraction is defeated by truncation; a…
justinchuby Jul 30, 2026
64dd70b
test(dashboard): reconcile what the panels build, not just what they …
justinchuby Jul 30, 2026
0c3edb0
docs(skills): static-cache is one of two batching paths, not the only…
justinchuby Jul 30, 2026
d03a189
brief: RULE 52 -- C19 is live on all four demo origins, and the empty…
justinchuby Jul 30, 2026
0a10e6f
perf: section 16 -- retract section 15's direction, I measured a bina…
justinchuby Jul 30, 2026
2067b0e
readability: R63 -- the freshness marker had three grammars and the g…
justinchuby Jul 30, 2026
b4a87ab
perf: flag section 15's direction as retracted at the section head
justinchuby Jul 30, 2026
b6a7aee
test(dashboard): an exemption without a reason is a silenced assertion
justinchuby Jul 30, 2026
a4a5ad6
readability: R64 -- peel the tag where a wrong answer results, refuse…
justinchuby Jul 30, 2026
53bc6d3
demo: a frozen census in a doc comment is read as a fact
justinchuby Jul 30, 2026
5ef01e3
design: pre-explain the withdrawn point figure inside the sketch fence
justinchuby Jul 30, 2026
70a569d
readability: R63-R65 and the final verdict -- the findings, not just …
justinchuby Jul 30, 2026
2d9f6a7
test(dashboard): the model-path guard discovers its corpus instead of…
justinchuby Jul 30, 2026
1e80917
test(dashboard): extract the command/prose discriminator, and delete …
justinchuby Jul 30, 2026
d9a65a7
server: a guard that spells its banned string is a tombstone
justinchuby Jul 30, 2026
a717d3d
test(dashboard): audit the screen-reader caption surface against the …
justinchuby Jul 30, 2026
64c819e
demo(docs): give every source citation in my lane a symbol anchor
justinchuby Jul 30, 2026
049da5f
test(perf-claims): scope the lab-notebook exemption to raw samples, n…
justinchuby Jul 30, 2026
603d2b6
qa: quote the +12 delta, not a cumulative-counter rate, at the one ex…
justinchuby Jul 30, 2026
3b70149
docs(PR): rewrite the body against a measured revision -- denominator…
justinchuby Jul 30, 2026
36d1414
server: split the last two guard needles that named their own defect
justinchuby Jul 30, 2026
4c38f41
readability: R68/R69/R70 in REVIEW-POINT.md -- the sole authority nam…
justinchuby Jul 30, 2026
dc1ebcd
docs(PR): the batching mechanism as counts, and the label class no te…
justinchuby Jul 30, 2026
fe84280
test(perf-claims): the withdrawn-ratio matcher was blind to the ASCII…
justinchuby Jul 30, 2026
9b54d3a
test(dashboard): prove the runner's nine guards fire, and find one th…
justinchuby Jul 30, 2026
ede2b74
demo(docs): fix two rotted citations in the admin-endpoint exclusion …
justinchuby Jul 30, 2026
e4cfa69
docs(PR): the rename refusal with its own census, and a guard whose p…
justinchuby Jul 30, 2026
68a761b
test(dashboard): the guard I called dead is the one that catches a na…
justinchuby Jul 30, 2026
c07824c
test(prefix-counters): read the shipping tree, not the desk
justinchuby Jul 30, 2026
e5aac10
docs(PR): the error-channel disclosure, and prose that cannot be sear…
justinchuby Jul 30, 2026
83fca2e
demo(guard): check the citations in all four owned docs, and declare …
justinchuby Jul 30, 2026
dafbb24
test(dashboard): a suite that takes minutes on a branch that moves is…
justinchuby Jul 30, 2026
c07d628
docs(PR): bind both suite blocks to the ruled pin, and refuse a desig…
justinchuby Jul 30, 2026
0bf9a12
server: the binary states which commit built it
justinchuby Jul 30, 2026
b365ec7
docs(PR): state where the variance lives instead of disclaiming deter…
justinchuby Jul 30, 2026
000346e
demo(guard): raise the path-uniqueness floor to its real population, …
justinchuby Jul 30, 2026
3a81eb0
review(readability): land R66/R67/R71, and strike my own stale verdict
justinchuby Jul 30, 2026
c9e99c6
docs(PR): re-derive every figure at the shipping revision, and correc…
justinchuby Jul 30, 2026
219307a
docs(PR): correct a denominator I asserted without measuring it
justinchuby Jul 30, 2026
6d7f7d4
fix(telemetry): a top-level classification is what the least-informed…
justinchuby Jul 30, 2026
241dd24
docs(PR): disclose that this file's own freshness guard cannot see it
justinchuby Jul 30, 2026
9e22ab9
classify unbounded text where it is written, so string length stops c…
justinchuby Jul 30, 2026
b0a9e1c
docs(review): pin the review point to a raw hex SHA with both suite d…
justinchuby Jul 30, 2026
817f8ab
fix(dashboard): a batch caption named a quantity the counter does not…
justinchuby Jul 30, 2026
c5bc4de
brief: stamp the document's own age, and mark the model_path prose as…
justinchuby Jul 30, 2026
8bc222f
test(runner): ratchet the test count; a floor cannot see a one-suite …
justinchuby Jul 30, 2026
ee9695b
scripts: resolve the tree once, not six times, and name it by SHA
justinchuby Jul 30, 2026
d0c2e22
review(readability): R72 (the canonical suite command degrades into i…
justinchuby Jul 30, 2026
9f6a1bf
test(server): fence the file that declares what /v1/models serializes
justinchuby Jul 30, 2026
a86c02f
docs: correct the Metal capability claim against code, not the comment
justinchuby Jul 30, 2026
8a8c4b6
review(code): supersede the pass-0 verdict, retarget MEASURED-AT, red…
justinchuby Jul 30, 2026
9c10a84
docs(PR): re-derive the JS suite at the pin, and reconcile two guards…
justinchuby Jul 30, 2026
0fda4a0
fix(dashboard): a measured poll interval blanked the moment it had a …
justinchuby Jul 30, 2026
a6d8c2e
review(readability): R74 -- remove 11 home-directory disclosures from…
justinchuby Jul 30, 2026
92cc793
docs: give "hardcodes" a subject, and drop a rotted coordinate
justinchuby Jul 30, 2026
2d516df
test(perf-claims): pin the corpus to the ref its contents are read at
justinchuby Jul 30, 2026
818856a
docs(PR): this file cannot be read at a review pin, and no pin choice…
justinchuby Jul 30, 2026
a2df3ee
guards: say what a green does NOT cover when the tree is dirty
justinchuby Jul 30, 2026
776b5d1
review(readability): R75 -- a blanket '/Users/' redaction would disar…
justinchuby Jul 30, 2026
217ae17
demo(dashboard): make the test-count ratchet reachable, and prove it
justinchuby Jul 30, 2026
3ef731d
fix(demo): the launcher tests a mode bit; make it test provenance
justinchuby Jul 30, 2026
0d0646a
docs(PR): retract my own vocabulary gap -- I checked one union agains…
justinchuby Jul 30, 2026
7aba34e
test(dashboard): the deadline was never proven to fire on the compose…
justinchuby Jul 30, 2026
f6a5a24
review(readability): pin the head SHA once, and stop the first stale …
justinchuby Jul 30, 2026
eea0ddb
docs(PR): C19 is wire-proven at the scored pin, and the empty blockin…
justinchuby Jul 30, 2026
989d24a
docs: resolve the refused-arm ambiguity, to the arm that was ruled out
justinchuby Jul 30, 2026
9368de6
docs(PR): retract my own "zero guards assert loopback" -- there is on…
justinchuby Jul 30, 2026
9d2f040
demo(dashboard): narrow the model-path exemption to expressions, not …
justinchuby Jul 30, 2026
1d402d3
fix(demo): run the provenance ancestry the other way, or it passes th…
justinchuby Jul 30, 2026
cd32a2e
review: pin the review point at 217ae170, the last commit before the …
justinchuby Jul 30, 2026
d7f563a
review: re-stamp the implementation review at the scored pin
justinchuby Jul 30, 2026
85009ad
docs(PR): name both anchors, and audit every zero in this document
justinchuby Jul 30, 2026
ef7c91b
docs: promote batching explanation to diagnosed, retract my own cause
justinchuby Jul 30, 2026
d772e96
brief: re-anchor MEASURED-AT to a verified sha, retiring the 326-comm…
justinchuby Jul 30, 2026
63a799c
docs(PR): the corruption that produced grammatical English, and the a…
justinchuby Jul 30, 2026
9d052ac
docs(qa): date the browser evidence by its ASSETS, not just by a commit
justinchuby Jul 30, 2026
70e00cf
review(readability): pin review at 37d0d72e -- five questions answere…
justinchuby Jul 30, 2026
aa596c9
docs(PR): a third species of control -- shape congruence, not just in…
justinchuby Jul 30, 2026
bdbf2d6
review: retract F11 -- panel.title resolves, verified by execution
justinchuby Jul 30, 2026
8584091
review(readability): R82 -- amend R79, symbol anchors equivocate in 5…
justinchuby Jul 30, 2026
c7472d6
docs(PR): the ordered body -- hero count, open set, command channel, …
justinchuby Jul 30, 2026
71494f6
review: retract my own unsatisfiable-predicate claim, in place, with …
justinchuby Jul 30, 2026
a566c48
refactor(shipping-tree): export REPO_ROOT; four spellings of one fact
justinchuby Jul 30, 2026
965fba0
docs(PR): the Rust block published a sample as a property
justinchuby Jul 30, 2026
7746680
review(readability): R83 -- auditing my six zeros found a live home-p…
justinchuby Jul 30, 2026
a83a318
docs(PR): my detached-worktree zero is falsified, and it was the dang…
justinchuby Jul 30, 2026
0935cfa
guards: stop prescribing prose, and retire an exemption that could no…
justinchuby Jul 30, 2026
6461e88
review(security): re-point the document header and disarm one fragile…
justinchuby Jul 30, 2026
392e307
docs(PR): correct two overclaims in my own flaky-test block, and add …
justinchuby Jul 30, 2026
2332064
review(readability): R84 -- retract a misattributed finding, and 4 of…
justinchuby Jul 30, 2026
c4809d6
docs(PR): a path you typed is a hypothesis, a path git printed is a fact
justinchuby Jul 30, 2026
c80c490
docs(PR): bound the encoding bypass, and the guard whose failures are…
justinchuby Jul 30, 2026
37e0361
review(readability): R85 -- one of three misattributions is mine, mea…
justinchuby Jul 30, 2026
3e0e526
delete the premise that licensed the prefix-cache misclassification
justinchuby Jul 30, 2026
d9f50a6
test(citations): put a price on the demo-ux.md coverage gap
justinchuby Jul 30, 2026
fa8c233
design(ux): AC208 is void on its premise; the live defect is the nume…
justinchuby Jul 30, 2026
cd22dcb
stop citing a withdrawn load-drift figure in shipped browser code
justinchuby Jul 30, 2026
ec8789f
readability: R86 -- my freshness guard scores fabricated SHAs as fresh
justinchuby Jul 30, 2026
3cab8a0
test(demo): retire a DEFERRED exemption that expired the minute its c…
justinchuby Jul 30, 2026
38f5c25
docs(PR): retract a false red in my own document about my own branch
justinchuby Jul 30, 2026
64c5654
readability: R87 -- the allowlist rationale is written, the enforceme…
justinchuby Jul 30, 2026
6220dd4
docs(PR): name C19 as a known gap, with the corpus composition that w…
justinchuby Jul 30, 2026
f359363
demo: refuse percent-escapes in /demo paths so authorisation and Serv…
justinchuby Jul 30, 2026
a11249e
readability: R88 -- a guard that quotes two of the five digits it for…
justinchuby Jul 30, 2026
6612ea7
review(code): re-measure at the declared review point, and F44 -- the…
justinchuby Jul 30, 2026
500755b
demo(dashboard): stop awarding the derived badge to values with no pr…
justinchuby Jul 30, 2026
4341257
docs(PR): kill the duplicate copy of a retracted figure, and the nami…
justinchuby Jul 30, 2026
6a7676e
test(demo): correct an exemption whose stated reason was already spent
justinchuby Jul 30, 2026
c29e7f4
readability: R89 -- amending R86, the swap is the fix and mine was we…
justinchuby Jul 30, 2026
21664cc
docs(pr): readiness is a property of the process, not of the screen
justinchuby Jul 30, 2026
5b06bf3
docs(pr): correct a directory-level count used to defend a per-panel …
justinchuby Jul 30, 2026
0a5191b
readability: R90 -- ruling on the caption template-literal gap
justinchuby Jul 30, 2026
5cb2e42
docs(demo): name which suite is green, because there are two and one …
justinchuby Jul 30, 2026
2a82096
design(ux): AC208 — the §24.2 sketches specify FIELDS, not VALUES (D349)
justinchuby Jul 30, 2026
cf14bc3
readability: R91 -- a verdict is a document and a pinned verdict rots
justinchuby Jul 30, 2026
e5feaad
test(dashboard): stop the ratchet promising on stdout what it refuses…
justinchuby Jul 30, 2026
7cdaf48
docs(pr): the build gate tests existence, and it corrects my own fix
justinchuby Jul 30, 2026
ed59d5d
readability: R92 -- the best comment in the repo is unreachable from …
justinchuby Jul 30, 2026
34ea441
docs(pr): mark the pin as under revision without editing line 3
justinchuby Jul 30, 2026
f24f9a1
docs(pr): record that the lead's illustration was false, at their ins…
justinchuby Jul 30, 2026
bf21619
readability: R93 -- positional citations NOT blocking, but 0-past-EOF…
justinchuby Jul 30, 2026
37b647d
feat(shipping-tree): disclose worktree divergence in JS, mirroring tr…
justinchuby Jul 30, 2026
50541f6
docs(pr): rule on the exposure ratchet as a publishing decision
justinchuby Jul 30, 2026
8cf667c
review-point: record the late measurements, including the ones agains…
justinchuby Jul 30, 2026
1944a5e
readability: R94 -- the ratchet menu has three items, not two
justinchuby Jul 30, 2026
5d8dc7b
docs(pr): convict my own retraction under the tombstone test
justinchuby Jul 30, 2026
cf82e56
readability: R95 -- verifying the lead escalation of R50 on my own ci…
justinchuby Jul 30, 2026
84e7645
shipping-tree: land the divergence vocabulary and its cross-language …
justinchuby Jul 30, 2026
d5da006
review-point: cut the review point forward to 1944a5e9, because the e…
justinchuby Jul 30, 2026
d6516fa
honesty: date the model-path ban's evidence, which had rotted into a …
justinchuby Jul 30, 2026
43857f0
docs: pin every dispatch to a sha and a predicate
justinchuby Jul 30, 2026
3942414
R96: the served-surface guard measures a binary that no longer exists
justinchuby Jul 30, 2026
04db78d
review-point: name d5da0061 as the pin, because a declaration cannot …
justinchuby Jul 30, 2026
932b4ff
R97: I re-leaked the path I had just redacted, in the sentence claimi…
justinchuby Jul 30, 2026
7cc0515
design(demo): skeleton.html contradicted its own thesis on a served page
justinchuby Jul 30, 2026
9e83f61
qa(browser): re-run 1.5 at 84e7645d — the unknown/absent-state P1 is …
justinchuby Jul 30, 2026
44b4a9f
R98: adoption rate and protection rate are different numbers and noth…
justinchuby Jul 30, 2026
63bc882
review-point: five runs found a flake the first two hid, and I retrac…
justinchuby Jul 30, 2026
c148e0f
R99: granted authority to move the pin, and the correct use of it was…
justinchuby Jul 30, 2026
a97c615
fix(shipping-tree): wire up the stash disclosure that shipped dead, a…
justinchuby Jul 30, 2026
f6607e3
review-point: the PR body discloses C19 as unfixed, and it is fixed i…
justinchuby Jul 30, 2026
53e5e7d
R100: the warning arrived attached to an instance of the thing it war…
justinchuby Jul 30, 2026
aed7c27
fix(dashboard): a part cannot exceed its whole, so refuse the ratio
justinchuby Jul 30, 2026
e4cdaa9
design(demo): 24.2 asserted the withdrawn hero in the present tense
justinchuby Jul 30, 2026
81fcbb0
test(demo-assets): close #468 by asserting the API arm on percent-enc…
justinchuby Jul 30, 2026
5a160af
R101: four documents name four review points, three lack C19, all thr…
justinchuby Jul 30, 2026
5538540
test(perf-claims): meter the deferrals, so an exemption cannot silent…
justinchuby Jul 30, 2026
4615895
R102: first six-counter score, and my own guard caught R91 mechanically
justinchuby Jul 30, 2026
ddf3bfa
review-point: the board's green SHA is 275 commits before the fix for…
justinchuby Jul 30, 2026
d23c80a
fix(routes): keep the model directory out of load-failure response bo…
justinchuby Jul 30, 2026
7d2ae96
R103: the three endorsed pins serve a PR body that is 70-80 percent a…
justinchuby Jul 30, 2026
af28a43
review(impl): record the two findings I closed in code but not in prose
justinchuby Jul 30, 2026
5b58122
brief: item 10's acceptance cell orders a reviewer to re-add the P1
justinchuby Jul 30, 2026
6140733
review(impl): stop naming the negative-control token in F45
justinchuby Jul 30, 2026
2634de5
review(security): replace 21 deleted tag names with the hexes I measu…
justinchuby Jul 30, 2026
9359140
review-point: the disk emergency is measured false and the published …
justinchuby Jul 30, 2026
c8527be
guard the honest interval against being quoted as a headline
justinchuby Jul 30, 2026
72dadf3
brief: the stale-number warning had itself gone stale, and the stamp …
justinchuby Jul 30, 2026
4e643e4
review-point: 37d0d72e is disqualified, and my own pin costs four red…
justinchuby Jul 30, 2026
75b19fa
restore the -fold arm my own commit dropped from the 2.45-2.49 range
justinchuby Jul 30, 2026
6f580b0
review(arch-sec): declare an honest MEASURED-AT, not the boundary pas…
justinchuby Jul 30, 2026
8d1330d
R104: my own freshness guard failed open, reported one offender, and …
justinchuby Jul 30, 2026
2318e56
test(perf-claims): catch the envelope bounds §12 turned into quotable…
justinchuby Jul 30, 2026
a8df2ed
design(a11y): fix a shipped WCAG AA failure and 7 stale token specs
justinchuby Jul 30, 2026
9f293a4
R105: my headline counts are not reconstructible from my own deliverable
justinchuby Jul 30, 2026
82c53f1
R106: the review pin is one field serving two consumers with opposite…
justinchuby Jul 30, 2026
c6bb395
Wire dashboard telemetry to the block-table endpoint; make "not appli…
justinchuby Jul 30, 2026
149c910
Sync README claims and the unrendered pin with the fields that just l…
justinchuby Jul 30, 2026
4b0c851
Add claims-of-absence skill
justinchuby Jul 30, 2026
edd9480
Correct static-cache KV dashboard claim
justinchuby Jul 30, 2026
33e6ae5
dashboard: block absolute paths at display boundary
justinchuby Jul 30, 2026
3e388e0
Fix KV block-window slot aggregation
justinchuby Jul 30, 2026
9f5c623
dashboard: keep caption audit through safety wrapper
justinchuby Jul 30, 2026
d348293
Require complete KV pool for slot fill
justinchuby Jul 30, 2026
d4cb4cc
Pin partial KV window rejection
justinchuby Jul 30, 2026
7b76e42
dashboard: neutralize paths inside formatters
justinchuby Jul 30, 2026
01fe66d
test: preserve legitimate model identifiers
justinchuby Jul 30, 2026
16fac55
Fix block window truncation flag
justinchuby Jul 30, 2026
33c69f0
Split dashboard telemetry polling lanes
justinchuby Jul 30, 2026
3d9ca68
dashboard: declare JSON wire types
justinchuby Jul 30, 2026
8740b14
test: document extractor census corpus
justinchuby Jul 30, 2026
c37172b
Revert "Fix block window truncation flag"
justinchuby Jul 30, 2026
d9cfa00
dashboard: reject mismatched JSON wire types
justinchuby Jul 30, 2026
8374070
Make the skill cite its guards instead of restating them
justinchuby Jul 30, 2026
fde9dfc
Account for one added file in the exposure ratchet
justinchuby Jul 30, 2026
0d70dc2
dashboard: redact stale path diagnostics
justinchuby Jul 30, 2026
d6e9892
Enforce that a renamed test cannot silently disarm its readers
justinchuby Jul 30, 2026
d47be1a
Collapse the duplicated deferral inventories into one registry
justinchuby Jul 30, 2026
d61030a
Preserve throughput across reused samples
justinchuby Jul 30, 2026
7378cc0
Anchor the by-name-read control on a fixture, not on a real defect
justinchuby Jul 30, 2026
cf9bac1
Stop the by-name scan from matching its own fixture
justinchuby Jul 30, 2026
b38049a
Prevent slow telemetry from rewinding fast state
justinchuby Jul 30, 2026
bdb5bd8
Account for one added file in the exposure ratchet
justinchuby Jul 30, 2026
38c49d5
Repair by-name test-read guard
justinchuby Jul 30, 2026
641635f
Neutralise absolute paths at the provenanceWarning boundary
justinchuby Jul 30, 2026
6409bcb
Prevent cross-lane telemetry write-back
justinchuby Jul 30, 2026
9c70044
Account for one added file in the exposure ratchet
justinchuby Jul 30, 2026
3f79064
Prove the single-source scan is not vacuous
justinchuby Jul 30, 2026
b80e195
Discard superseded telemetry responses
justinchuby Jul 30, 2026
9112495
Test whole-pool KV telemetry across partial windows
justinchuby Jul 30, 2026
d96b1a6
Repair never-bind store spellings
justinchuby Jul 30, 2026
a4d6653
Neutralise absolute paths at the display choke point too
justinchuby Jul 30, 2026
f50c09b
docs(dashboard): add red-capable testing guide
justinchuby Jul 30, 2026
de04735
docs(dashboard): add structural test checks
justinchuby Jul 30, 2026
e4fc8c6
test(dashboard): render measured false literally
justinchuby Jul 30, 2026
be8c02e
Withhold absolute paths from the reason channel too
justinchuby Jul 30, 2026
98bcaae
docs(dashboard): require diagnostic mutation proof
justinchuby Jul 30, 2026
ce81b6d
test(dashboard): build false field through fixture helper
justinchuby Jul 30, 2026
7b88db4
docs(dashboard): require independent guard controls
justinchuby Jul 30, 2026
c06b416
Strengthen telemetry generation oracle
justinchuby Jul 30, 2026
e0cb959
docs(dashboard): keep testing doctrine executable
justinchuby Jul 30, 2026
a537604
docs(dashboard): verify mutations actually apply
justinchuby Jul 30, 2026
5ce775b
Guard against a test file importing another test file
justinchuby Jul 30, 2026
429721c
Decouple KV fixture inputs from expected values
justinchuby Jul 30, 2026
daaec9f
test(dashboard): avoid pinning false decorations
justinchuby Jul 30, 2026
5d54130
docs(dashboard): explain silent mutation greens
justinchuby Jul 30, 2026
5d9147d
docs(dashboard): close negative assertion gaps
justinchuby Jul 30, 2026
2494769
test(dashboard): anchor false absence assertions
justinchuby Jul 30, 2026
cc158a9
test(dashboard): restore exact false value assertions
justinchuby Jul 30, 2026
928e2c0
Guard KV fixture scope divergence
justinchuby Jul 30, 2026
452971e
docs(dashboard): require controls per corpus
justinchuby Jul 30, 2026
e14fb6c
test(dashboard): allow composed false formatter text
justinchuby Jul 30, 2026
858b554
Name guarded KV pool expectations
justinchuby Jul 30, 2026
163b7cb
Prove a path-bearing value reaches the wire-type rejection path
justinchuby Jul 30, 2026
1c438fc
test(dashboard): anchor exact false value node
justinchuby Jul 30, 2026
87db68a
Extend the fail-closed control to the store-layer corpus
justinchuby Jul 30, 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
89 changes: 89 additions & 0 deletions .github/dispatch-format.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# Dispatch format

A dispatch is an order, assignment, or request sent from one agent to another.

Every dispatch carries a **SHA** and a **predicate**. Both are mandatory. A
dispatch missing either may be refused without penalty and without argument.

```
@ <sha> the commit the dispatch's premise was measured at
PREDICATE: <cmd> one command; if it no longer holds, the dispatch is spent
```

## Why this exists

Every other artefact this crew produces pins itself. A commit *is* a SHA. A tag
resolves to one. A test names the tree it ran against. An extract is taken at a
named commit.

A dispatch pins nothing. So it cannot go stale *visibly*, and every reader takes
it as present-tense forever — no matter how long it sat in a queue, and no
matter how many commits landed while it waited.

This is not a discipline problem and it will not yield to care. The volume of
dispatches on a busy branch is high, the cost of re-deriving each premise is
high, and the failure is silent on both ends: the sender cannot see that their
order expired, and the receiver cannot see that it ever was fresh.

Observed on this branch: orders to build things that already existed, orders
gated on conditions that had already cleared, and two near-misses on duplicate
implementations. In each case the order was *correct when written*.

## The rule

A dispatch's premise was measured at some point in history. Name it.

```
@ 37d0d72e
PREDICATE: git grep -c 'UNKNOWN_SOURCE_BADGE' -- dashboard/panel-kit.js # expect 0
```

The recipient runs the predicate **before** reading the prose. If it no longer
holds, the dispatch has expired and is closed with a one-line reply. Nobody
reads the body, nobody re-derives the reasoning, nobody spends twenty minutes
discovering the work is done.

A spent dispatch deletes itself.

## Writing a good predicate

The predicate must **go false when the work lands**. That is its whole job.

| Bad | Why |
| --- | --- |
| `test -f dashboard/panel-kit.js` | True before and after. Proves nothing. |
| `git log --oneline \| head -1` | Always changes. Expires instantly, always. |
| "check if the guard is present" | Not a command. Cannot be run. |

| Good | Why |
| --- | --- |
| `git grep -c 'FIELD' -- path` with an expected count | Goes false the moment the field lands. |
| `git merge-base --is-ancestor <fix> HEAD` | Goes false the moment the fix merges. |
| A test name plus its expected exit code | Goes false when the guard turns green. |

Two rules, both learned the hard way on this branch:

- **State the expected value beside the command.** A count with no expectation
is not a predicate; the reader cannot tell pass from fail.
- **Prefer a predicate that names bytes over one that names a file.** Presence
of a *file* is the one property every wrong answer also has.

## Refusing a dispatch

Refusal is cheap, expected, and carries no penalty:

> Refused: no `@ <sha>` / no predicate.

Or, when the predicate is present and has expired:

> Spent: `PREDICATE` returned `<actual>`, expected `<expected>`. Closed unread.

Refusing an unpinned dispatch is not insubordination. It is the only mechanism
that keeps the format honest, and it is enforceable against **every** agent on
this crew, including whoever is coordinating.

## Scope

This governs dispatches — orders, assignments, requests. It does not govern
broadcasts, findings, or reports, which already carry their own SHAs by
convention.
244 changes: 244 additions & 0 deletions .github/skills/build-static-cache-model/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
---
name: build-static-cache-model
description: Build a loadable static-cache (TensorScatter) ONNX model for onnx-genai. Use when continuous batching does not engage, when a model fails to load with "declares no model.io.static_cache", when a model loads but never stops generating, or when you need a real model for benchmarking or demoing continuous batching. Prefer scripts/build_qwen.sh, which now performs this whole recipe.
---

# Building a loadable static-cache model

## Why this exists

Continuous batching in `onnx-genai` is decided by `Engine::continuous_batch_manager`
in `crates/onnx-genai-engine/src/batched.rs`. It succeeds for **two** kinds of
model, and the shipped refusal message names both:

```
continuous batching requires a STATIC-CACHE or shared-buffer past/present model
```

1. A **static-cache** model (`ModelDecodePath::StaticCache`) — what this skill builds.
2. A **shared-buffer past/present** model (`shared_buffer: true`) with a known `max_len`.

**Batch capability is a property of (model, execution provider, launch), not of a
model directory.** The `shared_buffer` flag is resolved by
`supports_fixed_capacity_present_binding()` — an execution-provider capability plus
an explicit opt-in — so *the same model on the same disk* can batch or not depending
on how the server was launched. You cannot predict batching by reading
`inference_metadata.yaml`.

Two corollaries worth holding onto, because getting them backwards has cost real
debugging time here:

- **Batching not engaging does not mean the model is dynamic-cache.** A
`shared_buffer: true` model with `max_len: None` reaches the *capable* arm and
then fails on missing metadata — it was never judged unqualified. It is one of
several non-capability failures (zero `max_batch`, absent ORT decoder session,
session construction failure) that land in the same place. `driver.rs` states the
rule directly: *"Neither implies the other, in either direction."*
- **Read the reason, do not infer it.** The driver keeps the error in
`BatchDriver::PerRequest { reason }` precisely so the log tells you which of these
happened. An earlier version discarded it with `.is_ok()`; do not reintroduce that
and do not document it.

Building a static-cache model is a *sufficient* way to get batching, not the only
one — and it is the route this skill covers, because the obvious ways to produce one
currently give you a model that will not load.

## Symptom → diagnosis

**Symptom A — the model fails to load:**

```
Invalid argument: graph exposes a TensorScatter static-cache scatter ABI but
declares no `model.io.static_cache`; its integer scatter control ports
(write_indices / kv_sequence_length) are shape-indistinguishable and cannot be
bound by port name.
```

**Symptom B — the model loads, but batching never engages.** The server logs:

```
continuous batch driver disabled; using per-request engine path
```

Batch-related metrics stay flat. **Always check the model before debugging the batching code** — this log line is the fastest diagnostic in the system.

When batching *is* working you will see:

```
INFO onnx_genai_server::driver: continuous batch driver enabled max_batch=4
```

## Do not follow a recipe when a script exists

`scripts/build_qwen.sh` now performs everything below, including the two steps
this document used to leave to the reader. Use it:

```bash
cd "$(git rev-parse --show-toplevel)"
STATIC_CACHE=1 MAX_SEQ_LEN=4096 OUT_DIR=/tmp/qwen-scatter scripts/build_qwen.sh
scripts/verify_model.sh /tmp/qwen-scatter
```

The rest of this document explains what those two commands do and why, so you
can diagnose a failure or reproduce it against a different model. **It is
reference material, not a checklist to type out.**

> **NEVER build into a directory that already contains a model, and never into
> `models/qwen2.5-0.5b-scatter-v2`.** An earlier version of this file told you
> to do exactly that. Two reasons, and the second is worse than the first:
> `resolve_model_path` (`crates/onnx-genai-ort/src/loader.rs:405-410`) hard-errors
> when it finds multiple `.onnx` files, and — far more dangerous — **leftovers
> from a previous build SATISFY a completeness check**, so a partial build looks
> like a complete one. `build_qwen.sh` now refuses a non-empty `OUT_DIR` unless
> you pass `FORCE=1`. Build to scratch, verify, then move it into place.

## Root cause

Three independent problems. The first two stop the model loading; **the third
lets it load, batch, answer, and never terminate.**

1. **The runtime target must be `--runtime onnx-genai`.** `--runtime ort-genai`
emits only `genai_config.json`; the runtime needs `inference_metadata.yaml`.
2. **Mobius omits the `io:` block** for static-cache builds, so
`model.io.static_cache` has to be added after the export.
3. **The `onnx-genai` runtime target writes ONLY `tokenizer.json`** — no
`tokenizer_config.json` (`__main__.py:322` vs `:339`; the two targets are
mutually exclusive). Without it, `load_eos_token_ids`
(`crates/onnx-genai-ort/src/tokenizer.rs:103`) falls back to `<|endoftext|>`,
**which exists in Qwen's vocabulary** — so nothing errors and the model
generates until it hits the token budget on every single request.

> **Problem 3 is the one to fear, because every symptom of it looks like
> success.** It is also why `models/qwen2.5-0.5b-scatter-v2` worked: its
> tokenizer files are dated months before its graph — leftovers from an earlier
> build into the same directory. **That model was correct by accident of
> directory reuse, and a fresh clone reproduces neither the accident nor the
> result.**

The scatter control ports (`write_indices`, `nonpad_kv_seqlen`) are both integer
tensors of indistinguishable shape, so the loader cannot infer which is which
from the graph alone. That is why the declaration is mandatory rather than
optional — and why the loader keys on **the presence of those input ports**
rather than on TensorScatter nodes (`crates/onnx-genai-ort/src/decode/io.rs:194-198`).

## What the script does

### 1. Export with the correct runtime target

```bash
cd "$(git rev-parse --show-toplevel)"
HF_HOME=models/.hf_cache TMPDIR=models/.scratch PYTHONPATH=/path/to/mobius/src python -m mobius build --model Qwen/Qwen2.5-0.5B-Instruct /tmp/qwen-scatter --dtype f32 --ep default --static-cache --max-seq-len 4096 --runtime onnx-genai
```

`HF_HOME` and `TMPDIR` are redirected into `models/` because the download and
scratch space are multi-gigabyte and you usually do not want them on the default
volume. **The output directory is scratch, not `models/`.**

### 2. Derive the `model.io.static_cache` block

**Do not hand-author this and do not copy the fixture.** Run the generator,
which reads the block out of the graph you actually built:

```bash
python scripts/lib/write_static_cache_metadata.py /tmp/qwen-scatter
```

Use the **same Python that has Mobius installed** — this reads the graph with
`onnx`, and a bare system Python fails with `the 'onnx' package is required`.

Hand-authoring has a failure mode that is invisible on small models: the four
per-layer lists **pair positionally**, so the layer ports must be sorted
**numerically**. Sorted as strings, `key_cache.10` lands before `key_cache.2`
and **every buffer past layer 9 is silently mis-paired** — a model that loads
and produces plausible-looking garbage. Under ten layers the two orderings are
identical, which is why a small test cannot catch it.

Pass `--check` to print the derived block instead of writing it (read-only).

### 3. Copy the tokenizer companions

```bash
python scripts/lib/write_tokenizer_assets.py \
Qwen/Qwen2.5-0.5B-Instruct /tmp/qwen-scatter
```

Takes **two** arguments — the source model id (or a local directory) and the
built model directory. Resolves `tokenizer_config.json` (and friends) through
the Hugging Face cache,
never overwrites what the exporter produced, and **fails loudly** if the file
cannot be obtained — because a missing one produces problem 3 above, and a build
that silently omits it is indistinguishable from a good one.

Cached files are reused, but resolution still contacts the Hub, so **this step
needs network access on a machine that has not downloaded the model before.**
Pass a local directory instead of a model id to work fully offline.

### 4. Verify — and do not skip this

```bash
scripts/verify_model.sh /tmp/qwen-scatter
```

**This is the terminal step of the recipe.** The model is not built until this
passes; exit 0 is the only evidence that counts.

It asserts three things, and the second and third exist because of real defects:

- the model **loads**;
- `continuous batch driver enabled` appears in the log. **Both outcomes log at
`INFO`** (`driver.rs:417` and `:420`), so it greps for the *enabled* line
**and separately fails on the *disabled* line** — the absence of an error
proves nothing;
- the completion returns **`finish_reason=stop`**. A model with the tokenizer
defect returns `finish_reason=length`, and this is the only cheap check that
catches it.

If the port is busy it **refuses to run** rather than reporting on whatever else
is listening; pass `--port` to move it.

Reference numbers for Qwen2.5-0.5B f32 on CPU: ~10-50 s cold model load; a
single 24-token completion ~2.2 s; four concurrent 32-token completions ~8.7 s
total. **Timings are not a pass criterion** — they vary ~10% with background
load alone.

### 5. Only now promote it — to a NEW directory, never onto an existing one

```bash
# The destination MUST NOT EXIST. Bump the version rather than replacing.
test ! -e models/qwen2.5-0.5b-scatter-v3 || { echo "destination exists; bump the version"; exit 1; }
mv /tmp/qwen-scatter models/qwen2.5-0.5b-scatter-v3
scripts/verify_model.sh models/qwen2.5-0.5b-scatter-v3 # RE-VERIFY AT THE FINAL PATH
```

> **☠️ AN EARLIER VERSION OF THIS STEP SAID `mv /tmp/qwen-scatter
> models/qwen2.5-0.5b-scatter-v2`, AND ITS FAILURE MODE IS SILENT.** `models/`
> is gitignored, so `-v2` is the only copy of the only known-good static model
> in the project and @fc8b5d97's performance baseline is measured against it.
> But it would not have been *destroyed*, which is the part worth understanding:
>
> **`mv src dst` where `dst` is an existing directory moves `src` INSIDE it**,
> producing `…-v2/qwen-scatter/`. `resolve_model_path`
> (`crates/onnx-genai-ort/src/loader.rs:398-400`) scans with
> **`std::fs::read_dir` — non-recursive — and filters on `path.is_file()`**, so
> the nested copy is invisible to it. It does *not* trip the multiple-`.onnx`
> hard error documented above. The directory still resolves, and it resolves to
> the **original** `model.onnx`.
>
> **So the promotion silently does nothing, and everything downstream passes —
> against the model you believed you had just replaced.** `verify_model.sh`
> would certify it, because the model it loaded genuinely is good. The tool
> built to prevent false confidence becomes the thing producing it.
>
> **This is why step 5 re-runs verification at the FINAL path.** Verifying an
> artifact at the path where it was *built* proves nothing about the path where
> it will be *used*, and every step between the two is unverified.

Leave `-v2` in place. Nothing needs to be deleted; a superseded model dir costs
disk and removes a rollback.

## Gotchas

- **`--model` takes a directory, not a config file.** The CLI coerces a file path to its parent via `resolve_model_dir` (`crates/onnx-genai-cli/src/lib.rs:674`); the **server does not**. Passing `.../genai_config.json` to the server fails with `model directory does not exist`.
- **Always `export CARGO_TARGET_DIR`** to a shared target directory. A cold build of this 39-crate workspace is enormous; a warm build of the server is under a minute. Cargo takes an exclusive lock, so concurrent builds serialize.
- **Tiny test fixtures have a ~16-token context.** Use `max_tokens: 4` against `tests/fixtures/tiny-llm*` or requests are rejected. Use a real model for anything resembling a benchmark.
- **Static-cache and paged KV are mutually exclusive.** A static-cache model gets continuous batching but *no* paged-KV page activity, no prefix caching, and no preemption (`crates/onnx-genai-engine/src/batched.rs:757` hardcodes `PreemptionPolicy::Disabled`). A prefix-cache hit count of zero on this path is correct, not a bug.
Loading
Loading