lifeloop-cli 0.3.0

Provider-neutral lifecycle abstraction and normalizer for AI harnesses
Documentation
# Changelog

All notable changes to `lifeloop-cli` are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.3.0] - 2026-05-18

### Added

- Added the opt-in `ccd-renewal` host asset profile and `lifeloop host-hook`
  broker for Codex renewal prepare/continuation through CCD's public CLI.
- Added `renewal.profiles` to adapter manifest renewal claims so profile-scoped
  renewal support is explicit on the wire while remaining backward-compatible.
- Added `asset preview --profile <id>` for rendering built-in lifecycle
  profiles (`ccd-compat`, `ccd-renewal`, and `lifeloop-direct`).
- Added the CCD renewal playbook and Codex conformance coverage for
  wrapper-mediated reset prepare, out-of-band continuation token storage, and
  continuation delivery.

### Changed

- Codex now carries a scoped positive renewal claim for the `ccd-renewal`
  profile. Other built-in adapters continue to omit renewal until evaluated.

### Security

- Pending renewal token files are written fail-closed, never overwrite existing
  pending state, resolve nested repository paths to the parent `.git` state
  directory, and use user-only permissions on Unix.

## [0.2.0] - 2026-05-17

### Added

- Added optional renewal/reset adapter capability claims for native,
  wrapper-mediated, manual, and unavailable reset paths, plus
  continuation observation versus payload-delivery support.

### Removed

- Removed the public `lifeloop::source_files` managed-section renderer
  (`RenderedSourceFile`, `ApplyOutcome`, `ApplyError`, `SourceFileAdapter`,
  `TEMPLATE_VERSION`, `render_for`, and `apply`). Model instruction source
  files are user-owned; Lifeloop no longer renders replacement bodies for
  managed sections inside them. See
  `docs/decisions/source-files-are-user-owned.md` and
  `docs/tombstones/source-files-managed-section.md`.

## [0.1.1] - 2026-05-10

### Added

- Domain module aliases as pure re-exports over the canonical 0.1.0 surface,
  so consumers can use module-shaped imports without changing the underlying
  type design:
  - `lifeloop::event::{LifecycleEventKind, lifecycle_event_kinds}`
  - `lifeloop::manifest::{AdapterManifest, RegisteredAdapter, ConformanceLevel,
    Manifest*, manifest_registry, lookup_manifest}`
  - `lifeloop::adapters::{manifest_registry, lookup_manifest, codex_manifest,
    claude_manifest, hermes_manifest, openclaw_manifest, gemini_manifest,
    opencode_manifest}`
  - `lifeloop::capability::{CapabilityKind, CapabilityRequest,
    CapabilityRequirement, DefaultNegotiationStrategy, NegotiatedPlan,
    PayloadPlacementDecision, PlacementRejection, negotiate}`
- Compile-time + runtime alias-identity test (`tests/domain_modules.rs`) that
  prevents the new submodules from drifting away from their canonical
  counterparts.

### Notes

- This release is **purely additive**. All 0.1.0 paths remain authoritative
  and unchanged.
- The `CapabilityKind` / `CapabilityRequest` split is preserved deliberately:
  `CapabilityKind` is identity (used as a manifest lookup key);
  `CapabilityRequest` adds policy (`desired: SupportState`,
  `level: RequirementLevel`).
- Names like `EventName`, `all_manifests`, `negotiate_capabilities`, and a
  flat `Capability` are intentionally **not** added as aliases — consumers
  should adapt to the published vocabulary.

## [0.1.0] - 2026-05-09

- Initial publish: provider-neutral lifecycle abstraction and normalizer for
  AI harnesses. See `README.md` for the full surface.