diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 8a78959..e7d4903 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -54,7 +54,8 @@ jobs: git remote add origin https://github.com/deepseek-ai/deepseek-harness.git git fetch --depth 1 -q origin \ refs/tags/dsh-v0.1.7-rc.2:refs/tags/dsh-v0.1.7-rc.2 \ - refs/tags/dsh-v0.2.0-rc.2:refs/tags/dsh-v0.2.0-rc.2 + refs/tags/dsh-v0.2.0-rc.2:refs/tags/dsh-v0.2.0-rc.2 \ + refs/tags/dsh-v0.2.1-rc.2:refs/tags/dsh-v0.2.1-rc.2 # `pnpm test` is the vitest run only: all three projects (host and client # against src, compat against the BUILT plugin at each baseline tag) plus diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 21e47a0..af49280 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,7 +62,8 @@ jobs: git remote add origin https://github.com/deepseek-ai/deepseek-harness.git git fetch --depth 1 -q origin \ refs/tags/dsh-v0.1.7-rc.2:refs/tags/dsh-v0.1.7-rc.2 \ - refs/tags/dsh-v0.2.0-rc.2:refs/tags/dsh-v0.2.0-rc.2 + refs/tags/dsh-v0.2.0-rc.2:refs/tags/dsh-v0.2.0-rc.2 \ + refs/tags/dsh-v0.2.1-rc.2:refs/tags/dsh-v0.2.1-rc.2 - name: Test run: DSH_REPO="$PWD/.tmp/dsh-repo" pnpm test diff --git a/docs/compatibility.md b/docs/compatibility.md index 6ffab0e..6fa5a5e 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -6,13 +6,13 @@ The rules dsh-context must hold on every supported `@deepseek-ai/dsh` release, a **Law.** Record only what no other artifact carries; delete what code, tests, or git history already say. Verify against the dsh sources before acting — source wins over this page. Less is ALWAYS better. -Last verified: **2026-10-14** (dsh-context `0.70.0`, dsh `0.2.0-rc.2` npm install and `0.2.1-alpha.3` tree). +Last verified: **2026-10-20** (dsh-context `0.73.3`, dsh `0.1.7-rc.2` / `0.2.0-rc.2` / `0.2.1-rc.2` tag trees). ## 1 · Supported set *What the plugin declares it works on.* -1. **Support exactly `0.1.7-rc.2` and `0.2.0-rc.2`** — both the V4 durable-log generation. The floor is `0.1.7-rc.2` because it is the first `0.1.7`-line release with a complete npm dependency closure; anything older gets §2's fallback composition with an upgrade prompt, never a fold. +1. **Support exactly `0.1.7-rc.2`, `0.2.0-rc.2` and `0.2.1-rc.2`** — all the V4 durable-log generation. The floor is `0.1.7-rc.2` because it is the first `0.1.7`-line release with a complete npm dependency closure; anything older gets §2's fallback composition with an upgrade prompt, never a fold. ## 2 · Admission diff --git a/package.json b/package.json index 52996ad..857560e 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,8 @@ "compatibility": { "dshReleases": { "0.1.7-rc.2": "compatible", - "0.2.0-rc.2": "compatible" + "0.2.0-rc.2": "compatible", + "0.2.1-rc.2": "compatible" } } }, diff --git a/tests/baselines.ts b/tests/baselines.ts index a4f2aea..1fa4ffa 100644 --- a/tests/baselines.ts +++ b/tests/baselines.ts @@ -16,7 +16,7 @@ */ /** The supported dsh tags, in lockstep with the BASELINES entries below. */ -export type BaselineId = 'v0.1.7-rc.2' | 'v0.2.0-rc.2' +export type BaselineId = 'v0.1.7-rc.2' | 'v0.2.0-rc.2' | 'v0.2.1-rc.2' /** The harness web half's client faces, as far as the compat probes consume them. */ export interface ClientSeam { @@ -223,12 +223,12 @@ export interface Baseline { } /** One support-matrix entry. Every supported line is the V4 generation, so - * the seams are spelled once here; a future line that diverges on a needle outgrows the factory (inline its entry instead). */ -function baseline(id: BaselineId, tag: string, session: string): Baseline { + * the seams are spelled once here; a line that diverges states its divergence here. */ +function baseline(id: BaselineId, tag: string, session: string, line: { cordis?: string; stockIds?: readonly string[] } = {}): Baseline { return { id, tag, - cordis: '4.0.4', + cordis: line.cordis ?? '4.0.4', session, foldEventTypes: [ 'request/header', 'request/context', 'step/start', 'step/end', @@ -319,7 +319,7 @@ function baseline(id: BaselineId, tag: string, session: string): Baseline { }, stockIds: { file: 'packages/bundle/base/cordis.patch.yml', - ids: ['llm-deepseek', 'web-search-deepseek'], + ids: line.stockIds ?? ['llm-deepseek', 'web-search-deepseek'], }, providerFiles: [ { @@ -384,4 +384,12 @@ export const BASELINES: readonly Baseline[] = [ // session-format tree carries no v4-to-v5 migration). Cordis stays 4.0.4, // and the line continues to enforce the plugin dsh-peer gate this plugin's `>=0.1.7-rc.2` peers satisfy. baseline('v0.2.0-rc.2', 'dsh-v0.2.0-rc.2', '0.2.0-rc.2'), + // The 0.2.1 line continues the V4 Config-form generation with every seam the + // plugin rides spelled as at `0.2.0-rc.2`. Two facts differ: the line + // vendors cordis 4.0.5, and it adds the `web-deepseek-api` entry the + // balance fold falls back to. + baseline('v0.2.1-rc.2', 'dsh-v0.2.1-rc.2', '0.2.1-rc.2', { + cordis: '4.0.5', + stockIds: ['llm-deepseek', 'web-search-deepseek', 'web-deepseek-api'], + }), ] diff --git a/tests/compat/staging.ts b/tests/compat/staging.ts index d21bc2a..fdb6d01 100644 --- a/tests/compat/staging.ts +++ b/tests/compat/staging.ts @@ -57,6 +57,16 @@ export function stageFile(baseline: Baseline, tagPath: string, localName: string return file } +/** Stage one file only when the tag carries it: a line that does not ship the + * file stages nothing, and the sibling a staged module imports by relative + * path rides along. */ +function stageFileIfPresent(baseline: Baseline, tagPath: string, localName: string): boolean { + const run = spawnSync('git', ['-C', DSH_REPO, 'cat-file', '-e', `${baseline.tag}:${tagPath}`], { encoding: 'utf8' }) + if (run.status !== 0) return false + stageFile(baseline, tagPath, localName) + return true +} + /** The host packages the tag's staged sources import at runtime, at this line's own versions. */ function hostDepsOf(baseline: Baseline): Record { return { @@ -108,7 +118,7 @@ function driverSource(pluginUrl: string, developerMessages: boolean): string { return ` import { Context } from '@deepseek-ai/cordis' import { SessionProjectionRegistry } from './registry/index.ts' -import { snapshotJsonValue } from './dsh/json-values.ts' +import { snapshotJsonValue } from './dsh/index.ts' const plugin = await import(${JSON.stringify(pluginUrl)}) const ctx = new Context() const registry = new SessionProjectionRegistry(ctx) @@ -268,7 +278,12 @@ export function runDriver(baseline: Baseline): DriverReport { ensureHostDeps(baseline) stageFile(baseline, 'packages/session/session-projection/src/index.ts', join('registry', 'index.ts')) stageFile(baseline, 'packages/session/session-projection/src/types.ts', join('registry', 'types.ts')) - stageFile(baseline, 'packages/util/values/src/index.ts', join('dsh', 'json-values.ts')) + // The values package under its own file name: its modules import each other + // by relative path, so renaming the entry would break the sibling links. + stageFile(baseline, 'packages/util/values/src/index.ts', join('dsh', 'index.ts')) + // The 0.2.1 line's values package grew a sibling module the staged entry + // re-exports by relative path, so it rides along where the tag ships it. + stageFileIfPresent(baseline, 'packages/util/values/src/partial-json.ts', join('dsh', 'partial-json.ts')) const driver = join(STAGE, baseline.id, 'driver.mjs') writeFileSync(driver, driverSource(`file://${join(REPO, 'lib', 'index.js')}`, baseline.foldEventTypes.includes('developer/message'))) const run = spawnSync(process.execPath, [driver], { cwd: STAGE, encoding: 'utf8', timeout: 60_000 })