📱 Доска iOS

всеканоны и докиворкеры↗ WEB↗ Легаси
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