Skip to content

An index, because the Cossart work existed and could not be found - #415

Merged
syncytium2 merged 13 commits into
mainfrom
the-index
Aug 31, 2026
Merged

syncytium2 merged 13 commits into
mainfrom
the-index

Conversation

@syncytium2

Copy link
Copy Markdown
Owner

Tony, 2026-08-30: "it seems like we need an index. a file with a few key words, then a link to where the info is in the repo."

The argument is the conversation that prompted it

A session spent several turns re-deriving that the Cossart/DANDI transfer machinery exists, and started designing a ranking scheme around a constraint tools/import_dandi.py had already solved. Nothing was missing. It was unfindable — across 148 todos, 116 learned artifacts, 90 tools, 53 reviews.

Same shape as the case about computing instead of asking: when the thing an agent needs has no address it can resolve, it computes something rather than stopping.

Organised by the question, not the directory

The keyword column carries the words that do not appear in the path — "other lab", "fit here score there", "coincidence that is not coordination", "which folder", "why is my worktree test green". That's where lookups actually fail.

Two rows would justify the file on their own:

  • Transfer works by deriving a generator spec from the other lab's statistics and scoring on simulation from itnot by scoring on their raster. DANDI:000219 is a binary raster with no coordination ground truth, so recall/precision aren't directly computable on it. Today's session said the opposite out loud before finding the importer.
  • "Team" in interface2 commit prose means a parallel session, not another laboratory. A stranger reading "the other team's detector #5" gets it wrong, and the authorship correction in Two handover items existed only in a machine-local board — and one of them was wrong #413 quotes exactly that kind of prose.

Known traps

A section for things that fail quietly: the worktree PYTHONPATH hazard, reading a test subset as green, a stale checkout poisoning the session briefing, hand-typed tables, and three seeds being inside this bench's noise.

Guarded

tests/test_index_resolves.py — every link must resolve. The one deliberately unresolvable pointer (docs/decisions.md, owed and not written) says so in its row instead of linking.

Mutation-tested: adding a dead row fails it, removing the row passes again. This repo has twice shipped a check that could not fail; this one demonstrably can.

What's deliberately not in it

Anything that changes weekly — counts, current numbers, who holds what. Rows point at the file that owns the answer, and the file is the authority.

🤖 Generated with Claude Code

defazio2 and others added 11 commits August 30, 2026 13:42
… independence claim goes

Tony, 2026-08-30: "we built the first version of loco and coact detect in matlab
together." That corrects the 2026-08-29 block, which says rate_detect,
coact_detect and loco_detect "are his".

interface2 agrees and the dates are checkable. SpikyDetect 1-3, the synchrony
lineage, are 2026-04-23/27/28 with no co-author trailer. SpikyDetect4 -> RateDetect
is 2026-05-13, CoactDetect and detect_loco are both 2026-07-14, and all three carry
one. The first Claude-assisted commit in interface2 is 2026-05-06: the synchrony
work predates it, everything rate- and coordination-shaped comes after. Commit dates
are a lower bound and Tony notes years of poor hygiene, so earlier uncommitted work
is not ruled out -- what the record does settle is which commits are co-authored.

THE BIGGER CHANGE is withdrawing "I was totally unaware when I designed them", on
which the 08-29 block rests its "convergence, not a derivation" reading. That is
real evidence from a human and is NOT available from a model co-builder, which has
no introspective access to whether its output derives from CFAR-shaped training
data. Tony on the lit search: "i think it surpised both of us" -- genuine, and
consistent with independent convergence AND with unrecognised reconstruction.
Surprise cannot separate them. Withdrawn as unsupportable, not as false.

Replaced by a timeline that needs nobody's memory: built 2026-04 to 2026-07, CFAR
found 2026-08-22 (ff1db4d), recognised then. That rules out deliberate derivation,
which is the only charge worth pre-empting, and stops short of claiming independence
from a literature this project has not searched (§7 already says so).

It costs nothing that was being defended. Tony closed priority on 08-24 -- "most
researchers would be kind of thrilled with the link" -- so the independence claim
was never load-bearing. §5's list, port fidelity to 1e-9, the Cossart root and the
Kreuz position are all untouched.

Flags that docs/todo/2026-08-30-the-repo-underclaims-its-own-authorship.md predates
this and overstates in its title; it must be re-read against this before anyone acts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ssion

