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