Capture
The night as a funnel from 7395 launches to 4 fills, what each refusal reason cost, and where the runners we never saw actually were.
REPORT-capture.md · updated 06/09/2026 07:42:40Worker: analysis-capture. Window everywhere below is 2026-09-05 21:00 to 2026-09-06 07:00 Beirut, that is 18:00Z to 04:00Z. Read-only pass. Scratch under analysis-2026-09-06/data/capture/.
Digest for Thomas 09:00
Experiment A, day one, hour 8.4 of 24 (20:05Z Sat to 04:27Z Sun).
Rate: 648 events/h, 297 buys/h, 5637 rows, 2586 buys, 1735 traders, ingest lag median 8.7 s.
Coverage by token age at alert (buys): under 15m 136 · 15 to 60m 174 · 1 to 6h 426 · 6 to 24h 229 · over 24h 1292 · unknown 329.
Candidates (D3, under 6h and mcap under $3M at alert): 139. Upstream (no proven wallet before, one after): 16.
Wallet resolution: 813 of 2586 buys carry a wallet, 31%, up from 12% at hour one.
Holes: 0. Quote misses: 36 of 139 candidates, 26%.
D4 count now: 23 young first-buys, 22 traders. Thresholds are under 30 or under 10 traders at Sun 23:00.
D4 trend: NOT trending to kill on the count (23 at hour 8.4 projects to about 66), and already clear on traders.
Caveat that decides it: the +60% leg of D4 has fired 0 times because peak60mPct exists on 5 rows of 5637.
The whole D4 count is the proven-within-15-min leg, and 13 of 23 sit on one token, PEZ, which then rugged.
Read: the Fomo feed is real but shallow. It leads our proven wallets by a median of 5.4 minutes, not hours.
Bigger hole: 10 of the 12 tokens that ran +100% overnight with no proven-wallet buy are not in the Fomo feed either.
TLDR
- The night launched 7395 pairs. 96 ever showed $25k liquidity, 19 ran +100% on real volume, 7 got a proven-wallet buy, 5 got a book, Gold v2 got 4. We are catching about a fifth of the runners.
- The 12 runners we never saw are the story, not the ones we refused. 10 of those 12 do not appear in the Fomo feed either, so a second social feed would not have caught them.
- No Gold v2 refusal reason cost money on median. The heat guard (median -70%) and the chase guard (median -73%) are the two best rules on the board. Loosening either is the wrong move.
- The mcap cap refused the most rows (73 rows, 37 tokens) at a median of -7.5%. Raising it buys volume, not edge, on this night's sample.
- Experiment A is not trending to kill by the letter of D4, but the D4 count is running on one leg because the tape pipeline is stuck: 9 tapes in
retry_at, 1166 accumulated attempts,peak60mPcton 5 rows. - The Fomo lead time is 5.4 minutes median, max 13.8. That is real but it is a latency edge, not a different population.
- Gold v2 bought a copycat PEZ. The real PEZ (
0xa360…, +5312%) was refused at 00:40 for mcap $9.2M over cap; the PEZ the follower bought at 02:06 was0xcfc4…, a 16-minute-old token signalled by frankdegods, and it rugged.
1. The night, as a funnel
| stage | count | source |
|---|---|---|
| pairs created in the window | 7395 (6796 distinct token addresses) | data/watchtower/runtime.json registry[].createdAt |
| ever showed liquidity >= $25k | 96 | same, registry[].lastLiqUsd |
| ever showed liquidity >= $10k | 590 | same |
| ran +100% with 24h volume >= $50k | 19 | analysis-2026-09-06/data/capture/dexscan.json, DexScreener priceChange.h6/h24 and volume.h24 |
| a proven wallet bought (any token, any age) | 112 tokens, 194 rows, 49 wallets | data/watchtower/feed.jsonl |
| of those 112, launched inside the window | 58 | join of the two above |
| any book took | 28 tokens | data/watchtower/paper-ledger-v2.jsonl type=open |
| Gold v2 took | 9 | same, set="Gold v2" |
| the follower filled | 6 buys (hoodrat, AJC, ZEP, LIQLORACLE, PEZZED, PEZ), 3 skips | data/executor/follower-fills.jsonl |
Two caveats stated plainly. lastLiqUsd is the last value the watchtower observed, not the peak, so the 96 undercounts tokens that peaked and then had liquidity pulled. And priceChange.h6/h24 is a now-versus-then number, not a peak, so the 19 undercounts tokens that ran and fully round-tripped. Both errors push the same way: the real runner count is higher than 19, and our capture share is worse than the table says.
The 19 runners against what we did
| token | run | vol24 | liq now | proven buy? | book |
|---|---|---|---|---|---|
| ASTRA | +8135% | $768k | $43k | no | none |
PEZ (0xa360…) |
+5312% | $23.0M | $172k | yes, 00:40 | refused, mcap $9.2M over cap |
| DOHJ | +2787% | $1.34M | $88k | no | none |
| MUPPETS | +1328% | $2.72M | $79k | yes, 21:12 | Gold v2, Gold-flat, Gold-hold |
| QRAFT | +1078% | $372k | $145k | no | none |
| STOCKKIT | +809% | $4.50M | $64k | no | none |
| HD | +619% | $727k | $57k | no | none |
| LIQLORACLE | +611% | $6.30M | $100k | yes, 00:59 | Gold v2 + live |
| Onboard | +430% | $2.49M | $51k | no | none |
| BRRR | +425% | $152k | $90k | no | none |
| PONINU | +414% | $1.48M | $49k | no | none |
| RUIN | +411% | $495k | $48k | no | none |
| PINE | +318% | $969k | $55k | yes, 21:30 | refused, age 63m over the 60m ceiling |
HODL (0x0e25…) |
+266% | $233k | $71k | no | none (a different HODL was in the feed) |
| BUSINESS | +257% | $743k | $59k | yes, 21:19 | Gold v2 |
| VALUELESS | +208% | $468k | $82k | no | none |
| RSTR | +175% | $3.34M | $36k | yes, 20:16 | refused by Gold v2 (heat, 1h run +633%), taken by Hot |
| DUMBCRAYONEATER | +154% | $1.18M | $34k | yes, 00:15 | refused, age 145m over the 60m ceiling |
| Doohnibor | +101% | $1.27M | $23k | no | none |
Runners a book refused, with the verdict, the time and what happened after (data/watchtower/feed.jsonl, marks from analysis-2026-09-06/data/capture/marks-merged.json):
- PEZ
0xa360…, 00:40:19Z,mcap $9.2M over the $1.0M cap(handle paidinfullintel), again 01:25 at $6.7M. From that print to now it is -65% and -52%, so the cap did not cost money on this entry even though the token's day was +5312%. The run happened before our wallets bought it. - PINE, 21:30:28Z and 21:30:48Z (NotARandomUser then frankdegods),
age 63m over the 60m ceiling. Missed the ceiling by 3 minutes. From the print to now, -30%. The ceiling was right here. - DUMBCRAYONEATER, 00:15:51Z (81_tom),
age 145m over the 60m ceiling. No current mark, liquidity $34k, the +154% is a DexScreener h24 number that includes the pre-buy run. - RSTR, 20:16:42Z (fr3ak),
1h run +633% at or over the +500% heat ceiling. From the print to now, -66%. The heat guard was right. - HODL
0x7cbe…, 20:01:33Z (0xdedrater), heat +866%. -85% to now. Right again.
The 12 runners with no proven-wallet buy at all
Cross-checked against research/call-sourcing/data/experiment-a/fomo-events-materialized.jsonl (tokenAddress, type=buy):
| token | in the Fomo feed? |
|---|---|
| ASTRA, DOHJ, QRAFT, Onboard, BRRR, PONINU, RUIN, HODL, VALUELESS, Doohnibor | not present at all |
| STOCKKIT | 1 buy, bigfly $5k at 02:23:25Z, token 20 min old, provenBefore=false |
| HD | 2 buys, first shipshape $4k at 22:29:10Z, token 240 min old, provenBefore=false |
That is the sharpest result of the lane. Ten of the twelve tokens that ran and that our 56 proven wallets never touched are also invisible to the Fomo feed. Adding a second social feed of the same kind buys us STOCKKIT and HD, not the other ten.
On-chain first-buyer identification for those twelve was attempted and is blocked. Blockscout's etherscan-compatible route (/api?module=account&action=tokentx&sort=asc) returns Too many requests persistently; Blockscout v2 has transfers_count: 0 on this chain so there is no cheap way to page to the earliest transfer; the public RPC returned 429 on the one eth_getLogs probe and the README forbids eth_getLogs on Alchemy. Contract creator lookups via Blockscout v2 succeeded on 3 of 24 attempts before rate limiting (analysis-2026-09-06/data/capture/creators.log). This needs a paid data key, see the execution lane.
2. Refusal cost
Every Gold v2 verdict in the window, first occurrence per (token, reason), marked from the print price at refusal (feed.jsonl printPriceUsd) to the DexScreener price now. Tokens whose liquidity is now under $5k or that DexScreener no longer indexes are counted as "gone" and excluded from the median, since their printed price is a liquidity-pull artifact.
| Gold v2 verdict | tokens | marked | gone | median % | winners | best |
|---|---|---|---|---|---|---|
| mcap over the $1.0M cap | 37 | 31 | 6 | -7.5 | 11 | ZZZ +122% |
| age over the 60m ceiling | 34 | 22 | 12 | -10.9 | 10 | FSD +88%, BAWSAQ +79%, Chairman +74% |
| liquidity under the $25k floor | 20 | 4 | 16 | -15.1 | 0 | none positive |
| ACCEPTED (Gold v2 took) | 9 | 5 | 4 | +63.1 | 4 | MUPPETS +317% |
| heat, 1h run over +500% | 8 | 6 | 2 | -70.2 | 0 | best was -48% |
| chase, entry unpriced | 5 | 5 | 0 | -73.2 | 0 | best was -51% |
| already holding | 4 | 2 | 2 | +197.8 | 2 | MUPPETS, LIQLORACLE |
| band not in the live set | 4 | 0 | 4 | n/a | 0 | |
| cooldown | 3 | 3 | 0 | -45.9 | 0 | |
| wallet ticket under $100 | 2 | 1 | 1 | -43.5 | 0 | |
| rug ratio | 2 | 1 | 1 | +104.7 | 1 | PEZZEL |
| cohort | 1 | 1 | 0 | +43.2 | 1 | hoodrat |
Full table: analysis-2026-09-06/data/capture/refusal-cost-final.json.
Answers to the two questions in the brief:
- Which reason refused the most money. None of them, on this night. The largest refusing bucket, mcap over cap, has a median of -7.5% and 11 winners of 31. Its mean is corrupted by HOLO at +4,178,924%, a max-tick liquidity-pull artifact, which is why every number above is a median.
- Which reason saved the most. Heat (median -70.2%, zero winners of six) and chase (median -73.2%, zero winners of five). Between them they refused 13 tokens and not one of them was up. The liquidity floor is third: 16 of its 20 tokens are now dead or unindexed.
The honest caveat: these are marks from refusal to now, up to 10 hours, so they are the buy-and-hold number, not a +15 / +60 / +240 mark under a trailing exit. A trailing book would have banked part of the mcap-over-cap and age-over-60 tails (FSD +88%, ZZZ +122%) that this table shows as median losers. n = 121 token-reason pairs total, so the top four buckets are real and the bottom eight are anecdotes.
The "wider set" answer in one line: widening the age ceiling from 60 to about 180 minutes is the only loosening this data supports (10 winners of 22, three above +70%), and it should be paired with the existing heat and chase guards, which are what stop the widened set from being garbage.
3. Experiment A, round one
Digest reproduced. See the block at the top. Numbers from fomo-events-materialized.jsonl (5637 rows), mark-state.json, and the 07:23 collector line in progress-experiment-a.md.
The scorer runs cleanly. node scripts/score-scouts.mjs data/experiment-a/fomo-events-materialized.jsonl:
inputRows 5707 · youngFirstBuys 444 · traders 360 · maxAgeSec 21600
eligible 0 · min 3 · tradersWithMarks 76 · top []
Zero eligible because eligibility needs 3 marked events per trader and only 76 of 360 traders have a single mark. This is a marks problem, not a population problem.
D4 as of 04:27Z. Young (under 6h, known launch) first buys by (trader, token): 444 across 360 traders. Of those, 167 had no proven wallet before them across 157 traders. Of those, 23 across 22 traders met a D4 leg. Leg A (a proven wallet within 15 minutes after) fired 23 times. Leg B (+60% within 60 minutes) fired 0 times. Thresholds are under 30 or under 10 traders at Sunday 23:00. At hour 8.4 of 24, 23 projects to about 66. D4 is not trending to kill.
That said, the count is fragile in a way the orders file did not anticipate. The 23 sit on four tokens:
| token | D4 rows | lead over the proven wallet |
|---|---|---|
| PEZ | 13 | 125 s to 825 s |
| RKST | 5 | 21 s to 275 s |
| UNIPCS | 4 | 106 s to 550 s |
| TEST | 1 | 0 s |
Median lead 326 s, p90 660 s, max 825 s. The Fomo feed sits 5.4 minutes upstream of our wallets on median, not hours. And 13 of 23 are on PEZ, which is 0xa360…, the token that later showed +5312% and whose copycat rugged us.
The broken tape is costing D4 real rows, and they are exactly the interesting ones. STOCKKIT (bigfly, $5k, age 20 min, mcapAtAlert $2.43M) and HD (shipshape, $4k, age 240 min, mcapAtAlert $986k) are both D3 candidates with provenBefore: false and provenAfterSec: null, meaning no proven wallet ever bought them. They then ran +809% and +619%. They are precisely the "Fomo trader is early on a token our wallets never reach" case that D4's leg B was written to catch, and leg B cannot fire because peak60mPct is null on both. The population D4 is meant to measure may be materially larger than 23; we cannot tell until the tape worker is fixed.
The 16 upstream rows (Bolo's upstream=16, strict candidates only) are three tokens: UNIPCS (13 rows, 21:49 to 22:26, mcap $588k rising to $2.74M, ticket $3k to $16k), DUMBCRAYONEATER (2 rows, 22:30), TEST (1 row, 21:24). Full rows in analysis-2026-09-06/data/capture/upstream-rows.json.
Repeat scouts. Across the 16 upstream rows and the 23 D4 rows, three handles appear more than once: xfilesboy (3 appearances, UNIPCS twice and RKST once, the tightest leads in the set at 106 s, 84 s and 21 s), LeftCurveConnoiseur (2, both UNIPCS, wallet 0xf42b73d2 unique-match), Iamurbigbro (2, both UNIPCS, wallet 0x0ec4e45f unique-match). Everyone else appears once. n = 3 repeat handles is an anecdote, and two of the three repeat only inside a single token, which is a crowd, not a scout.
The elevated errors= counts. The BOLO progress line reports errors=1121 on marks-v3 at 07:18. marker.log is 0 bytes so it holds nothing. The source is recoverable from mark-state.json and marks.json:
mark-state.json:errors 1166,cycles 1313,deadlineMisses 36,tapes 25,entries 103,forwardMarks 274, and nolastErrorkey, which means the top-level catch atscripts/mark-experiment-a.mjs:317never fired.marks.json: exactly 9 rows carrytapeError, all withtapeStatus: "retry_at", andtapeAttemptsacross all rows sums to 1166. The message on all nine is identical:isolated tape worker failed: Command failed: /usr/bin/node .../mark-experiment-a.mjs --tape-worker <alertId> <fromMs> <toMs>, with no stderr captured.
So the precise list for Bolo is: the error counter is not 1121 distinct failures, it is 9 stuck tape rows retried about 130 times each at scripts/mark-experiment-a.mjs:295. Three concrete asks: (a) capture the child process stderr into tapeError instead of discarding it, (b) cap tapeAttempts and mark the row terminal_no_route (D5 already defines that state), (c) peak60mPct exists on 5 rows of 5637 and up60At on 1, so the D4 leg B has never been measurable. Fixing the tape worker is a higher priority than any new collection.
4. Where else
Populations on this chain that we do not read, ranked by expected calls per day and by how early they land. Reference point: our proven-wallet feed's first buy on a token lands at a median token age of 795 minutes, and only 194 rows a night (about 465 a day) with a median lag of 5 s from the on-chain buy.
| rank | population | one query to test it | sample per day | how early |
|---|---|---|---|---|
| 1 | Pons launch snipers, block 0 to 3 of the pool | eth_getLogs for Swap on the PoolManager for the first 40 blocks (4 s) after each TokenLaunched, keep the taker addresses, cluster by repeat appearance across launches |
96 launches reached $25k liquidity in 10 h, so about 230/day; at 5 to 20 takers each that is 1000 to 4000 wallet-launch pairs/day, and maybe 30 to 60 wallets that repeat | age 0 to 4 seconds. 795 minutes earlier than the proven feed. This is the only population that is structurally earlier rather than incrementally earlier |
| 2 | Wallets funded from the same root as known deployers | Blockscout /api/v2/addresses/{deployer}/transactions for the funding tx of each of the night's deployers, then the sibling addresses funded by that same root |
frankdegods alone launched 5 tokens in one night (memory/2026-09-06.md 05:29 block); at 20 to 40 deployers a night this is 50 to 200 sibling wallets to watch |
before launch. It is a pre-launch signal, not a buy signal. This is also the rugs lane's edge #2 |
| 3 | Fomo social feed (Experiment A, running) | already running | 7100 buys/day, 1225 young first-buys/day, 380 D3 candidates/day, about 63 D4 rows/day | 5.4 minutes ahead of the proven feed on median, 13.8 max. A latency edge over the same tokens |
| 4 | Telegram caller channels (already scraped, not wired) | data/watchtower/callers.jsonl already has kind:"call" rows |
11 calls in the window, about 26/day, on 3 channels (PowsGemCalls 8, sugarydick 2, overdose_gems_calls 1) | mostly late. The one call in the window carried delayMin in the thousands on a prior sample and the first row in the window was $UNI, a major. Low value as a caller feed, possible value as a crowd confirmation |
The ranking is unambiguous: #1 is the only one that changes what we can see. Everything else is a faster or wider read of tokens the proven feed eventually reaches anyway. And it is the population that would have surfaced ASTRA, DOHJ, QRAFT, Onboard, BRRR, PONINU, RUIN, HODL, VALUELESS and Doohnibor, the ten runners nothing we own saw.
The cost is the constraint. Watching first swaps on 230 launches a day at 0.1008 s block time (measured, eth_blockNumber and eth_getBlockByNumber on the public RPC) means about 40 blocks of eth_getLogs per launch. That is an eth_getLogs budget the free Alchemy tier cannot carry, which is exactly what killed detection 05:41 to 07:08 this morning. This is a paid-data decision, and it belongs with the execution lane's Alchemy question.
Recommendations
Ship now (config only, reversible)
- Raise the Gold v2 age ceiling from 60 to 180 minutes, keep heat and chase unchanged. The age bucket refused 34 tokens with 10 winners including FSD +88%, BAWSAQ +79% and Chairman +74%, at a median of -10.9%, and the two guards that actually protect us (heat median -70%, chase median -73%) sit downstream of the age check and will filter the widened set. Note honestly: median is negative, so this is a tail bet, not an expected-value improvement on this night's n.
- Do not touch the mcap cap, the liquidity floor, the heat ceiling or the chase guard. All four are net-positive or neutral on the night's numbers and two of them are the best rules on the board.
- Add a symbol-collision guard to the follower: refuse a token whose symbol matches a token already in the registry with more liquidity. Gold v2 bought PEZ
0xcfc4…at 02:06 (age 16 m, mcap $97k, frankdegods) while PEZ0xa360…(created 23:59Z, liquidity $172k, the actual runner) was already in the registry. Same for the three HODL addresses in the feed. This is a config-level check againstruntime.jsonregistry.
Build (code, with the test that proves it)
- Fix the Experiment A tape worker. Capture child stderr into
tapeError, captapeAttemptsat 5 and move the row toterminal_no_route. Test: force one tape worker to exit non-zero and assert the row reachesterminal_no_routewith the stderr text intapeError, and thatmark-state.errorsrises by 5 not 130. Until this lands, D4's leg B is unmeasurable and the Sunday 23:00 count decides on one leg. - Block-0 sniper collector, shadow only. For each
TokenLaunchedthe watchtower already reads, record the takers of the first 40 blocks of the pool intoresearch/call-sourcing/data/snipers/. Test: replay the ASTRA and DOHJ launch blocks and assert the collector produces a non-empty taker list for each, since these are two tokens nothing we own saw. This is gated on recommendation 8. - Persist launches. The night's launch list had to be rebuilt from
registry[].createdAt, which stores last-seen liquidity, not peak, so the funnel's "reached $25k" number is a floor rather than a count. Test: an append-onlydata/watchtower/launches.jsonlwithlaunchTs,launchBlock,poolIdand a peak-liquidity high-water mark, and a replay that reproduces the 7395 count for this window.
Needs Thomas (money, accounts, or a call only he makes)
- A history API key. Blockscout rate-limits the one route that returns transfers in ascending order, and Blockscout v2 reports
transfers_count: 0on this chain, so first-buyer identification is currently impossible for us at any volume. Without it, question 1's "who bought first" stays unanswered for the ten runners we missed. - The
eth_getLogsbudget for the block-0 sniper feed. This is the same paid-tier question the execution lane is costing. The capture-lane number to feed into that decision: about 230 qualifying launches a day at roughly 40 blocks of logs each. - A call on the D4 threshold. D4 as written will pass at 23 and rising, on a count where 13 of 23 sit on one token and the second leg has never fired. The letter of D5 says the thresholds cannot move. The spirit says a pass on those numbers means little. Rook should not decide this alone at Sunday 23:00.
Open questions
- What did the ten invisible runners look like at block 0? Blocked on recommendation 7. Until it is answered, the claim "the sniper population is the real edge" is an inference from absence, not a measurement.
lastLiqUsdis last-seen, not peak, so the "96 reached $25k" figure is a floor. How many of the 7395 briefly touched $25k and were pulled is unknown.- MUPPETS: Gold v2 opened at 21:12:14 and closed at 21:18:48 for $0.00 realized, and the token is +317% from the entry print. That is an exit question, not a capture question, and it belongs to the positions lane.
- The Fomo feed's 5.4-minute lead is measured against
provenAfterSec, which is a join field produced by Bolo's pipeline. It was not independently verified againstfeed.jsonltimestamps in this pass.
Sources
data/watchtower/runtime.json(registry[].createdAt,lastLiqUsd,tokenAddress,dexId;ponsCursor)data/watchtower/feed.jsonl(ts,symbol,token,handle,ageMin,mcap,liquidityUsd,printPriceUsd,lagSec,verdicts,live)data/watchtower/paper-ledger-v2.jsonl(type,set,symbol,ts,realizedUsd)data/executor/follower-fills.jsonl(ts,side,symbol,reason,pnlUsd)research/call-sourcing/data/experiment-a/fomo-events-materialized.jsonl(type,trader,tokenAddress,usdValue,ageAtAlertSec,mcapAtAlert,provenBefore,provenAfterSec,peak60mPct,traderWallet,walletConfidence)research/call-sourcing/data/experiment-a/marks.json(tapeError,tapeStatus,tapeAttempts,peak60mPct,up60At,poolTick15m),mark-state.jsonresearch/call-sourcing/progress-experiment-a.md(collector and BOLO lines, 03:37 to 07:23)research/call-sourcing/EXPERIMENT-A-ORDERS-2026-09-06.md(D1 to D6)research/call-sourcing/scripts/score-scouts.mjs(run at 08:20, output quoted above),scripts/mark-experiment-a.mjs:295and:317data/watchtower/callers.jsonl(kind:"call",channel,at,delayMin)- DexScreener
api.dexscreener.com/latest/dex/tokens/{addrs}batched 30 at a time, 400 ms apart, results inanalysis-2026-09-06/data/capture/dexscan.jsonandfeedmark.json, merged inmarks-merged.json - Public RPC
eth_blockNumberandeth_getBlockByNumbertwice for the 0.1008 s block time;eth_getLogsprobed once and returned 429, not retried - Blockscout
api/v2/tokens/{addr}/countersandapi/v2/addresses/{addr}, mostly rate-limited, log inanalysis-2026-09-06/data/capture/creators.log - Scratch:
analysis-2026-09-06/data/capture/(feed-tokens-window.json,runners.json,upstream-rows.json,d4-rows.json,refusal-cost-final.json,dexscan-best.json)