history — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited history (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.
Show the evolution of a decision, not just its current state. iroha never overwrites a decision when the project changes its mind: the old row stays as Status=Superseded and the new one links back to it via Supersedes. This skill follows that chain so you can read the story — what was chosen first, what replaced it, and the reason at each turn. Read-only; it never writes. Report in the user's conversation language.
L="${CLAUDE_PLUGIN_ROOT}/scripts/_lib/config.ts"; IDX="${CLAUDE_PLUGIN_ROOT}/scripts/_lib/index.ts"
SEARCH="${CLAUDE_PLUGIN_ROOT}/scripts/_lib/search.ts"; ROOT="$PWD"
bun "$L" get decisions_ds_id # empty -> tell the user to run /iroha:init, then stopIf decisions_ds_id is empty, tell the user to run /iroha:init and stop.
The lineage is walked from the most recent decision on the topic (usually the Active one) back to the original. Find that head from $ARGUMENTS:
# a) Exact-ish topic match (the "<topic>:" prefix is the dedup key).
bun "$IDX" find-topic "$ROOT" "$ARGUMENTS"
# b) Fuzzy fallback when the user typed a paraphrase, not the literal topic.
bun "$SEARCH" "$ROOT" "$ARGUMENTS" decision 5 0Pick the head:
status="Active" whose topic (or title) matches the query.a chain.
bun "$IDX" chain "$ROOT" "<head-id>" # newest first: head, predecessor, …, originalEach line is a decision record {id, topic, status, date, title, supersedes, text}. A chain of length 1 means the decision has no predecessor — say "this decision has no earlier version" rather than padding it.
The index text is only a short search snippet. For the actual Rationale and rejected Alternatives at each step, fetch the full pages (the index has no content):
# for each id in the chain (cap at ~6 to stay cheap):
# notion-fetch <id> -> read Name / Rationale / Alternatives / Date / SessionUse the Notion MCP notion-fetch tool with each chain id. If a fetch fails or Notion is unreachable, fall back to the index text snippet and say it is a summary, not the full rationale.
Render the chain as a short narrative, current decision first, each step annotated with why it changed (drawn from the newer decision's Rationale — a supersede almost always states what the predecessor got wrong):
Topic: リコール (3 decisions, current is Active)
▸ NOW リコール: hybrid(検索+index) Active 2026-06-25
Why: notion-search is top-N + write-lag; a keys-only local index enumerates everything …
↑ replaced
リコール: notion-search 主体 Superseded 2026-06-25
Why it was dropped: search alone misses freshly-saved rows (write-lag) …
↑ replaced
リコール: ローカル grep Superseded 2026-06-24
(original) query-database-view 400s on the free plan, so local grep …Keep it tight: the choice, the date, the one-line reason, and the supersede arrows. Link each decision's Notion URL (https://www.notion.so/<bare-id>) so the user can open the full page.
Supersedes is a URL to itspredecessor (the same pattern as the Session↔Decision link), chosen to dodge the MCP relation- write bug. The local index mirrors the same edge as a supersedes id so the walk is offline.
save-session links every new supersession goingforward; older chains were backfilled only where the predecessor was stated unambiguously. If a Superseded decision has no supersedes and no successor links to it, its lineage is unknown — say so rather than guessing a predecessor.
/iroha:audit's job (areversible edit), not history's.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.