Plugin payload links (#3204)

The installed-payload inventory found 121 unresolved relative Markdown links across 14 plugins in the original checked-in payloads.

Plugin payload links (#3204)

The installed-payload inventory found 121 unresolved relative Markdown links across 14 plugins in the original checked-in payloads. Links are checked against each isolated plugin root, even when their targets exist elsewhere in the checkout. The regenerated canonical research skill also restored the bibliographic-services link described in #3204.

Fixes

  • Package the research bibliographic-services and corpus-data-model docs. Publish the bibliographic doc's cross-framework token-security link as a GitHub URL.
  • Package directly referenced SDLC flows (Claude and Codex), Voice docs/flow/ledger, Utilities rules, and the Security Engineering CI rule.
  • Rewrite shared rule and repository documentation links to their public GitHub source, checking the local source exists. Keep framework-owned files inside the plugin when available. Preserve fenced examples and inline code.
  • Report missing targets and paths leaving a plugin, with plugin/file, line, original target, and reason. Images and reference definitions are included; anchors, URLs, fenced code, comments and inline code are excluded. Symlink and encoded traversal are checked. Markdown parsing covers common inline/reference syntax; it is not a complete CommonMark parser, and anchors and network URLs are not validated.

Commands and merge overlap

Run `npm run package-plugins` to generate Claude payloads and print warnings; generate Codex with `node tools/plugin/package-plugins.mjs --plugin codex-sdlc --provider codex`.

Run `npm run lint:plugin-links` (or `node tools/plugin/package-plugins.mjs --plugin research --check-links`) for a read-only report. This strict check exits 1 while any unresolved link remains, including the reviewed cases below. Normal packaging warns without failing. The unit inventory fixture prevents additions to the reviewed unresolved set.

The packager preserves #3061 / PR #3203’s offline `--check` mode. `npm run lint:plugin-copies` regenerates default Claude payloads in a temporary directory using the same document copies and published-link rewrites as normal packaging, then compares them with tracked copies. It remains enabled in CI. The strict `lint:plugin-links` check is not wired into CI while the reviewed unresolved links below remain.

Original inventory by plugin

PluginUnresolved links
agent-loop11
aiwg-dev3
codex-sdlc24
compound-memory1
context-curator3
daemon2
guided-implementation1
research14
sdlc28
security-engineering3
semantic-memory1
testing-quality3
utils14
voice13

Remaining inventory

All 11 remaining links are missing targets; no reported path leaves its plugin root. These are retained for review rather than inventing content or treating host-local paths as public docs.

Plugin/file:lineTargetDecision needed
`agent-loop/README.md:147``docs/examples/test-fix.md`README names example docs absent from the addon: author examples or remove links?
`agent-loop/README.md:150``docs/examples/greenfield.md`README names example docs absent from the addon: author examples or remove links?
`aiwg-dev/skills/devkit-create-agent/SKILL.md:12``~/.local/share/ai-writing-guide/docs/AGENT-DESIGN.md`Host-local legacy reference: replace, remove, or keep as a runtime instruction?
`context-curator/README.md:163``~/.local/share/ai-writing-guide/docs/references/REF-002-llm-failure-modes-agentic.md`Host-local legacy reference: replace, remove, or keep as a runtime instruction?
`context-curator/README.md:164``~/.local/share/ai-writing-guide/docs/AGENT-DESIGN.md#rule-6-scoped-context`Host-local legacy reference: replace, remove, or keep as a runtime instruction?
`context-curator/README.md:165``~/.local/share/ai-writing-guide/.aiwg/planning/roig-2025-gap-analysis.md`Host-local legacy reference: replace, remove, or keep as a runtime instruction?
`research/skills/induct-media/examples/expected-REF-101-radar.md:17``../citations/REF-101-citations.md`Illustrative corpus fixtures: add fixture targets or render paths as code?
`research/skills/induct-media/examples/expected-REF-101-radar.md:17``../references/REF-101.md`Illustrative corpus fixtures: add fixture targets or render paths as code?
`research/skills/induct-media/examples/expected-REF-101-radar.md:59``../references/REF-101.md`Illustrative corpus fixtures: add fixture targets or render paths as code?
`research/skills/induct-media/examples/expected-REF-101-radar.md:60``../citations/REF-101-citations.md`Illustrative corpus fixtures: add fixture targets or render paths as code?
`research/skills/induct-media/examples/expected-REF-101.md:112``../citations/REF-101-citations.md`Illustrative corpus fixtures: add fixture targets or render paths as code?