Skip to content

Stack ceiling: the tallest stack circular shifting can build, with an animated page - #877

Merged
syncytium2 merged 15 commits into
mainfrom
stack-ceiling
Oct 8, 2026
Merged

syncytium2 merged 15 commits into
mainfrom
stack-ceiling

Conversation

@syncytium2

Copy link
Copy Markdown
Owner

Tony's question of 2026-10-08, asked to get away from what stack shares with LoCo and count (sliding): what is the tallest stack of width w that circular shifting over a period p can build?

The answer is a count. Any ROI with an onset in the period can be slid into the window, so the ceiling is the number of ROIs with an onset in the period, and the fill is the unshifted height divided by it. No tail probability, no calibration, no draws.

  • src/bugarach/detectors/stack_ceiling.py: height, ceiling, fill and the growth curve, numpy only. Tests in tests/test_stack_ceiling.py.
  • tools/make_stack_ceiling_demo.py: an animated page on two of the bench's simulated recordings. The tool checks every number the page computes against the module before writing it.
  • docs/learned/runs/2026-10-08-stack-ceiling/: the page, one frame of it, and what one seed showed.

A prototype, not a detector. No calling rule, no bench run, no real recording. On this seed the 10-ROI planted event stands clear on fill, the 3-ROI event sits below the busiest background moment, and a raised-rate stretch reaches 0.59 with nothing planted.

Not set to merge by itself: the page has not been through the murderboard, and the idea is still being worked with Tony.

🤖 Generated with Claude Code

defazio2 and others added 15 commits October 8, 2026 10:55
…nd how much of it stands

Tony, 2026-10-08, asking for something independent of the approaches stack shares with LoCo
and count (sliding): what is the tallest stack of width w that circular shifting over a period
p can build? The answer is a count. Any ROI with an onset in the period can be slid into the
window, so the ceiling is the number of ROIs with an onset in the period, and the fill is the
unshifted height divided by it. No tail probability, no calibration, no draws.

stack_ceiling.py computes height, ceiling, fill and the growth curve (the tower's height against
the shift each ROI is allowed), numpy only. make_stack_ceiling_demo.py builds an animated page
on two of the bench's simulated recordings: a period shifting toward the window, the tower it
builds and the curve it traces. The tool holds every number the page computes to the module
before it writes the page.

A prototype, not a detector: no calling rule, no bench run, no real recording. On this one seed
the 10-ROI planted event stands clear on fill, the 3-ROI event sits below the busiest background
moment, and a raised-rate stretch reaches 0.59 with nothing planted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rebuild elsewhere

Tony, on the first page: fun to watch, but without calls it is only mesmerizing.

The rule stays in the language of shifting and still computes no probability. A tower at a
moment stands with no shift; the cost to rebuild it elsewhere is the shift per ROI it takes to
build one as tall at a typical other moment of the same period, in seconds. A moment is called
when that cost reaches a setting and at least 3 ROIs stand.

The page now holds a calls lane above the whole recording, verdicts on the planted events, and
a slider for the setting, with fill offered as the plainer rule to compare. On this seed both
rules find the four planted events of 6 and 10 ROIs and miss both of 3; in the raised-rate
stretch fill makes 22 calls and the rebuild cost makes 1. The settings were picked by eye on
four seeds of these recordings, so that is a fit and not a test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tony's layout: the three figures at the top, each with its legend, the controls after them and
the explanation last. The tool row keeps its place in the page after the figures and stays in
view while they are on screen, so the shift can be played while watching it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tony's ruling of 2026-10-08, made on the stack ceiling page after he had it rearranged: the
figures at the top, the controls stuck to the bottom of the window, the explanation at the
bottom of the scroll, and each figure's legend kept with the figure.

The record lands with the first page built that way, a line in CLAUDE.md's plot conventions,
and a test that holds that page to the four points. It covers one page: checking every page
builder needs a shared shell, and that request goes to the armory repository as the estate's
half. Whether long written reports count as figure pages is left open for Tony.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… in place

Tony's answer to the question the record left open. A written report opens with the one figure
that carries its finding; every other figure sits where the text discusses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e calls, and no more

Tony: try it on the bench. The rule ran on all three streams with the bench's scorer and each
recording's floor, at eleven thresholds, beside CoactDetect, LoCo, count (sliding) and
stack (global). The threshold was picked on the even fresh seeds and everything reported is
from the odd ones: 672 recordings, 183 s.

