agentleFS
fabioc-alohafabioc-aloha/Alex_Skill_Mall/.github/skills/staleness-discipline/SKILL.md

staleness-discipline

Skill5 starsChanged 4 months agoMITView on GitHub

Detect, classify, and prune stale source stores in the Mall — define what stale means and how to remove gracefully without breaking downstream consumers.

The file

We split this skill into the rules it gives an agent

6 rules. About 0 are common, 4 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈4

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Wait one weekly cron cycle and verify the catalog-refresh PR shows:

    line 51
  2. Distinctive:

    No other unintended diffs

    line 54
  3. Very specific:

    After a clean cycle, delete the commented-out entry and commit [behaviour] prune source (delete): <name>

    line 55
  4. Distinctive:

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

    line 60
  5. Distinctive:

    Run full store-evaluation — past acceptance does not transfer

    line 62
  6. Very specific:

    If it passes, add a fresh entry via /add-source

    line 63

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Staleness Discipline

Define what "stale" means for a source store in the Mall, and how to remove an entry from sources/supported-stores.json without breaking downstream consumers.

The Mall is read-mostly: downstream agents install from upstream at pinned refs. Pruning a source from the registry stops new catalog entries from that source but does not retroactively break existing installs (those still resolve to their pinned SHA). The discipline below keeps the catalog honest.

When to Use

  • Weekly catalog-refresh PR shows a store with degraded signals (no recent commits, broken license signal, archived upstream)
  • A reviewer flags a store as no longer fit during PR review
  • /prune-source invocation

What "stale" means

An entry is stale if any of these apply:

SignalThresholdWhere it shows up
Remote unreachablebootstrap-sources.cjs clone fails in 2+ consecutive cron runsWorkflow log
Upstream archivedfetch-github-stats.cjs returns archived: truescoring/github-stats.json
No upstream activitylast_commit older than 18 monthsscoring/github-stats.json + maintenance signal = 0
License changed unfavorablySPDX id changed to NOASSERTION or to a more restrictive licensescoring/github-stats.json license field
Replaced by superior alternativeAnother source covers the same domain better with higher trust scoresPer-store trust delta in scoring/trust-audit.md
Persistent scan failurescan-sources.cjs produces 0 plugins for 2+ consecutive runs after previously producing >0catalog/stores/<name>.json plugins array shrinks to 0
Schema or shape driftnormalize-frontmatter.cjs warns or errors on >50% of plugins from that sourceNormalize log

Classification

Stale signalAction
Remote unreachable, but upstream still alive on GitHubRefresh — fix remote URL, don't prune
Upstream archived but plugins still valuableKeep (note archived in PR review); catalog continues to surface them with degraded maintenance score
Upstream archived + no activity for yearsPrune
License changed to unclear or restrictiveSurface in PR review; user decides whether to keep with degraded license signal or prune
Replaced by superior alternativePrune the worse entry; downstream consumers can opt into the better one via --from-store override
Persistent scan failure with no clear causeInvestigate pluginDir first — upstream may have renamed the folder. Only prune after fix attempts fail.

Pruning procedure

Pruning is always reversible by re-add. The two-step removal (comment-out → observe → delete) is the safety net. Run via /prune-source.

  1. Confirm at least one staleness signal above fires
  2. Comment out the entry in sources/supported-stores.json and add // pruned-pending: YYYY-MM-DD reason: <reason> above it
  3. Commit [behaviour] prune source (pending): <name> — <reason>
  4. Wait one weekly cron cycle and verify the catalog-refresh PR shows:
    • The store missing from catalog/stores/
    • Plugin count drops by the right amount in catalog/index.json
    • No other unintended diffs
  5. After a clean cycle, delete the commented-out entry and commit [behaviour] prune source (delete): <name>
  6. Record the decision in docs/curation-log.md

Re-add procedure

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

  1. Run full store-evaluation — past acceptance does not transfer
  2. If it passes, add a fresh entry via /add-source
  3. Record the re-add in docs/curation-log.md

Pruning anti-patterns

Anti-patternCorrection
Hard-deleting the entry in one commitAlways use the two-step (comment-out → observe → delete) so the catalog refresh PR can verify the impact cleanly
Skipping the observation cycleWithout one clean cron run, you don't know whether the catalog-refresh PR will surface only the expected diffs
Pruning multiple stores in one commitEach prune is a decision; bundle wastes the audit trail and makes one bad prune undoable without reverting the others
Pruning for "I don't like the maintainer" or subjective reasonsThe staleness signals are the bar; the commit message must cite the firing signal
Pruning plugin-mall itselfConstitutional to this Mall — would break the catalog's ability to surface first-party plugins

Output template (PR comment for a prune proposal)

**Prune candidate: `<store-name>`**

Staleness signals firing:
- [x] <signal 1>: <evidence from workflow log / github-stats / trust-audit>
- [ ] ...

Action: comment-out now, delete after one clean cron cycle.

Downstream impact: <known consumers, if any; otherwise "no known consumers; downstream agents that depend on this store can pin to a specific SHA before deletion">

Falsifiability

This skill is wrong if any of the following occur by 2026-08-29 (90 days):

  • Pruned stores are re-added within 30 days ≥2 times in a quarter (staleness signals miscalibrated — pruning prematurely)
  • A store flagged as stale by these signals is still being actively used by a known downstream consumer (signals threshold too aggressive)
  • The two-step procedure causes a registry-vs-catalog drift that ships ≥1 time (the reversible pattern is leaking)

Track outcomes in docs/curation-log.md tagged [STALENESS].

Related

  • source-inventory — adding and editing registry entries
  • store-evaluation — gate for re-add
  • mall-self-curation — the pipeline this discipline keeps clean
  • mall-maintenance-rules — always-on routing
  • /prune-source prompt

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.