Rewritten before review. The first version of this block tagged rate, coact and
loco "AI-assisted" and withdrew §4's independence claim on that basis. Wrong
twice, and Tony said so plainly: "i feel disparaged by the tag ... I did not say
build three detectors for me."

A Co-Authored-By trailer records who produced a commit. It carries no design
attribution, and reading it as though it does disparages the person who specified
the detector, ran the validation and wrote the spec into the message. interface2
shows the specification running the other way: bc833ca8 says "my CoactDetect
detect_local_coincidence.m" and defines it as "the coactivity analog of RateDetect:
distinct-ROI coactivity excess over a rolling LOCAL null"; 9d4d37a2 states rate's
rule as "excess = primary rate (1s) - context rate (60s), Hz" -- the phrasing Tony
reproduced from memory 3.5 months later, unprompted, before seeing the commit.
So §4's reading stands and this block no longer disturbs it. The error is recorded
rather than deleted, because the same wrong inference is available to anyone else
auditing this tree.

SECOND FINDING, and it is the one worth keeping: "team" in interface2 means a
SESSION. Tony, 2026-08-30: "i am the only human in these repos. my teams are
sessions. in those days, i'd work two workstations in parallel and call them
teams." Commits say "the other team's detector #5" (bc833ca8) and "for the
CoactDetect team's integration" (e8692f77). A reader outside this estate takes
that as another laboratory. It is not, no outside attribution is owed, and anyone
quoting interface2 commit prose publicly has to decode it first.

Kept from the first draft: the timeline. Built 2026-04 to 2026-07, CFAR found
2026-08-22 (ff1db4d). Checkable in two repos, depends on nobody's memory, and now
sits ALONGSIDE the recollection rather than replacing it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Tony, 2026-08-30: "we built loco and coact detect as two versions of the same
circular shift idea." So bc833ca8's "the other team's detector #5" is not a rival
design -- it is the same idea on his other workstation, wired in as a deliberate
A/B, with the stated plan to "collapse to ONE unified detector #5 (LoCo engine +
CoactDetect name)".

The shipped code already says this and this document did not:
src/bugarach/detectors/_shared.py:3 -- "CoactDetect and LoCo share the
circular-shift surrogate machinery" -- a module that exists for that reason, with
loco.py:5 naming the same core machinery.

CONSEQUENCE, flagged not settled: §2 and §4 file them as two independent lineages,
loco's maxlt as GO-CFAR and its percentile-of-pool as kin to OS-CFAR, coact
separately. Two variants of ONE idea landing on two CFAR variants is a weaker
coincidence than two detectors doing so, and the CFAR argument should not be
counted twice. The arithmetic of "three of these are re-derivations" depends on how
many independent arrivals there were, and it is fewer than three.

Not resolving §4 here. A document that files one idea as two lineages should say so
before anyone reasons from the count.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Tony, 2026-08-30: "loco and coact detect performance is distinct. they are two
distinct detectors with different params." Correcting this block's previous
version, which read his "two versions of the same circular shift idea" as "one
detector twice" and drew a false consequence -- that §4 was double-counting its
CFAR mappings and there were "fewer than three independent arrivals."

WITHDRAWN. §4 maps MECHANISMS, not detectors, and its rows are distinct
mechanisms. Nothing in the count was wrong.

What is shared is how the null is built (_shared.py, circular-shift surrogates).
Everything that makes a detector differs, and the numbers were checked before
saying so: coact thresholds on a significance level (alpha=1e-4, 4 params, 60s
context); loco on an order statistic (99.9th percentile, 6 params, 120s context).
Measured: recall 0.767 vs 0.733, probe 1.25 vs 2.50/min, detect 0.062 vs 0.248s.
Two thresholding principles on a shared null, twice the false alarms, four times
the runtime. That is why §4 maps them to different CFAR variants.

The block now names the trap rather than deleting the error, because _shared.py
invites exactly this misreading and the next reader gets it cold. Also records
that "collapse to ONE unified detector #5" in bc833ca8 was a PLAN, not a record --
both ship, and the table says why.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…he winner

Recording a piece of project history that lived only in Tony's memory. Tony,
2026-08-30: "loco kicked ass in the beginning, we might have dropped coact as the
ugly sister. but now with our more serious optimization tools, coact is
consistently higher than loco."

