Skip to content

spec(trinity): a capability card for the brain region tests, one ahead of the pin (Closes #5953) - #5965

Merged
gHashTag merged 2 commits into
masterfrom
feat/trinity-brain-capability-card
Oct 4, 2026
Merged

gHashTag merged 2 commits into
masterfrom
feat/trinity-brain-capability-card

Conversation

@gHashTag

@gHashTag gHashTag commented Oct 4, 2026

Copy link
Copy Markdown
Owner

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-brain and test-brain-stress, over six src/brain test roots. Trinity's capability index vendors tools/trinity_manifest.py and these cards byte for byte. It found the eleven targets with no owning card and failed on each one as UNASSIGNED_TARGET. That is why the "Headless profile from a clean clone" job on #1333 is red.

What

  • New specs/trinity/capabilities/brain.regions.t27 (module trinity_capability_brain_regions, ID trinity/brain.regions, work package S03). It owns exactly the eleven targets.
    • DISPOSITION / PROFILE / BACKEND: executable / headless / zig. The steps sit outside every !ci_mode block, so zig build -Dci=true defines them.
    • ACCEPTANCE: the five zig build <step> -Dci=true commands, joined by &&.
    • EVIDENCE: 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.
      • Each step's exit code is the gate.
      • Both runs give the same counts: 51/51, 48/48, 52/52, 151/151 (138 + 13), and 261/261 with 0 leaked.
      • The evidence names that commit and says it is not the pin.
    • CANONICAL_SPEC: empty, with DIALECT none. src/brain is handwritten Zig. specs/brain/brain.t27 only lists its files in a comment table; nothing generates the files from it or checks them against it.
  • research.unreferenced-sources no longer names src/brain. IMPLEMENTATION goes from [6] to [5], and the NOTE says why. It also records that most of the directory is still unreachable: 43 of 46 .zig files at the pin, and 37 at 291ac8b24.
  • Regenerated: conformance/trinity/report.json.
  • Updated: the README of specs/trinity/.
  • Added: a docs/now entry.
  • Seals: both cards are re-sealed with t27c built from this branch.

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.

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

Check Result
t27c parse + typecheck on both cards OK
t27c seal --save / seal --verify on both all hashes MATCH; the new seal's test block passes 1/1
Grep both seals for blocked, /Users/, /private/ no match
tools/trinity_manifest.py --self-check PASS
tools/trinity_manifest.py check exit 1, 11 UNKNOWN_TARGET (expected, explained above); report.json stable on re-run
tools/check_seal_currency.py exit 0
tools/check_seal_coverage.py neither new seal reported. The local run lists 39 dangling seals, all of them paths that exist in HEAD but are outside my sparse checkout; CI runs it on a full checkout
tools/check_assertionless_spec_tests.py OK (3761, unchanged)
tools/ci/check_specs_still_parse.py --base <merge-base> 2 changed specs, 0 newly unparseable
tools/check_now_entry_shape.py and scripts/ci/now-sync-gate-diff.sh OK
tools/check_fix_carries_source.py OK

Follow-up in gHashTag/trinity (after this merges)

🤖 Generated with Claude Code

gHashTag and others added 2 commits October 4, 2026 15:17
…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>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 08:28:48 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 43
PRs with All Checks Green 7
READY 0
FAILING 43
PENDING 0
NO CHECKS YET 0

These columns do not partition: 0 + 43 + 0 + 0 = 43, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=b45a356c2eb6 != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@gHashTag
gHashTag merged commit 39e06aa into master Oct 4, 2026
31 of 32 checks passed
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

trinity cards: own the brain region test targets that gHashTag/trinity#1333 restores, and drop src/brain from research.unreferenced-sources

1 participant