Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/cavalry-collective/visual-stack/specnpx skills add Cavalry-Collective/visual-stack --skill specgit clone --depth 1 https://github.com/Cavalry-Collective/visual-stackWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00115 | $0.02554 |
| Opus 5 | $0.00057 | $0.01277 |
| Sonnet 5 | $0.00023 | $0.00511 |
| Haiku 4.5 | $0.00012 | $0.00255 |
Grade A, and why
spec scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 188 lines — stays where its author put it; the contents beside it link to each section on GitHub.
A spec in traditional agile shape — the full Atlassian ladder, initiative → epics → user stories, with themes as the labels that span them — that opens collapsed to headlines: the initiative's goal, its epics, their story titles; one screen, no scrolling. Click a story for its acceptance criteria; click a criterion for how it will be verified. Themes are "large focus areas that span the organization" — tags, not work items: a catalog shown on the initiative, toggled onto the stories they span (auditability, performance, compliance). The complaint this fixes: a spec today is a long document nobody reads.
wireframe + product.md + the conversation ──► tree JSON ──► drill-down page ──► edits & notes ──┐
▲ │
└────────── you apply it, reply in notes, regenerate ◄────────────────┘
│
specs/YYYY-MM-DD-<feature>.md ← generated every round
The tree is the spec. .vstack/specs/<feature>.json is the source of truth; the markdown under
specs/ is generated from it, never edited by hand. There is no approve/reject — the user
changes what's wrong, and the change is the feedback.
1 · Draft the tree
Read whatever exists — the wireframe (design/<feature>.html or wherever it lives),
specs/product.md, specs/requirements.md, and the conversation. Then write
.vstack/specs/<feature>.json:
{
"feature": "candidate-pipeline",
"title": "Candidate pipeline",
"goal": "The epic statement — one sentence on what the user gets.",
"source": ["design/candidate-pipeline.html", "specs/product.md"],
"themes": ["Auditability", "Reporting"],
"epics": [
{ "id": "e1",
"title": "As a hiring manager, I want to run a role's pipeline in one place, so that no candidate stalls unseen.",
"stories": [
{ "id": "s1",
"title": "As a hiring manager, I want to see everyone who applied to a role, so that I can act on every application.",
"themes": ["Reporting"], "notes": [],
"note": "Newest application first — the sort is the point, not a detail.",
"crit": [
{ "id": "c1", "scenario": "Opening a role",
"given": "Role 42 has applications",
"when": "I open /roles/42",
"then": "The top row is the most recent application",
"and": "", "notes": [] }
] }
] }
]
}
The model is Epic → User story → Acceptance criteria inside one initiative (title + goal,
the document itself), with Atlassian's themes spanning it as labels:
- Epics and user stories are both written as "As a [persona], I want to [goal], so that [benefit]". The story is the experience — what the person wants.
- There is no separate requirements list. A requirement that isn't checkable is an opinion, and
one that is checkable is a scenario — so it goes in
crit, wherephase-buildwill test it. Writing both meant writing everything twice and letting the two drift. noteis the margin — one optional string per story for the aside that isn't a criterion: a constraint, a decision already taken, a thing not to forget. It is never a hiding place for behaviour that belongs incrit.critare the acceptance criteria, as Gherkin scenarios —scenarionames the behaviour;given/when/then(and optionaland) make it checkable with real values, not restatements. A criterion you can't write as Given/When/Then isn't done. This is also whatphase-buildlater tests against. Cover the flows, not just the demo path: every story's scenarios should span the happy flow, the sad flows (invalid input, refusals, failures), and the edge cases (empty, duplicate, boundary). One happy scenario alone is a spec that lies by omission.doc.themesis the initiative's theme catalog — plain labels, edited here, not on the page; each story'sthemesarray tags it. Keep the catalog short — a theme only one story wears isn't spanning anything.- No priorities here. Which stories land first is a phasing decision, and phasing is
/vstack:user-story-map's job — the spec says what, the story map says when. Ids are stable — never renumber existing ones on a rewrite. - A small feature is one epic; don't invent a second epic to look thorough. Keep the first pass lean — the loop is how it gets rich; a bloated v1 wastes the user's first round on deletions.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 188 lines · 115 tokens per session scan A 3484c77191a8
spec is a skill published in the GitHub repository Cavalry-Collective/visual-stack (11 stars, last pushed 13d ago), licensed MIT. It adds 115 tokens to every session and 2,554 once invoked, about $0.0006 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
job-apply
Fill out job applications automatically using your resume. Use when the user wants to apply for jobs on LinkedIn Easy Apply, Greenhouse, Ashby, Lever, Rippling, or Workday.
neo4j-nvl-skill
Neo4j Visualization Library (NVL) — framework-agnostic graph rendering for the browser. Covers @neo4j-nvl/base (NVL class, nodes/relationships, Canvas vs WebGL renderer), @neo4j-nvl/interaction-handlers (ZoomInteraction, PanInteraction, DragNodeInteraction, ClickInteraction, HoverInteraction, BoxSelectInteraction…
answer-memory
Manage Job Apply's local profile, reusable answers, application history, and resumable sessions. Use whenever a Job Apply workflow needs to initialize, migrate, read, or update persistent applicant data.
job-search
Search LinkedIn, Hacker News, and Twitter/X for jobs with connections, hiring manager insights, and preference-based scoring. Use when the user wants to find jobs, search for positions, or explore job opportunities.
job-preferences
Set or update job-search preferences such as titles, salary, remote work, and filters for the other Job Apply skills.
session-search
Search across sessions by user properties, device, browser, custom events, or page — find the needle in the haystack. Use when you need to find specific sessions without a pre-built metric or segment.