Taxonomy
Claude plugin

Research corpus

A file-based, author-seeded knowledge base that compounds across DTPR authoring sessions.

plugin/dtpr/research/ is a file-based, author-seeded knowledge base that all seven skills read from and (where Write and Task are available) write to. The first time a skill needs a framework (ISO 42001, NIST AI RMF), a regulatory text (EU AI Act), or a prior-art pattern (algorithmic-transparency notices), it dispatches a researcher, captures the synthesis as a corpus entry, and every later session cites it instead of re-researching.

The corpus ships with the plugin but is not pre-seeded. Every entry comes from a real authoring session.

Contract

Retrieval. Skills read INDEX.md, compute query tags from the user's request and skill context, filter rows whose applicability_tags share at least one tag with the query, and on 1+ hits read the top row's file. The top row wins by authority_tier (see enum below) with date_accessed as tiebreak.

Write path. On a corpus miss, if the host has a Task tool, the skill dispatches a researcher (best-practices-researcher or web-researcher) and receives a synthesis. The skill (not the sub-agent) writes the entry file with required frontmatter and appends one row to INDEX.md. On hosts without Task, the skill flags the gap in its output and continues.

Concurrency. Entry filenames carry a minute-precision timestamp suffix so parallel sessions do not silently overwrite each other. INDEX.md is append-only — conflicts resolve at PR time, not at write time. verify.mjs enforces append-only integrity against the merge base with origin/main when git history is available.

Freshness. Each entry may carry recheck_after. When retrieval lands on a stale entry, skills mark the citation STALE in output and, on hosts with Task, dispatch an async refresh. The stale citation is still used — stale is better than silent gaps.

Supersession. When a refreshed entry supersedes an older one, the new entry sets supersedes: <old-slug> and a one-shot pass updates the old entry's superseded_by. Retrieval skips entries that carry superseded_by.

Consumer-side degradation. When INDEX.md is missing or malformed (stale install, Claude.ai read-only), retrieval treats it as an empty corpus and the skill logs a one-line warning. No skill hard-fails on corpus malformation.

Privacy. Filenames prefixed with _ are git-ignored (see research/.gitignore). Use that for citations you do not want in the public plugin payload — un-scrubbed regulatory drafts, internal memos, confidential vendor responses.

Slug convention

YYYY-MM-DDThhmm-<kebab-slug>.md

Example: 2026-04-20T1415-iso-42001-risk-categorization.md. The minute suffix eliminates same-day collisions.

Frontmatter schema

Required on every entry:

---
source: <URL or citation string>
date_accessed: <ISO 8601 YYYY-MM-DD>
authority_tier: <one of the 8 enum values below>
applicability_tags: [<tag>, <tag>, ...]   # non-empty
---

Optional fields:

  • recheck_after: <ISO 8601> — default cadence: 365 days for primary-source, peer-reviewed, standards-body, regulatory-text; 180 days for the other four tiers.
  • supersedes: <prior-entry-slug> — set when this entry replaces an earlier one.
  • superseded_by: <newer-entry-slug> — set on the old entry when a replacement writes; retrieval skips these.
  • content_hash: <hash> — set when the entry cites schema content from api/schemas/*. Carries the schema's meta.content_hash at the time of capture, used for drift detection.

authority_tier enum

Ordered high to low. Retrieval tiebreak picks the highest tier on a multi-hit.

  1. primary-source — first-party statement from the original author.
  2. peer-reviewed — published peer-reviewed scholarly work.
  3. standards-body — formal standards output (ISO, IEEE, W3C, NIST).
  4. regulatory-text — statute, regulation, or official guidance.
  5. industry-report — published report by a research firm or trade body.
  6. engineering-postmortem — post-incident write-up.
  7. secondary-commentary — analysis, journalism, blog post.
  8. speculative — forward-looking opinion or conjecture.

applicability_tags vocabulary

The seed set. Use other:<freeform> for anything that doesn't fit; promotion to the controlled list happens after a freeform tag appears ≥3 times.

TagMeaning
category:<id>Scope is one DTPR category (e.g., category:ai__risks_mitigation).
element:<id>Scope is one DTPR element (e.g., element:accept_deny).
concept:<slug>A domain concept (e.g., concept:algorithmic-accountability).
framework:<name>A named framework (e.g., framework:nist-ai-rmf).
standard:<name>A formal standard (e.g., standard:iso-42001).
jurisdiction:<iso>A jurisdiction code (e.g., jurisdiction:eu, jurisdiction:us-ca).
pattern:<slug>A design or disclosure pattern.
other:<freeform>Escape hatch.

INDEX.md

A flat markdown table. One row per entry. Append-only — verify.mjs confirms new rows were appended at EOF and no existing row was rewritten.

Columns: slug | title | applicability_tags | authority_tier | date_accessed | recheck_after.

Validation

node plugin/dtpr/evals/verify.mjs (or pnpm test:plugin) checks:

  • Every entry filename matches the slug convention.
  • Every entry has required frontmatter with valid ISO dates and a closed authority_tier enum.
  • applicability_tags is non-empty.
  • INDEX.md has the expected header and every data row references an existing entry file.
  • When git history is available, INDEX.md was modified append-only against the origin/main merge base.

Source

  • plugin/dtpr/research/README.md — full contract, source of truth for this page: repository.
  • plugin/dtpr/research/INDEX.mdlive index.
  • plugin/dtpr/evals/verify.mjsvalidator source.