It is not the breakout. On slow and combined the pick is the lowest threshold tried, where the
rule is count (sliding) and scores the same to the third decimal. On fast it trades 0.027 F1
gained on the busy background for 0.017 lost on the quiet one, and LoCo stays ahead on both.
It does make no call in the raised-rate stretch from 3 s up, but every detector is already far
inside that limit. Raising the threshold cannot buy precision, because the false calls are on
decoys, and a decoy is as costly to rebuild elsewhere as an event.

The record leads with the bench figure, as ADR-0014 asks of a report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dow, not the idea

Tony, on the first bench run: was stack_ceiling not optimized? It was not. Only the threshold
had been searched, beside detectors at fully searched operating points.

search_stack_ceiling.py searches the window, the period, the merge gap and the threshold as one
grid of 2,520 settings per stream, picks on the even fresh seeds inside count (sliding)'s three
limits and reports on the odd ones. Searched, the rule gains 0.016 F1 over LoCo on fast
(interval spans zero) and 0.021 on combined, and is level on slow, with no call on recordings
with nothing planted or in the raised-rate stretch.

The attribution is the finding. Against the best setting with the rebuild cost switched off,
the cost adds 0.008 on fast, nothing on slow and 0.001 on combined. What moves the score is a
0.5 s window in place of count (sliding)'s shipped 2 s, with the floor still counted at 2 s.
That is a question for count (sliding)'s own search, and the record says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e 0.5 s window was known

Checked at Tony's prompting. Fast LoCo and CoactDetect ship binned at points from 2026-09-16;
their sliding forms were searched on the realistic bench on 2026-09-26 and not adopted, and
reach about what the searched stack ceiling does. count (sliding) was searched the same night
and found the 0.5 s window, refused on its precision difference. The record now says both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…c bench cannot

Tony, once every tuned detector had landed within a few hundredths of F1 on fast: we need the
revised bench with short intervals. The realistic bench's gaps were measured from peaks of a
count in a 2 s window, so its shortest fast gap is 2.1 s.

measure_close_events.py is a controlled test that needs no real recording: on the fast bench's
recording half the gaps between planted events are set to one value, from 0.3 s to 10 s. At
10 s the detectors sit within 0.09 F1 of each other; at 1 s they span 0.40 to 0.66. The merge
gap decides it, then the window: the shipped 3 s merge gaps lose a third of the events until
the gap passes 5 s, and a 0.5 s window with a 0.2 s merge gap recalls every scored event down
to 1 s. Under 1 s nothing separates the pair.

A revised bench itself needs the real gaps measured again in a narrower window, and the
default folder is stopped (#858). The record says what that waits on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed at all

The 2026-09-25 measurement counted co-activity in a 2 s window and merged events under 2 s
apart, so the realistic bench holds no gap shorter than 2.1 s on fast. --window-sec sets the
count's window, the window the floor is counted in and the merge distance together. The
default is unchanged, floor key included, so the first measurement reproduces exactly.

Nothing is measured in this commit: the default folder is stopped (#858).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dow changes what an event is

Measured on the stopped default folder on Tony's acknowledgment, run by him; measurement only.
In a 0.5 s window 4 to 6 percent of gaps are under 2 s, where the 2 s measurement the bench
plants from could see none. The narrower window also counts more events, nearly twice as many
on fast, because the floor falls with it. A revised bench from that measurement would be a
bigger change than adding short gaps, and the record says so.

make_real_gaps_by_window.py reads the measurement's output files and reports every number
with and without the four DI recordings the stop names. No share moves by more than 0.01.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tony reran the 2 s window, which had written nothing on its first attempt. Its gaps.csv is
identical to the first measurement's, so --window-sec changes nothing at the default and the
1 s and 0.5 s results rest on a checked option.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…page, the index

Tony: prepare to end the session, and make sure this detector does not get lost. The todo holds
the detector's entry point, its searched settings per stream, the four findings, what waits on
him (what the revised bench is, whether the stack ceiling goes further, the unadopted fast
proposals) and what a session can do without a ruling. The goal page and the index point at it.
The darkroom claim is released.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@syncytium2
syncytium2 merged commit c35bfbf into main Oct 8, 2026
1 check passed
@syncytium2
syncytium2 deleted the stack-ceiling branch October 8, 2026 20:43
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