# Tombstone: `lifeloop asset apply` CLI subcommand

**Superseded by:** `lifeloop asset preview` (already shipping; identical
output).
**Date:** 2026-05-08
**Decision:** [`docs/decisions/asset-apply-boundary.md`](../decisions/asset-apply-boundary.md)
**Issue:** [#23][issue-23]

## What was removed

The `apply` subcommand under `lifeloop asset`. Calling
`lifeloop asset apply --host <h> --mode <m>` now exits with usage error
code 2 and a stderr message redirecting the caller to
`lifeloop asset preview`.

## Why

The `apply` subcommand was a side-effect-free alias of `preview`. The
two commands shared the same `run_action` helper and emitted the
identical JSON `{ relative_path, mode, contents }` array. The name
implied filesystem mutation that the command never performed, which
risked operator confusion and contradicted the documented boundary that
"callers handle reads, writes, mode bits, and atomic replace".

The full reasoning is in the decision document linked above. In short:
Lifeloop normalizes lifecycle reach, not filesystem ownership. Building
safe-write infrastructure (root selection, atomic rename, no-clobber,
drift detection) for a P1 boundary decision when no current client asks
for it is the wrong shape of investment.

## Migration

If a script or harness wrapper invoked `lifeloop asset apply`, replace
the call with `lifeloop asset preview` — flags, exit codes, and JSON
output are identical. The caller already had to write the files
themselves; that part of the workflow is unchanged.

## Removal criterion

This tombstone may be deleted once **all** of the following hold:

- two consecutive Lifeloop releases have shipped without any committed
  doc, fixture, harness wrapper script, or CCD-side script under
  `dusk-network/ccd` referencing `lifeloop asset apply` (the rejection
  message itself is allowed to keep mentioning the old name);
- the apply-boundary decision in
  [`docs/decisions/asset-apply-boundary.md`](../decisions/asset-apply-boundary.md)
  has not been reopened in favor of Option A (Lifeloop-owned
  filesystem apply).

If the decision flips to Option A, this tombstone is removed in the
same change that introduces the new safe-apply subcommand (whose name
will not collide with the old `apply` because that command would carry
new flags like `--root` and `--dry-run`).

[issue-23]: https://code.nanto.org/nanto/lifeloop/-/work_items/23
