IOS-071 · Задача · UX · web
FC волна 2: переразрешить ядро+проводку на пост-волна1 канон
Закрыт
P1 · важно
ведёт: fc-replay
эпик: IOS-067
Суть
Волна 1 (честность+светофор+F1) посажена в канон коммитом 6b522793a. Wave2-core-only ложился чисто на СТАРЫЙ канон, но конфликтует поверх волны 1 — нужно переразрешение. Затем ручной rewrite проводки (route/actions/modal) с сохранением новых канон-потоков: auth, rate-limit, abort, server-owned payload, autosave. МИНЫ: RRF≠cosine (любой score-гейт только после rescoreByCosine — mine.ts это уже делает, НЕ сломать); i18n в messages/*.json; drawer на deferOverlaysReady. Конфликт-карта: ~/Downloads/FC-REPLAY-WIRING-CONFLICTS.md + snippets в fc-replay-ios069-checks/.
Чем закрывается (приёмка)
Заплатки FC-W2-core-rebased.patch и FC-W2-wiring-rebased.patch от пост-волна1 канона, обе exit 0; отчёт в тикет со списком сохранённых канон-потоков по каждому конфликтному файлу.
Лента
2026-08-02T01:24:32.691Z · fc-replay# IOS-071 fc-wave2 report
SCOPE: Wave2 core + wiring rebased onto post-Wave1 canon from `/tmp/canon-fcw1.tar.gz`; no push, no deploy.
BASE: `4090d3a85fcc9123f88e2d937b08584c8d38fab6` (scratch branch `main`, local import of post-Wave1 canon 6b522793a).
CHANGES:
- `/Users/milamarty/Downloads/FC-W2-core-rebased.patch`
- `/Users/milamarty/Downloads/FC-W2-wiring-rebased.patch`
- Scratch commits:
- `5ef0e53b2343b5aacfb8442dc8af9a260b81a2cd` `IOS-071 Wave2 core rebased`
- `df7fdeec8d269acc1b5baaf9ca3054875c950bf7` `IOS-071 Wave2 wiring rebased`
Core patch:
- Kept Wave2 core/library work: `src/lib/research/retrieve.ts`, `src/lib/research/mine.ts`, `src/lib/research/entailment.ts`, `src/lib/deepResearch/pipeline.ts`, shared PDF modules/tests.
- Excluded old Wave2 hunks against `src/lib/factcheck/pipeline.ts` and `src/lib/factcheck/providers/internalRag.ts` because Wave1 is already canon and the IOS-071 brief says not to touch fact-check Wave1.
- RRF mine preserved: MINE retrieval still goes through `searchMineVectors()` and `rescoreByCosine()` before `classifyVectorScore()`.
Wiring patch:
- `src/app/api/deep-research/run/route.ts`
- Preserved auth via `auth`.
- Preserved rate limit via `consumeRateLimit`.
- Preserved bounded JSON parse via `readBoundedDeepResearchJson`.
- Preserved server-owned payload path via `buildServerOwnedDeepResearchPayload`.
- Client raw `context` is not trusted: route injects empty context into the server-owned payload and later overwrites server-owned `context/contextSourceCount` from ACL-checked sources.
- Preserved managed Tavily key resolution via `resolveProviderKeyForRequest`.
- Preserved source ACL via `getAccessibleSourceIds`.
- Preserved Prisma source hydration and `hydrateTrustedDeepResearchSources`.
- Preserved generated save-target reconciliation.
- Preserved singleton run guard via `acquireDeepResearchRun`.
- Preserved abortable stream via `AbortController` and `wrapDeepResearchStream`.
- Added server-owned `userId` and normalized retrieval `scope`.
- `src/app/researchActions.ts`
- Preserved runtime key resolution and runtime fallback/error messages.
- Preserved abort checks around planner, pipeline, writer, native engines, save, and stream close.
- Preserved native OpenAI/Perplexity paths with server-owned notebook context compatibility.
- Replaced classic raw context + bespoke Tavily join with `runResearchPipeline()` and `formatGroundedBlock()`.
- Retrieval filter is server-owned from ACL-checked `sourceIds`; `userId` is injected by route.
- Metadata `context.sourceCount` now uses grounded MINE source count for classic pipeline.
- Preserved autosave via `processDocument()` and `normalizeDeepResearchSaveTargetMetadata()`.
- `src/components/modals/DeepResearchModal.tsx`
- Preserved abort controller, stream parser, runtime availability checks, autosave reconciliation, addSource/createCorpus, ready/export UI.
- Removed client plaintext context construction.
- Client now sends retrieval `scope` + `sourceIds`, not raw source text.
PROOF:
- Core apply-check from fresh base: `/Users/milamarty/Downloads/fc-wave2-ios071-checks/core-apply.log`, exit 0.
- Wiring apply-check after core: `/Users/milamarty/Downloads/fc-wave2-ios071-checks/wiring-apply.log`, exit 0.
- Focused lint: `./node_modules/.bin/eslint src/app/api/deep-research/run/route.ts src/app/researchActions.ts src/components/modals/DeepResearchModal.tsx`, exit 0, log `/Users/milamarty/Downloads/fc-wave2-ios071-checks/eslint-wiring.log`.
- Whitespace check: `git diff --check`, exit 0, log `/Users/milamarty/Downloads/fc-wave2-ios071-checks/diff-check.log`.
- Focused tests: `npx tsx --test src/lib/deepResearch/__tests__/pipeline.test.ts src/lib/pdf/__tests__/pdfShared.test.ts`, exit 0, 16 pass / 0 fail, log `/Users/milamarty/Downloads/fc-wave2-ios071-checks/focused-tests.log`.
- `git show --name-only --oneline HEAD`: `df7fdee IOS-071 Wave2 wiring rebased`, changed route/actions/modal only.
RISK/BLOCKERS:
- Full `./node_modules/.bin/tsc --noEmit --pretty false --incremental false` was attempted once and failed with Node OOM (`exit 134`) on this Mac; not repeated due local resource guard.
- `src/lib/research/__tests__/retrieve.test.ts` remains blocked in this tar tree by missing generated `.prisma/client/default` because `pnpm exec` refused build scripts without `pnpm approve-builds`; pipeline/PDF tests pass.
NOT-DONE:
- No push.
- No deploy.
- No browser/prod check; this scope only produces rebased patches.
2026-08-02T01:29:14.298Z · вахтёрВоркер fc-replay-069 объявил БЛОКЕР или ждёт сборочный слот. Жив, но не продвигается. Последняя строка: gpt-5.5 high · ~/Projects/fc-replay
2026-08-02T01:34:21.136Z · вахтёрВоркер fc-replay-069 объявил БЛОКЕР или ждёт сборочный слот. Жив, но не продвигается. Последняя строка: gpt-5.5 high · ~/Projects/fc-replay
Воркер
не проверен
fc-replay-069
M4
движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
ssh -t poolpooly@192.168.1.74 "ssh -t milamarty@192.168.1.114 '/opt/homebrew/bin/tmux -L gui attach -t fc-replay-069'"
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
ssh poolpooly@192.168.1.74 "ssh milamarty@192.168.1.114 '/opt/homebrew/bin/tmux -L gui capture-pane -p -S -5000 -t fc-replay-069'" | less -R
Если при входе tmux покажет «.config/tmux/tmux.conf: Permission denied» — нажми q, это косметика: каталог ~/.config на M4 принадлежит root, сессия работает. Лечится один раз с паролем на M4: sudo chown -R milamarty:staff /Users/milamarty/.config && chmod 755 /Users/milamarty/.config
Обновлён
2026-08-02T01:39:18.060Z