staleness-discipline · git:20260529.5656e38 · 2026-05-29 · sha256 b864cc294b5f0682

staleness-discipline git:20260529.5656e38A

Immutable. This exact content is served forever at /api/v1/blob/b864cc294b5f0682.

---
name: staleness-discipline
description: "Detect, classify, and prune stale plugins in Alex_ACT_Plugin_Mall -- define what stale means and how to remove gracefully"
lastReviewed: 2026-05-05
---

# Staleness Discipline

Define what "stale" means in the Mall and how to remove entries without breaking heirs that depend on them.

## When to Use

- Monthly mall audit (fired by `/audit-mall`)
- A heir reports a broken or outdated entry
- A `/prune-store` invocation
- Coherence-check finds an Edition reference to a Mall entry that should be pruned

## What "Stale" Means

An entry is stale if **any** of these apply:

| Signal | Threshold |
|---|---|
| Link unreachable | HTTP 4xx/5xx for 2+ consecutive checks across 7 days |
| Upstream archived | Repo settings show "Archived" or equivalent |
| No upstream activity | No commits, releases, or issue activity in 18+ months |
| License changed unfavorably | Switched to a more restrictive or unclear license |
| Description drift | Mall description no longer matches upstream README's description |
| Replaced by superior alternative | Another Mall entry covers the same ground better |
| Heir reports persistent breakage | >= 2 heirs report the entry doesn't work as documented |
| Missing plugin.json | Plugin folder lacks machine manifest |
| Missing README.md | Plugin folder lacks human-readable description |
| Shape mismatch | plugin.json shape doesn't match actual files in the folder |
| Token cost stale | plugin.json token_cost differs from actual file sizes by >20% |

## Classification

| Stale signal | Action |
|---|---|
| Link unreachable, but upstream still active | Refresh (update URL) — not prune |
| Upstream archived but stable | Keep, mark `archived: stable` in entry |
| No activity AND archived | Prune |
| License change | Defer to ACT pass — license escalation may need user input |
| Description drift only | Refresh |
| Replaced by superior alternative | Prune the worse entry, update the better one's description |
| Persistent heir breakage | Investigate before pruning — may be a Mall-side fix |

## Pruning Procedure

Pruning is **always reversible by re-add**. Never delete history.

1. Run [mall-curation](../mall-curation/SKILL.md)'s decision tree to confirm prune is correct
2. Check coherence: does any Edition skill or instruction reference the entry being pruned?
   - If yes, fix the Edition reference *first* (open Edition PR), then prune
   - If no, proceed
3. Comment out the entry in STORES.md and CATALOG.json (do not delete)
4. Add a `pruned: YYYY-MM-DD reason: <reason>` line above the commented entry
5. Update README counts
6. Open Mall PR titled `prune: <entry name> (<reason>)`
7. After merge, document in `docs/` if this prune sets a class precedent
8. Record in `docs/ledgers/curation-log.md` with `M` or `S` classification

## Pruning Anti-Patterns

| Anti-pattern | Correction |
|---|---|
| Hard-deleting the entry | Comment out instead — preserves history and reversibility |
| Skipping the coherence check | Pruning a referenced entry breaks the Edition for fleet heirs |
| Pruning without updating README counts | The Mall claims N stores; the count must match reality |
| Pruning multiple entries in one PR without separate rationales | Each prune is a decision; bundle wastes the audit trail |

## Re-Add Procedure

If a pruned store revives (un-archived, link restored, license clarified):

1. Run full [store-evaluation](../store-evaluation/SKILL.md) — past acceptance does not transfer
2. If it passes, uncomment in STORES.md and CATALOG.json
3. Update the prune line to `re-added: YYYY-MM-DD`
4. Increment counts

## Output Template (prune verdict)

```markdown
# Prune Verdict — <store name>

**Entry**: <STORES.md line or CATALOG.json ID>
**Date**: YYYY-MM-DD
**Reason**: <which staleness signal fired>

## Coherence Check

- Edition references: <count>
- References fixed first: yes/no
- Files affected: <list>

## Counts After Prune

- STORES.md: <before> → <after>
- CATALOG.json: <before> → <after>
- README badge: <before> → <after>

## ADR?

Yes | No — <if yes, link to docs/ADR-NNN>

## ACT Pass Trail

<markers>
```

## Would Revise If

Revise if pruned entries are re-added within 30 days under new evidence 2+ times in a quarter (signals over-pruning), or if entries flagged stale by the script remain useful to active heirs (signals threshold miscalibration).

## Related

- [mall-curation](../mall-curation/SKILL.md)
- [store-evaluation](../store-evaluation/SKILL.md)
- [mall-maintenance-rules](../../instructions/mall-maintenance-rules.instructions.md)
- `/prune-store` prompt