bc833ca8 scheduled the A/B for deletion -- "collapse to ONE unified detector #5
(LoCo engine + CoactDetect name); detect_loco.m + the loco slot get removed then."
Run on time, while LoCo was ahead, that would have kept LoCo's engine under
CoactDetect's name and deleted the detector that later won, with nothing recording
the swap. The scaffold outlived its own deletion notice, which is why there is
anything to compare.

MEASURED, from the 2026-08-29 bake-off (a510e69) which Tony had not seen when he
described it from memory: coact takes 3 of 4 folds, 0.651 vs 0.638. Direction of
the recollection confirmed.

But "consistently higher" does NOT survive on F1: the gap is 0.013 against fold
ranges of 0.61-0.71 and 0.57-0.70, and on the background sweep at 12 seeds the
ordering flips with the seed block -- coact takes all seven grid points on seeds
1-12, loco takes the busy half on 13-24. F1 cannot separate them.

Where coact is consistently ahead is everywhere F1 averages away: recall 0.767 vs
0.733, probe 1.25 vs 2.50/min, detect 0.062s vs 0.248s. Half the false alarms on
an empty block, four times faster, more events found.

So the reversal is real and the number a reader checks to confirm it reports a tie.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Tony, 2026-08-30: "it seems like we need an index. a file with a few key words,
then a link to where the info is in the repo."

The argument is the conversation that prompted it. A session spent several turns
re-deriving that the Cossart/DANDI transfer machinery exists and started designing
a ranking scheme around a constraint tools/import_dandi.py had already solved.
Nothing was missing. It was unfindable, across 148 todos, 116 learned artifacts,
90 tools and 53 reviews.

Organised by the QUESTION a session asks, not by directory. The keyword column
carries the words that do NOT appear in the path -- "other lab", "fit here score
there", "coincidence that is not coordination", "which folder" -- because that is
where the lookups actually fail.

Two rows are worth the file on their own:
  - transfer works by deriving a generator spec from the other lab's statistics
    and scoring on simulation from it, NOT by scoring on their raster. Their data
    is a binary raster with no coordination ground truth. Today's session got
    that wrong out loud before finding the importer.
  - "team" in interface2 commit prose means a parallel session, not another
    laboratory, and a stranger reading those commits will get it wrong.

Carries a Known Traps section for the things that fail quietly: the worktree
PYTHONPATH hazard, reading a test subset as green, a stale checkout poisoning the
briefing, hand-typed tables, and three seeds being inside this bench's noise.

Guarded by tests/test_index_resolves.py -- every link must resolve, and the one
deliberately unresolvable pointer (docs/decisions.md, owed and not written) says
so in its row rather than linking. Mutation-tested: adding a dead row fails it,
removing the row passes again.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…tays announced

The index had no address, which is the exact failure it was written to fix. Tony
caught it: "assuming you have made the index loud".

Two announcements: CLAUDE.md, which every session loads, and the gates block of
session_briefing.sh, which is inside the ~1.5KB that survives a spill by design.

And a test, because the first version of tests/test_index_resolves.py carried a
docstring asserting "It is referenced from CLAUDE.md" while CLAUDE.md did not
reference it. A claim about a check is not a check. test_the_index_is_announced
now reads both files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…d today

Tony: "i thought this was fixed." It was, in 2026-08-20, and only for the payload
that was oversized THEN. The board has since grown to 32 ACTIVE claims and the
digest to 22,296B -- on its own nearly three times the harness's measured refusal
threshold. The trimmed hook spilled at ~14KB in this very session: its output
arrived as "Output too large (14KB). Full output saved to ..." with a 2KB preview.

The degrade ladder DID fire and reported success -- "over 8000B, board digest
re-rendered terse" -- and still left 15,663B. The alarm worked; the remedy did
not; nothing said so. Same shape this repo keeps finding.

FIX, per Tony: "break out the density of the briefing to a file with more detail.
the briefing should just be pointers." The digest is still generated IN FULL and
written to BOARD_DIGEST.txt beside the board it describes, so nothing is lost. The
briefing carries the count, the live-worktree count, the path, and the claim-first
rule. 15,663B -> 4,751B, no degrade warning.

