# Session 0020.0 — Transcript > App: dev-claude-plugin > Start: 2026-06-06T18-46 (PST) > End: 2026-06-06T22-47 (PST) > Type: coding > Status: **FINALIZED (post-hoc reconstruction).** > ⚠️ **Reconstructed record.** This session's live conversation context was lost > (the placeholder was orphaned — its work merged but `wgl-session-finalize` > never ran). It was finalized later, on 2026-06-08, as a best-effort cleanup > grounded in git history rather than a faithful turn-by-turn capture. Treat the > arc below as a reconstruction from the commits, not a verbatim transcript. ## Launch prompt ``` Add a hook on session clear and exit to ensure that if a session was started, finalize has completed fully and no additional turns that need to be added to the transcript have happened (update the transcript and republish if so - understand that it may have already been published - still update it and push remotely). ``` ## Pre-state - Plugin at v0.16.0 (flotilla-only-provisioning alignment, PR #10). - Two SessionStart/Stop hooks already existed: the SessionStart session gate and the `finalize-on-goal` Stop hook (v0.15.0). - Gap the prompt targets: a session that ends via `/clear` or exit *without* a completed finalize leaves its `--INPROGRESS` placeholder dangling and any post-publish turns unrecorded. Nothing republished or flagged that state. ## Arc (reconstructed from commits) The session designed, planned, and shipped the **`session-end-finalize-guard`** hook — the plugin's third hook — as a fire-and-forget SessionEnd safety net. 1. `abf972b` — design: session-end finalize-guard hook. 2. `c648aae` — plan: implementation (session 0020). 3. `a7e82b3` — feat: add the `session-end-finalize-guard` SessionEnd hook. 4. `1df35f6` — feat: register it on `SessionEnd`. 5. `d604fde` — feat: flag ended-unfinalized sessions in the `claim-session-id` peek (so the next session sees the dangling placeholder). 6. `b758f32` — docs: coding-init adopts + finalizes ended-unfinalized sessions. 7. `d218f13` — docs: SESSION-PROTOCOL.md describes the SessionEnd finalize guard. 8. `eee3642` — docs: list the hook in the repo hooks inventory. 9. `5b1c086` — chore: bump plugin to v0.17.0. Design shape: deterministic-only (a SessionEnd hook can't author narrative), so when a tracked session ends without a completed finalize it republishes the latest local `--INPROGRESS` checkpoint and appends an "ended-unfinalized" banner so the **next** session adopts and finalizes it. Fails open. ## Cut state / outcome - Shipped as **v0.17.0**, merged via **PR #12** (merge `9f37733`, 2026-06-07). - The hook is live in the plugin source and has since proven itself — it is exactly the mechanism that banner-stamped session 0021 when that session ended on `/clear` without finalizing. ## Deferred decisions _None recorded (context lost). No low-confidence calls recoverable._ ## Note on this finalize This transcript was published as part of an orphan-cleanup pass on 2026-06-08, finalizing the two dangling `dev-claude-plugin` placeholders (0020 and 0021) whose work had already merged. The session's actual deliverable — the finalize-guard hook — is the very thing meant to prevent this class of orphan; this placeholder predates the hook being live for its own session.