Task 9 of the native-surfaces migration plan. fullLoop.test.ts walks the
whole inner loop in one doc, stub-turned: enter (snapshot baseline) -> two
comment asks -> reply -> offer -> pending proposals (F12 optimistic-apply,
decorated + isApplied) -> human tweak inside a pending proposal's range
(INV-11: breaks the raw fingerprint anchor, but finalizeInPlace/"Keep" is
built to survive that) -> keep one (attribution split via spansFor: claude's
words + the human tweak, char-honest) -> reject the other (buffer text
returns EXACTLY to its pre-proposal text, INV-5) -> markReviewed -> change
count 0.
scripts/smoke-native-loop.mjs + test/e2e/smoke/nativeLoop.ts are the rung-3
manual gate: launches the real EDH against sandbox/, posts a real comment via
ThreadController.createThreadOnSelection with BOTH turns left unstubbed (the
real @cline/sdk, INV-8), waits for the reply/offer, makes + accepts the edit,
and prints the created proposal ids. Lives outside test/e2e/suite so it is
never swept into `npm run test:e2e`; `npm run smoke:native` builds +
compiles then runs it. Operator-run only (real credentials) -- not executed
here, verified by typecheck + a syntax/structural pass only.
300 unit + 86 workspace/5 no-workspace host E2E green (1 pending, pre-existing
#54 undo-suite skip).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Surface Claude live output/progress during the asking-Claude status: notification activity line + token count, a Cowriting: Claude OutputChannel streaming assistant text, and a cancellable turn. Pure turnProgress reducer + runEditTurn onProgress/AbortSignal (vscode-free) + both call sites. INV-43..47.
Fixes#60