How the reduce skill resolves the destination for its coupling ledger.
Implements the topic-docs convention: https://raw.githubusercontent.com/melodic-software/claude-code-plugins/main/docs/conventions/topic-docs/README.md. The contract owns every general rule: tiers, schema, resolution order, slug spec, runtime guards, no-project-root fallback, non-interactive/forked mode. This document records only this plugin's deltas.
| Artifact (writer) | Tier | Location (default) |
|---|---|---|
coupling-ledger.md (/coupling:reduce) |
Memory | .work/<topic-slug>/, never committed |
Memory tier because the placement questions resolve there: nothing downstream enforces
against the ledger, and both of its readers are scoped to this checkout. The producer itself
reads it again on the next run (resume is the skill's whole iteration model), and the user
reads it when checking status. The ledger is a single file updated in place, not a timestamped
file per run: statuses inside it, not filenames, carry run-to-run history.
Delta from the contract's precedence: the slug is the constant coupling, always. Scoped
and unscoped runs, and the status action, all resolve the same slice. Neither the
explicit-argument rung nor the branch-name rung is used: coupling reduction is repo-scoped
and spans many scopes and short-lived branches, and a scope- or branch-derived slug would
fragment the one ledger successive runs must resume (a status call could then never find a
scoped run's backlog). A run's scope is recorded inside the ledger, in the file header and
per entry, not in the path. Form and collision rules are the contract's.
The memory root's self-ignore guard applies on first write (verify-or-create .gitignore
with *, announced). The contract also defines invalid roots at which the guard does not
run; they are enumerated in its
Runtime guards
section and deliberately not listed here, so this binding cannot drift from them. Create the
topic slice directory when absent.