spec(trinity): a capability card for the brain region tests, one ahead of the pin (Closes #5953) - #5965
Merged
Conversation
…d of the pin (Closes #5953) gHashTag/trinity#1333 puts five brain test steps back into trinity's build.zig (test-basal-ganglia, test-reticular-formation, test-locus-coeruleus, test-brain, test-brain-stress) over six src/brain test roots. Trinity's capability index, which vendors tools/trinity_manifest.py and these cards byte for byte, found the eleven targets with no owning card, failed on each as UNASSIGNED_TARGET, and turned the "Headless profile from a clean clone" job red. specs/trinity/capabilities/brain.regions.t27 owns exactly those eleven targets: executable, zig, headless (the steps sit outside every !ci_mode block), work package S03. Its acceptance is the five `zig build <step> -Dci=true` commands. Its evidence is measured, from brain-ci runs 37184075728 (push) and 37184077352 (pull_request) at gHashTag/trinity@291ac8b24, each step's exit code gated, with the same counts in both runs: 51/51, 48/48, 52/52, 151/151, and 261/261 with 0 leaked. No canonical spec is claimed: src/brain is handwritten Zig, and specs/brain/brain.t27 only lists it in a comment table. research.unreferenced-sources no longer names src/brain; its NOTE says why, and records that 43 of the 46 .zig files under src/brain stay unreachable at the pin (37 at 291ac8b24). The order problem stays visible. None of the eleven targets exists at the pinned gHashTag/trinity@976df517, so `trinity_manifest.py check` now reports eleven UNKNOWN_TARGET findings, and the regenerated conformance/trinity/report.json records them until S01 re-pins. The card header, the README and the docs/now entry say so. Against an inventory of 291ac8b24 the card has no finding and none of the eleven is unassigned. --self-check passes. Both cards are sealed with t27c built from this branch; seal --verify matches both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
This was referenced Oct 4, 2026
Closed
gHashTag
added a commit
to gHashTag/trinity
that referenced
this pull request
Oct 4, 2026
…ain.regions The brain test steps this PR restores (test-basal-ganglia, test-reticular-formation, test-locus-coeruleus, test-brain, test-brain-stress) and their six src/brain test roots had no S01 card, so the capability index failed on each as UNASSIGNED_TARGET. gHashTag/t27#5965 (39e06aa0, Closes gHashTag/t27#5953) adds the card trinity/brain.regions that owns exactly those eleven targets. - tools/contracts.py vendor --revision 39e06aa0: external/t27 and the lock move from de2a1aca; 76 files (the new card is the 76th). It also brings gHashTag/t27#5474: the S01 checker skips build.zig comments and counts the vendored copies apart, and the acceptance of mcp.needle-mcp and mcp.trinity-mcp becomes zig build -Dci=true && test -x zig-out/bin/<name>. - specs/reproduce/capabilities.t27: trinity/brain.regions is in RUN. The profile's test step does not compile its roots, so its five zig build test-<region> commands are its only measure in the index. mcp.needle-mcp and mcp.trinity-mcp leave KNOWN_BLOCKED: they were blocked on steps that exist only in commented-out lines, and their new acceptance is the install the profile already makes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
added a commit
to gHashTag/trinity
that referenced
this pull request
Oct 4, 2026
… that test nothing (#1333) * fix(brain): EventBus.poll applies max_events after the since filter poll(since, allocator, max_events) scanned only the first max_events buffered events and then filtered them by `since`. Whenever those oldest events were at or before `since`, it returned nothing even though newer events matched: with three old events and two new ones, poll(boundary, a, 1) returned 0 events instead of 1. The scan now walks the whole buffer and stops once max_events events have passed the filter, which is what the doc comment already promised ("Returns events with timestamp > since ... Limited by max_events"). poll(0, a, n) is unchanged. Found by the new `tri stress --health` probe limit-after-filter. A module test pins it: it fails on the old code (0 events) and passes on this one. Refs #1326 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(tri): tri stress --health runs brain self-check probes `tri stress --health` was a stub that printed "not implemented yet" and no Score: line, so the brain-ci Brain Health Check failed on every run as "not measured". It now runs 17 probes against the three brain regions linked into tri: basal_ganglia (8: claim, refuse, heartbeat, complete, abandon, TTL expiry, shard accounting, an 8-thread one-winner-per-task race), reticular_formation (5: string ownership, FIFO order, since filter, limit-after-filter, bounded ring) and locus_coeruleus (4: exponential, capped and monotone, linear and constant, jitter bounds). Each probe uses fresh private instances (never the process globals) and its own leak-checking allocator; a leak fails the probe. The output lists every probe as PASS or FAIL with its claim, then one plain-ASCII line Score: <n.n>/100 (<passed> of <total> probes passed) where n = 100 * passed / total, then "Status: HEALTHY" or "Status: UNHEALTHY". The command exits 1 if any probe failed. Nothing in the score is a constant: removing the basal_ganglia live-claim check, the locus_coeruleus cap or the poll fix drops it to 88.2, 82.4 and 94.1. Not covered: other src/brain regions (not linked into tri), load and soak behaviour. The other stress modes still only print a notice. Refs #1326 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): brain health step reads the number right after Score: The Brain Health Check parsed the first number anywhere on the Score: line, so a colour escape such as ESC[32m before "Score:" read as 32. It now reads only the number directly after "Score:" on the first Score: line, integer or decimal. The HEALTHY check used `grep -q "HEALTHY"`, which also matches "UNHEALTHY", so every run with a Status line reported healthy. It now matches the whole line "Status: HEALTHY". A run above the threshold with failed probes now gets a warning annotation instead of passing silently. The threshold (80), the not-measured and unparseable branches, and `|| true` are unchanged. The comment block describes what the score measures and states that the CLI Smoke Test, which fails on any failed probe, only runs after brain-unit, brain-integration and brain-stress succeed. Closes #1326 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): grant brain-ci the token permission its PR comments need The repository default GITHUB_TOKEN is read-only and brain-ci.yml had no permissions block, so "Comment Health on PR" failed with 403 "Resource not accessible by integration" on the first PR run where the health check passed (run 37176287100). The same applies to the stress comment and the Critical State Notification. Those steps were unreachable while the health check failed first. Grant contents: read and pull-requests: write at workflow level. A PR from a fork still receives a read-only token. Refs #1326 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(brain): stress_test reads claims through the sharded registry stress_test.zig still read `registry.claims`, the single map the registry had before it was split into 16 shards, so the file stopped compiling (13 errors) and test-brain-stress could not run. Count with Registry.count() and look a claim up in the one shard Registry.getShardIndex names, under that shard's read lock. The tests themselves are unchanged: 261/261 pass on zig 0.15.2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(brain): metrics_dashboard deinit and overwrite no longer corrupt or leak Restoring test-brain ran the dashboard's own tests for the first time in months (integration_test.zig imports the file by path). They found: - RegionMetrics.deinit freed the alert through raw_metrics.allocator after raw_metrics.deinit() had set the map to undefined: a segfault at 0xaaaa... whenever a region carried an alert. Read the allocator first. - setMetric/setMetricOwned on an existing key leaked the new key copy and the replaced value, because HashMap.put keeps the stored key. Copy the key only on first insert and free the replaced value. - Five tests leaked memory they owned (the singletons collect() creates, buffers setMetric copies) and one asserted a 23-byte prefix of a name formatAscii truncates to 20 bytes. The assertions now match the code. test-brain: 151/151 pass, no leaks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(build): restore the brain test steps brain-ci calls #517 (42490a2) removed test-basal-ganglia, test-reticular-formation, test-locus-coeruleus, test-brain and test-brain-stress from build.zig while brain-ci.yml kept calling them, so every Unit Tests leg failed with "no step named ..." and nothing behind it ran. Point the steps back at the source files, which were never removed. Not restored: test-intraparietal (intraparietal_sulcus.zig is stubs around the hslm library that left this repo and does not compile) and test-hslm (hslm is tested in gHashTag/trinity-training; no such step ever existed). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): brain-ci runs only steps that exist and measure something - Unit Tests: basal-ganglia, reticular-formation, locus-coeruleus only; intraparietal and hslm dropped with the reason in the file. - Stress: pipefail-safe exit code plus zig's own "N/M tests passed" count. A missing count is NOT MEASURED and fails, never 0. The 270/300 threshold and the hard-coded 100/100 PR table are gone; nothing ever produced them. - CLI Smoke: only `tri stress --health`, no `|| true`. task stats, task list, event stats and stress --scan are unimplemented and exit 0. - Export Brain Metrics job and the --record/--history steps removed: they call unimplemented subcommands, and the health job wrote "snapshot recorded" whether or not anything was. - Report shows each job's real result instead of FAIL for skipped; the verdict still requires every job to succeed. Weekly artifact name is now unique (`with:` never expanded $(date)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(build): link libc for the state_recovery brain module captureState() calls std.c.getpid(). macOS links libc implicitly, so test-brain passed locally, but on ubuntu-latest the integration binary failed to compile with 'dependency on libc must be explicitly specified' (brain-ci run 37180861619). A cross-compile for x86_64-linux-gnu reproduces the error before this change and compiles cleanly after it. Refs #1331 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): brain-ci merge gate fails red instead of skipping The gate needed brain-health-report without always(), so whenever the report failed the gate was skipped. A skipped check renders grey, not red: on #1328 (run 37176676345) the report failed and the Merge Gate showed skipped. With always() the gate runs and its existing check fails it for any report result other than success. Refs #1331 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * build(brain): spell out brain test roots so the S01 checker can see them The capability index (external/t27/tools/trinity_manifest.py) finds build targets only as `const X = b.addTest(.{ .root_module = b.createModule(.{ .root_source_file = b.path(...) }) })` and `b.step("literal", ...)`. The helper-built roots and the region-step loop showed up as `test:None` and hid three steps. Each brain test root and step is now written out, so every target has a precise name a capability card can own. No test changes: the same files are compiled with the same imports. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * build(reproduce): vendor gHashTag/t27@39e06aa0 and measure trinity/brain.regions The brain test steps this PR restores (test-basal-ganglia, test-reticular-formation, test-locus-coeruleus, test-brain, test-brain-stress) and their six src/brain test roots had no S01 card, so the capability index failed on each as UNASSIGNED_TARGET. gHashTag/t27#5965 (39e06aa0, Closes gHashTag/t27#5953) adds the card trinity/brain.regions that owns exactly those eleven targets. - tools/contracts.py vendor --revision 39e06aa0: external/t27 and the lock move from de2a1aca; 76 files (the new card is the 76th). It also brings gHashTag/t27#5474: the S01 checker skips build.zig comments and counts the vendored copies apart, and the acceptance of mcp.needle-mcp and mcp.trinity-mcp becomes zig build -Dci=true && test -x zig-out/bin/<name>. - specs/reproduce/capabilities.t27: trinity/brain.regions is in RUN. The profile's test step does not compile its roots, so its five zig build test-<region> commands are its only measure in the index. mcp.needle-mcp and mcp.trinity-mcp leave KNOWN_BLOCKED: they were blocked on steps that exist only in commented-out lines, and their new acceptance is the install the profile already makes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * build(reproduce): raise the contract-test floor to the 78 that run at t27@39e06aa0 The vendoring of gHashTag/t27@39e06aa0 added one spec test, the card_is_bound_to_its_package test of specs/trinity/capabilities/ brain.regions.t27; no other vendored spec changed its number of tests. t27c built at 39e06aa0 with zig 0.16.0 measures 58 specs and 78 tests, all passing, so a floor left at 77 would let one test vanish unseen. The other ledgers were re-checked against the new vendor and stand as they are: the eleven TEST_BLOCKED specs fail with the same first error each, lotus.t27 still drops 48 top-level tokens, and the two specs/tools/mcp specs still declare no test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #5953
Why
gHashTag/trinity#1333 puts five brain test steps back into trinity's
build.zig:test-basal-ganglia,test-reticular-formation,test-locus-coeruleus,test-brainandtest-brain-stress, over sixsrc/braintest roots. Trinity's capability index vendorstools/trinity_manifest.pyand these cards byte for byte. It found the eleven targets with no owning card and failed on each one asUNASSIGNED_TARGET. That is why the "Headless profile from a clean clone" job on #1333 is red.What
specs/trinity/capabilities/brain.regions.t27(module trinity_capability_brain_regions,ID trinity/brain.regions, work package S03). It owns exactly the eleven targets.executable/headless/zig. The steps sit outside every!ci_modeblock, sozig build -Dci=truedefines them.zig build <step> -Dci=truecommands, joined by&&.measured. The source is brain-ci runs 37184075728 (push) and 37184077352 (pull_request), on ubuntu-latest with zig 0.15.2 at gHashTag/trinity@291ac8b24.DIALECT none.src/brainis handwritten Zig.specs/brain/brain.t27only lists its files in a comment table; nothing generates the files from it or checks them against it.research.unreferenced-sourcesno longer namessrc/brain.IMPLEMENTATIONgoes from [6] to [5], and the NOTE says why. It also records that most of the directory is still unreachable: 43 of 46.zigfiles at the pin, and 37 at 291ac8b24.conformance/trinity/report.json.specs/trinity/.The order problem, not hidden
The cards are held to the inventory of the pinned tree gHashTag/trinity@976df517, and none of the eleven targets exists there.
python3 tools/trinity_manifest.py checknow exits 1 with elevenUNKNOWN_TARGETfindings. Before this PR it reported none.report.jsonrecords them. No t27 workflow runs that check.PIN_MISMATCHand nineCOUNT_MISMATCH.The alternative was to re-pin S01 to a trinity revision that contains #1333. That waits on #1333 merging and moves every count in
project.t27, which is a larger and separate change.Checks run locally
t27c parse+typecheckon both cardst27c seal --save/seal --verifyon bothblocked,/Users/,/private/tools/trinity_manifest.py --self-checktools/trinity_manifest.py checkUNKNOWN_TARGET(expected, explained above);report.jsonstable on re-runtools/check_seal_currency.pytools/check_seal_coverage.pytools/check_assertionless_spec_tests.pytools/ci/check_specs_still_parse.py --base <merge-base>tools/check_now_entry_shape.pyandscripts/ci/now-sync-gate-diff.shtools/check_fix_carries_source.pyFollow-up in gHashTag/trinity (after this merges)
tools/contracts.py vendoragainst the new t27 master.trinity/brain.regionstospecs/reproduce/capabilities.t27.mcp.needle-mcpandmcp.trinity-mcp. Trinity'sKNOWN_BLOCKEDwill be re-checked for those two in the same step.🤖 Generated with Claude Code