dsh-plugin-upgrade 0.1.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -1,37 +1,95 @@
1
1
  # AGENTS.md
2
2
 
3
- Standalone DeepSeek Harness plugin repository (`dsh-plugin-upgrade`). Development follows
4
- the dsh-plugin-guide skill and the official plugin contract; this file records repo-local
5
- decisions. Read `README.md` (external contract) and the packaged version card
6
- (`skills/plugin-upgrade-015/references/v0.1.3-alpha.1-to-v0.1.5-alpha.1.md`) before
7
- changing behavior.
3
+ Standalone DeepSeek Harness plugin repository (`dsh-plugin-upgrade`). Development
4
+ follows the dsh-plugin-guide skill and the official plugin contract; this file records
5
+ repo-local decisions. Read `README.md` (external contract) and the packaged merged corridor
6
+ card (`skills/plugin-upgrade/references/v0.1.3-alpha.1-to-v0.1.5-rc.1.md`) before changing
7
+ behavior.
8
+
9
+ ## A corridor never widens (and one package may carry several closed corridors)
10
+
11
+ - **A corridor never widens.** This package upgrades plugins across `0.1.3-alpha.1 →
12
+ 0.1.5-rc.1` and nothing else. Do not widen the peer band or the card to "all versions":
13
+ a drifting card is worse than no card. A hop that adds a seam is a new package.
14
+ - **One package may carry several *closed* corridors.** That is what this repository is: one
15
+ npm package holding leg A (`0.1.3-alpha.1 → 0.1.5-alpha.1`) and leg B (`0.1.5-alpha.1 →
16
+ 0.1.5-rc.1`) as **two closed corridors of one span**, each keeping its own evidence, card
17
+ section, fixtures and rollback path. Neither leg may absorb a third hop.
18
+ - **This supersedes the family's earlier rule.** The retired `dsh-plugin-upgrade` and
19
+ `dsh-plugin-upgrade-rc1` each carried a "**The corridor is locked** … a new corridor is a
20
+ new package" section plus "**zero code dependency on the sibling corridor**: no `import`,
21
+ no vendoring, no shared `SEAMS`". The owner deliberately superseded the second half of that
22
+ pair: the merged package **does** share one `SEAMS` (one scanner, one catalog, one
23
+ id-parity gate) because the two legs are contiguous hops of one span. What survives
24
+ unchanged is the numbering discipline — a corridor is *closed*, not open-ended — and the
25
+ per-leg ownership below.
26
+
27
+ Consequences accepted by this repository:
28
+
29
+ - The merged catalog (20 seams: `S3`, `S8`, `S9`, `M1`, `S4`, `S5`, `S6`, `S7`, `S2`, `S1`,
30
+ `S10`, `C1`, `C2`, `P1`, `C4`, `C5`, `H1`, `H2`, `H4`, `H3`) is evidence-bound to the two
31
+ tag ranges it was measured on — leg A `dsh-v0.1.5-alpha.1` (2026-09-09 wave over 40 plugin
32
+ repos) and leg B `dsh-v0.1.5-alpha.1..dsh-v0.1.5-rc.1` (2026-09-10). A hop after
33
+ `0.1.5-rc.1` (rc.2, the final release, anything later) is a **new package**, not a wider
34
+ card. The harness hop `0.1.5-rc.1 → 0.1.5-rc.2` added no plugin-facing seam, which is why
35
+ the span ends at rc.1 while the dev/test pin and the CI probe run on `0.1.5-rc.2`.
36
+ - **Leg A owns the session-format seams** (`assistant/message.stream`, `S3`;
37
+ `SessionHandleReadResult`, `S8`; `EpochHeader.system`, `S2`; `ctx.agent`, `S5`; `Inbox`,
38
+ `S6`; `SystemPrompt.persona`, `S9`; the V3 log generation, `S1`) and **leg B does not
39
+ restate them** — measured: the whole `packages/core/session/src` diff inside leg B's range
40
+ is two added event-type literals and one comment line. Each leg's card section keeps its own
41
+ scope statement; restating across legs is drift.
42
+ - **`C3` is retired.** Leg B's card spelled the stale-type-line false green `C3`; it is the
43
+ same defect as leg A's `M1` and is folded into it, so `M1` carries both causes (an
44
+ unresolvable `tsconfig` `paths` alias and dev/test types pinned at `0.1.5-alpha.*`). The
45
+ card records the old spelling in the fold notes, but `C3` is not a seam id: `--seams C3`
46
+ matches nothing and `types.d.ts` does not accept it.
47
+ - The peer band is **unchanged** by both legs. `>=0.1.2-rc.1 <0.2.0` alone rejects
48
+ `0.1.5-rc.1` under npm semver's prerelease-tuple rule (measured `false` on semver 7.8.5);
49
+ the `|| >=0.1.5-alpha.1 <0.2.0` segment is what admits it. `P1` forbids dropping it, and
50
+ this package's own `peerDependencies` keeps both segments.
51
+ - The `C1` ruling (the bare `conversation` slot removal is a **public extension-point
52
+ break**, kept at `error`, with a rewrite recipe and a real-browser exit criterion) is
53
+ recorded in card §2 §3.3. Do not downgrade it to an advisory without new upstream
54
+ evidence (an alias, a shim, or an official migration note).
8
55
 
