collect_ia still scans only profiles[0]; offload-scan --root is repeatable now #3
Notifications
Total Time Spent: 25 minutes
oleks
25 minutes
No due date set.
Dependencies
No dependencies set.
Reference: oleks/analytics-playbook#3
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
playbook.xsh:126-127still takes the first profile only:The standard invocation passes two (
--profile ~/.claude --profile ~/.claude-vlad). Thetokensandpagroups cover both;iacovers only~/.claude.Why this is now actionable (it was not when kotkan/claude-plugin-inference-arbitrage#55 was filed)
#55 was filed against
inference-arbitragebecause the fix was thought to needoffload-scanto accept multiple roots. It now does. Verified atorigin/main(v0.23.0),bin/offload-scan:985:Landed in
adb0309/ v0.16.0, CI pipeline #65 pass.coverage.rootsin the emitted document now names every store actually scanned, andcoverage.caveatstates the document covers only those stores.#55 is correctly closed — its producer half is complete and was independently verified. Both the landing peer and the verifying shepherd stated explicitly on that issue that the consumer half lives here and is the shepherd's to route. This issue is that routing, not a reopening.
Why it matters
Offload candidates are ranked by observed invocation cost. Half the evidence is missing and nothing in
SUMMARY.mdormanifest.jsonsays so, so the digest reads as a whole-fleet measurement. A skill used mostly from the vlad profile is systematically under-ranked and filing decisions inherit that bias.~/.claude-vladis not marginal: in run20260905-214353its five sampled sessions ran 100-181 turns at 270k-524k context each.Acceptance
collect_iapasses every profile as a repeated--root, in one invocation (no merging needed —offload-scan's(message.id, requestId)seenset spans the whole scan, and roots are de-duplicated afterprojects/descent).SUMMARY.mdandmanifest.jsonsurfacecoverage.rootsfrom the scan document, so a subset scan cannot present as a whole-fleet one. This is the half that matters more: widening coverage without recording it fixes the smaller problem.bin/candidate-digestemits a bare JSON array with no header object, so it carries no coverage field; coverage must be read from thescan.jsonthe digest joins.Scope note
Same file as oleks/analytics-playbook#1 and oleks/analytics-playbook#2 (
playbook.xsh). Should be worked in one pass with them, not separately.Plan (posted before the first code edit)
Worked as one pass with oleks/analytics-playbook#1 and oleks/analytics-playbook#2 — same file, as the issue's scope note asks.
Verified the premise before building on it
The issue's claim that
offload-scan --rootis now repeatable is the load-bearing one, so I checked it rather than inheriting it. Confirmed atinference-arbitrage/bin/offload-scan:--rootcarriesaction="append", and its help text says "REPEATABLE — pass it once per profile; scanning one profile out of several is a partial measurement".kotkan/claude-plugin-inference-arbitrage#55 stays closed and I am editing nothing in
inference-arbitrage. The change is entirely on this side.Both halves, per acceptance
collect_iadropsprof = profiles[0]and passes every profile as a repeated--rootin one invocation. No merging:offload-scan's(message.id, requestId)seenset spans the whole scan and roots are de-duplicated afterprojects/descent, exactly as the issue states.SUMMARY.mdandmanifest.jsonsurfacecoverage.rootsread from eachscan.json. This is the half that matters more — widening coverage without recording it would make the number better and the report no more honest.bin/candidate-digestemits a bare JSON array with no header object and therefore carries no coverage field. That is by contract; adding one is a breaking schema change for every consumer. Coverage is read from thescan.jsonthe digest joins, not from the digest. I am not touchingcandidate-digest.The check that makes it credible
Per the acceptance evidence I was briefed on, a two-profile scan must find more sessions, not merely a bigger number — a missed root shows up as a missing session. I will report per-plugin session counts for one profile vs. both, from the before/after runs. If the totals do not increase I will say so and establish which of the two explanations holds (the second profile genuinely empty for that plugin, vs. roots being de-duplicated wrongly) rather than reporting the widening as a success.
Related observation, not acted on
instrument report --all-profiles(fromhook-instrument) reads a third profile:/home/oleks/.claude-old, 157 records against 199,927 and 188,121 for the two live ones. So even after this fix, "every profile passed" means the two the playbook is invoked with, not every profile on the host. Thecoverage.rootsline will state the roots actually scanned, which is precisely the property that keeps that from becoming the next version of this bug. Recorded here rather than widened, since which profiles the playbook should cover is an operator decision.A separate fail-open found while working oleks/analytics-playbook#1
route-stats <nonexistent-path> --jsonexits 0 and emits an all-zeros document, making an unreadable path indistinguishable from an empty transcript. Same family of defect as this issue — a partial or failed measurement presenting as a complete one — but it belongs toagents-routing. Filing separately.Done —
938e09d, landed onmainat04cf5f4Both halves. Before/after from two real
playbook.xshruns on emmett (x86_64, 8 cores), 2026-09-06,--days 30 --profile ~/.claude --profile ~/.claude-vlad, ten default plugins.1. Widened — and it finds MORE SESSIONS, which is the check that matters
A bigger number would prove nothing; a missed root shows up as a missing session. It does:
On the seven that did not move — the acceptance asks me to distinguish "the second profile is genuinely empty" from "roots are being de-duplicated wrongly", not to assume the first. The discriminating evidence is within this same table: all ten scans list the identical two roots in
coverage.roots, and three of them increased. If de-duplication were collapsing the second root, none could have increased. So the roots are being read, and the seven flat rows are genuine absence of~/.claude-vladactivity for those plugins — six of which are at 0–1 sessions in total.Baseline
coverage.rootsfor every plugin was exactly["/home/oleks/.claude/projects"], which is the defect this issue describes, reproduced.2. Recorded — the half that mattered more
SUMMARY.mdnow leads the section with a per-plugin coverage table, andmanifest.jsoncarries the same undercoverage.ia:Note it reports what was read, not what was requested. Printing the requested roots would have re-created this bug one level up.
Control: the word "coverage" and the word "roots" appear zero times in the baseline
SUMMARY.md. Verified by grep over the whole file.3. Upstream boundary respected
bin/candidate-digestis untouched. It emits a bare JSON array by contract, so the summary says in as many words that the digests inherit the table's coverage and state none of their own. Nothing ininference-arbitragewas edited; kotkan/claude-plugin-inference-arbitrage#55 stays closed.Cost
The second root roughly doubles the
iagroup: 176.8s → 369.1s (+192.3s). That is inherent — it is twice the transcript volume — and is the price of the measurement being true. Reported separately from oleks/analytics-playbook#2's additions so the operator can see which change bought what.Limits
Two runs, one host, one point in time; the two profiles this playbook is invoked with. As noted in the plan,
instrument report --all-profilessees a third profile on this host (~/.claude-old, 157 records) that no group here covers. The coverage line now makes that visible instead of hiding it, which is the property that stops it becoming the next version of this bug — but widening to it is an operator decision and I did not take it.⏱ worked | 06-09-26 | session oleks/2fede70c | +25min | session-total 25min (landed at
04cf5f4on origin/main; issue closed with evidence) | elapsed from timeline