Skip to content

"1 token today" read as a surveyed field, when the screen had four candidates - #2796

Merged
Flotapponnier merged 1 commit into
devfrom
fix/capital-divergence-funnel
Oct 4, 2026
Merged

Flotapponnier merged 1 commit into
devfrom
fix/capital-divergence-funnel

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Reported from the live page: the Valuation divergences tab shows 2 while the visible section lists one token, and it is not obvious whether something is broken.

Nothing is broken, and that is the problem

The tab counts protocols carrying either signal. There are two screens, fees-up-token-down (Moonwell) and its mirror fees-down-token-up (Sushi), one row each, and the second sits below the fold. Correct, but unreadable.

Measured against /api/capital today:

protocols on the board 67
testable (three readings present, category median usable) 62
missing readings across 67 rows × 3 fields 0
grew fees past +20% 33
sit under their category median 38
token fell more than 10% 4
token rose more than 10% 39

The fee leg and the P/F leg each match about half the field. The token leg matches four rows. The screen wants a falling token in a month where 39 of 62 rose more than 10%, so it had four candidates before any other clause applied and one survived.

So the short list is the market's direction, not the filter's strictness, and the page communicated neither. "1 token today" with no denominator reads as a swept field. This is the {{count}} / {{ranked_count}} lesson from #2782 in a different surface.

What changes

The three counts, printed under the table. Taken from the rows the table itself renders, so a reader can recompute each one. divergenceFunnel() in capital-hub-rules.ts, pure, five tests.

The rows that can never qualify, named. Five protocols sit in Yield (2 members) and DEX Aggregator (3), below SIGNAL_MIN_CATEGORY_MEMBERS, so they are excluded before any clause is tested. Two of them would have cleared both legs today. The page did not say they were ineligible, only that they were absent.

The heading. It read "fees up, token down, price to fees under the category median" over a list that also carries the mirror, which is exactly why a 2 on the tab and one row underneath could not be reconciled. Now "fee trend against token move, in both directions".

No harness change, no API change: every number was already on the row.

Rendered today

What the screen had to work with. Both readings run over the same 62 testable protocols of 67 on the board. This month 33 grew fees past 20% and 38 sit under their category median, but only 4 saw the token fall more than 10%, against 39 that rose by more than that. A screen that wants a falling token has that many candidates before any other clause applies, so a short list here is usually the month rather than the filter. A further 5 protocols sit in DEX Aggregator and Yield, categories with fewer than 5 ranked members: the median there is a pair rather than a peer group, so those rows cannot carry either signal whatever they do.

Those figures match an independent read of /api/capital exactly.

Verified

pnpm typecheck, eslint clean on all three files, pnpm test 430 pass / 0 fail (+5), page renders 200 with the copy above.

…ndidates

The divergence list on /capital prints how many rows carry a signal and
not how many it had to choose from, so a short list reads as a field that
was swept and produced one answer. The usual cause is the reverse.

On the live board today: 62 of the 67 protocols are testable, 33 of them
grew fees past 20% and 38 sit under their category median, both about
half the field. Only 4 saw their token fall more than 10%, against 39
that rose more than 10%. The fees-up-token-down screen wants a falling
token in a month where tokens rose, so it had four candidates before any
other clause applied, and one survived. That is the month, not the
filter, and the page said neither.

Prints the three counts under the table. They are taken from the rows the
table itself renders, so a reader can recompute every one. Same lesson as
the spec tokens: a count published without the set it came from is not a
reading.

Also names the rows that can never qualify. Five protocols sit in Yield
(2 members) and DEX Aggregator (3), under the floor where a category
median is a peer comparison rather than a pair, so they are excluded
before any clause is tested. Two of them would otherwise have cleared
both legs today.

And the section heading described one screen while the tab counted two.
It read "fees up, token down, price to fees under the category median"
above a list that also carries the mirror signal, which is why a reader
seeing 2 on the tab and one row under that heading cannot reconcile them.
@Flotapponnier
Flotapponnier merged commit 2c86b44 into dev Oct 4, 2026
2 checks passed
@Flotapponnier
Flotapponnier deleted the fix/capital-divergence-funnel branch October 4, 2026 10:14
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.

1 participant