# Pmstack Lint

> Walks the pmstack skill graph against the outputs/ directory to find graph gaps (missing downstream artifacts), cross-artifact drift (PRD-metrics-eval misalignment), and stale candidates (superseded files). Each finding includes a one-line "do this" recommendation. Trigger when the user says "lint my workspace," "graph check," "find drift," "tidy up outputs," "what's stale," or asks for a workspace audit. Run weekly on schedule, or before any review.

- Skill: `ryanalberts/pmstack-lint` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ryanalberts/pmstack-lint`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ryanalberts/pmstack-lint/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: RyanAlberts (https://skillmd.com/u/ryanalberts)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ryanalberts/pmstack-lint

---


# lint — graph + drift + staleness pass over the artifact corpus

A structural lint over your accumulated artifacts. Finds the silent drift that compounds when nobody is watching.

## Required structure (exactly three sections, always present)

```
# lint — <YYYY-MM-DD>
FINDINGS: <total>

## Graph gaps
- <finding>: <file path> — Do this: <one-line action>
(or: "No gaps." if section is empty)

## Cross-artifact drift
- <finding>: <file paths involved> — Do this: <one-line action>
(or: "No drift." if section is empty)

## Stale candidates
- <file path> (age: Nd) superseded by <newer path> — Do this: archive or delete
(or: "Nothing stale." if section is empty)
```

## What goes in each category

**Graph gaps** — for each topic slug in `outputs/`:
- PRD with no metrics file
- Metrics with no eval YAML
- Eval YAML with no matching `outputs/eval-runs/<eval-id>/summary.md`
- Brief that references an artifact path no longer present
- Compare YAML with no matching eval run

**Cross-artifact drift**:
- PRD's Success Metrics North-Star line not present (verbatim or near) in same-slug metrics file
- Eval YAML's failure_modes don't map to any same-slug PRD Risks item
- Latest eval-drift shows RELEASE_BLOCKED:true while same-slug launch-readiness within 7 days returned GO

**Stale candidates** — files older than 30 days (default) with a newer same-slug, same-skill artifact (superseded). Mutating files is out of scope; just flag.

## Hard rules

- **Every finding has a "Do this:" line.** Pure observation gets ignored — every line specifies an action (a command, a deletion, a section to update).
- **All three sections always present**, even when empty. Empty sections write the empty marker text.
- **No mutations.** Lint reports only. Do not delete, archive, or modify any file.
- **Cold-start writes a real artifact** with the cold-start prompt: "Graph is empty — start with `/prd \"<a customer signal>\"`."

## Where to write

- With filesystem: `outputs/lint-<YYYY-MM-DD>.md`. Reads `skills/_graph.yaml`, all `outputs/`, `decisions-log.md`.
- Inline (web/mobile): emit the artifact as markdown with the suggested filename at the top, and ask the user to paste their decisions log + outputs/ inventory if running inline.

## Decision-log entry

`- <date> — lint: <N> findings (gaps:<g>/drift:<d>/stale:<s>) — outputs/lint-<date>.md`

## Tone

Mechanical, action-oriented. Every line ends in a "Do this." imperative.

## Cold-start behavior

Writes a real artifact even with near-empty `outputs/`. The cold-start prompt is itself a useful signal.

