Archilyzer · Source

archilyzer

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

commit d49637c636027ffb64cfdf4d24ede9361e2c85d2
parent fbfd4009c1e1cce259a401456fb472348f516777
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Tue, 29 Sep 2026 21:18:27 -0400

plans: slice S1 as shipped — the record (rulings, step 0 settled: the hub renders SearchResults, Back restores the listing, measured; the tests; gates; decisions the operator could overturn); the plan's S1 as built; the export changelog

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

Diffstat:
Mexport/CHANGELOG.md | 1+
Mplans/export-header-first-search.md | 8++++++++
Mplans/release-14.md | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 143 insertions(+), 0 deletions(-)

diff --git a/export/CHANGELOG.md b/export/CHANGELOG.md @@ -6,6 +6,7 @@ - **A chart's stacked bars are separated by a 2 px gap in the chart card's colour.** A stacked bar's segments were drawn touching; they now have a 2 px gap in the card's colour between them, and in high-contrast mode the system's background colour. Stacked areas keep their line in each series' colour along the top, charts of one series, line charts and side-by-side bars are unchanged. Needs a rebuild and deploy of each site. - **Two grounds, Light and Dark, and each site in its own accent.** The third ground, the warm paper one, is gone: the header's toggle cycles System, Light and Dark. A reader who had chosen it gets Light, before the page first paints and with no other ground on the way, and the stored choice becomes Light (the old paper theme's `archive` + `light` too). The theme menu's accent picker is gone from the header and the slide-out menu: every page wears the site's own accent (`site.json` `accent`), and a reader's stored pick from before is not read and is left in storage. Needs a rebuild and deploy of each site. - **The header carries the operator's social links and one theme toggle, keeps the site's name on a small screen, and links to the Archilyzer home in place of the sites menu.** Every site's header and the hub's end with the social icons (the site's `socialLinks`, else `settings.json`'s) followed by the theme toggle, all 36 px keys (44 px on a touch screen) with a focus ring. From 520 px wide the header shows every link, up to four (with more, the ones marked **Keep in header on small screens** first, then the last of the rest); below 520 px it shows only the marked ones (none marked → none) and keeps the site's name beside them. The switch is 32.5rem, so at a larger text size it comes later. With one marked link, every current site's name shows in full from 360 px wide on a touch screen. The footer keeps every link, in the same keys (its icons were 20 px and turned the accent on hover; they now turn the text colour), and wraps them rather than widen the page. The **Sites** dropdown and the **Hub** link are gone from the header and the slide-out menu: in their place a link, **Archilyzer**, goes to the Archilyzer home's Official Instances, in the same tab (not on the hub, which lists them itself). **Changelog** moved from the header and the menu to the footer, after Use with AI. The nav and the Archilyzer link are inline from 1024 px wide; below that they are in the slide-out menu, which now holds only them. Only as last resorts, for a very long name on a phone, does the name drop (its mark stays; the same before and after the page's font has loaded, and never with its last letter cut off) and do the icons scroll sideways in their own box. A site's `hubUrl` still loads and is no longer shown. Needs a rebuild and deploy of each site. +- **A clear screen until the first Search.** A plain visit to a site's search page, and to the hub's, shows the search bar, the page's intro and the footer: no count, no listing and no results controls, and the line under the bar, "Press Enter or click Search to apply", says what to do. Search with the box empty lists every video, as before. A link that carries a query or a filter (`qt=`, `q=`, `tg=`, a share link, the older filter keys) still shows its results on load. Within one visit the results stay: going to Ask AI or another page and coming back keeps them. A reload starts over, and shows results at once only when the address carries a query or a filter. A query restored from the last visit waits in the box over the clear screen. Needs a rebuild and deploy of each site and the hub. ## [0.10.0] - 2026-09-28 - **A video whose recheck failed shows as possibly missing rather than available.** When a video drops out of its channel's listing it is marked "Missing?" until a recheck says why. A recheck that could not reach the video — a blocked request or a network error — used to clear the mark as if the video had been found. It now leaves "Missing?" in place until a recheck actually reaches the video. Needs a rebuild and deploy of every export site. diff --git a/plans/export-header-first-search.md b/plans/export-header-first-search.md @@ -330,6 +330,14 @@ Owns `common/components/theme*` (`themeConfig.ts`, `ThemeProvider.tsx`, `ThemeSc ## Slice S1 — a clear screen until the first Search (branch `r14/first-search`) +As built (2026-09-29, on the rulings of that day): S1 only, the summaries download not deferred +(S2 stays a candidate). A link carrying only a filter (`tg=`, a share link, the legacy filter keys), +like one carrying `qt=`/`q=`, runs on load and shows its results. Step 0: the hub renders +`SearchResults` (`HubHome` → `TranscriptSearch`), so it has the clear screen and `e2e:hub` joined +the gate; Back restores the listing (measured in `release-14.md`, "Slice S1, as shipped"). Beyond +the four specs this section owns, the ones that read the listing at load were `responsive` (two +tests), `tag-chips` (three) and `e2e-hub/federated-search` (eight). + Owns `common/components/{SearchSessionContext,SearchResults,SearchBar}.tsx`, `export/app/(workspace)/WorkspaceView.tsx`, `export/e2e/{browse-all,workspace-shell,charts, restore-no-refire}.spec.ts`, a NEW `export/e2e/first-search.spec.ts`, `export/e2e/helpers.ts` diff --git a/plans/release-14.md b/plans/release-14.md @@ -1004,6 +1004,140 @@ There the bar overflows and the wide row scrolls while the name shows: measured 1100 px at 150 % and from 779 to 1300 px at 200 %. With the browser's own text size `md` moves too and nothing overflows. The `md` layout is slice HP's and unchanged here. +### Slice S1, as shipped — a clear screen until the first Search (2026-09-29) + +Branch `r14/first-search` off `main` `99d4d76a` (`r14/two-grounds-headers` merged), worktree +`~/Projects/plans-export-header-first-search` (block #4: export e2e 3420, hub e2e 3441, editor test +3411), one Opus implementer. Scratch files `s1-*` in the job's `tmp`. The rulings, all 2026-09-29, +not re-opened: +1. S1 only. The summaries download is not deferred; S2 stays a candidate. +2. A link carrying only a filter (`tg=`, `fv=`, `ch=`), like one carrying `qt=`/`q=`, runs on + load and shows its results. +3. The gate is in `SearchResults`, which the hub mounts too, so the hub gets the same behaviour and + `e2e:hub` joins the gate. +4. `ranThisPageLife` feeds a reactive `searchedThisPageLife`; the dead `searchExecuted` goes. +5. A URL with `qt`, `q` or any filter key counts as asked, at hydration. +6. `SearchResults` renders nothing until the flag is set; `resultGroups` is still computed. The + page's intro (the transcript count, the Welcome card) stays. +7. The bar's "Press Enter or click Search to apply" line also shows before the first Search. + +| sha | what | +|---|---| +| `93d72a80` | `common:` the results area renders nothing until the visitor asks in this page life; the bar's line shows meanwhile; `searchedThisPageLife`; `searchExecuted` deleted | +| `90043b78` | `export:` `first-search.spec.ts`; one `showAll` helper, pressed where the export and hub specs read the listing at load | +| _this_ | `plans:` this record; the plan's S1 as built; the export changelog | + +- **What a plain visit shows**, on a site's `/` and on the hub's: + - the search bar with its line, "Press Enter or click Search to apply"; + - the page's intro (on a site the transcript count and the Welcome card; on the hub the shelf, + the figures and the archive chips); + - the footer, whole on the first screen at 1280×800 and 390×844 (the spec asserts it). + - No count, no Results/Chart toggle, no Copy for AI, no selection toolbar, no chart, no listing, + no `browse-hint`, and on the hub no "N of M archives answered" line. +- **What counts as the first Search:** Enter, the Search button, a Filters Apply (all through + `commitSearch`), a profile load or Revert (`applySnapshot`), and a URL that asks. + - An empty Search shows "All videos (N)" and the listing, as before. + - A filter changed before it shows nothing; the line was already there for an unapplied edit. +- **A URL that asks** (`urlAsks`, `SearchSessionContext.tsx`): any of `qt`, `q`, `tg`, the legacy + filter keys (`ch nov nol naa nar nav nd nu m tk`) or the share-link keys + (`fv fc ft fa fav fk fdf fdt`). + - Presence counts, not a valid value: `?tg=Not%20An%20Id` shows every video, which is what + `tag-chips.spec` already asserts. + - A video (`v`, `t`), a chart's shape (`view`, `cs`), `re` and `vm` do not ask. The Share button + always writes `fv=`, so a shared chart does run. +- **The flag.** `ranThisPageLife` (module) stays the source of truth across remounts. + - `searchedThisPageLife` starts from it and is set wherever it is set: at hydration, in + `commitSearch` and in `applySnapshot`. + - At hydration the URL is read after `holdRestored` is decided, so a query restored beside a + filter-only link is still held on that first load. + - On the server the module variable is never set, so the first client render matches the static + HTML. The exported `index.html` now has the line and no results section. +- **Step 0, settled:** + - **The hub renders `SearchResults`:** `HubHome.tsx` → `TranscriptSearch` (common) → + `SearchResults`. So the hub has the clear screen, and `e2e:hub` ran in the gate. + - **Back restores the listing.** Measured with a probe (not committed) on the 120-video fixture + at 1440×1200, scrolled to 3,000 px before leaving: + + | Path | After Back | Scroll before → after | + |---|---|---| + | empty Search → **Use with AI** (header) → Back | the listing, "All videos (120)" | 2,838 → 2,676 px (the first card drawn: `0024` → `0025`) | + | `qt=` link → **Use with AI** → Back | the results | 2,952 → 2,904 px | + | empty Search or `qt=` → **Chat** (workspace nav) → Back | the listing | → 0 (the top) | + | a card's video (the modal) → Back | leaves the page | — | + + - A route outside the workspace unmounts the session; Back remounts it with the flag already + set, and the scroll comes back to within a card. + - `/ask` hides the search pane in place, and the window is at the top when Back shows it again. + - The modal opens with `replaceState`, so there is no entry of the page's own to go Back to. + - The last two are unchanged by S1. +- **Tests:** + - `first-search.spec.ts`, new (11): + - on load, no results area, the line, the intro and the whole footer, at 1280×800 and 390×844; + - Enter on an empty box shows every video, and the line goes; + - the Search button shows every video; + - a filter changed before the first Search shows nothing; + - `/` → `/ask` → `/` keeps the listing; + - Back from Use with AI keeps it; + - a reload clears it; + - a `qt=` link shows its results on load; + - `tg=` and `ch=` links show theirs; + - a restored query shows the clear screen and the filled form, and runs on Enter. + - `showAll(page)` in `export/e2e/helpers.ts`: wait for the query builder, press Search, wait for + `results-summary`. + - Where specs read the listing at load: + - `browse-all`: the first test rewritten to assert the clear screen, then the listing; + - `charts` (7 tests), `workspace-shell` (1), `responsive` (the filters sheet and the selection + toolbar), `tag-chips` (3; its `?tg=` tests unchanged); + - `restore-no-refire`: the held query now shows no results area; + - the hub's `federated-search` (8): its first test asserts the clear screen with both archives + in, then the listing. + +#### Gates (at `90043b78`; logs `$T/s1-*.log`) + +- **tsc** was clean before each commit and at the tip (36–38 s). The specs commit's own run + timed out at 100 s under the machine's load; it was run again on that commit, clean. +- **Unit:** common **2,210/2,210** (75 s). Editor unit, `test:scripts` and mcp were not run: S1 + touches no editor, mcp or scripts file, and the editor imports none of these components. +- **Builds**, each capped at 5 GB with no swap, from a clean `.next`: + + | Build | Time | Max RSS | + |---|---|---| + | export, site (the worktree's default) | 36 s | 957 MB | + | export, hub | 28 s | 1,034 MB | + +- **e2e**, each detached and queued: + + | Suite | Passed | Failed | Time | + |---|---|---|---| + | export, the specs above first | 58 | 1 | 3.4 min | + | hub, full | 36 | 0 | 1.7 min | + | export, full | 254 | 0 | 11.4 min | + | `e2e:2origin` (`E2E_TWO_ORIGIN_REBUILD=1`, the `export/public` links in place) | 3 | 0 | 49 s | + + The one failure in the first run was the new `/` → `/ask` test: that run's first visit to `/ask`, + compiled by the dev server, took longer than 5 s. The test now waits 20 s for the URL. After + `e2e:2origin`, the primary's `export/public` files kept their 2026-09-28 mtimes. +- **Numbers tool:** none. + +#### Found and left + +- **Back from `/ask`** shows the listing at the top, not where the reader left it (the table + above). This is as before S1. +- **A card's video opens without a history entry**, so Back from the modal leaves the site. This is + as before S1. + +#### Decisions the operator could overturn + +| What I assumed | The alternative | +|---|---| +| The line also shows under the bar on a fresh `/ask` (the bar is shared, and Search there applies the grounding) | show it only on the search view | +| A link with only a chart's shape (`view=chart&cs=…`, copied from the address bar after an empty Search) opens on the clear screen | count `view`/`cs` as asking | +| A video link (`?v=`) opens the video over the clear screen | count `v` as asking | +| On the hub, the "N of M archives answered" line waits for the first Search with the rest of the results; each failed archive's chip says so, with its Retry, before that | show the line above the gate | +| A filter-only link marks the page life as asked, as a `qt=` link does, so a stored query restored on a later mount (the hub's `/ask`, a page outside the workspace and back) runs rather than being held | a second flag: shown vs. ran | +| A key's presence asks, not a valid value (`?tg=Not%20An%20Id`) | count only the keys the page applied | +| The Search button keeps its outline look before the first Search; only the line says what to do | fill it as for an unapplied edit | + ## Rollout Release 14 is slice HP (merged, `bfa1ff3c`) and `r14/two-grounds-headers` (after the parent's