dx-archive
Retire a finished container. One id in, one folder moved, one stamp written. No registry — the archive is just where done work lives.
Guard. If the id resolves to nothing, or the folder can't move cleanly, do nothing and say why. Never half-move.
Resolve
The argument is one id. Find its home:
context/changes/<id>/→ it's a change.context/efforts/<id>/→ it's an effort.- Neither, or both → fail loud: print what you looked for and stop. (Already under
context/archive/? Say it's already archived.)
Effort gate — children first
An effort is done only when every child change is already archived. Before moving an effort, read its roadmap.md, and for each linked child change check for archived_at (derive it — scan the child's change.md, don't trust a checkbox). If any child is still open, list them and ask before continuing. The user may override.
Review gate — unresolved findings
For a change, check reviews/impl-review.md. If it has any finding with Resolution: PENDING, warn — "N unresolved impl-review finding(s) — /dx-review-triage impl to address them first" — and ask whether to archive anyway. The user may override.
Move and stamp
- Destination:
context/archive/<today>-<id>/where<today>isdate +%F. If it already exists, fail loud and stop. - Stamp the moved container's
change.md(oreffort.md): setstatus: archivedandarchived_at:to today's date (date +%F, same format ascreated/updated— no other field in the schema carries a finer timestamp); bumpupdated:. Leave every other field alone. For the exact schema, invokedx-referenceswith topicchange-md(a change) oreffort-md(an effort). - Move the whole folder: prefer
git mvso history follows; fall back tomv(warn) if git is unavailable. Confirm the source is gone and the destination exists — if not, print a diagnostic and stop.
Done when
The folder lives at context/archive/<today>-<id>/, its identity file reads status: archived with archived_at set, and nothing remains under the old path. Print:
✓ Archived <id> → context/archive/<today>-<id>/
If it was an effort, add one line noting how many child changes it closed. Then suggest a next step (/dx-new <idea> to start fresh) and stop. Do not chain.