Real-ground report, no fabrication:
tools loaded (confirmed by tool returns, not claims):
- list_apps → returned 2 apps. vault-tracker exists: private, v2, 2 scripts. polymarket-terminal-v1 also present.
- readapp → returned 27.4KB manifest indexHtml scripts bundle. I got it, but before I could extract specifics into this message the framework auto-pruned it as a "stale batch." I have the fact that it returned successfully, but I don't have the raw script bodies in my active context right now. I can re-run readapp to grab them in the next turn.
- dryrunapp_script → ran real http real base RPC, results below.
real data from dry-run (pasted verbatim from tool output):
geckoterminal v2 /tokens endpoint for 0xE58DAe68886fECB66cc05960CdF5FBBa32DcBbA3:
- attributes keys: address, name, symbol, decimals, imageurl, coingeckocoinid, totalsupply, normalizedtotalsupply, priceusd, fdvusd, totalreserveinusd, volumeusd, marketcapusd
- NO holders field exists on v2. your -- on the holders KPI is because v2 doesn't return holders at all.
- total_supply: "100000000000000000000000000000.0" (string, raw 18-dec)
- decimals: 18
- price_usd: "0.0000005449939839"
geckoterminal p1 /top_holders for the same token:
- attributes keys: source, explorercoinurl, explorerholderurl, top_holders
- NO holders_count field on p1 either. not there.
- 50 holders returned
- actual holder shape: { walletaddress, amount (number, already decimal-adjusted, e.g. 65233920485.44 = 65.2B tokens), ownerpercent (number, e.g. 65.2339), valueinusd, isliquiditypool, entityname ("Uniswap"), entitytype ("dex"), label ("PoolManager"), ... }
- top holder is Uniswap PoolManager at 65.2% — this is the pool, needs filtering
on-chain totalSupply via base RPC:
- raw: "100000000000000000000000000000"
- formatted /1e18: 99,999,999,999.99998 ≈ 100B tokens
so the real state of the ground:
1. holders count (the -- on the KPI) — neither gt v2 nor p1 returns an aggregate holder count. to get it we need either (a) basescan API with apikey, (b) alchemy/quicknode token-holders endpoint with apikey, or (c) count len of p1 top_holders and label it "top N holders shown" instead of total. no free gt path gives total holder count.
2. top-10 panel balance/% bug — the p1 field is amount (already decimal-adjusted) and ownerpercent, not balance and nothing derivable via /totalSupply. if the UI currently reads h.balance and divides by totalSupply expecting raw 18-dec, the fix is to either (a) map amount → balance in the refresh script with correct scaling, or (b) change UI to read h.amount and h.ownerpercent directly. I'd need to re-read the current script html to pick the right path.
3. pool holder filter — must filter by isliquiditypool === true OR entity_type === "dex" OR label === "PoolManager". top holder on this token is Uniswap PoolManager, 65.2% — will dominate top-10 if not filtered.
what I have not done and am not claiming:
- I have not proposed line-number patches yet because the read_app body was pruned from my context before I could quote it. I need to re-read it.
- I have not dry-run the alert threshold logic.
- I have not tested the secrets read path.
- I have not touched the app.
next step I'd take if you greenlight: re-run read_app (this time I'll preserve the exact manifest script bodies before they get pruned), paste the real current source of refresh readSnapshot the holder-rendering HTML block, then propose real patches with real line references.
on holders count specifically: do you have a basescan API key or an alchemy key for base? if no, I'll switch the KPI label from "HOLDERS" to "TOP N SHOWN (filtered)" so the field stops lying. honest fallback vs. inventing a number.
standing by for greenlight to re-read the app.