NOT CHANGED, deliberately: session_briefing.sh still renders FOUNDATIONS §9 whole
at its 9,000B budget. I tried making that a pointer too and reverted it. Two tests
and the file's own header say the consequence must travel with the fact -- "assert
'min_rois' in out.stdout" -- because the 2026-08-13 incident was a session that
would not have been stopped by the headline alone. That file's header also records
that degrading §9 to claims on every run was already considered and rejected. It
was never the thing that spilled: it delivers at 8,608B under a 9,000B budget.
The density question there is Tony's, and is not answered here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nothing is built. A design brief, written on a context budget rather than a
ruling, with a role-1 claim check and NOT murderboarded -- said in its own banner.

Why the current ranking cannot be patched: F1 does not separate the detectors it
is used to separate. Three independent demonstrations, all today, and the decisive
one is that the background-axis winner FLIPS between two blocks of twelve seeds.
Any scheme that must produce a strict order will produce a different one next week.

What the brief carries that was not written down anywhere:
  - four failure modes are instrumented, not two. distractor_hits ("should a burst
    count?", open since score.py was written) has never entered a ranking.
  - the probe is a real axis, r(precision, probe) = -0.32, coact 0.572/1.25 vs
    tube 0.543/20.5 -- same precision, 17x the firings.
  - "false positives on empty data" is WRONG. The probe block holds 591 spikes and
    chance coincidence there is 12.4/min at 3 ROIs, 0.10 at 6, 0.00 at 8+. What it
    measures is calling a chance coincidence coordination.
  - Cossart transfer already works, and not by scoring on their raster: import ->
    assess -> derive a generator spec from THEIR statistics -> simulate with
    ground truth -> fair_bakeoff --score-spec. The ground-truth measures DO survive.
    This session asserted the opposite before finding the importer, which is why
    docs/INDEX.md exists.

Five decisions are listed as Tony's, with why each cannot be defaulted, and four
things not to do -- headed by not re-baselining the three test_background_curve
asserts, which encode a claim rather than a measurement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…see the citation

Found by short-course-56 in review, not by the check. Verified before acting:
the Known-traps row cited todo/2026-08-30-the-site-types-what-a-token-could-
substitute.md, which exists only on site-derives-from-data (PR #412). Dead for
every reader on main. The file actually there is the 2026-08-28 bake-off-page one.

THE REAL DEFECT is the test. It matched only markdown ](path) links -- 18 of the
49 pointers in the file. The other 31 are bare code spans, and that set included
every pointer in Known traps and docs/learned/assessment_cossart.json, the Cossart
row the index was written for. The suite went green over a dead row, in the test
whose own docstring argues a dead row is worse than a missing one. Third check in
this repo that could not fail.

Code spans are checked now. They resolve against the repo root or docs/, because
the index writes both and inside a section the shorthand reads better; the job is
catching a pointer to NOTHING, not enforcing one path style on prose. Five rows
that used section-local shorthand are now explicit, which is better for a reader
than a looser test. docs/decisions.md stays exempt by name -- owed, not written,
and its row says so instead of linking.

New rule in the file, because the dead row was not a typo: a row may only point at
something that exists on main. This repo runs 14 worktrees; citing a branch is how
the rot recurs. Land it, then index it.

Two Cossart rows added, both previously unreachable: the executable spec
(test_import_dandi.py, test_fair_bakeoff_transfer.py) and the 2026-08-29 transfer
handoff carrying the retractions -- without which a session finds the index and
still quotes superseded numbers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
defazio2 and others added 2 commits August 31, 2026 06:20
…inter it duplicated comes off

Two trims so this branch fits, and the second one is the point.

THE ANNOUNCEMENT GOES FROM THREE LINES TO ONE. Merged with main, the briefing
measured 9,215B against a 9,150B budget on a fresh clone -- over by 65 -- and
the ladder degraded FOUNDATIONS §9 to its bolded claims. What it drops in that
state is the consequence half: that a detector returning little under TTX is not
thereby validated, and that a nonzero coactivity excess is evidence about the
preparation rather than a false-alarm floor to raise min_rois until it
disappears. Losing that to keep the index's origin story is the wrong trade.
The story is IN the index, which is where a reader who cares already is. The
address is the payload.

THE POINTER FILE RETIRES INTO THE THING IT WAS STANDING IN FOR. It was added
hours ago because two decisions sat in docs/learned/ where the briefing does not
look, and it duplicated what docs/INDEX.md already does properly. Tony, on
seeing it: "I'm beginning to realize the pointer fix was a Bandaid on a bullet
wound." He is right. With the index landing, the pointer shrinks to the single
decision genuinely open -- promote the 24-seed bake-off or not -- and the K
question it also carried is deleted, because K was never open.

THAT IS THE INCIDENT THIS BRANCH EXISTS FOR, and it happened to me. K=12 for the
Cossart corpus was decided on 2026-08-29 across all 59 of their recordings,
written into a handoff on main, indexed by keyword as "K=3 vs K=12 -- read
before quoting any transfer figure", and the [cossart] role in
current_export.toml carries DO NOT TRANSPLANT OUR K in capitals. I ran the whole
transfer at k=3 and k=8 anyway, twenty-five minutes of compute, and landed it.
The index's own first line says it exists because a session re-derived the
Cossart machinery already in the tree. I then did it again -- because the index
was not on main, because #415 was red, from the same briefing-budget defect I
hit independently and fixed in #418. The fix for the failure was one unmerged
pull request away, blocked by the bug that caused the failure's twin.

The structural reading is filed rather than acted on:
docs/todo/2026-08-31-a-decision-in-prose-will-be-re-derived.md. Short version --
the role note carries the prohibition and not the number, and cites a figure
(405 ROIs) that the same handoff retracted to 566. A prohibition without an
alternative is an instruction to improvise. Put k = 12 in the role, have
derive_spec read it, and the error becomes impossible instead of documented.

NOT MY BRANCH. bugarach-17 built #415 and ended; short-course-56 handed it over
saying it was not asking me to take it on. Tony approved me landing it once it
turned out to be the root cause of a wrong result. The only files touched are
the one conflicted hunk and the pointer I added myself.

Fresh clone, no data, no darkroom, no board: 9,056B against 9,150, no
degradation, briefing tests 34 passed 1 skipped.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@syncytium2

Copy link
Copy Markdown
Owner Author

Taking this over with Tony's approval — bugarach-17 ended and short-course-56 handed it across explicitly not asking anyone to pick it up. It turned out to be the root cause of a wrong result, so it stopped being optional.

Why it was red, and it wasn't this branch's fault alone

The index announcement adds 3 lines / 224B to the briefing. That took it over the 9,000B budget, the ladder degraded FOUNDATIONS §9 to bare claims, and four tests went red — one of them test_it_carries_the_ttx_fact, which is not about size at all.

I hit the identical defect independently last night and fixed the budget side in #418 (gates block trimmed −112B; budget 9,000 → 9,150 with hook_spill_census.sh re-run as evidence, 1,036B under the smallest refusal).

What I changed here

  1. Merged main — one conflict in tools/session_briefing.sh, both sides' edits to the gates block, resolved keeping both.
  2. Announcement 3 lines → 1. After the merge it still measured 9,215B against 9,150 on a fresh clone — over by 65. The origin story is in the index, which is where a reader who cares already is. The address is the payload. (This was short-course-56's own first option.)
  3. Deleted the pointer todo I added in Two decisions were waiting where the briefing does not look #423. It existed only because the index was unreachable; it duplicated what this file does properly. Tony: "the pointer fix was a Bandaid on a bullet wound."

The incident that made this urgent

docs/INDEX.md line 4 says it exists because "a session spent several turns re-deriving that the Cossart/DANDI transfer machinery exists."

I then did it again. Overnight I ran the Cossart transfer at k=3 and k=8. The answer — K=12 — was measured across all 59 recordings on 2026-08-29, written into a handoff on main, and indexed by this file as K=3 vs K=12 — read before quoting any transfer figure. The [cossart] role even carries DO NOT TRANSPLANT OUR K in capitals.

The index would have caught it. It wasn't on main because this PR was red — from the same bug I'd independently rediscovered. The fix for the failure was one unmerged PR away, blocked by the bug that caused the failure's twin.

Structural follow-up filed: a decision in prose will be re-derived. The role note carries the prohibition but not the number, and cites ~405 ROIs which that same handoff retracted to 566.

Verified

Fresh clone, no data / darkroom / board: 9,056B against 9,150, no degradation, briefing tests 34 passed + 1 skipped. Full suite 1660 passed, 48 skipped. Sapper clear.

94B of headroom is thin — tracked.

🤖 Generated with Claude Code

@syncytium2
syncytium2 enabled auto-merge (squash) August 31, 2026 10:30
@syncytium2
syncytium2 merged commit 81cc134 into main Aug 31, 2026
3 checks passed
@syncytium2
syncytium2 deleted the the-index branch August 31, 2026 10:41
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.

2 participants