Archilyzer · Source

archilyzer

Archilyzer
git clone https://archilyzer.pages.dev/source/archilyzer.git
Log | Files | Refs | README | LICENSE

commit 85803250e82e1b3414022b1a4d80f4872bd1b5f0
parent 42a117fd14387eea5d5e87e85df88356f679c1ab
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Wed, 30 Sep 2026 18:33:33 -0400

plans: slice CK re-review — R-L1 landed, the mechanism sentence, R-L2 R-I2 R-I1 under "Found and left", the Load-more follow-up in STATE

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Diffstat:
Mplans/STATE.md | 4+++-
Mplans/release-16.md | 44+++++++++++++++++++++++++++++++++++++++++---
2 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/plans/STATE.md b/plans/STATE.md @@ -22,7 +22,9 @@ reviewed SHIP). The operator's runbook is `~/reports/release-15/RUNBOOK.html`. `settings.storage.health` (DT). - **Follow-ups the reviews named:** the editor's and export's build traces list dot-directories (cosmetic while `standalone` is off); `REQUIRED_TOKENS` lacks `--chart-other` (the e2e pins it); - `export`'s `WorkspaceView` `splitOn` has a one-paint flash from a localStorage restore. + `export`'s `WorkspaceView` `splitOn` has a one-paint flash from a localStorage restore; + "Load more results" never resumes a leaf that settled at its cap (`runQueryTree`'s `setHitLimit` + reaches running leaves only; on `main` too — release 16 CK re-review R-I1; wants a spec). **Now (2026-09-28, night): the stats cache key fix — built, reviewed (SHIP AFTER FIXES, then SHIP on re-review; every touch-up done), not merged.** The branch is `fix/stats-cache-key`, and [`stats-cache-key.md`](stats-cache-key.md) diff --git a/plans/release-16.md b/plans/release-16.md @@ -85,7 +85,9 @@ only a "Posts" leaf, as before. are all the row reads — then the copy stays and reads an empty scope, and the leaf does not fall back to its transcripts. A leaf of any other scope, and an empty leaf, are untouched. (b) would have run up to three pipelines per leaf inside `runLeaf`, each with its own cache key, - controller and streaming merge; (a) touches the evaluator not at all. + controller and streaming merge; (a) touches the evaluator only in `runLeaf`'s empty-scope + short-circuit (review M1) and in what a cached or empty leaf reports as its progress (re-review + R-L1). - **The fold.** `foldSearchIn(progress, tree)` (`common/lib/search/searchIn.ts`, new) files the copies' hits back under the visitor's leaf id (a chat hit keeps `scope: "chat"` and `track: "live_chat"`, so it lands in the same section of the same video row, in time order), and @@ -101,7 +103,8 @@ only a "Posts" leaf, as before. manifest's first answer or first failure (a 404 subs manifest is not held for the retry), the hub's is `summariesReady`, since an archive is ready only once both its manifests have settled. Until then Search is not refused and the query does not run, so a stored row with Transcripts - unticked never reads transcripts first and then re-runs. The committed tree runs as `applySearchIn(committedRoot, …)` and its progress + unticked never reads transcripts first and then re-runs — on a single site; for the progressive + hub see "Found and left". The committed tree runs as `applySearchIn(committedRoot, …)` and its progress is folded before `setTreeProgress`; `needsChatManifests` and `needsPostsManifests` read the rewritten trees (draft and committed), so Live chat ticked loads the subs manifests and passes `chatScopeSlugs` exactly as a "Live chat" leaf does (the prompt's `|| committedLiveChat`, but only @@ -166,7 +169,9 @@ leaves, and `search-in.spec.ts` reads both corpora with a regex `alpha|kappa` in | `b22198d5` | `common:` review M2, L1, L2, L4 and M1's tag rule — `nop` no longer gates the global scope; `searchInUnderTags`; `manifestsSettled` on both SearchData providers and the held decision; the always-mounted refusal line and the button's description; Save and Save as… disabled. | | `aaf3accd` | `export(e2e):` `search-in` cases 9 (the "Posts" leaf), 10 and 11, the refusal's description and Save as…; `posts-search` for M2. | | `76deaac7` | `common:` the refusal line is a polite live region, not a second `role="status"` (it broke `modal-digest.spec`'s `getByRole("status")`). | -| this commit | `plans:` the review, its rulings and gates in this section; the standing choice amended; FACTS; the changelog. | +| `1d7da806` | `plans:` the review, its rulings and gates in this section; the standing choice amended; FACTS; the changelog. | +| `500417f3` | `common:` re-review R-L1 — a cached or empty leaf reports its progress over the scope it read (0 of 0 when empty); a real-driver test asserts the folded "searched N/M" only climbs. | +| this commit | `plans:` the re-review in this section; "Found and left" gains R-L2, R-I2 and R-I1; the mechanism sentence; the follow-up in `STATE.md`. | **Tests** (unit) @@ -243,6 +248,22 @@ and finishes. `posts-search.spec.ts`: unticking Posts leaves a "Posts" leaf's tw - **Hub mode is covered by reasoning** (review I3): no hub or two-origin fixture ships posts or live chat, so their suites see a lone Transcripts box and no rewrite. The rewrite never touches slugs, and the posts and chat scopes are built from the merged, origin-qualified manifests. +- **On the progressive hub, a stored row of posts only or live chat only can read as empty at + first** (re-review R-L2). The hub's `manifestsSettled` is `summariesReady`, true once the first + archive is ready, and the merged posts and subs manifests grow one ready archive at a time. If + that archive has neither, a stored row with Transcripts unticked reads as nothing: the refusal + shows, and a `qt=` link runs through the empty-row fallback, reading transcripts, then re-runs + when an archive with posts or chat lands. On a single site the manifests settle together, and the + claim holds. +- **The global scope takes the posts when the draft needs them too** (re-review R-I2): + `needsPostsManifests` is the draft's need or the committed tree's. With Posts unticked and a + committed negated plain query (`NOT x`), a draft that grows a "Posts" leaf re-runs the committed + query, and its result gains every post (the plain leaf read none). Consistent with NOT; the + result depends on the draft. On `main` the same held with Posts ticked. +- **"Load more results" never resumes a leaf that settled at its cap** (re-review R-I1; on `main` + too): a driver resolves `done` when its workers stop at the cap, `runLeaf` drops its controller, + and the tree's `setHitLimit` reaches running leaves only. More plain queries reach the cap now + that each copy has its own. A follow-up in `STATE.md`. - **A lone Transcripts box.** On a site with neither posts nor live chat (the hub's e2e fixture) the row is one box, whose only effect unticked is to refuse Search. Shown as ruled (Transcripts is not conditional). @@ -324,3 +345,20 @@ fix; the drivers' fix alone passes all 15, the `runLeaf` short-circuit alone pas | 9 | `aaf3accd` | the full export suite | stopped at 214 of 267: 213 passed, **1 failed** — `modal-digest`'s `getByRole("status")` found the always-mounted refusal line beside the modal's status; fixed in `76deaac7` | | 10 | `76deaac7` | the full export suite | **267 passed**, 0 failed, 13.5 min | | 11 | `76deaac7` | the hub suite | **36 passed**, 0 failed, 1.5 min | + +#### Re-review + +**Verdict: SHIP**, with three small things landed before the merge (parent's rulings, 2026-09-30): + +| Finding | Ruling | Where | +|---|---|---| +| R-L1: an empty-scope copy reported its parent scope as processed, so the folded "searched N/M" started full and then fell back (a cached copy did the same) | `applyCached` takes the size of the scope the leaf read: 0 of 0 when empty, a cached leaf's effective scope otherwise. The real-driver test with the posts scope null asserts the folded leaf's processed and fraction never fall; it fails on the previous code | `500417f3` | +| R-L3: "(a) touches the evaluator not at all" was stale | The sentence names `runLeaf`'s empty-scope short-circuit and the progress `applyCached` reports | this commit | +| R-L2: on the progressive hub a stored posts-only or chat-only row can read as empty until an archive with posts or chat is ready | Recorded ("Found and left"); the single-site claim is marked single-site | this commit | +| R-I2: the global scope takes the posts when the draft needs them too | Recorded ("Found and left") | this commit | +| R-I1: "Load more results" never resumes a leaf that settled at its cap (on `main` too) | Recorded ("Found and left") and a one-line follow-up in `STATE.md` | this commit | + +**Gates after the re-review:** tsc (all workspaces) clean, 48 s; common **2,380/2,380**, 84 s (the +count is unchanged: one test extended); `pnpm --filter export exec next build` exit 0, 29 s; +`search-in`, `query-tree` and `posts-search` at `500417f3`: **38 passed**, 0 failed, 1.9 min. The +full export suite and the hub suite were not re-run, as the parent directed.