Conversation
…ing doc The channel carries what a search load was made of, but reading it has traps that produce plausible wrong numbers: the result counts are null whenever a cache answered, so a naive average is an average over cache misses only; `total` is additionally null on an incomplete merge; and `shapeHash` groups across realms and page numbers by design. The largest trap was in the module doc itself, which offered `correlationId` as the key to count distinct shapes within. That id is minted per search — `newCorrelationId()` runs on every `_federated-search` fetch — so every line has its own and the count is always 1. A render's searches group by `jobId` for prerender traffic; live browser traffic has no render key on this channel and reaches a tab session only by joining `correlationId` to the `server-request` event on `boxel:client-perf`. The module header says that now. The skill carries the traps, the join map, and worked LogQL for the questions this channel exists to answer — what a spike was made of, which shapes dominate by volume and by latency, how much of a load the caches absorbed, prerender load vs live load, and reconstructing a replay from a shape. It defers to the module header for field semantics rather than restating them, so the two cannot drift. No dashboard ships with this; the recipes are written for Grafana Explore and note what the panels should be. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015T2Z2bbFtqizh57qAW7JFW
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 951f91934b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
`jobId` is the indexing job a search ran under — queue job plus reservation, held across the job's whole file sweep — so it groups an entire index pass, every file and both visit types, rather than one render. Calling it per-visit repeated the error this skill exists to prevent: a key offered for a grouping it does not perform. No member of the line groups one render, so "searches per page render" is not answerable here; per index pass and per tab session are. `linkMode: 'prerender'` is not a synonym for indexing. It derives from `x-boxel-during-prerender`, which the module, file-extract and command-runner routes raise alongside the indexing render route, so the bucket is all headless traffic. Indexing is the subset carrying a non-null `jobId`. A correlation id rides only an instrumented request. Lines from a live request whose client-telemetry instrument is dormant share the absence of an id rather than each carrying their own, so a filter on it silently lumps them together. The admission gate is the channel's blind spot and belonged in it: an over-ceiling search is shed with a 429 before the handler runs and logged on `realm:search-admission` instead. Under the saturation this channel is written for, it counts admitted searches and not arriving ones, and the missing lines are the excess. Also: the cache-outcome filter is necessary but not sufficient for counting lines, since the live cache records its outcome before the populate runs and a 408 or 500 reports a miss with no counts; the truncation trap's heading stated the converse of its own warning; and the sections that restated the module header now carry the operational consequence and point at the header for the semantics, since the pair had already drifted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015T2Z2bbFtqizh57qAW7JFW
|
[Claude Code 🤖] Host Tests (3, 16) failed on The diff is two files. One is So there is no mechanism by which this branch reaches a host test. Nothing to port and nothing to fix here. The re-run is not spent: Generated by Claude Code |
Host Test Results 1 files ± 0 1 suites ±0 10m 35s ⏱️ - 2h 27m 3s Results for commit 43e9ed4. ± Comparison against earlier commit ac3bf7b. Realm Server Test Results 1 files ±0 226 suites ±0 1h 10m 20s ⏱️ - 9m 53s Results for commit 43e9ed4. ± Comparison against earlier commit ac3bf7b. |
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015T2Z2bbFtqizh57qAW7JFW
|
[Claude Code 🤖] Base merged. Head is
That file's failure mode is the deep link arriving logged out. Nothing here reaches a host test. The diff is one skill file plus comments: The re-run allowance is unspent. Generated by Claude Code |
|
[Claude Code 🤖] One red remains, and it is a re-run artifact rather than a visual change:
This falls out of any partial re-run of the host workflow, not out of anything in this branch, and no further re-run of failed jobs can clear it: attempt 3 would mint another nonce and repeat the shape. Only a whole-workflow re-run, where all sixteen shards upload under one nonce, produces a complete set. That costs a full suite pass, which is a poor trade for a branch whose diff is one skill file plus comments and which renders nothing. It is not a required check — the PR is mergeable — so this stands as is unless someone wants the badge cleared. Generated by Claude Code |
boxel:search-shapeemits one line per_federated-searchrequest saying what the search asked for.boxel:client-perf,boxel:screenshot-perfand the indexer'sdiagnosticscolumns each have a skill for reading them; this adds the equivalent forboxel:search-shape, because several of the obvious queries against it return plausible wrong numbers.The grouping correction
The module header offered
correlationIdas the set to count distinctshapeHashwithin. That is wrong:newCorrelationId()runs on every_federated-searchfetch, so a line that carries an id carries its own, and the count is always 1.The sharper version, which this PR settles: no member of the line groups one render.
correlationIdjobIdcorrelationId→boxel:client-perfserver-requestsession_id) and the person driving it (matrix_user_id)So "searches per page render" is not answerable from this channel as posed; per index pass and per tab session are. The header states that, and the skill carries it as a trap.
No behavior change: the fields are what they always were, and the correction is to the grouping the header documents.
The skill
.claude/skills/search-shape-diagnosis/SKILL.md, matching the*-diagnosisfamily. It states the operational consequence of a field and points at the module header for the semantics, rather than restating them.The traps, each of which produces a believable wrong number:
results/total/incompleteare null whenever a cache answered, soavg(results)averages over cache misses only — during a load event, the unrepresentative subset. And thecache=~"none|miss|job-miss"filter is necessary but not sufficient: the live cache records its outcome before the populate runs, so a 408 or an escaping 500 reports a miss with no counts too. Add| status=200when counting lines rather than unwrapping.totalhas a second null cause: an incomplete merge, where it would sum only the realms that answered.linkMode: 'prerender'is not a synonym for indexing — it derives fromx-boxel-during-prerender, which the module, file-extract and command-runner routes raise alongside the indexing render route. Indexing is the subset with a non-nulljobId.shapeHashgroups across realms and page numbers by design; a shared hash means the same query shape, not the same request.filtercan be indistinguishable — group byshapeHash, never by thefilterstring.The channel's blind spot, which belonged in the skill: a search the admission gate sheds is answered with a 429 before the handler runs and logged on
realm:search-admissioninstead. Under exactly the saturation this channel is written for, it counts admitted searches and not arriving ones, and the missing lines are the excess. Pair any spike with the shed count.Worked LogQL for what the channel exists to answer: what a spike is made of, which shapes dominate by volume and by latency, how much of a load the caches absorbed, headless load vs live load, searches per index pass by card type, and one request end to end joined to
realm:search-timing. Plustail-logsinvocations, and a section on reconstructing a replay from a shape — including that a replay issuing one query repeatedly measures the live-search cache rather than the index.Scope
Deferred: no dashboard. The three sibling channels each have one under
packages/observability/grafanactl/resources/dashboards/boxel-status/; the recipes here are written for Grafana Explore, and the trap list is what any panel set has to respect.Also out of scope: wiring the prerender
requestIdonto the line, which would give the per-render key the channel lacks. That is a change to the telemetry, not to its documentation.Test plan
Prose and one corrected comment block — no behavior. The skill loads and registers (its description appears in the session skill list).
eslintandprettierclean via lint-staged on both files.🤖 Generated with Claude Code
https://claude.ai/code/session_015T2Z2bbFtqizh57qAW7JFW