Archilyzer · Source

archilyzer

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

commit 5803ac8b5b0c9433a8e4982ad319f90740f88a90
parent eae372ebfeba4633db8be840400744e19dd54b13
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Fri, 25 Sep 2026 16:54:20 -0400

plans: release 8 slice E — the restored search waits for the visitor (record + changelog)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Diffstat:
Meditor/CHANGELOG.md | 1+
Mplans/release-8.md | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/editor/CHANGELOG.md b/editor/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## [Unreleased] +- **Export sites: a search restored from the last visit waits for you.** Opening a site (or `/ask`, or the hub) still loads the last query, the filters and the profile from the browser, but no longer runs the search. The results show the video listing under those filters, and the bar says "Press Enter or click Search to apply", as for any unapplied edit. Search or Enter runs it; so does loading a profile. A link with a query in it (`?qt=`) still runs on arrival. The restored search used to re-fetch transcript shards (up to 8 MB each) on every visit to a device that had not cached them. Needs a rebuild and deploy of every export site. - **The project homepage is rewritten, and it can be deployed as a preview.** The front page of `archilyzer.pages.dev` now opens on one line and a chart. The chart shows the official instances' transcripts by the month each video was published, from 2009 to now, stacked by instance. It is drawn when the site is built, so no chart script loads. Under it is one strip of numbers for the official instances: hours of speech, transcripts, recordings, channels, instances, and recordings gone at the source but still here. The **Official instances** section has a card for each public site, with its channels, recordings, transcripts and hours. **What it does** is now three short paragraphs. The recent-acquisitions list, "How it works" and "What this isn't" are gone from the page. The homepage summary (`homepage/public/homepage-summary.json`) is version 5. It adds `monthly`, `official` and per-site numbers and removes nothing, so `/stats` is unchanged. `archilyzer deploy homepage --preview <branch>` deploys a preview the way `deploy hub --preview` does. Without the flag it still deploys to production (`main`). - **A channel's video list shows titles, and you can search by them.** On `/channels/<slug>/videos`, each row now shows the video's title, with its id in smaller type underneath. Search matches the title or the id, ignoring case. The title comes from the transcript index for transcribed videos, from the channel's metadata scan for videos that were listed but never downloaded, and otherwise from the video's `metadata.info.json`. A video none of these name shows its id, as before. Each row's selection checkbox and link are named by the id as before, and the order is unchanged (by id). - **An undownloaded video's page shows its title and details.** The video page used to show a bare id for any video without a `metadata.info.json`. If the channel's metadata scan has read the video, the page now shows its title, upload date and duration from the scan, marked *from the listing scan — not downloaded*. Any video page with a description, from either source, has a **Description** section, collapsed by default. diff --git a/plans/release-8.md b/plans/release-8.md @@ -304,6 +304,68 @@ runs there. - `KpiHeader.tsx` and `RecentAdditions.tsx` are unchanged. `/stats` still uses `KpiHeader`. The rail is unused on `/` but kept, per the brief. +### Slice E, as shipped — export: the restored search waits for the visitor (2026-09-25) + +Branch `one-core/r8-export-norefire` off `main` `1d54b7af`. **The operator's instruction (2026-09-25):** "The +export homepage pre-loads the last query from localStorage, including firing that search to immediately +see results. Just load the settings but don't re-fire the search on first load." A restored query re-ran +the leaf pipeline on every visit. On a cold device that refetched transcript shards (up to 8 MB each); even +from the service-worker cache it was CPU and memory the visitor had not asked for. Nothing else heavy loads +on a plain visit (~1.24 MB of summaries). + +**The restore-vs-run split** (all in `common/components/SearchSessionContext.tsx`, so `/`, `/ask` and the +hub get it together). Hydration still COMMITS everything it restores: the query tree (draft and committed), +the filters, the channel selection, the tag chips, the profile pointer and the grounding selection. The +profile divergence check, the share link and the persisted `working` snapshot therefore see the session +exactly as it was left; nothing about what is stored changed. What is new is one boolean, `runHeld`: +- It is set only when the query came from the stored snapshot (`working` or the active profile) and is + non-empty. A query on the URL (`qt=`, or the legacy `q=`/`m=`/`re=`) is never held: a shared link is the + visitor asking, and it runs as before. +- While held, `hasActiveQuery` is false. The pipeline effect returns early (no leaf pipeline, no shard + fetch), the results area is the ordinary browse listing under the restored filters (summaries only, the + same `All videos (N)` + `browse-hint` as a visit with no query), chart defaults and `/ask`'s live + grounding see "no active query", and the selection self-clean prunes against the browse set, a + superset of the search's, so a restored selection survives. +- `queryDirty` is true while held, so the bar shows what it already shows for any unapplied edit: the + filled `Search` button (`data-dirty="true"`) and "Press Enter or click Search to apply". That is the + "neutral line": existing UI and copy, nothing new. The browse listing was chosen over an empty results + area because it is what the page shows with no query, costs nothing extra, and keeps `browse-all.spec.ts`'s + contract. +- It is cleared by whatever already commits a search: `commitSearch` (Search, Enter, the filters panel's + Apply) and `applySnapshot` (loading or reverting a profile). The pipeline effect now also depends on + `hasActiveQuery`, so committing the same query that was held (same hash) still starts it. + +| sha | what | +|---|---| +| `00fb567b` | `SearchSessionContext.tsx`: `runHeld` (set by hydration only for a stored query, cleared by `commitSearch`/`applySnapshot`), gating `hasActiveQuery` and `queryDirty`; the pipeline effect keys on `hasActiveQuery`; a held query does not default a restored chart to "search". New `export/e2e/restore-no-refire.spec.ts` (+2): a pre-seeded query + filter loads into the form with no transcript shard requested in 1.5 s after the browse listing is up, and Enter fetches one and shows `Matching videos`; a `?qt=` link with a stored session present still fetches on load | +| `545c7405` | `ask-chat.spec.ts` "Load context enriches the pin and persists": after the reload on `/ask` it clicks Search before asserting `Grounded in 1 result` (the test encoded the old re-run-on-load). Outside the slice's listed ownership; no other release-8 slice touches `export/e2e/` | + +`filter-profile-persistence.spec.ts` is **unchanged**: it seeds no query and asserts only the profile +pointer and checkbox state across reloads, all of which this slice preserves. + +**Gates**, on `545c7405`: tsc clean. Common tests **1816/1816** (unchanged; no common unit test covers the +hook). `pnpm --filter export exec next build` ok. Export e2e **194 passed, 0 failed, 6.7 min** (192 + 2; +`e-final-export.log`). `e2e:hub` **8 passed, 18 s**. `e2e:2origin` with `TWO_ORIGIN_REBUILD=1` **3 passed, +38 s**, with the hub-written `export/public` entries swapped for copies and relinked after, as in +`final-e2e-r7.sh`. An earlier targeted run on `00fb567b` (six specs, `e-e2e-targeted.log`) was 41 passed, +1 failed: the ask-chat test fixed in `545c7405`. The editor build, editor unit, test:scripts and mcp were +not run: the slice touches no file they build or test beyond `common/components/`, which tsc covers +and the editor does not render (`SearchSessionContext` is export-only). **Numbers: none.** + +**Pending, the parent's:** a rebuild and deploy of every export site (and the hub) for the change to reach +visitors. + +**Found and left.** +- **Saving a profile while a query is held keeps it held.** `handleSaveProfile` / `Save as…` promote the + draft FILTERS to committed but have never committed the query tree, so they do not clear the hold; the + saved profile still carries the query. The visitor runs it with Search. Left as is: saving is not searching. +- **A held chat or posts query still loads the subs/posts manifests on first load**, because the DRAFT + tree names that scope (`draftHasChatLeaf`), exactly as it does while someone types one. Manifests are + small; no shard is fetched. +- The e2e measures shard requests from the page (`page.on("request")`). A search served wholly from the + IndexedDB layer cache would fetch nothing either way, which is why the spec seeds storage in a fresh + context that has never searched. + ## Rollout 2026-09-25 (late afternoon) — `0e72ef73` live on :3001 (second restart of the day) The second editor restart of the day. Release 7 (`bb3dbb4c`) had gone live at 13:11. Two things