9
56
  ## Layout (JS form, pure host, no browser half)
10
57
 
11
58
  ```
12
59
  index.mjs single host face: Config schema + skill bundle reader + apply()
13
- types.d.ts Config, SeamHit, ScanReport and the public function surface
14
- lib/scan.mjs zero-dependency seam catalog + scanner + CLI main()
60
+ types.d.ts Config, SeamId, SeamHit, ScanReport and the public function surface
61
+ lib/scan.mjs zero-dependency merged seam catalog (both legs) + scanner + CLI main()
15
62
  scripts/scan-0.1.5.mjs thin bin wrapper (npx dsh-plugin-upgrade-scan)
16
- skills/plugin-upgrade-015/scripts/scan-0.1.5.mjs the same wrapper inside the skill directory,
17
- so the skill body's `./scripts/...` resolves against its resourceBase
63
+ skills/plugin-upgrade/scripts/scan-0.1.5.mjs the same wrapper inside the skill
64
+ directory, so the skill body's `./scripts/...` resolves against its
65
+ resourceBase
18
66
  scripts/sweep-all.mjs maintainer tool: sweep a workspace of plugin repos into a table
19
67
  scripts/changelog-section.mjs print one CHANGELOG section for GitHub Release notes
20
68
  scripts/verify-self-contained.mjs every import resolves inside the package
21
- scripts/verify-artifacts.mjs pack + inspect the published tarball
69
+ scripts/verify-artifacts.mjs pack + inspect the published tarball (also asserts that
70
+ test/, fixtures/ and .github/ do NOT ship, and that a
71
+ leg-A seam fails the packaged CLI)
22
72
  scripts/check-readme-sync.mjs five-language README consistency
23
- skills/plugin-upgrade-015/SKILL.md the bundled skill body (frontmatter name is the skill id)
24
- skills/plugin-upgrade-015/references/… the version card
25
- test/scan.test.mjs synthetic bad/good fixtures + a live negative on an adapted repo
26
- test/plugin.test.mjs real Cordis Context + real SkillRegistry: register, dispose, negative
27
- fixtures/ scanner fixtures (bad-repo, good-repo)
28
- cordis.patch.yml bundle declaration (insert dsh-plugin-upgrade); every Config key inline
73
+ skills/plugin-upgrade/SKILL.md the bundled skill body (frontmatter name is the skill id;
74
+ it routes the caller to the leg matching its peer band)
75
+ skills/plugin-upgrade/references/v0.1.3-alpha.1-to-v0.1.5-rc.1.md the merged card:
76
+ §1 Leg A, §2 Leg B, §3 the 20-seam index
77
+ test/scan.test.mjs synthetic bad/good fixtures for BOTH legs + --seams + a live negative
78
+ test/plugin.test.mjs real Cordis Context + real SkillRegistry: register, dispose, negatives
79
+ test/card.test.mjs the card↔catalog id/severity parity gate
80
+ fixtures/ scanner fixtures — never published:
81
+ bad-repo / good-repo leg B (client-slot oriented)
82
+ leg-a-bad-repo / leg-a-good-repo leg A (TypeScript/session oriented)
83
+ docs/EVIDENCE.md the command→output record every card claim traces to
84
+ (§A = leg A's provenance, §1–§10 = leg B's records)
85
+ cordis.patch.yml bundle declaration (insert dsh-plugin-upgrade); every
86
+ Config key inline
29
87
  pnpm-workspace.yaml nearest-workspace root (isolates this repo from a surrounding harness checkout)
30
88
  package.json npm metadata; files whitelist = published content
31
- .github/workflows/ CI (3 OS × 2 Node), monthly compat probe, v* npm release,
32
- plugin-doctor static R/K gate, OpenSSF Scorecard
89
+ .github/workflows/ CI (3 OS × 2 Node), monthly compat probe, v* npm release + GitHub
90
+ Release, plugin-doctor static R/K gate, OpenSSF Scorecard
33
91
  README.md English primary (GitHub default page; source of truth)
34
- README.{zh,es,pt,hi}.md translations, top switcher, updated in the same commit
92
+ README-{zh,es,pt,hi}.md translations, top switcher, updated in the same commit
35
93
  CHANGELOG.md Keep a Changelog, [Unreleased] at the top
36
94
  SECURITY.md private vulnerability reporting + scope
37
95
  THIRD_PARTY_NOTICES.md install-time dependencies (none bundled)
@@ -40,38 +98,52 @@ LICENSE Apache-2.0
40
98
 
41
99
  ## Hard rules applied here
42
100
 
43
- - **The corridor is locked.** This package upgrades plugins across `0.1.3-alpha.1
44
- 0.1.5-alpha.1` and nothing else. Do not widen the peer band or the card to "all versions":
45
- a drifting card is worse than no card. A new corridor is a new package.
46
- - **M1 is an error, never a warning.** If a `tsconfig` `paths` alias does not resolve, every
47
- other local signal is fake. The scanner must keep failing the run for it.
101
+ - **`C1` is an error, never a warning.** The deletion has no alias and the injection callback
102
+ never runs, so the only honest level is error. Only promote `C4`/`C5`/`H1`/`H2`/`H4` from
103
+ advisory to error with evidence and a fixture that proves the false positive is gone.
104
+ - **`M1` and `P1` are blockers, never warnings.** If the local type line is stale (either
105
+ cause), or the peer band lost its second segment, every other local signal is fake. `M1`
106
+ and `P1` are **structured** checks, so their catalog `test` is `null` without being
107
+ card-only.
108
+ - **The leg-A error seams stay errors.** `S3`, `S8`, `S9`, `S4`, `S5` and `S6` each make a
109
+ repo that looks green fail on the target host; only demote one with new upstream evidence.
110
+ - **Advisory seams stay advisory.** `S7`/`S2`/`S1`/`S10` and `C4`/`C5`/`H1`/`H2`/`H4` have
111
+ legitimate matches; they are leads for manual review. Only promote one to `error` with
112
+ evidence and a fixture that proves the false positive is gone.
113
+ - **`H3` is card-only.** It is documented, id-parity checked, and deliberately has no
114
+ detector; `CARD_ONLY` is exactly `['H3']` and the test suite asserts it stays that way.
48
115
  - **The scanner is read-only and dependency-free.** No network, no child process, no write
49
116
  inside `--repo`; `lib/scan.mjs` imports only `node:fs` and `node:path`. Keep it that way.
50
- - **Advisory seams stay advisory.** `S7`/`S1`/`S2`/`S10` have legitimate matches; they are
51
- leads for manual review. Only promote one to `error` with evidence and a fixture that
52
- proves the false positive is gone.
53
117
  - **A clean scan is necessary, not sufficient.** Never describe a scan as proof of
54
- adaptation; the card's exit criterion is a real-host smoke on a temp `DSH_HOME`.
118
+ adaptation: this span's breakage is silent from both ends, so a session-log writer needs a
119
+ resume round-trip (`S3`), a client half needs a real browser assertion, and the card's exit
120
+ criterion is a real-host smoke on a temp `DSH_HOME`.
121
+ - **The card and the catalog are one catalog.** `test/card.test.mjs` fails when their ids or
122
+ severities disagree, and when the card mints an id outside the merged 20. Change the card
123
+ first, then the catalog, in the same commit.
55
124
  - **Mount loud.** A missing `SKILL.md`, an empty body, or a frontmatter without `name` must
56
125
  abort the mount. Never register a placeholder skill.
57
126
  - **The skill id is the frontmatter name.** `skillName` selects the directory; the registered
58
- name comes from the file. Keep the two in sync (`plugin-upgrade-015`).
127
+ name comes from the file. Keep the four in sync (`plugin-upgrade`: directory,
128
+ frontmatter `name`, `package.json` Config default, `cordis.patch.yml`).
59
129
  - **Registration is an effect.** `ctx.skills.register()` runs inside `ctx.effect()` so the
60
130
  disposer removes the contribution on unload; the test asserts that.
61
131
  - **No build step.** Pure ESM: `index.mjs` + `lib/` are the shipped artifacts. There is no
62
132
  `build`/`prepare` script — keep it that way.
63
133
  - **Optional seams fail closed.** `skills` is a hard `inject`; if the service is absent the
64
134
  plugin waits rather than registering into a void.
135
+ - **License headers.** `// SPDX-License-Identifier: Apache-2.0` is the first line of every
136
+ source file; `# SPDX-License-Identifier: Apache-2.0` heads `cordis.patch.yml`.
65
137
 
