lifeloop-cli 0.5.0

Provider-neutral lifecycle abstraction and normalizer for AI harnesses
Documentation
# Decision: `session.*` is Lifeloop top-level lifecycle vocabulary

**Status:** Accepted on 2026-05-28, scope `lifeloop.v0.2`.

**Issue:** [#82 - Audit Lifeloop lifecycle vocabulary for stale session terminology](https://github.com/nantobv/lifeloop/issues/82).

## Decision

Lifeloop keeps the public `session.*` event names in `lifeloop.v0.2`.

In the Lifeloop contract, `session.*` means the top-level harness lifecycle
boundary: starting, started, ending, and ended. It is not a claim that every
client owns or exposes a product concept named "session".

CCD maps those Lifeloop events onto CCD-owned channel, thread, spin, lease,
checkpoint, and renewal operations. CCD must continue to expose its own
vocabulary (`thread`, `spin`, `frame`, and `checkpoint`) and must not introduce
a CCD session abstraction just because the incoming Lifeloop wire event is
named `session.*`.

## Why

The `session.*` names are already public wire contract:

- `src/wire.rs` serializes `LifecycleEventKind::{SessionStarting,
  SessionStarted, SessionEnding, SessionEnded}` to `session.*`.
- `tests/wire_contract.rs` pins those literal names.
- `docs/specs/lifecycle-contract/body.md`, conformance fixtures, manifests,
  and client fixtures all use those names.

Renaming them would be a breaking wire change and would require the schema-bump
and tombstone process. The audit found no current need for that break: the stale
part was CCD-facing prose treating the Lifeloop wire word as CCD vocabulary.

## Implications

- No schema bump is required.
- Existing conformance fixtures named `session_*` remain valid because they pin
  Lifeloop wire events, not CCD concepts.
- CCD integration specs should say "top-level lifecycle" when describing CCD
  behavior and reserve `session.*` for the Lifeloop event names themselves.