Skip to content

Reference: packs and plugins

This page is the exhaustive reference for the harness’s extension surface: the plugin shape, the pack taxonomy, the manifest fields, the control plane that toggles them, and the bundled inventory. For the rationale behind the model see Explanation: pack structure and ADR 0005.

Every optional capability ships as a Claude Code plugin, and each plugin contains exactly one skill. Plugins are grouped into pack families by directory, but the plugin boundary is the individual skill — a clone enables exactly the skills it wants without adopting a whole family.

packs/
├── reports/ # family: deliverable genres (18 plugins)
│ ├── exec-summary/ # a plugin (one skill)
│ ├── academic/
│ ├── briefing/
│ └── … # 15 more — see the Bundled inventory below
├── market-research/ # family: methodologies (5 plugins)
│ ├── competitive-analysis/
│ ├── customer-research/
│ ├── financial-analysis/
│ ├── market-sizing/
│ └── regulatory-review/
├── channels/ # family: render adapters (9 plugins)
│ ├── book/
│ ├── diataxis/
│ ├── pdf/
│ └── … # 6 more — see the Bundled inventory below
├── trend-modeling/ # family: scenario methodology (1 plugin)
│ └── trend-modeling/
└── ontologies/ # family: MIF entity/relationship extensions (12 plugins)
├── scientific/
└── … # 11 more — see the Bundled inventory below

The harness bundles 45 pack plugins across five families: 9 channels, 5 market-research methodologies, 12 ontologies, 18 report genres, and 1 trend-modeling methodology. The Packs reference and the per-family pages document every one — its use, constraints, and goals.

Each packs/<family>/<plugin>/ is self-contained: a .claude-plugin/plugin.json (validated against schemas/pack.schema.json), a flat skills/<skill>/SKILL.md, and that skill’s evals/.

The kind field classifies what a pack contributes to the core. It is an enum in schemas/pack.schema.json.

kindFamily directoryContributes
methodologymarket-research/, trend-modeling/Research dimensions and analyst skills
genrereports/Deliverable templates for the report channel
channelchannels/Render adapters (blog, book, PDF, NotebookLM, GitHub)
ontologyontologies/MIF entity, relationship, and trait extensions

Manifest fields (schemas/pack.schema.json)

Section titled “Manifest fields (schemas/pack.schema.json)”

A pack’s plugin.json is a Claude Code plugin manifest plus the harness-local classification fields below. additionalProperties is true, so standard plugin keys are preserved.

FieldRequiredMeaning
nameyesPack name and skill namespace (^[a-z][a-z0-9-]*$); skills resolve as pack:skill.
versionyesSemantic version (MAJOR.MINOR.PATCH).
kindyesOne of methodology, genre, channel, ontology.
descriptionnoShort human description.
mifnoMIF output-conformance declaration (see below).
providesnoWhat the pack adds, namespaced: skills, agents, commands, dimensions, genres, channels, ontologies.
license, author, keywordsnoStandard metadata.

A channel pack whose target format is orthogonal to MIF (PDF, audio, an external service body) declares mif.exempt: true with a required mif.reason, so the MIF Level-3 output-conformance gate logs its outputs instead of requiring an L3 projection. Genre packs are L3 by default and must not declare exemption — exemption is for orthogonal formats, never for genres (see ADR 0007).

harness.config.json packs[] is the single control plane. Each entry names a plugin with an enabled flag and a source (bundled, or an external git/marketplace plugin).

{ "name": "engineering", "enabled": true, "source": "bundled" }
OperationCommand
Flip one pluginscripts/pack-toggle.sh <plugin> on (or off)
Materialize the enabled setscripts/sync-packs.sh

sync-packs.sh resolves each enabled plugin’s directory from the marketplace source and writes the result into two places:

  1. Claude Code’s native enabledPlugins in .claude/settings.local.json (the mechanism the runtime reads — <plugin>@research-harness: true). This is instance-local materialized state: it derives from this repo’s harness.config.json packs[], so it is gitignored and never lives in the template-managed, byte-identical .claude/settings.json. Claude Code deep-merges enabledPlugins across settings.json and settings.local.json, so the runtime sees these enablements alongside the shared hooks.
  2. A sidecar .claude/enabled-packs.json recording each enabled plugin’s source and resolved skills, for tooling and the conformance gate (also gitignored).

Disabled plugins appear in neither, so their skills are not active. By default the five reports genres are enabled; every other plugin is disabled and opt-in.

.claude/settings.json is template-managed: it carries the harness hooks and is kept byte-identical template-and-instance so copier update never conflicts on it. Anything instance-local — the materialized enabledPlugins (settings.local.json), the enabled-packs.json sidecar, and personal overrides like skillOverrides — lives in .claude/settings.local.json (gitignored, deep-merged by the runtime) and is rebuilt by sync-packs.sh. The Copier answers file .copier-answers.yml is the one instance-specific file that is committed: it records the template commit copier update uses as its merge base.

.claude-plugin/marketplace.json is the marketplace manifest (name, research-harness). Its plugins[] array maps each plugin name to its source path under packs/ and a description. A plugin must be registered here before harness.config.json can reference it by name.

The harness bundles 45 pack plugins across five families. Each family has a dedicated reference page documenting every component’s purpose, constraints, and goals; the counts below match ls packs/<family>/ exactly.

Channels — render adapters (packs/channels/, 9 plugins): book, diataxis, ectd, github-discuss, github-issues, jats, notebooklm, pdf, xbrl.

Report genres — deliverable templates (packs/reports/, 18 plugins; academic, briefing, engineering, exec-summary, and trend-analysis are enabled by default, the rest are opt-in): academic, briefing, clinical-submission, competitive-quadrant, compliance-audit, computing-paper, engineering, exec-summary, humanities-chicago, humanities-mla, legal-memo, market-research-report, nist-sp, regulatory-disclosure, security-pentest, sustainability-report, systematic-review, trend-analysis.

Market-research methodologies — research dimensions (packs/market-research/, 5 plugins): competitive-analysis, customer-research, financial-analysis, market-sizing, regulatory-review.

Trend-modeling — three-valued scenario methodology (packs/trend-modeling/, 1 plugin): trend-modeling.

Ontologies — MIF entity/relationship/trait vocabularies (packs/ontologies/, 12 plugins): biology-research-lab, data-engineering, market-research, observability, psycholinguistics, regenerative-agriculture, regenerative-agriculture-research, regulatory-legal, scientific, software-engineering, software-security, trend-analysis.

The blog channel is a first-class, always-on harness output (not a pack). The report channel is the canonical MIF Level-3 source of truth.

  1. Create packs/<family>/<plugin>/ with .claude-plugin/plugin.json (valid against schemas/pack.schema.json) and skills/<skill>/SKILL.md.
  2. Register the plugin namesource in .claude-plugin/marketplace.json.
  3. Add { "name": "<plugin>", "enabled": false, "source": "bundled" } to harness.config.json packs[].
  4. Enable it with scripts/pack-toggle.sh <plugin> on and run scripts/sync-packs.sh.

Nothing in the core changes — the extension surface is uniform across all families.