docs(plan): v5.3.0 Session A — scope decision (ship-list empty) + gap-matrix reconciliation [skip-docs]

Session A audit (read/plan only). Reconciled docs/cc-2.1.x-gap-matrix.md (the
v5.2.0 plan) against HEAD: the entire HIGH-priority false-positive cluster is
already CLOSED in v5.2.0 (settings keys + xhigh, 28 hook events, MCP POSIX/trust,
claude-md HIGH->MEDIUM reframe, DIS/CNF param-aware). The 8 unreleased commits add
incrementally; no active bug or false positive remains unshipped.

Operator GO 2026-06-19: "Release-only, ship-list tom" -> Session B SKIPPED. All
still-open gaps are M-effort enhancements -> defer to v5.4. v5.3.0 = docs +
knowledge + release of the 8 commits already on main.

Output: scope-decision block appended to docs/v5.3.0-release-plan.md (empty
ship-list + verbatim GO + full draft CHANGELOG bullets mapping all 8 commits +
What's New draft + 3 knowledge-backing entries for Session C); reconciliation
block prepended to docs/cc-2.1.x-gap-matrix.md. Version confirmed 5.3.0 (minor,
non-breaking). 9 commits 1576909..HEAD = 8 mapped + 1 excluded (the plan commit).
This commit is contained in:
Kjell Tore Guttormsen 2026-06-19 20:30:04 +02:00
commit 891f9506bf
2 changed files with 142 additions and 0 deletions

View file

@ -131,3 +131,110 @@ pluginGrade ≥ A, readmeCheck.passed; contamination-grep + gitleaks clean on an
- New CC-gap features beyond Session A's approved ship-list.
- Any scanner refactor not required by an approved feature.
- Marketplace-wide changes beyond the config-audit catalog entry.
---
## v5.3.0 scope decision (Session A output, 2026-06-19)
### Operator GO (recorded verbatim)
> **"Release-only, ship-list tom"** — Session B SKIP; knowledge-backing (disableBundledSkills,
> 40k char-budget, forbidden-param) folded into Session C; open M-gaps → v5.4 backlog.
**Ship-list = EMPTY.** Session B is skipped entirely. v5.3.0 is a docs + knowledge + release
of the work already on `main`. No new feature build.
### Reconciliation result (matrix vs. current code)
The gap-matrix was the **v5.2.0** plan. Verified against HEAD: the entire HIGH-priority
false-positive cluster is **already CLOSED**`settings-validator` (all 11 keys + `xhigh`),
`hook-validator` (28 events incl. `MessageDisplay`/`post-session`), `mcp-config-validator`
(POSIX/auto-injected env + `trust` removed), `claude-md-linter` (HIGH→MEDIUM reframe), DIS/CNF
(param-aware). The 8 unreleased commits add incrementally on top. **No active false positive or
behavior bug remains unshipped.** Full row-by-row verdicts appended to `cc-2.1.x-gap-matrix.md`.
### Still-open gaps → verdicts (all defer; none are bugs)
| Gap (matrix row) | Effort | Verdict |
|---|---|---|
| PLH shadow-folder: plugin.json key shadows default component folder (129) | M | defer-5.4 |
| permissions: acceptEdits prompts on shell-startup/build-config writes (141) | M | defer-5.4 |
| permissions: Read-deny hides Glob/Grep; Windows backslash/case path (140) | M | defer-5.4 |
| settings: autoMode.hard_deny nested-structure validation (144) | M | defer-5.4 |
| PLH: validate `skills:` array entries are dirs within plugin (130) | M | defer-5.4 |
| CLAUDE.md: nested `.claude` closest-wins conflict detection (104, 131) | M | defer-5.4 |
| Knowledge L-rows: env vars, model-lineup nuance, hook-output fields, plugin/skill doc rows | S | defer (rolling knowledge maintenance) |
### Draft CHANGELOG narrative (all 9 commits `1576909..HEAD` accounted for)
**Added**
- **DIS forbidden-param rules** (`d678765`) — flags `Tool(param:value)` whose key is the tool's
own canonicalizing field (`command`/`file_path`/`path`/`notebook_path`/`url`); CC ignores these
and emits a startup warning. Severity by intent: **deny/ask = false security (medium)**,
**allow = dead config (low)**. Valid forms (`Bash(npm:*)`, `WebFetch(domain:host)`,
`Agent(model:opus)`) never flagged. Predicate `forbiddenParamRule` in `permission-rules.mjs`.
- **DIS ineffective allow wildcards + `Tool(*)` deny-all** (`03949c6`) — flags unanchored
tool-name globs in `permissions.allow` (`*`, `B*`, `mcp__*`) that CC silently skips (low);
treats `Tool(*)` as deny-all (`Bash(*)``Bash`) so a bare allow killed by it is reported
as dead config. Valid `mcp__<server>__*` never flagged.
- **CML context-window-scaled char budget** (`b0bf8c5`) — new `CA-CML` finding mirroring CC's
startup warning *"Large CLAUDE.md will impact performance (X chars > 40.0k)"*. Anchors on the
conservative 200k window; discloses the relaxed ~200,000-char figure at 1M context. Severity
**medium** (token cost). Char-keyed, complementary to the 200/500-line checks. Window constants
in shared `scanners/lib/context-window.mjs`.
- **PLH plugin namespace collision** (`c6c5f17`) — flags 2+ discovered plugins declaring the same
`name` in `plugin.json`. Namespaces collapse; CC picks an undocumented winner; the loser's
commands/skills/agents go silently unreachable. Severity **medium** (dead config),
`category: 'plugin-hygiene'`, COL-shaped `details.namespaces`. Keys on declared `name`, not
`basename(dir)`; name-less plugins excluded.
- **feature-gap `disableBundledSkills` lever** (`dfe9049`) — conditional recommendation to set
`disableBundledSkills` when the active skill listing is over budget; remediation companion to
SKL `CA-SKL-002`.
**Changed**
- **PLH cross-plugin command-name overlap: HIGH → LOW** (`0874188`) — reframed from "conflict" to
"ambiguity". Commands are namespaced (`/name:command`) so both stay reachable; only a same-`name`
plugin collision loses components (covered by the new namespace-collision finding). Now
group-first (one finding per command name listing every namespace), COL-shaped
`details.namespaces`. The old HIGH `Cross-plugin command name conflict` finding **and its
humanizer entry are removed**. Scoring impact: configs with cross-plugin command overlap score
slightly higher. **Not a `--json`-shape break** — no test/consumer asserted the old HIGH.
**Fixed**
- **README scanner table** (`96743ec`) — added the missing SKL row (12 → 13 rows); the prose table
lagged the badge/self-audit count (the `--check-readme` gate is number-only and didn't catch it).
**Internal**
- **Extract skill-listing budget to shared lib** (`0a631e3`) — `scanners/lib/context-window.mjs`
as single source of truth for the 200k/1M window constants, re-exported by
`skill-listing-budget.mjs` and consumed by the new CML char-budget finding.
**Excluded from changelog:** `9b828fa` `docs(plan): v5.3.0 multi-session release plan [skip-docs]`
— the plan meta-commit itself, not a product change. (9 commits total = 8 mapped + 1 excluded.)
### What's New in v5.3.0 (draft prose)
> **v5.3.0 — permission-rule & plugin-hygiene hardening.** Five additive scanner findings extend
> the permission, CLAUDE.md, and plugin surfaces: DIS now catches forbidden-parameter rules and
> ineffective allow-wildcards that Claude Code silently ignores; CML mirrors CC's own 40.0k-char
> "large CLAUDE.md" startup warning, context-window scaled; PLH flags two plugins that declare the
> same name (one silently shadows the other); and feature-gap recommends `disableBundledSkills`
> when the skill listing is over budget. The cross-plugin command-name finding is reframed from a
> HIGH conflict to a LOW ambiguity to match Claude Code's namespacing. Scanner count stays **13**
> (all extend existing scanners). `--json`/`--raw` remain byte-stable.
### Version & non-breaking confirmation
- **5.3.0** (minor). Additive findings + one severity downgrade (PLH HIGH→LOW). No envelope/JSON
shape change; `json-backcompat` + `raw-backcompat` + SC-5 snapshot green at HEAD. The PLH change
alters a severity VALUE, not the shape. **Document the downgrade under Changed, not Breaking.**
### Knowledge-touch list (apply in Session C step 4)
Three short backing entries for the v5.3.0 features (rows currently absent from the corpus —
verified by grep, 0 files each). Pure docs, no scanner/test impact:
1. `knowledge/prompt-cache-patterns.md``disableBundledSkills` as a token-efficiency lever
(hides bundled-skill descriptions from the system prompt). (matrix row 167)
2. `knowledge/claude-code-capabilities.md` *or* `prompt-cache-patterns.md` — the CC 40.0k-char
"Large CLAUDE.md will impact performance" startup warning + 2.1.169 context-window scaling
(backs the new CML finding).
3. `knowledge/claude-code-capabilities.md``Tool(param:value)` permission semantics: param
matching is deny/ask-only, and the canonicalizing-field rules CC ignores (backs DIS
forbidden-param). (matrix rows 137, 139)
Everything else in the matrix (env-var rows, model-lineup nuance, hook-output fields, plugin/skill
doc rows) → **defer** to rolling knowledge maintenance; not required for 5.3.0 correctness.