From 64b02775530dbff2cf91240738a61ce4da28c847 Mon Sep 17 00:00:00 2001 From: Destin Date: Sun, 27 Sep 2026 20:46:49 -0700 Subject: [PATCH] docs(MAP): the chat row names first-page-loader.ts and its test Close-out for youcoded#582: the file that decides whether a chat comes up blank is new; without a MAP entry the next session searches for it. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/MAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/MAP.md b/docs/MAP.md index 5ade98c7..63796ce8 100644 --- a/docs/MAP.md +++ b/docs/MAP.md @@ -14,7 +14,7 @@ Rules live in `.claude/rules/`; depth docs are read-on-demand (`youcoded/docs/`, | Subsystem | Entry points | Rule | Depth doc | Guard tests | |---|---|---|---|---| | Model switcher recommendations (desktop + Android shared renderer) | `youcoded/desktop/src/renderer/components/model/ModelPicker.tsx` (favorite-first bands, per-family replacement, search)
`youcoded/desktop/src/shared/recommended-models.ts` (curated OpenRouter IDs and version-independent ChatGPT families)
`youcoded/desktop/src/renderer/components/assistant-settings/pages.tsx` (show/hide toggle)
`youcoded/desktop/src/main/providers/chatgpt-auth.ts` (hourly manifest refresh) | react-renderer · native-runtime | `youcoded/docs/native-runtime.md` → providers; future weekly endpoint check: `docs/roadmap/dev-workspace.md` → release | `youcoded/desktop/tests/ModelPicker.test.tsx` (ordering, GPT generation and fallback, mounted-toggle refresh) | -| Chat & transcript | `youcoded/desktop/src/renderer/state/chat-reducer.ts`
`youcoded/desktop/src/renderer/state/cc-background.ts` (Claude Code background helpers/commands: launch receipt → task-notification end)
`youcoded/desktop/src/main/transcript-watcher.ts` (the live tail)
`youcoded/desktop/src/main/transcript-page.ts` (scroll-back: one page of history)
`youcoded/desktop/src/main/transcript-page-source.ts` (WHICH file a page is read from)
`youcoded/desktop/src/renderer/state/attention-classifier.ts` | chat-reducer | `youcoded/docs/chat-reducer.md` | `youcoded/desktop/tests/chat-reducer.test.ts`
`youcoded/desktop/tests/attention-reducer.test.ts`
`youcoded/desktop/tests/transcript-watcher.test.ts`
`youcoded/desktop/tests/transcript-page-locator.test.ts` | +| Chat & transcript | `youcoded/desktop/src/renderer/state/chat-reducer.ts`
`youcoded/desktop/src/renderer/state/cc-background.ts` (Claude Code background helpers/commands: launch receipt → task-notification end)
`youcoded/desktop/src/main/transcript-watcher.ts` (the live tail)
`youcoded/desktop/src/main/transcript-page.ts` (scroll-back: one page of history)
`youcoded/desktop/src/main/transcript-page-source.ts` (WHICH file a page is read from)
`youcoded/desktop/src/renderer/state/first-page-loader.ts` (each session's FIRST page: retries, re-ask on live activity, `toEnd` for a rebuilt chat — why a chat comes up blank)
`youcoded/desktop/src/renderer/state/attention-classifier.ts` | chat-reducer | `youcoded/docs/chat-reducer.md` | `youcoded/desktop/tests/chat-reducer.test.ts`
`youcoded/desktop/tests/attention-reducer.test.ts`
`youcoded/desktop/tests/transcript-watcher.test.ts`
`youcoded/desktop/tests/transcript-page-locator.test.ts`
`youcoded/desktop/tests/first-page-loader.test.ts` | | IPC bridge (parity) | `youcoded/desktop/src/main/preload.ts`
`youcoded/desktop/src/renderer/remote-shim.ts`
`youcoded/app/src/main/kotlin/com/youcoded/app/runtime/SessionService.kt` | ipc-bridge | `youcoded/docs/shared-ui-architecture.md` | `youcoded/desktop/tests/ipc-channels.test.ts` | | Remote access (reaching this computer from another device) | `youcoded/desktop/src/main/remote-server.ts` (the WS host a phone talks to — auth, the channel dispatch, the tailnet-only bind)
`youcoded/desktop/src/main/remote-devices.ts` (**paired devices are RECORDS, not opaque tokens — unpair actually revokes, and survives a restart**)
`youcoded/desktop/src/main/remote-paths.ts` (both stores, scoped per profile so a dev instance cannot touch the real one)
`youcoded/desktop/src/main/remote-config.ts` (port, password hash, `detectTailscale` — which of the prerequisites is missing)
`youcoded/desktop/src/renderer/remote-shim.ts` (the browser's `window.claude`; `isRemoteMode()` is declared here on auth, NOT only on the Android pairing path)
`youcoded/desktop/src/main/prefs-service.ts` (**session defaults, favorites, incognito — ONE read/write for desktop IPC AND the remote host**; a setting saved from a phone reaches the permission-override cache main enforces)
`youcoded/desktop/src/renderer/android-local-bridge.ts` (a paired Android app's short second connection to its OWN runtime — its saved computers live there, not on the computer)
`youcoded/desktop/src/renderer/components/SettingsPanel.tsx` → `RemoteButton` (setup, devices, the end-of-setup check) | ipc-bridge, react-renderer | `docs/archive/specs/2026-09-09-remote-access-batch1-technical-design.md` | `youcoded/desktop/tests/remote-channel-parity.test.ts` (**every channel the shim invokes has a case in the host — the guard that was missing when a phone opened a blank panel**)
`youcoded/desktop/tests/remote-server.test.ts`
`youcoded/desktop/tests/remote-devices.test.ts`
`youcoded/desktop/tests/remote-shim.test.ts` + ast-grep `remote-admin-case-refuses` / `unpair-button-disabled-on-remote` (admin channels refused on the socket; the Unpair button disabled on a phone)
`youcoded/desktop/tests/remote-server-bind.test.ts`
`youcoded/desktop/tests/remote-phone-findings.test.ts`
`youcoded/desktop/tests/prefs-service.test.ts` (desktop and remote read and write the same way)
`youcoded/desktop/tests/terminal-touch-bottom-chrome.test.ts` + `terminal-touch-enter-disconnected.test.tsx` (terminal view on a touch screen) | | React renderer / chrome | `youcoded/desktop/src/renderer/App.tsx`
`youcoded/desktop/src/renderer/components/HeaderBar.tsx`
`youcoded/desktop/src/renderer/components/SessionStrip.tsx` (the session switcher: press, drag, drop)
`youcoded/desktop/src/renderer/components/header/drag-order.ts` (where a dragged pill lands)
`youcoded/desktop/src/renderer/components/header/pack-sessions.ts` (which pills fit)
`youcoded/desktop/src/renderer/styles/globals.css`
`youcoded/desktop/src/renderer/styles/motion.css` (**hover / press ladder, the state layer, glass-safe session-switch arrival** — imported by globals.css)
`youcoded/desktop/src/renderer/styles/float-chrome.css` (the `chrome-style: 'float'` look — every control floats on its own; its frost is `FLOAT_CHROME_GLASS` in `youcoded/desktop/src/renderer/themes/theme-engine.ts`)
`youcoded/desktop/src/renderer/hooks/use-wallpaper-header-ink.ts` + `youcoded/desktop/src/renderer/themes/wallpaper-header-ink.ts` (float only: readable icon/text colours sampled from the wallpaper)
`youcoded/desktop/src/renderer/components/ChatEdgeFade.tsx` (float only: messages fade under the controls)
`youcoded/desktop/src/renderer/components/header/control-states.ts` (the ONE definition of header hover/press/focus and the session pill's surface)
`youcoded/desktop/src/renderer/hooks/use-switch-first-frame.ts` (a tab switch shows its messages on the first frame)
`youcoded/desktop/src/renderer/hooks/use-chatview-handlers.ts` (ChatView's callbacks, stable — an inline arrow there re-renders every open tab)
`youcoded/desktop/src/renderer/hooks/use-chunked-reveal.ts` (long lists draw 50 at a time)
`youcoded/desktop/src/renderer/hooks/use-entry-folding.ts` (timelines fold what is far off screen) | react-renderer, renderer-lists, performance, session-strip-motion | `youcoded/docs/renderer-chrome.md` (→ "Lists and render cost") | `scripts/ui-review/dom-size-sweep.mjs` (every screen from the shoot list, opened by name under `stress`, under 8,000 elements; builds and serves its own copy; run on request — needs a browser, not in `verify.sh`)
`scripts/ast-grep/rules/no-hardcoded-z-index-or-scrim.yml` (+6 sibling rules with the same prefix; retired tests/overlay-layer-authority.test.ts, Plan B 2026-09-16)
`scripts/ast-grep/rules/no-arbitrary-text-size.yml` (+ `-ts` twin + `type-scale-named-tokens-declared`; retired tests/type-scale-authority.test.ts, Plan B t5c 2026-09-16)
`youcoded/desktop/tests/animation-frame-budget.test.ts` + `animation-css-budget.test.ts` (stylesheet frame-budget and motion-token pins)
`youcoded/desktop/tests/hover-press-ladder.test.ts` + `switch-arrival-glass.test.tsx` + `chatview-skips-uninvolved-sessions.test.tsx`; ast-grep `app-chatview-props-are-stable`, `chrome-control-no-glyph-nudge-hover`
`scripts/ast-grep/rules/session-strip-drag-visuals-are-state.yml` + the other session-strip-… rules (the switcher's drag/hover/label pins, retired from animation-frame-budget.test.ts 2026-09-16)
`scripts/ast-grep/rules/no-unstepped-infinite-animation.yml`
`youcoded/desktop/tests/drag-order.test.ts`
`youcoded/desktop/tests/pack-sessions.test.ts`
`youcoded/desktop/tests/SessionStrip.test.tsx` (the All Sessions menu reorders on its own drag; renaming from the list)
`youcoded/desktop/tests/float-chrome-pops.test.ts` (every float rule is gated on float; frost obeys Reduced effects) + `wallpaper-header-ink.test.ts` + `wallpaper-header-runtime.test.tsx` |