Files
kandev/docs/plans/transcript-env-switch-scroll/task-01-reconcile-env-switch-transcript-placement.md
T

157 lines
7.2 KiB
Markdown

---
id: "01-reconcile-env-switch-transcript-placement"
title: "Reconcile environment-switch transcript placement"
status: done
wave: 1
depends_on: []
plan: "plan.md"
requirements:
- REQ-UI-TRANSCRIPT-AUTO-SCROLL-001
acceptance_criteria:
- AC-UI-TRANSCRIPT-AUTO-SCROLL-001.11
- AC-UI-TRANSCRIPT-AUTO-SCROLL-001.12
- AC-UI-TRANSCRIPT-AUTO-SCROLL-001.13
system_design:
- ../../specs/ui/system-design/transcript-auto-scroll.md
---
# Task 01: Reconcile Environment-switch Transcript Placement
## Summary
Arm a session-scoped placement request for environment-changing Dockview
switches, defer the incoming transcript until its layout and latest history are
ready, and block automatic older-history pagination during that window. Prove
that enabled and disabled sessions resolve from their own state while same-
environment and ordinary layout behavior remain unchanged.
## Failing regressions first
1. Add a store action test that performs an `env-a` to `env-b` switch and
requires a tokened request for the incoming session while
`pendingChatScrollTop` remains null. Require the same-environment early
return not to arm a request.
2. Add a native-scroll hook case with outgoing and incoming sessions, distinct
saved offsets, a matching environment-switch token, and a pending history
refresh. Require no initial write or pagination eligibility until the
incoming rows settle.
3. Complete the refresh with a larger scroll height and require an enabled
session to land at the current bottom.
4. Repeat with auto-scroll disabled and require the incoming session's saved
offset, never the outgoing session's offset.
5. Add a cached-entry session-message test that holds the background
`message.list` promise and requires the placement-readiness signal to remain
pending until that exact refresh settles.
6. Add a desktop Playwright case that switches between two overflowing tasks
in different environments and fails on the current top reset.
## In scope
- Add and consume the tokened Dockview transcript-placement request.
- Extend activation pending to support a visible external reactivation token.
- Expose cached history-refresh readiness without changing loading copy or
presentation.
- Block the older-history sentinel while environment placement is unresolved.
- Cover the env-switch store action, absolute scroll preservation isolation,
initial placement, session-specific saved offset, pagination block, and
same-environment behavior.
- Add the desktop differing-environment browser regression and run the existing
mobile auto-scroll suite.
- Update plan and work-order results after implementation.
## Out of scope
- Reusing `preserveChatScrollDuringLayout` for the environment switch.
- Changing saved-offset persistence, auto-scroll controls, pagination page
sizes, or message fetching contracts.
- Changing maximize, un-maximize, preset/custom layout, explicit navigation,
unread divider, or live-tailing behavior.
- New copy, layout, responsive composition, or mobile navigation.
## Acceptance
- A cross-environment switch places an enabled incoming transcript at the
bottom after its latest history settles, without applying the outgoing
session's offset.
- A disabled incoming transcript restores only its own saved offset.
- Automatic top-intersection pagination remains blocked until placement is
complete, and same-environment switching retains the current path.
## Verification
```bash
cd apps && pnpm --filter @kandev/web test -- lib/state/dockview-env-switch-action.test.ts lib/state/dockview-scroll-preserve.test.ts hooks/domains/session/use-session-messages.test.ts components/task/chat/transcript-auto-scroll.test.ts components/task/chat/message-list-native.test.tsx
cd apps && NODE_ENV=production pnpm --filter @kandev/web test -- lib/state/dockview-env-switch-action.test.ts lib/state/dockview-scroll-preserve.test.ts hooks/domains/session/use-session-messages.test.ts components/task/chat/transcript-auto-scroll.test.ts components/task/chat/message-list-native.test.tsx
cd apps/web && pnpm run typecheck
cd apps && pnpm --filter @kandev/web lint
cd apps/web && pnpm e2e:run --host --project chromium tests/chat/auto-scroll-toggle.spec.ts -- --grep "environment-changing task switch" --retries=0
cd apps/web && pnpm e2e:run --host --no-build --project mobile-chrome tests/chat/mobile-auto-scroll-toggle.spec.ts -- --retries=0
python3 scripts/lint-spec-files.test.py
python3 scripts/lint-spec-files.py --all
git diff --check -- docs/specs/ui docs/plans/transcript-env-switch-scroll apps/web/components/task/chat apps/web/components/task/task-chat-panel.tsx apps/web/hooks/domains/session apps/web/lib/state apps/web/e2e/tests/chat
```
Run `pnpm install --frozen-lockfile` from `apps/` before the first package
command in a fresh worktree.
## Files likely touched
- `apps/web/lib/state/dockview-store.ts`
- `apps/web/lib/state/dockview-env-switch-action.test.ts`
- `apps/web/lib/state/dockview-scroll-preserve.test.ts`
- `apps/web/hooks/domains/session/use-session-messages.ts`
- `apps/web/hooks/domains/session/use-session-messages.test.ts`
- `apps/web/components/task/chat/use-chat-panel-state.ts`
- `apps/web/components/task/task-chat-panel.tsx`
- `apps/web/components/task/chat/message-list-shared.tsx`
- `apps/web/components/task/chat/message-list-native.tsx`
- `apps/web/components/task/chat/message-list-native-scroll.ts`
- `apps/web/components/task/chat/message-list-native.test.tsx`
- `apps/web/components/task/chat/transcript-auto-scroll.ts`
- `apps/web/components/task/chat/transcript-auto-scroll.test.ts`
- `apps/web/e2e/tests/chat/auto-scroll-toggle.spec.ts`
## Dependencies
None.
## Risks
- A request that is not session- and token-checked can clear or reposition a
later task switch.
- Placement must wait for both layout and cached-history refresh readiness, not
only one signal.
- The sentinel block must be released after the final placement write, not when
the request is first observed.
## Parallelism
`sequential`
## Inputs
- `REQ-UI-TRANSCRIPT-AUTO-SCROLL-001`, criteria 11 through 13.
- `docs/specs/ui/system-design/transcript-auto-scroll.md`, especially
Environment-change rebuild lifecycle.
- Existing env-switch store-action and native-scroll hook harnesses.
- Existing desktop and mobile transcript auto-scroll Playwright suites.
## Results
- Added a session-scoped, tokened Dockview placement request that is armed only
by environment-changing switches and never captures the outgoing transcript's
absolute offset.
- Added cached-entry history-refresh readiness and delayed native placement
until both Dockview and message history settle. Auto-scroll writes and the
older-history sentinel stay inactive while the request owns placement.
- Added unit regressions for enabled bottom placement, disabled incoming offset,
stale-token completion, same-environment behavior, pagination blocking, and
isolation from absolute layout restore.
- Added a desktop Playwright regression using two confirmed distinct task
environments. It covers enabled and disabled return trips through the task
sidebar.
- Verification passed: focused Vitest in test and production modes (128 tests),
full Vitest (1,756 files and 15,076 tests, with 4 skipped), typecheck, lint,
Prettier, spec lint, desktop Playwright (1 test), and mobile Playwright (5
tests).