Cleanup pass following the CoCounsel merge (#4) and Lexis removal (#5):
- Normalize whitespace and JSON indentation across plugin metadata files
- Sync marketplace.json with plugin.json (ip-legal description, Courtroom5 title field)
- Add missing ai-inventory and invention-intake rows to README skill reference
- Replace stale short-form skill names in customize/cold-start SKILL.md prose with canonical directory names across 11 plugins (same bug class as the /setup -> /cold-start-interview QA fix)
- Fix FYY -> FYI typo and a phantom WebFetch claim in launch-radar docs
- Address review findings: line-wrapped /check-claims, /renewals-due -> /renewal-tracker, stale /setup in references/, agent.yaml comment contradiction, redundant 'intake intake'
- Add root CLAUDE.md with validation conventions (claude plugin validate, I1-I11 invariants, frontmatter requirements) and a marketplace.json description + $schema
No behavioral changes. claude plugin validate passes clean.
Adds the Thomson Reuters CoCounsel Legal plugin (Westlaw Deep Research)
as a vendor-maintained plugin under a new external_plugins/ directory,
following the partner-built layout used elsewhere.
- external_plugins/cocounsel-legal/: plugin.json, .mcp.json (HTTP MCP
server with OAuth), deep-research skill, vendor README
- .claude-plugin/marketplace.json: register cocounsel-legal pointing at
./external_plugins/cocounsel-legal with Thomson Reuters as author
- README.md: document external_plugins/ in the repo layout, add an
'External / partner-built' section, list the CoCounsel Legal connector,
and add a skill reference entry
Four findings from the overnight QA re-run against the post-fix build:
1. renewal-register.yaml storage path. Was references/renewal-register.yaml
inside the skill directory, which lives in the plugin cache and gets
wiped on update. Moved to the config directory path that survives
updates. Silent data loss bug for any user who built up a register.
2. /setup references. Docs pointed at /<plugin>:setup which does not
exist (the command is /cold-start-interview). QUICKSTART.md, two
SKILL.md files, and a commented-out template all had the stale
reference. This was the only hard give-up moment in the cold-install
path.
3. False-premise defense promoted to all 12 plugins. corporate-legal
had the strongest anti-fabrication rule in the suite: decline to
characterize a statute you cannot retrieve. It was only in 1 of 12.
Generalized and added to the shared guardrail block in all 12.
4. Currency-watch corrections in ai-governance-legal. The EU Digital
Omnibus entry said high-risk deferrals were still being negotiated
in the same bullet that cited the May 7 agreement that settled them.
Illinois HB 3773 was marked pending when it has been in force since
Jan 1, 2026, and was conflated with the distinct AIPA.
The rich practice context from setup — jurisdiction footprint, risk
posture, playbook positions — was only accessible through structured
skills. A lawyer asking a quick question in the plugin's domain got a
generalist answer.
Now the plugin CLAUDE.md instructs Claude to read the practice profile
and apply the plugin's guardrails for ANY question in the domain, not
just skill invocations. A configured plugin feels like a colleague who
already knows your practice, not a form you fill out. The skills are
the structured workflows; this is everything in between.
Param values for matter_id and clause are interpolated directly into the
steering-prompt templates. Their patterns previously permitted spaces, which
would let a hostile document smuggle a natural-language sentence into the
prompt through a field that looks like an ID. Restrict both to slug shape
(no spaces); descriptive context belongs in the note/event fields, which are
never interpolated and are wrapped in the data frame.
Also render templates via format_map with an empty-string default so an
optional param the template references (e.g. playbook_monitor's clause)
degrades gracefully instead of raising KeyError, and ignore __pycache__.