diff --git a/docs/release.md b/docs/release.md index d53dca9e7..904bce139 100644 --- a/docs/release.md +++ b/docs/release.md @@ -300,8 +300,8 @@ No prefix (`v`), no extra text. The parser matches the first `## X.Y.Z` line to ## Changelog ownership -- **Only Claude should write changelog entries.** -- If you are Codex and a stable release needs a changelog entry, launch a Claude agent with Paseo to draft it, then review and commit the result. +- **The agent running the stable release writes the changelog entry.** Do not hand the changelog to another model or agent. The release agent has the release context and owns the final wording. +- Draft the entry from the stable-to-stable diff, review it against the changelog policy below, show it to the user, and wait for approval before committing it. ## Changelog voice @@ -380,19 +380,15 @@ Entries within each section (Added, Improved, Fixed) are ordered by user impact: ## Pre-release sanity check -Before cutting a **stable** release, run a Codex review of the diff as a last line of defence against shipping bugs. Skip this for betas — the beta itself is the smoke test, and gating each beta on a code review defeats the point of using betas as fast release candidates. +Before cutting a **stable** release, the release agent reviews the diff as a last line of defence against shipping bugs. Skip this for betas — the beta itself is the smoke test, and gating each beta on a code review defeats the point of using betas as fast release candidates. -Load the `paseo` skill and launch a **Codex 5.4** agent with a prompt like: +Review the diff between the latest release tag and `HEAD`. Focus on: -> Review the diff between the latest release tag and HEAD. Focus on: -> -> 1. **Breaking changes** — especially in the WebSocket protocol, agent lifecycle, and any server↔client contract. -> 2. **Backward compatibility** — the important direction is old app clients talking to newly updated daemons. Users update desktop and daemon first, then keep running the old app for a while. Flag anything that breaks old clients against new daemons or requires both sides to update in lockstep. -> 3. **Regressions** — anything that looks like it could break existing functionality. -> -> Diff: `git diff ..HEAD` +1. **Breaking changes** — especially in the WebSocket protocol, agent lifecycle, and any server↔client contract. +2. **Backward compatibility** — the important direction is old app clients talking to newly updated daemons. Users update desktop and daemon first, then keep running the old app for a while. Flag anything that breaks old clients against new daemons or requires both sides to update in lockstep. +3. **Regressions** — anything that looks like it could break existing functionality. -The agent's job is a deep sanity check, not a full code review. If it flags anything, investigate before proceeding. +Use `git diff ..HEAD` as the review input. This is a deep sanity check, not a full code review. If anything looks risky, investigate before proceeding and surface the finding to the user. ## Changelog scope diff --git a/packages/app/src/terminal/runtime/terminal-resize-repro.browser.test.ts b/packages/app/src/terminal/runtime/terminal-resize-repro.browser.test.ts index 1b733ae94..c5492df78 100644 --- a/packages/app/src/terminal/runtime/terminal-resize-repro.browser.test.ts +++ b/packages/app/src/terminal/runtime/terminal-resize-repro.browser.test.ts @@ -75,6 +75,18 @@ function someRowContains(text: string): boolean { return dumpRows().some((r) => r.text.includes(text)); } +function renderSnapshotCommitted(runtime: TerminalEmulatorRuntime, state: TerminalState) { + return new Promise((resolve) => { + runtime.renderSnapshot({ state, onCommitted: resolve }); + }); +} + +function writeCommitted(runtime: TerminalEmulatorRuntime, data: Uint8Array) { + return new Promise((resolve) => { + runtime.write({ data, onCommitted: resolve }); + }); +} + // Build a server-style snapshot of one long pino line that the SERVER soft-wrapped // at `cols`, represented as multiple grid rows (exactly what the daemon stores in // its headless xterm and ships in a snapshot). @@ -122,12 +134,12 @@ describe("terminal resize reflow repro (Paseo terminal)", () => { // 1) Mid-stream snapshot arrives (server overflowed 256KB). It carries the // long line wrapped at the server width as separate grid rows. - m.runtime.renderSnapshot({ state: buildWrappedSnapshot(narrowCols) }); + await renderSnapshotCommitted(m.runtime, buildWrappedSnapshot(narrowCols)); await waitFor(() => someRowContains('"seq":1')); // 2) Normal post-snapshot streaming resumes (autowrap on -> soft-wrapped). for (let seq = 90; seq <= 96; seq++) { - m.runtime.write({ data: encodeTerminalOutput(pinoLine(seq)) }); + await writeCommitted(m.runtime, encodeTerminalOutput(pinoLine(seq))); } await waitFor(() => someRowContains('"seq":96')); diff --git a/packages/client/src/daemon-client.test.ts b/packages/client/src/daemon-client.test.ts index 726371dee..5ea7294a7 100644 --- a/packages/client/src/daemon-client.test.ts +++ b/packages/client/src/daemon-client.test.ts @@ -256,6 +256,7 @@ test("advertises client capabilities in hello", async () => { capabilities: { custom_mode_icons: true, reasoning_merge_enum: true, + terminal_reflowable_snapshot: true, }, }); });