## Why

Session titles generated by Claude Code's title-generator subagent never appear in the dashboard. The `session_title_update` SSE events carrying these titles arrive before the client's `sessionsMap` is populated (the fetch to `/_api/entries` is slower than the SSE connection), so titles are silently dropped and sessions show only their 8-character short ID instead.

## What Changes

- `/_api/entries` response shape changes from a plain array to `{ entries: [...], sessionTitles: { [sid]: title } }` — **BREAKING** for any client that treats the response as a bare array
- Client fetch handler updated to parse the new shape and apply titles to `sessionsMap` after entries are loaded
- No change to the SSE `session_title_update` handler (live updates continue to work as before)

## Capabilities

### New Capabilities
- `session-title-initial-load`: Deliver all known session titles to the dashboard client at page load time via the entries API response, eliminating the SSE race condition

### Modified Capabilities
<!-- None: the session_title_update SSE behavior is unchanged at the spec level -->

## Impact

- **`server/routes/api.js`**: `/_api/entries` handler — response envelope change
- **`public/entry-rendering.js`**: entries fetch callback — parse new shape, apply sessionTitles after sessionsMap is built
- No new dependencies, no new modules
- Tests that assert on the `/_api/entries` response shape will need updating
