commit 716a84ec98f1adefc87b6ca5801dc9192eaf7acc
parent 50fdaf00042dcabf1e0323176f143a85949196c4
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Mon, 28 Sep 2026 03:06:38 -0400
plans: FACTS — release 10 "L1 — hub lows" amended for release 11 O1: the subs rule keys on errorUpdateCount (and waits on /ask for a refetch), the zero-archive and live-chat lows are closed, builtinsLoaded / listed / the DRAFT constants anchored
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
1 file changed, 31 insertions(+), 0 deletions(-)
diff --git a/plans/FACTS.md b/plans/FACTS.md
@@ -6698,6 +6698,21 @@ S4, as shipped"; `release-10.md` "Slice L2 / L1, as shipped". Every anchor below
the archive is `ready`, its videos are searched, only its live chat is missing, and nothing says
so (a new low). Official members send CORS on their 404s (checked live on
`https://jeralyzer.pages.dev/subs/<missing>.json`).
+ **AMENDED 2026-09-28 (release 11 O1; `release-11.md`, "Slice O1, as shipped"): the rule keys on
+ `errorUpdateCount`, and the low is closed.** "Has errored" is `subs.data === undefined &&
+ subs.errorUpdateCount > 0` (`SearchDataContext.tsx:461`), not `isError`. TanStack (query-core
+ 5.100.5, `fetchState`) puts an errored query with no data back to `pending` / `error: null` on
+ refetch but keeps the count, and the count moves only on the final `error` dispatch (after
+ `retry: 1`). Settled is `data !== undefined || (errored && (progressive || !isFetching))`
+ (`:462-464`): the progressive front page stays ready through a refetch, while `/ask` waits for one.
+ The count survives in the shared query client into `/ask`'s own mount (`retryOnMount`), a scope
+ toggle off→on, or a whole-archive Retry. A ready archive whose subs errored carries
+ `liveChatMissing: {retrying, error?}` (`:477`). Its scope chip shows `LIVE_CHAT_MISSING`
+ (`export/app/ask/hubScopeCopy.ts:24`, a DRAFT) in `data-testid="hub-scope-live-chat"`, with a Retry
+ (`Retry live chat from <title>`, `HubScope.tsx:106-115`). The Retry calls
+ `federation.retryLiveChat(origin)`, which refetches `["subs-manifest", origin]` exactly (`:799-802`).
+ `resetQueries` would zero the count; nothing in `common/` or `export/` calls it, and `gcTime` is
+ Infinity.
- **An empty scope is never ready unless the provider is `progressive`**
(`SearchDataContext.tsx:456-466`: `allSettled = (progressive || scoped.length > 0) && …`).
`MultiSiteDataProvider` has two users: the hub's front page (`HubHome.tsx:40`, `progressive`:
@@ -6709,6 +6724,22 @@ S4, as shipped"; `release-10.md` "Slice L2 / L1, as shipped". Every anchor below
forever on `/ask` (a new low). Both surfaces take their list from `useFederatedSites()`
(`export/app/components/hub/useHubSites.ts:49`), so an archive off on the front page is not fetched
on `/ask`.
+ **AMENDED 2026-09-28 (release 11 O1): the zero-archive low is closed, and `/ask` waits for the
+ hub's list.**
+ - `siteRegistry.ts` has `builtinsLoaded` (`:76`; `getBuiltinsLoaded` `:106`; `useRegistry()` returns
+ it). `loadBuiltins` (`:195`, exported) sets it once `/hub-sites.json` has answered in any way — a
+ list, `[]`, a 404, a 500, a network error or bad JSON — in the same `emit` that adds the
+ built-ins. It is still never retried.
+ - `useHubSites().listed = builtinsLoaded && summary settled` (`useHubSites.ts:36`) is passed
+ through `useFederatedSites` to `MultiSiteDataProvider`'s `listed` prop (default `true`,
+ `SearchDataContext.tsx:310`), where `allSettled = listed && …` (`:527`). `federation.listed`
+ carries it. Only `AskHub` passes it (`AskHub.tsx:48`); the progressive front page is unchanged.
+ - Once `listed`, `AskChat` (`:40`) blocks the composer with `NO_ARCHIVES_ON_HUB` (an empty list) or
+ `NO_ARCHIVES_IN_SCOPE` (every chip off). Before `listed`, it reads "Loading transcripts…".
+ - `AskScope` (`AskHub.tsx:49`) renders `ASK_SCOPE_LINE(inScope, total)` in
+ `data-testid="ask-scope"` once `listed` with at least one archive in scope. `null` hides it.
+ - `NO_ARCHIVES_ON_HUB`, `LIVE_CHAT_MISSING` and `ASK_SCOPE_LINE` (`hubScopeCopy.ts:16/24/33`) are
+ DRAFTs awaiting the operator's ruling. `LinkedCopy` renders a line's one [bracketed] link to `/`.
- **The official instances' order is the homepage's key and tiebreak.** The homepage sorts its
public sites by `transcribed.total` descending, then `siteTitle.localeCompare`
(`common/lib/homepageSummary.ts:437-441`); `hub-summary.json` keeps that order, and