66
138
  ## Checks
67
139
 
68
140
  ```sh
69
- pnpm install
70
- pnpm test # node --test (11 tests: scanner + real-registry mount)
71
- pnpm run verify:self-contained # dependency specs resolve from the registry
72
- pnpm run verify:artifacts # shipped files present + entry importable from the tarball
73
- pnpm run check:readmes # five-language README consistency
74
- pnpm pack # the published tarball
141
+ npm install # or: pnpm install (pnpm-lock.yaml is committed)
142
+ npm test # node --test: scanner (both legs) + card parity + real-registry mount
143
+ npm run verify:self-contained # every import resolves inside the package
144
+ npm run verify:artifacts # tarball contents + entry import + dev-only content excluded
145
+ npm run check:readmes # five-language README consistency
146
+ npm pack # the published tarball
75
147
  ```
76
148
 
77
149
  `pnpm-workspace.yaml` keeps `minimumReleaseAge: 0`: pnpm 11 enables a 1440-minute age gate by
@@ -81,23 +153,50 @@ after every harness release.
81
153
 
82
154
  ## Release
83
155
 
84
- Version is currently `0.1.2`. For a new version: bump `package.json#version`, stamp the
85
- CHANGELOG `[Unreleased]` section into `## [<x.y.z>] - <UTC date>`, re-run the full gate,
86
- commit `chore(release): <x.y.z>`, and `git tag -a v<x.y.z>`. `git push origin main
87
- --follow-tags` triggers `.github/workflows/release.yml`, which re-runs the gate, publishes to
88
- npm with provenance (skipped without the `NPM_TOKEN` secret), and creates the GitHub Release
89
- from the stamped CHANGELOG section. Never push a tag for a version already on the registry.
156
+ Version is currently `0.1.0`. The npm name `dsh-plugin-upgrade` is brand new, so
157
+ this package starts its own version line at `0.1.0`; the two retired packages' histories live
158
+ in `CHANGELOG.md` under `[Unreleased]` and below. For a new version: bump
159
+ `package.json#version`, stamp the CHANGELOG `[Unreleased]` section into `## [<x.y.z>] - <UTC
160
+ date>`, re-run the full gate, commit `chore(release): <x.y.z>`, and `git tag -a v<x.y.z>`.
161
+ `git push origin main --follow-tags` triggers `.github/workflows/release.yml`, which re-runs
162
+ the gate, publishes to npm with provenance (skipped without the `NPM_TOKEN` secret) and
163
+ creates the GitHub Release from the stamped CHANGELOG section behind an idempotent
164
+ `gh release view` guard. Never push a tag for a version already on the registry.
165
+ **Publish incident (2026-09-10, the first tag of the retired `dsh-plugin-upgrade-rc1`).**
166
+ `v0.1.0`'s first run failed in `Publish to npm` with `*** is not a legal HTTP header value`,
167
+ after the provenance statement had already been signed and published to the transparency log.
168
+ The step read the token through setup-node's `${NODE_AUTH_TOKEN}` expansion at the time; it
169
+ now normalises line breaks and writes `//registry.npmjs.org/:_authToken=…` into
170
+ `NPM_CONFIG_USERCONFIG` itself. The rewritten step reports whether the secret carried line
171
+ breaks, and it reported **no** — so the trailing-newline hypothesis is disproven and the
172
+ mechanism of the env-expanded failure is NOT established. What is established: that path
173
+ failed, the directly written userconfig publishes. `v0.1.0` was re-tagged onto the fix
174
+ (allowed: the version was not on the registry yet). The rewritten step is inherited by this
175
+ package unchanged; do not reintroduce `${NODE_AUTH_TOKEN}` without re-testing it.
90
176
 
