case — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited case (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
When you need the user to make one or more multiple-choice decisions, use this skill instead of asking via plain-text enumerated prompts. A local web UI opens in the user's browser with:
recommended badge)↑↓ / j k to move, 1–9 to pick, A to accept all recommendations, ⌘↩ to submitThe process mirrors crit: launch in the background, the user submits, control returns to you with a JSON result path.
"1. Should we X? 2. Should we Y? ...").Do not use for:
Write a JSON file at a temp path (e.g. /tmp/decide-input.json) matching this schema:
{
"title": "short header shown in the browser tab and page heading",
"tag": "optional category label (e.g. 'design review')",
"intro": "optional multi-line preamble shown above the questions",
"questions": [
{
"id": "stable-id",
"title": "The actual question",
"reason": "One-line recommendation rationale, shown under the title",
"options": [
{ "label": "Short choice label", "note": "sub-line detail", "recommended": true },
{ "label": "Alternative", "note": "tradeoff" }
],
"allowFreeText": true
}
]
}Authoring rules:
title terse. Put rationale into reason, not title.recommended: true (your best guess).options[].note is optional but strongly recommended — it is what makes the cards scannable.allowFreeText: false only for strictly binary, non-qualifiable choices.Run the bundled decide.py in the background via run_in_background: true:
python3 ~/.claude/skills/case/decide.py /tmp/decide-input.json --output /tmp/decide-result.jsonThis:
Tell the user: "Opened decide in your browser. Pick options, optionally add free-word notes per question, and click Submit."
Do NOT proceed until the background task completes. Do not ask the user to type answers into chat as a fallback. Waiting for the background process to exit is how you know the user is done.
When the background task completes, stdout contains Decision result saved to <path>. Read that file:
{
"version": 1,
"answers": [
{
"id": "stable-id",
"title": "The question",
"selectedIndex": 0,
"selectedLabel": "Short choice label",
"wasRecommended": true,
"freeText": "optional per-question caveat or null"
}
],
"notes": "optional shared notes or null",
"submittedAt": "ISO timestamp"
}Interpret:
selectedLabel is the user's choice. It may be null when the user answered with free text only.wasRecommended: true means they accepted your recommendation (often a green light to proceed).freeText (when non-null) is a layered instruction — it refines or overrides the selected choice. When there is no selected choice, treat freeText as the complete answer for that question.notes (when non-null) applies to the whole decision set and may include scope changes or side-topics.Apply the selected choices. When freeText or notes is present, fold them into your plan before executing. If the user's free-text materially changes the scope (e.g. "hold off until X"), confirm with them rather than forging ahead.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.