CodeNomad/docs/help/tr
Pascal André 1840c71054
Some checks are pending
Publish help / build (push) Waiting to run
Publish help / deploy (push) Blocked by required conditions
fix(timeline): mirror every transcript block in order and keep clicks on the clicked marker (#1086)
## What changes for the user
The timeline now matches the transcript block for block, and a click
lands exactly where it should.

- **One marker per visible block, in transcript order:** each reply,
each thinking run, each tool (or collapsed tool group), each compaction
and each system context. Markers follow Message content: a block that is
hidden in the transcript is hidden in the timeline too.
- **The clicked marker stays active** until you scroll, and its own
block, not just the start of its message, is placed at the reading
position. This also works for history that is not loaded yet.
- **While scrolling,** the active marker is the first block below the
reading line.

## Reproduced in numbers before fixing
We replayed 45 of the user's real sessions (65,241 messages, exported
read-only) into the real `SessionView`, with the outline, windows and
previews served by the real server readers. Each session was measured at
1280×800 with two presets, using 16 real pointer clicks and 8 wheel
scrolls per run. Baseline and fix used the same seeds.

| Metric | Before, Complet | Before, Balanced | After, both presets |
|---|---|---|---|
| Sessions out of sync | 43/45 | 42/45 | 0/90 runs |
| Markers / expected | 68,949 / 130,818 | 68,949 / 98,759 | 130,818 /
130,818 and 98,759 / 98,759 |
| Click: clicked marker active | 53.6% (46.0% the one above) | 57.2% |
1,440 / 1,440 |
| Click: block at reading position | 41.5% (median off by 35 px) | 82.2%
| 1,440 / 1,440 (median 0.27 px) |
| Scroll: reading-line block active | 93.1% | 92.2% | 505 / 505 moving
wheels |

What was wrong with the markers in the Complet runs:
- 29,782 tool markers were collapsed into one marker per step.
- 31,777 thinking blocks and 282 system blocks had no marker.
- There were 10,232 order inversions.

## Causes
1. Once an outline existed, the outline projection replaced the markers
of loaded messages too (`message-section.tsx`). It collapsed a step's
tools into one marker placed before its reply, and dropped system
blocks.
2. Resident segments merged thinking into replies, dropped thinking-only
steps and skipped system parts.
3. After a click or a scroll, the active marker was the message's first
marker. The message itself came from a scroll offset that rounds a row
starting just below the top to the previous message.
4. Clicks navigated to the message, not to the block.
5. Jumps into unloaded history had no row to hold while the target was
not yet rendered.

## How
- **Server (outline):** each assistant step can now carry an optional
`layout` field. It lists the step's visible parts in order: thinking
runs, reply runs and each tool, at most 64 entries. It is computed in
the same bounded SQL. Older plugin copies don't send it, and the client
then falls back to the counts: thinking, then text, then tools.
- **Markers:** `buildTimelineSegments` emits one marker per block, keyed
`messageId:type:ordinal`. Loaded messages keep their exact markers.
Unloaded steps are placed at their native position from `layout`.
- **Click and scroll:** the list's `scrollToKey(key, selector)` holds
the selected block on every frame, survives row remounts, and follows
Virtua's estimate until the row renders. `timeline-transcript-blocks.ts`
maps markers to blocks and finds the block at the reading line.
- **Saved indexes:** outline indexes saved without `layout` are
revalidated once.
- **Docs and help:** updated in `dev-docs/SESSION_HISTORY_NAVIGATION.md`
and in the help pages for all 10 locales.

## Behaviour to be aware of
- **The timeline has more markers:** about +90% with Complet and +43%
with Balanced on this sample, because every tool, thinking and system
block now has its own marker.
- **Tool icons for unloaded steps:** a step not loaded yet shows its
first tool's icon on all of its tool markers, until its window loads.
- **Plugin requirement:** the pruning plugin must ship with the new
`layout` field.

## Validation
- **New regression test:** `tests/browser/timeline-sync.test.ts` passes
4/4 and fails 4/4 on unmodified dev. Fixtures are synthetic.
- **Measurement harness:** the opt-in qualification `npm run
qualify:browser:timeline-sync`.
- **Browser suites:**

  | Suite | Result |
  |---|---|
  | history-navigation | 65 |
  | message-scroll | 128 |
  | session-rendering | 47 |
  | render-cost | 17 |
  | full-source-copy | 12 |
  | search-highlight | 11 |
  | system-messages | 10 |
  | timeline-tool-filters | pass |
| streaming-outline (no full reprojection over 64 token deltas) | pass |
  | session-search | pass |
  | transcript-presets | pass |

- **Other checks:** UI unit tests 75/75, server session-pruning 70/70,
help 9/9 and the UI typecheck pass.
- **After rebasing on dev:** the typecheck passes, along with
timeline-sync 4/4, timeline-tool-filters, full-source-copy 12/12,
usage-metrics 5/5 and streaming-outline.

Oversized files touched: `message-section.tsx` (~1,637 lines),
`virtual-follow-list.tsx` (~1,368), `message-timeline.tsx` (~508),
`message-timeline.css` (204).
2026-10-22 05:32:43 +02:00
..
browser-sidecars.md docs(agents): keep AGENTS.md to universal rules and agent docs to the current state (#1082) 2026-10-21 16:59:43 +02:00
conversations.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
desktop.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
extensions.md docs(help): multilingual help site with in-app Help menu and palette entry (#859) 2026-10-14 22:44:56 +02:00
files.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
history.md fix(timeline): mirror every transcript block in order and keep clicks on the clicked marker (#1086) 2026-10-22 05:32:43 +02:00
index.md fix(workspaces): closing a project tab closes the project in CodeNomad (#970) 2026-10-15 15:14:29 +02:00
install.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
integrations.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
missions.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
mobile.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
opencode.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
permissions.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
projects.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
providers.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
remote-access.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
remote-control.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
security.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
server.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
settings.md fix(timeline): mirror every transcript block in order and keep clicks on the clicked marker (#1086) 2026-10-22 05:32:43 +02:00
shortcuts.md fix(transcript): jump between user messages with Alt+Up/Down, also from the composer (#1087) 2026-10-21 20:36:02 +02:00
support.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
troubleshooting.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
updates.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00
voice.md docs(help): bring the user guide back in line with the current app (#1079) 2026-10-21 14:38:29 +02:00