91
177
  The scanner catalog is evidence-bound: a version bump that changes a seam must update the
92
- card, the fixtures and `CHANGELOG.md` in the same commit.
178
+ card, `docs/EVIDENCE.md`, the fixtures **of the leg it belongs to** and `CHANGELOG.md` in the
179
+ same commit.
180
+
181
+ **Post-publish integration (not done in this repository's history yet).** The README badge
182
+ row expects `PerryLink/dsh-plugin-doctor` to carry a
183
+ `PerryLink__dsh-plugin-upgrade.svg` badge, and the family also enrols each package
184
+ in the Gitee mirror, the `dsh-catalog` directory and the omdsh workshop list. Those are
185
+ release-side steps performed from the family workspace after the first tag. The two retired
186
+ package names stay on the registry (unpublished content is not removed by publishing a new
187
+ name); their README/card wording is now historical.
93
188
 
94
189
  ## Docs
95
190
 
96
- - Five-language READMEs (`README.md` is the source; `README.zh.md`, `README.es.md`,
97
- `README.pt.md`, `README.hi.md` follow). Every behavior change updates all five in the same
98
- commit; `check:readmes` enforces the shared surface in CI.
191
+ - Five-language READMEs (`README.md` is the source; `README-zh.md`, `README-es.md`,
192
+ `README-pt.md`, `README-hi.md` follow). Every behavior change updates all five in the same
193
+ commit; `check:readmes` enforces the shared section count and the install line in CI.
99
194
  - GitHub topics `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`,
100
- `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner` (mirror `package.json`
101
- keywords; the ecosystem's visibility channel is the `dsh-plugin` topic).
195
+ `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner`, `client-slots` (mirror
196
+ `package.json` keywords; the ecosystem's visibility channel is the `dsh-plugin` topic).
102
197
  - License is Apache-2.0 (`LICENSE` + the package.json `license` field).
103
198
  `THIRD_PARTY_NOTICES.md` documents install-time dependencies; nothing is bundled.
199
+ - Every factual claim in the card or the scanner traces to a command recorded in
200
+ `docs/EVIDENCE.md` — §A for leg A's provenance (via the retired `dsh-plugin-upgrade` card,
201
+ now merged in as Leg A) and §1–§10 for leg B's records. Where a claim could not be verified
202
+ it is marked **unverified** and kept out of the card.
package/CHANGELOG.md CHANGED
@@ -5,52 +5,112 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
9
-
10
- ## [0.1.3] - 2026-09-10
8
+ ## [2.0.0] - 2026-09-19
11
9
 
12
10
  ### Changed
13
11
 
14
- - Pin the `@deepseek-ai/dsh-*` dev/test dependencies to the published `0.1.5-rc.1` line and record `0.1.5-rc.1` in `dshWorkshop.compatibility.dshVersions`; the monthly Compat workflow now runs against `0.1.5-rc.1`. The peer range `>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0` is unchanged, so no supported host line is dropped.
12
+ - The retired name returns as the new-generation single package: one package, one corridor index. It absorbs the merged corridor 0.1.3-alpha.1 -> 0.1.5-rc.1 that lived in dsh-plugin-upgrade-015 (legs A+B, 20 seams) and it is the package the later corridor 0.1.5-rc.2 -> 0.1.6-alpha.2 (E1-E5, from dsh-plugin-upgrade-016) is folded into.
13
+ - The skill and the CLI are one entry point: the scanner detects the caller peer band and routes to the matching corridor; the corridor index is the growth point (a new corridor adds a card and an index row, not a new package).
14
+ - Names: the skill id is plugin-upgrade and the CLI is dsh-plugin-upgrade-scan.
15
15
 
16
- ### Docs
16
+ ### Supersedes
17
17
 
18
- - Refresh the five-language README compatibility baseline to `dsh-v0.1.5-rc.1` (verified 2026-09-10).
18
+ - dsh-plugin-upgrade-015 (npm 0.1.1) - its corridors are carried here.
19
+ - dsh-plugin-upgrade-rc1 and the old 0.1.x line of this name.
19
20
 
21
+ ## [0.1.1] - 2026-09-12
20
22
 
21
- ## [0.1.2] - 2026-09-09
23
+ ## [0.1.0] - 2026-09-11
22
24
 
23
- ### Fixed
25
+ ### Added
24
26
 
25
- - **The shipped version card no longer describes itself as unpublished.** Its status line
26
- now names the three published channels and points at the packaged CLI
27
- (`dsh-plugin-upgrade-scan`) for reproduction instead of a workspace-private evidence
28
- path that no reader of the tarball can follow.
27
+ - **Merged corridor: one package for `0.1.3-alpha.1 0.1.5-rc.1`.** This package supersedes
28
+ the two version-locked npm names `dsh-plugin-upgrade` (leg A, `0.1.3-alpha.1
29
+ 0.1.5-alpha.1`, seams `S1`–`S10` + `M1`) and `dsh-plugin-upgrade-rc1` (leg B,
30
+ `0.1.5-alpha.1 0.1.5-rc.1`, seams `C1`, `C2`, `C4`, `C5`, `H1`–`H4`, `P1`). The npm name
31
+ is new, so the version line restarts at `0.1.0`; the two retired names stay on the registry
32
+ and their content is now historical.
33
+ - **One 20-seam catalog** — `lib/scan.mjs` carries both legs in catalog order (`S3`, `S8`,
34
+ `S9`, `M1`, `S4`, `S5`, `S6`, `S7`, `S2`, `S1`, `S10`, `C1`, `C2`, `P1`, `C4`, `C5`, `H1`,
35
+ `H2`, `H4`, `H3`) behind one CLI, one skill and one id-parity gate.
36
+ - **Seam `C3` was folded into `M1`.** Leg B's `C3` was the same defect as leg A's `M1` (a
37
+ local gate compiling a stale type line), so the merged catalog has one seam carrying both
38
+ causes: an unresolvable `tsconfig` `paths` alias and dev/test types pinned at
39
+ `0.1.5-alpha.*`. `C3` is no longer a seam id — `--seams C3` matches nothing, `types.d.ts`
40
+ does not accept it, and the merged card records the old spelling only in its fold notes.
41
+ - **Merged card with two labelled legs** —
42
+ `skills/plugin-upgrade/references/v0.1.3-alpha.1-to-v0.1.5-rc.1.md`: a preamble (the
43
+ span, why it ends at rc.1, how to read it), **§1 Leg A** and **§2 Leg B** each carrying the
44
+ retired card's full text, evidence and `path:line` citations, and **§3 the merged 20-seam
45
+ index**.
46
+ - **Leg-routing skill body** — the skill is now `plugin-upgrade` (renamed directory,
47
+ frontmatter, Config default and bundle row). Its body routes the caller to the leg that
48
+ matches the peer band, and both legs' original frontmatter routing hints are preserved in
49
+ the body.
50
+ - **Fixtures for both legs** — leg A's TypeScript/session-oriented pair is vendored as
51
+ `fixtures/leg-a-bad-repo` / `fixtures/leg-a-good-repo`; the client-slot pair stays at
52
+ `fixtures/bad-repo` / `fixtures/good-repo`. Each leg therefore has a bad fixture that trips
53
+ its error-severity seams and a good fixture that stays clean.
29
54
 
30
55
  ### Changed
31
56
 
32
- - Family-standard CI: the `plugin-doctor` static R/K gate and OpenSSF Scorecard now run in
33
- this repository, and `dsh-plugin-upgrade` is enrolled in the
34
- `dsh-plugin-doctor` verified registry (badge: passing).
35
-
36
- ## [0.1.1] - 2026-09-09
37
-
38
- ### Fixed
57
+ - The scanner CLI is now `dsh-plugin-upgrade-scan` (`scripts/scan-0.1.5.mjs`, plus the
58
+ skill-local `skills/plugin-upgrade/scripts/scan-0.1.5.mjs`); the cordis row is
59
+ `dsh-plugin-upgrade`.
60
+ - The dev/test pin and the monthly compat probe move to the published `0.1.5-rc.2` line (the
61
+ newest published types verify the same seam catalog), while `dshWorkshop.compatibility.dshVersions`
62
+ lists `0.1.2-rc.1` and `0.1.5-rc.2`. The peer band still keeps both segments
63
+ (`>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0`) — `P1` forbids collapsing it.
64
+ - Rename the four translated READMEs to `README-<lang>.md`. npm selects the package-page readme as the first markdown file matching its `{README,README.*}` glob (`@npmcli/package-json`, publish path), and that glob order puts `README.<lang>.md` ahead of `README.md` — so npm was serving the Simplified-Chinese file for this package too (measured on 15/15 sampled packages of the family). The new names sit outside the glob, so the English source is served again. No content changed apart from the language-switcher link each translation holds to its siblings, and the repo readme gate still passes. Takes effect with the next release; an already-published version cannot gain a corrected readme retroactively.
39
65
 
40
- - **SKILL.md frontmatter on a CRLF checkout.** The parser required the `---\n`
41
- delimiter, so a Windows checkout (`core.autocrlf=true`) mounted the skill with the
42
- frontmatter leaked into the body and no description/`whenToUse`. Line endings are now
43
- normalized before parsing, `.gitattributes` pins every text file to LF, and the suite
44
- covers both a CRLF string and a CRLF-converted bundle on disk. Caught by the Windows
45
- CI leg of v0.1.0.
66
+ ## [0.1.0] - 2026-09-10 · retired package `dsh-plugin-upgrade-rc1` (leg B)
46
67
 
47
- ## [0.1.0] - 2026-09-09
68
+ > *Historical entry, kept as published: every package name, CLI name and skill id below is as
69
+ > it was in the retired leg-B package (`dsh-plugin-upgrade-rc1`, skill
70
+ > `plugin-upgraderc1`, CLI `dsh-plugin-upgrade-rc1-scan`). Their merged equivalents are in
71
+ > `[Unreleased]`. Leg B's seam `C3` below is the merged `M1`, and this entry is retained
72
+ > verbatim apart from that fold.*
48
73
 
49
74
  ### Added
50
75
 
51
- - **Bundled agent skill `plugin-upgrade-015`** — the version-locked `0.1.3-alpha.1 → 0.1.5-alpha.1` upgrade corridor: a 6-step fix-and-verify loop plus the version card with host path, commit, minimal fix and regression for every seam.
52
- - **Zero-dependency seam scanner** (`dsh-plugin-upgrade-scan`, also `dsh-plugin-upgrade/scan`) reports `file:line` facts for ten seams measured against 40 real plugin repositories during the 2026-09-09 adaptation wave; exit `1` on any error-severity hit.
53
- - **Ten-seam catalog** — `S1` V3 session format / generation-scoped log name, `S2` `EpochHeader.system` removal, `S3` `assistant/message.stream` required, `S4` `tool/code-dispatch` `tool/ptc-dispatch`, `S5` `ctx.agent` removal, `S6` `Inbox` typed interface, `S7` `SubprocessHandle.pid` removal, `S8` `SessionHandleReadResult`, `S9` `SystemPrompt.persona` → `personaPrefix`/`personaSuffix`, `M1` stale `tsconfig` `paths` producing a silently fake-green typecheck.
54
- - **M1 as a first-class defect** — the scanner resolves every checkout-style `tsconfig` alias and fails the scan when a target directory does not exist, instead of letting the repo compile against published types.
55
- - **Plugin surface** `enabled`, `skillName`, `skillsRoot`, `userInvocable` config keys; the skill registers through the injected `skills` service and unregisters with its effect disposer. A missing bundle, an empty body or a nameless frontmatter fails the mount loud.
56
- - **Gates** `node --test` against a real Cordis `Context` and the real `SkillRegistry`, five-language README consistency, self-contained import resolution, and a packed-tarball artifact check that imports the entry under plain Node.
76
+ - **Bundled agent skill `plugin-upgraderc1`** — the version-locked `0.1.5-alpha.1 →
77
+ 0.1.5-rc.1` corridor: a 6-step fix-and-verify loop plus the corridor card with the
78
+ fromto mapping, the seam catalog and the rewrite recipes.
79
+ - **Zero-dependency seam scanner** (`dsh-plugin-upgrade-rc1-scan`, also
80
+ `dsh-plugin-upgrade-rc1/scan`)reports `file:line` facts for ten seams re-read from the
81
+ harness tag range on 2026-09-10; exit `1` on any error-severity hit.
82
+ - **Ten-seam catalog** — `C1` the bare client slot `conversation` deleted with no alias
83
+ (silent unmount), `C2` the `dsh-client-ui-sidebar-textpreview` →
84
+ `…-sidebar-documentpreview` package rename, `M1` the client-side false green from a stale
85
+ type line or an unresolvable `tsconfig` `paths` alias (leg B's card spelled this seam `C3`;
86
+ it is now one seam with leg A's `M1`), `C4` the new global main-panel model
87
+ and the `usePanelInfo` standard prop, `C5` the `sidebar.right.tab.document` document
88
+ preview slot and the `rightbar` → `rightbar.session` parent change, `H1` the two new
89
+ fail-closed session event types, `H2` the `present` tool taking the `'present'` tool-view
90
+ key, `H3` the additive capabilities (card-only, no detector), `H4` the DeepSeek adapter's
91
+ default advisory catalog now led by `deepseek-flash`, and `P1` the peer-range trap where
92
+ `>=0.1.2-rc.1 <0.2.0` alone rejects `0.1.5-rc.1`.
93
+ - **`C1` ruling and rewrite recipe** — the removal is documented as a **public
94
+ extension-point break** (no alias, no shim, no upstream deprecation note, and
95
+ `ctx.slots.inject()` never fires without the declaration), with the
96
+ `conversation` → `main.conversation` / `main` recipe and a real-browser exit criterion.
97
+ - **Honest blast-radius record** — the card states that the family's own client halves use
98
+ eight slot keys, all of which survive in rc.1, so this hop is latent breakage for them and
99
+ actual breakage only for third-party halves that targeted the bare key.
100
+ - **`M1` (leg B's `C3`) and `P1` as structured checks** — they resolve `tsconfig` `paths` and
101
+ the declared peer band instead of matching text, mirroring leg A's `M1` treatment.
102
+ - **Card↔catalog parity gate** — `test/card.test.mjs` asserts that the card and
103
+ `lib/scan.mjs` name exactly the same seam ids with the same severities, turning the
104
+ evidence-binding rule into a machine gate.
105
+ - **Plugin surface** — `enabled`, `skillName`, `skillsRoot`, `userInvocable` config keys; the
106
+ skill registers through the injected `skills` service and unregisters with its effect
107
+ disposer. A missing bundle, an empty body or a nameless frontmatter fails the mount loud.
108
+ - **Evidence seal** — `docs/EVIDENCE.md` records the command and the observed output behind
109
+ every card claim, and marks what could not be verified.
110
+ - **Gates** — `node --test` against a real Cordis `Context` and the real `SkillRegistry`,
111
+ five-language README consistency, self-contained import resolution, and a packed-tarball
112
+ artifact check that also proves `test/`, `fixtures/` and `.github/` never ship.
113
+ - **Family-standard CI** — 3 OS × 2 Node `ci.yml`, a monthly `compat.yml` probe against the
114
+ published `0.1.5-rc.1` line, OpenSSF `scorecard.yml`, the `plugin-doctor.yml` static R/K
115
+ gate, and a tag-triggered `release.yml` that gates, publishes to npm with provenance and
116
+ creates the GitHub Release behind an idempotent guard.