# 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.
