triage-board — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited triage-board (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Turn an exploration session into a triage artifact: a ~/Desktop/triage-boards/<topic>-<YYYY-MM-DD>/ folder containing the same data in three forms — prose report.md for skimming, structured report.json for tools, and a self-contained viewer.html for the user (or a developer) to triage interactively in their browser. Tracking state (status, comments, tickets, screenshots) lives in localStorage keyed by report+date, so reviewers can each have their own annotations without a backend.
_On startup, use the Read tool to load ~/.claude/skills/triage-board/preferences.md. If missing, use sensible defaults._
_On startup, use Bash to verify_ ~/Desktop/triage-boards/schema/triage-board.schema.json _exists. If missing, copy from_ ~/.claude/skills/triage-board/templates/schema.json _on first run._
Check $ARGUMENTS:
AskUserQuestion, then stop~/.claude/skills/triage-board/preferences.md, confirm, stoptriage-board — Generate a structured triage artifact from session findings
Usage:
/triage-board Build a new report from current conversation
/triage-board --topic <slug> Use a specific topic slug (skips topic prompt)
/triage-board --findings <path> Use a pre-built findings JSON file
/triage-board config Set preferences
/triage-board reset Clear preferences
/triage-board help This help
Output (always at ~/Desktop/triage-boards/<topic>-<YYYY-MM-DD>/):
report.md — Prose mirror for skimming / sharing
report.json — Schema-conformant structured findings
viewer.html — Single-file interactive triage UI (works from file://)
Examples:
/triage-board After a beginner-mind PMI audit
/triage-board --topic pmi-bulk-flowsIf preferences.md is missing, show once: First time using /triage-board? Run /triage-board config to set defaults, or continue with sensible defaults. Then proceed.
If --topic was passed, use it. Otherwise ask the user via AskUserQuestion:
pmi-beginner-mind, auth-flow-audit). Suggest one based on conversation context; let them edit.date +%Y-%m-%d); offer to override.Final folder path: ~/Desktop/triage-boards/<topic>-<YYYY-MM-DD>/.
If --findings <path> was provided, read that JSON file (must conform to the schema; validate before proceeding).
Otherwise, mine the current conversation for discrete findings. Look for:
where / symptom / impact / repro / triage shape, even if not all five are presentB1, U7, etc.) — preserve those IDsFor each finding, assemble:
id — [A-Z]+[0-9]+ (B# bugs, U# ux, C# console/perf/a11y). Stable across re-runs.severity — one of: critical | high | medium | low | infocategory — one of: bug | ux | accessibility | content | performance | consoletitle — one-line summarywhere — file/route/componentsymptom — what the tester sawimpact — why it matters to a userrepro — step-by-steptriage — suggested fix direction (not prescriptive)Also gather optional:
positives — what worked well (array of strings)notes — side effects of testing (data destroyed, accounts created, etc.)Show a compact table (severity + id + title only) and let the user accept / drop items via AskUserQuestion with multiSelect: true. Default = all selected.
if [ ! -f ~/Desktop/triage-boards/schema/triage-board.schema.json ]; then
mkdir -p ~/Desktop/triage-boards/schema
cp ~/.claude/skills/triage-board/templates/schema.json \
~/Desktop/triage-boards/schema/triage-board.schema.json
fireport.json~/Desktop/triage-boards/<topic>-<YYYY-MM-DD>/report.json. Must validate against the schema. Include:
schemaVersion: "1"meta — title / date / tester / surface / branch / scopeIncluded / scopeExcludedfindings — array (accepted in Step 3)positives — arraynotes — arrayreport.mdProse mirror of the JSON. Use the same severity tiers (Critical / High / Medium / Low / Info). One section per severity, findings in order of ID within the section. Each finding gets a ### <id> — <title> heading with the same fields formatted as **Where:** … / **Symptom:** … / **Impact:** … / **Repro:** … / **Triage:** ….
End with Things that worked well, Notes / side effects, and a Severity summary table.
viewer.htmlCopy ~/.claude/skills/triage-board/templates/viewer.template.html and inline the JSON at the marker /*REPORT_JSON_START*/…/*REPORT_JSON_END*/. Use Python or sed for the substitution (Python preferred — handles edge cases):
python3 <<'PYEOF'
import re, json, pathlib
report = pathlib.Path('<dest>/report.json').read_text()
json.loads(report) # validate
template = pathlib.Path('~/.claude/skills/triage-board/templates/viewer.template.html').expanduser().read_text()
out = re.sub(r'/\*REPORT_JSON_START\*/.*?/\*REPORT_JSON_END\*/',
'/*REPORT_JSON_START*/' + report.strip() + '/*REPORT_JSON_END*/',
template, flags=re.DOTALL)
pathlib.Path('<dest>/viewer.html').write_text(out)
PYEOFopen -a "Google Chrome" <dest>/viewer.html to launch.pbcopy so the user can cmd+v it elsewhere.templates/viewer.template.html)Stateless, single-file HTML with vanilla JS (~25 KB). No localStorage, no tracker, no build step. The findings JSON is the only source of truth; the viewer just renders it.
↓ MD / ↓ CSV / ↓ JSON buttons in the top-right of the header. Each generates the artifact from the in-page REPORT object and triggers a download (report-<date>.md, report-<date>.csv, report-<date>.json). ## [B8] Bulk Delete has NO confirmation modal
**Severity:** `critical` · **Category:** `bug`
**Where**
Bulk-select header on Action Items / Decisions / Questions
**Symptom**
Clicking `Delete` in the bulk-action header immediately destroys all selected items…
**Impact**
Data loss in one click. Contradicts the pattern PR #977 just shipped…
**Repro**
Open any meeting → tick the header select-all checkbox → click Delete…
**Triage**
Wire bulk Delete into a confirmation modal using MeetingModalLayout…
---
_From: PMI Beginner-Mind Audit · 2026-05-15 · /w/30/meetings_Button shows ✓ Copied! briefly after click. Falls back to document.execCommand("copy") if the Clipboard API is blocked.
templates/schema.json)JSON Schema draft-07. Key constraints:
id must match ^[A-Z]+[0-9]+$severity enum: critical | high | medium | low | infocategory enum: bug | ux | accessibility | content | performance | consolemeta.title, meta.date, meta.surface requiredfindings[].id, findings[].severity, findings[].category, findings[].title requiredNo tracker state in the schema or viewer — when reviewers want to act on a finding, they click Copy as Markdown and paste into their ticket system of choice (Linear, GitHub, Notion, Slack). Triage state lives in the ticket system, not the report.
file:// with no network, no build, no localStorage. JSON is inlined at write time and is the only source of truth.symptom / repro should be specific enough that a developer can reproduce without asking. Vague findings are noise.Copy as Markdown, plus MD/CSV/JSON exports in the header). Status and ownership belong to Linear / GitHub / Notion, not localStorage._Auto-managed. The skill silently adds preferences here when the user corrects a default (chose a different topic slug pattern, dropped a section, etc.). Surface once when adding: "Noted: <pattern>. Saved for next time."_
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.