@foggy-projects/deepseek-harness-plugin 0.4.0-rc.1 → 0.4.0-rc.2

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/README.md CHANGED
@@ -14,7 +14,7 @@ modify `PATH`, or register Python globally. Advanced users may explicitly set
14
14
  ## Local beta installation
15
15
 
16
16
  ```powershell
17
- dsh plugin --profile web add --workspace-root ./foggy-projects-deepseek-harness-plugin-0.4.0-rc.1.tgz
17
+ dsh plugin --profile web add --workspace-root ./foggy-projects-deepseek-harness-plugin-0.4.0-rc.2.tgz
18
18
  ```
19
19
 
20
20
  Restart `dsh web`, use the browser it opens (or the complete printed URL,
@@ -1,10 +1,10 @@
1
- # Public beta readiness: 0.4.0-rc.1
1
+ # Public beta readiness: 0.4.0-rc.2
2
2
 
3
3
  Assessment date: 2026-09-05
4
4
 
5
5
  ## Verdict
6
6
 
7
- `0.4.0-rc.1` is suitable for a scoped public beta on Windows 10/11 x64 and
7
+ `0.4.0-rc.2` is suitable for a scoped public beta on Windows 10/11 x64 and
8
8
  Linux/WSL2 x64. It is not a general-availability release.
9
9
 
10
10
  The plugin package stays small and downloads large components only during
@@ -31,7 +31,7 @@ system PATH, registry, or a user's existing Python installation.
31
31
  Runtime. The password is excluded from onboarding state and evidence, and
32
32
  datasource setup does not trigger Runtime restart. Opaque profiles remain an
33
33
  optional advanced path.
34
- - A real Launcher 0.1.20 smoke on Java 17 accepted a synthetic inline-password
34
+ - A real Launcher 0.1.21 smoke on Java 17 accepted a synthetic inline-password
35
35
  datasource through the public Runtime API while retaining the same Java PID.
36
36
  The isolated registry confirmed the documented local-development plaintext
37
37
  persistence boundary; the test datasource was then removed and the temporary
@@ -41,8 +41,8 @@ system PATH, registry, or a user's existing Python installation.
41
41
  PID, while the persisted onboarding state and command evidence contained no
42
42
  copy of the synthetic password.
43
43
  - The package and settings contract report Python 3.12.13 as `Foggy private`,
44
- CLI 0.1.23, Launcher 0.1.20, analysis Skill 0.1.17, and onboarding Skill
45
- 0.4.0-rc.1; the same component display was accepted in the preceding
44
+ CLI 0.1.23, Launcher 0.1.21, analysis/query Skills 0.1.18, and onboarding Skill
45
+ 0.4.0-rc.2; the same component display was accepted in the preceding
46
46
  native Windows beta run.
47
47
  - Runtime startup now reports the current phase, elapsed/timeout seconds, and a
48
48
  bounded progress value. A real Windows launch with Temurin 17 reached readiness
@@ -67,7 +67,7 @@ system PATH, registry, or a user's existing Python installation.
67
67
  new datasource tests cover secret-free persisted state, direct Runtime API
68
68
  submission, CLI bypass for inline development credentials, stable inline
69
69
  credential resumption, bounded transient connection retry, and output redaction.
70
- - A real Java 17 / Launcher 0.1.20 regression resumed the same completed inline
70
+ - A real Java 17 / Launcher 0.1.21 regression resumed the same completed inline
71
71
  datasource composite twice, retained the Runtime PID, and emitted a complete
72
72
  `01` through `06` workspace evidence sequence without falling back to granular
73
73
  commands.
@@ -0,0 +1,38 @@
1
+ # Foggy DeepSeek Harness plugin 0.4.0-rc.2 release candidate
2
+
3
+ Assessment date: 2026-09-06
4
+
5
+ ## Decision
6
+
7
+ This build is a public preview for Windows 10/11 x64 and Linux/WSL2 x64. It
8
+ remains a development and evaluation plugin; the bundled Runtime defaults are
9
+ not a production security profile.
10
+
11
+ No Java engine or `foggy-runtime-cli` source was changed for this candidate.
12
+ The plugin consumes the independently accepted CLI 0.1.23, Runtime Launcher
13
+ 0.1.21, foggy-ai-analysis Skill 0.1.18, and foggy-semantic-query Skill 0.1.18
14
+ public releases.
15
+
16
+ ## Delta from rc.1
17
+
18
+ - Upgrade Runtime Launcher from 0.1.20 to 0.1.21.
19
+ - Upgrade foggy-ai-analysis from 0.1.17 to 0.1.18.
20
+ - Install and register foggy-semantic-query 0.1.18 as a second managed Skill.
21
+ - Keep DeepSeek Harness 0.1.2-rc.1, managed Python 3.12.13, CLI 0.1.23, and the
22
+ default Runtime port 18166 unchanged.
23
+
24
+ The new public assets and their nested Skill manifests were independently
25
+ checksum-verified. Runtime acceptance covered automatic static-dictionary
26
+ captions, label-to-code filtering, dictionary member enumeration, self-date
27
+ dimensions, and the `$year`, `$month`, and `$yearMonth` describe/query path.
28
+
29
+ ## Publication gate
30
+
31
+ The plugin's existing automated tests and npm tarball inspection must pass.
32
+ The Runtime functional matrix is not repeated because the exact public
33
+ Launcher and Skill assets were accepted independently before this pin update.
34
+
35
+ DeepSeek Harness minimum-release-age policy can reject a recently published
36
+ version still present in a profile lockfile. Users should inspect and rebuild
37
+ the profile lockfile or wait for the policy window rather than weakening
38
+ plugin integrity checks.
@@ -1,7 +1,7 @@
1
1
  # Native Windows Beta acceptance
2
2
 
3
3
  This runbook validates DeepSeek Harness `0.1.2-rc.1` with Foggy plugin
4
- `0.4.0-rc.1` on a clean 64-bit Windows 10 or Windows 11 machine. Use a local
4
+ `0.4.0-rc.2` on a clean 64-bit Windows 10 or Windows 11 machine. Use a local
5
5
  directory that is not synchronized by OneDrive.
6
6
 
7
7
  ## Prerequisites
@@ -60,9 +60,9 @@ Expected component state:
60
60
 
61
61
  - Python 3.12.13, source `Foggy private`;
62
62
  - CLI 0.1.23;
63
- - Launcher 0.1.20;
64
- - analysis Skill 0.1.17;
65
- - onboarding Skill 0.4.0-rc.1;
63
+ - Launcher 0.1.21;
64
+ - analysis/query Skills 0.1.18;
65
+ - onboarding Skill 0.4.0-rc.2;
66
66
  - Java 17+ available;
67
67
  - native DSH Skill registration available.
68
68
 
package/lib/client.js CHANGED
@@ -35,7 +35,7 @@ window.__ModuleLoader__.load({
35
35
  package: '@foggy-projects/deepseek-harness-plugin',
36
36
  descriptors: [
37
37
  ...[
38
- 'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill',
38
+ 'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill', 'repairSemanticQuerySkill',
39
39
  'migrateProfiles', 'diagnostics', 'runtimeStart', 'runtimeStop',
40
40
  ].map((method) => descriptor(method)),
41
41
  descriptor('saveRuntimeSettings', [{
@@ -66,6 +66,7 @@ window.__ModuleLoader__.load({
66
66
  cli: 'CLI',
67
67
  launcher: 'Launcher',
68
68
  analysisSkill: '分析 Skill',
69
+ semanticQuerySkill: '语义查询 Skill',
69
70
  onboardingSkill: '引导 Skill',
70
71
  skillRegistry: 'DSH Skill 注册',
71
72
  python: 'Python',
@@ -81,6 +82,7 @@ window.__ModuleLoader__.load({
81
82
  repairCli: '检查 / 修复 CLI',
82
83
  repairLauncher: '检查 / 修复 Launcher',
83
84
  repairAnalysisSkill: '检查 / 修复分析 Skill',
85
+ repairSemanticQuerySkill: '检查 / 修复语义查询 Skill',
84
86
  diagnostics: '导出诊断报告',
85
87
  diagnosticsSaved: '诊断报告已保存',
86
88
  start: '启动 Runtime',
@@ -92,6 +94,7 @@ window.__ModuleLoader__.load({
92
94
  progressCli: '准备 CLI',
93
95
  progressLauncher: '准备 Launcher',
94
96
  progressAnalysis: '准备分析 Skill',
97
+ progressSemanticQuery: '准备语义查询 Skill',
95
98
  progressSkills: '注册 DSH Skills',
96
99
  progressState: '写入安装状态',
97
100
  progressComplete: '初始化完成',
@@ -169,6 +172,7 @@ window.__ModuleLoader__.load({
169
172
  cli: 'CLI',
170
173
  launcher: 'Launcher',
171
174
  analysisSkill: 'Analysis Skill',
175
+ semanticQuerySkill: 'Semantic Query Skill',
172
176
  onboardingSkill: 'Onboarding Skill',
173
177
  skillRegistry: 'DSH Skill registry',
174
178
  python: 'Python',
@@ -184,6 +188,7 @@ window.__ModuleLoader__.load({
184
188
  repairCli: 'Check / repair CLI',
185
189
  repairLauncher: 'Check / repair Launcher',
186
190
  repairAnalysisSkill: 'Check / repair analysis Skill',
191
+ repairSemanticQuerySkill: 'Check / repair semantic query Skill',
187
192
  diagnostics: 'Export diagnostics',
188
193
  diagnosticsSaved: 'Diagnostics saved',
189
194
  start: 'Start Runtime',
@@ -195,6 +200,7 @@ window.__ModuleLoader__.load({
195
200
  progressCli: 'Preparing CLI',
196
201
  progressLauncher: 'Preparing Launcher',
197
202
  progressAnalysis: 'Preparing analysis Skill',
203
+ progressSemanticQuery: 'Preparing semantic query Skill',
198
204
  progressSkills: 'Registering DSH Skills',
199
205
  progressState: 'Writing install state',
200
206
  progressComplete: 'Initialization complete',
@@ -324,6 +330,7 @@ window.__ModuleLoader__.load({
324
330
  cli: 'progressCli',
325
331
  launcher: 'progressLauncher',
326
332
  'analysis-skill': 'progressAnalysis',
333
+ 'semantic-query-skill': 'progressSemanticQuery',
327
334
  'workspace-skills': 'progressSkills',
328
335
  state: 'progressState',
329
336
  complete: 'progressComplete',
@@ -603,6 +610,7 @@ window.__ModuleLoader__.load({
603
610
  componentCard(t('cli'), status.components.cli, 'runtime', t),
604
611
  componentCard(t('launcher'), status.components.launcher, 'runtime', t),
605
612
  componentCard(t('analysisSkill'), status.components.analysisSkill, 'runtime', t),
613
+ componentCard(t('semanticQuerySkill'), status.components.semanticQuerySkill, 'runtime', t),
606
614
  componentCard(t('onboardingSkill'), status.components.onboardingSkill, 'runtime', t),
607
615
  componentCard(t('skillRegistry'), { installed: status.components.onboardingSkill?.provider === 'foggy-managed-skills', version: 'native' }, 'runtime', t),
608
616
  ] }),
@@ -613,6 +621,7 @@ window.__ModuleLoader__.load({
613
621
  jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairCli'), children: t('repairCli') }),
614
622
  jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairLauncher'), children: t('repairLauncher') }),
615
623
  jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairAnalysisSkill'), children: t('repairAnalysisSkill') }),
624
+ jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairSemanticQuerySkill'), children: t('repairSemanticQuerySkill') }),
616
625
  ] }),
617
626
  ] }),
618
627
  status.profileMigration?.pendingCount || status.profileMigration?.conflictCount ? jsxs('div', { className: 'foggy-warning', children: [
package/lib/index.js CHANGED
@@ -228,8 +228,10 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
228
228
  const cliPath = state?.cli?.command
229
229
  const launcherPath = state?.launcher?.path
230
230
  const analysisSkillPath = state?.skills?.analysis?.path || join(roots.installRoot, 'skills', 'foggy-ai-analysis')
231
+ const semanticQuerySkillPath = state?.skills?.semanticQuery?.path || join(roots.installRoot, 'skills', 'foggy-semantic-query')
231
232
  const onboardingSkillPath = join(packageRoot, 'skills', 'foggy-deepseek-onboarding')
232
233
  const analysisMarker = await readOptionalJson(join(analysisSkillPath, '.foggy-managed-skill.json'))
234
+ const semanticQueryMarker = await readOptionalJson(join(semanticQuerySkillPath, '.foggy-managed-skill.json'))
233
235
  const components = {
234
236
  python,
235
237
  java,
@@ -249,6 +251,14 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
249
251
  ),
250
252
  version: state?.skills?.analysis?.version ?? manifest.components.analysisSkill.version,
251
253
  },
254
+ semanticQuerySkill: {
255
+ installed: Boolean(
256
+ await exists(join(semanticQuerySkillPath, 'SKILL.md'))
257
+ && semanticQueryMarker?.schemaVersion === 'foggy-managed-skill/v1'
258
+ && semanticQueryMarker?.componentVersion === manifest.components.semanticQuerySkill.version
259
+ ),
260
+ version: state?.skills?.semanticQuery?.version ?? manifest.components.semanticQuerySkill.version,
261
+ },
252
262
  onboardingSkill: {
253
263
  installed: await exists(join(onboardingSkillPath, 'SKILL.md')),
254
264
  version: manifest.packageVersion,
@@ -259,6 +269,7 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
259
269
  && components.cli.installed
260
270
  && components.launcher.installed
261
271
  && components.analysisSkill.installed
272
+ && components.semanticQuerySkill.installed
262
273
  && components.onboardingSkill.installed
263
274
  const running = Boolean(runtime && processRunning(Number(runtime.pid)))
264
275
  const activePort = running && Number.isInteger(Number(runtime?.port)) ? Number(runtime.port) : null
@@ -314,8 +325,8 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
314
325
  'download and verify a pinned private Python runtime',
315
326
  'create isolated Python environment',
316
327
  'download and verify pinned CLI and Launcher assets',
317
- 'install the Foggy analysis Skill into the global managed component directory',
318
- 'register onboarding and analysis Skills through the native DSH Skill registry',
328
+ 'install the Foggy analysis and semantic-query Skills into the global managed component directory',
329
+ 'register onboarding, analysis, and semantic-query Skills through the native DSH Skill registry',
319
330
  'write global install state; resolve each workspace from the DSH session cwd',
320
331
  ],
321
332
  secretsInDshSettings: false,
@@ -346,6 +357,10 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
346
357
  return this.startOperation('repair-analysis-skill', true, ['install', '--repair-component', 'analysis-skill'])
347
358
  }
348
359
 
360
+ async repairSemanticQuerySkill() {
361
+ return this.startOperation('repair-semantic-query-skill', true, ['install', '--repair-component', 'semantic-query-skill'])
362
+ }
363
+
349
364
  async migrateProfiles() {
350
365
  return this.startOperation('profile-migration', false, ['profile-migrate', '--approve'])
351
366
  }
@@ -530,7 +545,7 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
530
545
 
531
546
  const markerInitializers = []
532
547
  for (const method of [
533
- 'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill',
548
+ 'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill', 'repairSemanticQuerySkill',
534
549
  'migrateProfiles', 'diagnostics', 'runtimeStart', 'runtimeStop',
535
550
  'saveRuntimeSettings',
536
551
  ]) {
@@ -28,6 +28,7 @@ export const descriptors = [
28
28
  descriptor('initialize'),
29
29
  descriptor('repair'),
30
30
  descriptor('repairPython'),
31
+ descriptor('repairSemanticQuerySkill'),
31
32
  descriptor('runtimeStart'),
32
33
  descriptor('runtimeStop'),
33
34
  descriptor('saveRuntimeSettings', [{
@@ -56,15 +56,15 @@ function candidate(name, description, path, source) {
56
56
  }
57
57
  }
58
58
 
59
- async function managedAnalysisSkill(installRoot, manifest) {
59
+ async function managedSkill(installRoot, manifest, { stateKey, componentKey, kind }) {
60
60
  const state = await readOptionalJson(join(installRoot, 'install-state.json'))
61
- const path = state?.skills?.analysis?.path
61
+ const path = state?.skills?.[stateKey]?.path
62
62
  if (!path || !await exists(join(path, 'SKILL.md'))) return null
63
63
  const marker = await readOptionalJson(join(path, '.foggy-managed-skill.json'))
64
64
  if (
65
65
  marker?.schemaVersion !== 'foggy-managed-skill/v1'
66
- || marker?.kind !== 'analysis'
67
- || marker?.componentVersion !== manifest.components.analysisSkill.version
66
+ || marker?.kind !== kind
67
+ || marker?.componentVersion !== manifest.components[componentKey].version
68
68
  ) return null
69
69
  return join(path, 'SKILL.md')
70
70
  }
@@ -83,10 +83,15 @@ export function createFoggySkillProvider({ installRoot, versionsFile }) {
83
83
  'bundled',
84
84
  )]
85
85
  if (!manifest) return result
86
- const analysisPath = await managedAnalysisSkill(installRoot, manifest)
87
- if (analysisPath) {
88
- const analysis = parseSkill(await readFile(analysisPath, 'utf8'), 'foggy-ai-analysis')
89
- result.push(candidate('foggy-ai-analysis', analysis.metadata.description, analysisPath, 'bundled'))
86
+ const managedSkills = [
87
+ { name: 'foggy-ai-analysis', stateKey: 'analysis', componentKey: 'analysisSkill', kind: 'analysis' },
88
+ { name: 'foggy-semantic-query', stateKey: 'semanticQuery', componentKey: 'semanticQuerySkill', kind: 'semantic-query' },
89
+ ]
90
+ for (const spec of managedSkills) {
91
+ const path = await managedSkill(installRoot, manifest, spec)
92
+ if (!path) continue
93
+ const skill = parseSkill(await readFile(path, 'utf8'), spec.name)
94
+ result.push(candidate(spec.name, skill.metadata.description, path, 'bundled'))
90
95
  }
91
96
  return result
92
97
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foggy-projects/deepseek-harness-plugin",
3
- "version": "0.4.0-rc.1",
3
+ "version": "0.4.0-rc.2",
4
4
  "description": "Foggy Java data analysis engine integration for DeepSeek Harness",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -20,7 +20,7 @@
20
20
  "cordis.patch.yml",
21
21
  "experience/linux/**",
22
22
  "docs/PUBLIC-BETA-READINESS.md",
23
- "docs/RELEASE-CANDIDATE-0.4.0-RC.1.md",
23
+ "docs/RELEASE-CANDIDATE-0.4.0-RC.2.md",
24
24
  "docs/WINDOWS-BETA-ACCEPTANCE.md",
25
25
  "THIRD-PARTY-RUNTIME-NOTICES.md",
26
26
  "README.md"
@@ -65,7 +65,7 @@ are authoritative; do not copy the Skill into the current workspace.
65
65
  instead of treating success as proof that every requested option took effect. Free-text advice is
66
66
  optional. When a warning indicates possible semantic drift, use `models describe` to prepare a
67
67
  corrected payload if the user's intent can be preserved; otherwise disclose the limitation.
68
- Runtime 0.1.20 defaults unknown ordinary Query DSL properties to `WARN`; `IGNORE` continues without
68
+ Runtime 0.1.21 defaults unknown ordinary Query DSL properties to `WARN`; `IGNORE` continues without
69
69
  `queryInputWarnings`, while `STRICT` rejects the request with the complete structured violations.
70
70
  Never reinterpret a protected or governance-field failure as an ignorable warning.
71
71
  7. When the model works, recommend committing the model directory to the user's own Git repository.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "foggy-deepseek-onboarding-versions/v1",
3
- "packageVersion": "0.4.0-rc.1",
4
- "validatedAt": "2026-09-05",
3
+ "packageVersion": "0.4.0-rc.2",
4
+ "validatedAt": "2026-09-06",
5
5
  "components": {
6
6
  "deepseekHarness": {
7
7
  "version": "0.1.2-rc.1",
@@ -66,64 +66,89 @@
66
66
  }
67
67
  },
68
68
  "launcher": {
69
- "version": "0.1.20",
69
+ "version": "0.1.21",
70
70
  "minimumJavaVersion": "17.0.0",
71
71
  "runtimeApiContract": "foggy-runtime-api/v1",
72
72
  "assets": [
73
73
  {
74
- "file": "foggy-runtime-launcher-0.1.20.jar",
75
- "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.20/foggy-runtime-launcher-0.1.20.jar",
76
- "sha256": "5f7742ba2875dcfd8f00deb4a8aaa43147d3fce2315e907e6ce9da4e25eae4b5"
74
+ "file": "foggy-runtime-launcher-0.1.21.jar",
75
+ "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/foggy-runtime-launcher-0.1.21.jar",
76
+ "sha256": "0b5002e40633f4606b0f5d3adbcd734ad4a11d8204decab162bb53b6ab28b3b3"
77
77
  },
78
78
  {
79
79
  "file": "start-foggy-runtime.ps1",
80
- "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.20/start-foggy-runtime.ps1",
81
- "sha256": "7e001f9dc9c491b85f8a687ca1b094bc5529e76abd536bfaf77aa98ad5bd2867"
80
+ "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/start-foggy-runtime.ps1",
81
+ "sha256": "8609f8c60bad9e56460b132e1bd6c699d4ebf47cf591c3e6bc37bc8563d7de5a"
82
82
  },
83
83
  {
84
84
  "file": "start-foggy-runtime.sh",
85
- "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.20/start-foggy-runtime.sh",
86
- "sha256": "c0f5ff32fb2429d61aa6b3c1ce38dad8d1d32ca35443ad9d3b78b848bea2eeed"
85
+ "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/start-foggy-runtime.sh",
86
+ "sha256": "fa844f422473ba00a31cf801092b0fe4ef93fe8697656a9063e0ec27dacef715"
87
87
  },
88
88
  {
89
89
  "file": "README-foggy-runtime-launcher.md",
90
- "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.20/README-foggy-runtime-launcher.md",
91
- "sha256": "8b48dd3d2b2183b6168779733a195fb89172d39d3b91c17ecfda38f4f496ea72"
90
+ "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/README-foggy-runtime-launcher.md",
91
+ "sha256": "6b63cafe798e19c255a043e15e64109f6fb3252aee3fb9c37ab6a66d9adbf3cf"
92
92
  },
93
93
  {
94
94
  "file": "runtime-launcher-manifest.json",
95
- "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.20/runtime-launcher-manifest.json",
96
- "sha256": "d6a36647952230edd3e57d8d47f481f65c8fcf4b26635c59e973b43f640e7b29"
95
+ "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/runtime-launcher-manifest.json",
96
+ "sha256": "1591804035bbf589912907195c74746bf97edff3b9e6ebd7d569ecc0e5aebed7"
97
97
  },
98
98
  {
99
99
  "file": "SHA256SUMS",
100
- "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.20/SHA256SUMS",
101
- "sha256": "de6aafcad95f002ef5080004ff8b8436ecdc0e69c4dd1b92d1aab25f5e4e073c"
100
+ "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/SHA256SUMS",
101
+ "sha256": "6e03f8861176d73be22c4c7c6f6345a68e49aacfb5375cd5cf2c54f1dc4cbe5d"
102
102
  }
103
103
  ]
104
104
  },
105
105
  "analysisSkill": {
106
106
  "name": "foggy-ai-analysis",
107
- "version": "0.1.17",
108
- "minimumCliVersion": "0.1.21",
107
+ "version": "0.1.18",
108
+ "minimumCliVersion": "0.1.23",
109
109
  "assets": [
110
110
  {
111
111
  "role": "zip",
112
- "file": "foggy-ai-analysis-skill-0.1.17.zip",
113
- "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.17/foggy-ai-analysis-skill-0.1.17.zip",
114
- "sha256": "2c5a10090befc38dd2cf8c3de5121d19c28682ca9c0fe72daf778d315c56c7ff"
112
+ "file": "foggy-ai-analysis-skill-0.1.18.zip",
113
+ "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-ai-analysis-skill-0.1.18.zip",
114
+ "sha256": "93d7bb8812e91a7f85040fe14ce40a3e0657cb2fed07ddfeb9c6f28aca9e2925"
115
115
  },
116
116
  {
117
117
  "role": "manifest",
118
- "file": "foggy-ai-analysis-skill-0.1.17-manifest.json",
119
- "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.17/foggy-ai-analysis-skill-0.1.17-manifest.json",
120
- "sha256": "094b1401ff384f011ef80446dd639d8afb2585aa01d7a7ba49d39cb2968ae8bf"
118
+ "file": "foggy-ai-analysis-skill-0.1.18-manifest.json",
119
+ "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-ai-analysis-skill-0.1.18-manifest.json",
120
+ "sha256": "c6e3ae9d9ab17d8fd05fde9b94bba25577662f7edd862b099429e24244d22739"
121
121
  },
122
122
  {
123
123
  "role": "checksums",
124
- "file": "foggy-ai-analysis-skill-0.1.17-SHA256SUMS",
125
- "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.17/foggy-ai-analysis-skill-0.1.17-SHA256SUMS",
126
- "sha256": "18804088cd7da7af6bbf70d658cb0d6a5a31e765470ed673dfd274f1789db240"
124
+ "file": "foggy-ai-analysis-skill-0.1.18-SHA256SUMS",
125
+ "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-ai-analysis-skill-0.1.18-SHA256SUMS",
126
+ "sha256": "10b4c97e30201d63fa1fb9773e9a540827b92b495369403deb12b9ab67c69846"
127
+ }
128
+ ]
129
+ },
130
+ "semanticQuerySkill": {
131
+ "name": "foggy-semantic-query",
132
+ "version": "0.1.18",
133
+ "minimumCliVersion": "0.1.23",
134
+ "assets": [
135
+ {
136
+ "role": "zip",
137
+ "file": "foggy-semantic-query-skill-0.1.18.zip",
138
+ "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-semantic-query-skill-0.1.18.zip",
139
+ "sha256": "828aa8517385ea7c4956906834d3bea918f56de6e1d2df7ff0779dc31f7f7fb2"
140
+ },
141
+ {
142
+ "role": "manifest",
143
+ "file": "foggy-semantic-query-skill-0.1.18-manifest.json",
144
+ "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-semantic-query-skill-0.1.18-manifest.json",
145
+ "sha256": "0348c0786b72c3ea39a5e091ef494559f2fd48a625bd41796fc1b0f6eba82400"
146
+ },
147
+ {
148
+ "role": "checksums",
149
+ "file": "foggy-semantic-query-skill-0.1.18-SHA256SUMS",
150
+ "url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-semantic-query-skill-0.1.18-SHA256SUMS",
151
+ "sha256": "9fdba41edcb39e07f199b3347191e025a4ade4b535827842f861ffa42f4da9cc"
127
152
  }
128
153
  ]
129
154
  }
@@ -117,7 +117,7 @@ The composite result keeps `success=true` when the Runtime safely continues with
117
117
  on free-text remediation alone: compare `path`, `suggestedNextAction`, `safeToAutoRepair`,
118
118
  `normalizedFragment`, `docsRef`, and `details.allowedProperties` with the described
119
119
  model, correct and revalidate when an equivalent supported query preserves the user's intent, or
120
- clearly report the degraded interpretation. The wrapper accepts Runtime 0.1.20
120
+ clearly report the degraded interpretation. The wrapper accepts Runtime 0.1.21
121
121
  `queryInputWarnings` and legacy `warnings` as separate warning kinds. In `IGNORE`, ordinary unknown
122
122
  properties continue without `queryInputWarnings`; in `STRICT`, the Runtime rejects the query with the
123
123
  complete violations. Protected and governance fields remain fail-closed in every mode.
@@ -1168,22 +1168,26 @@ def safe_extract(zip_path: Path, destination: Path) -> None:
1168
1168
  archive.extractall(destination)
1169
1169
 
1170
1170
 
1171
- def install_analysis_skill(
1171
+ def install_managed_skill(
1172
1172
  zip_path: Path,
1173
1173
  install_root: Path,
1174
1174
  version: str,
1175
1175
  expected_hash: str,
1176
1176
  package_version: str,
1177
1177
  replace: bool,
1178
+ *,
1179
+ skill_name: str,
1180
+ kind: str,
1181
+ display_name: str,
1178
1182
  ) -> dict:
1179
1183
  skills_root = install_root / "skills"
1180
- destination = skills_root / "foggy-ai-analysis"
1184
+ destination = skills_root / skill_name
1181
1185
  with tempfile.TemporaryDirectory(prefix="foggy-skill-") as temporary:
1182
1186
  extract_root = Path(temporary)
1183
1187
  safe_extract(zip_path, extract_root)
1184
1188
  candidates = list(extract_root.rglob("SKILL.md"))
1185
1189
  if len(candidates) != 1:
1186
- raise OnboardingError(f"Expected exactly one SKILL.md in analysis Skill archive, found {len(candidates)}")
1190
+ raise OnboardingError(f"Expected exactly one SKILL.md in {display_name} archive, found {len(candidates)}")
1187
1191
  source = candidates[0].parent
1188
1192
  source_digest = skill_tree_digest(source)
1189
1193
  if destination.exists():
@@ -1199,7 +1203,7 @@ def install_analysis_skill(
1199
1203
  if marker_matches:
1200
1204
  marker = write_skill_marker(
1201
1205
  destination,
1202
- kind="analysis",
1206
+ kind=kind,
1203
1207
  package_version=package_version,
1204
1208
  component_version=version,
1205
1209
  source_digest=source_digest,
@@ -1207,13 +1211,13 @@ def install_analysis_skill(
1207
1211
  )
1208
1212
  return {"path": str(destination), "version": version, "digest": marker["installedDigest"], "managed": True, "action": "kept-matching"}
1209
1213
  if not replace:
1210
- raise OnboardingError(f"Analysis Skill is missing, modified, or outdated at {destination}; use the plugin Repair action to back it up and restore it")
1214
+ raise OnboardingError(f"{display_name} is missing, modified, or outdated at {destination}; use the plugin Repair action to back it up and restore it")
1211
1215
  backup_skill(destination, install_root / "skill-backups")
1212
1216
  skills_root.mkdir(parents=True, exist_ok=True)
1213
1217
  shutil.copytree(source, destination)
1214
1218
  marker = write_skill_marker(
1215
1219
  destination,
1216
- kind="analysis",
1220
+ kind=kind,
1217
1221
  package_version=package_version,
1218
1222
  component_version=version,
1219
1223
  source_digest=source_digest,
@@ -1264,7 +1268,7 @@ def install_command(args: argparse.Namespace) -> dict:
1264
1268
  "workspaceMode": "dsh-session-cwd",
1265
1269
  "versions": {name: value.get("version") for name, value in components.items()},
1266
1270
  "repairComponent": repair_component,
1267
- "operations": ["verify private Python", "install isolated CLI", "verify Launcher assets", "install global analysis Skill", "write install state"],
1271
+ "operations": ["verify private Python", "install isolated CLI", "verify Launcher assets", "install global analysis/query Skills", "write install state"],
1268
1272
  "productionReady": False,
1269
1273
  }
1270
1274
  if args.dry_run:
@@ -1364,32 +1368,41 @@ def install_command(args: argparse.Namespace) -> dict:
1364
1368
  (launcher_dir / "start-foggy-runtime.sh").chmod(0o755)
1365
1369
  progress.update("launcher", 3, "Launcher ready", fraction=1.0)
1366
1370
 
1367
- analysis_assets = components["analysisSkill"]["assets"]
1368
- for index, asset in enumerate(analysis_assets):
1369
- progress.update(
1370
- "analysis-skill", 4, "Downloading and verifying analysis Skill",
1371
- fraction=index / len(analysis_assets), current_file=asset["file"],
1372
- completed_files=index, total_files=len(analysis_assets),
1373
- )
1374
- verified.append(materialize(
1375
- asset, downloads / "skill" / asset["file"], cache_dirs,
1376
- progress=progress, progress_phase="analysis-skill", progress_step=4,
1377
- progress_index=index, progress_total=len(analysis_assets),
1378
- progress_message="Downloading and verifying analysis Skill",
1379
- replace_corrupt=repair_component == "analysis-skill",
1380
- ))
1381
- progress.update(
1382
- "analysis-skill", 4, "Downloading and verifying analysis Skill",
1383
- fraction=(index + 1) / len(analysis_assets), current_file=asset["file"],
1384
- completed_files=index + 1, total_files=len(analysis_assets),
1385
- )
1386
- zip_asset = next(item for item in analysis_assets if item["role"] == "zip")
1387
- progress.update("analysis-skill", 4, "Installing analysis Skill", fraction=0.9, current_file=zip_asset["file"])
1388
- analysis_skill = install_analysis_skill(
1389
- downloads / "skill" / zip_asset["file"], install_root, components["analysisSkill"]["version"],
1390
- zip_asset["sha256"], versions["packageVersion"], args.replace_skill or repair_component == "analysis-skill",
1371
+ installed_skills = {}
1372
+ skill_specs = (
1373
+ ("analysisSkill", "analysis", "foggy-ai-analysis", "Analysis Skill", "analysis-skill"),
1374
+ ("semanticQuerySkill", "semantic-query", "foggy-semantic-query", "Semantic Query Skill", "semantic-query-skill"),
1391
1375
  )
1392
- progress.update("analysis-skill", 4, "Analysis Skill ready", fraction=1.0)
1376
+ for component_key, state_key, skill_name, display_name, repair_key in skill_specs:
1377
+ skill_assets = components[component_key]["assets"]
1378
+ for index, asset in enumerate(skill_assets):
1379
+ progress.update(
1380
+ repair_key, 4, f"Downloading and verifying {display_name}",
1381
+ fraction=index / len(skill_assets), current_file=asset["file"],
1382
+ completed_files=index, total_files=len(skill_assets),
1383
+ )
1384
+ verified.append(materialize(
1385
+ asset, downloads / "skill" / asset["file"], cache_dirs,
1386
+ progress=progress, progress_phase=repair_key, progress_step=4,
1387
+ progress_index=index, progress_total=len(skill_assets),
1388
+ progress_message=f"Downloading and verifying {display_name}",
1389
+ replace_corrupt=repair_component == repair_key,
1390
+ ))
1391
+ progress.update(
1392
+ repair_key, 4, f"Downloading and verifying {display_name}",
1393
+ fraction=(index + 1) / len(skill_assets), current_file=asset["file"],
1394
+ completed_files=index + 1, total_files=len(skill_assets),
1395
+ )
1396
+ zip_asset = next(item for item in skill_assets if item["role"] == "zip")
1397
+ progress.update(repair_key, 4, f"Installing {display_name}", fraction=0.9, current_file=zip_asset["file"])
1398
+ installed_skills[state_key] = install_managed_skill(
1399
+ downloads / "skill" / zip_asset["file"], install_root, components[component_key]["version"],
1400
+ zip_asset["sha256"], versions["packageVersion"], args.replace_skill or repair_component == repair_key,
1401
+ skill_name=skill_name, kind=state_key, display_name=display_name,
1402
+ )
1403
+ progress.update(repair_key, 4, f"{display_name} ready", fraction=1.0)
1404
+ analysis_skill = installed_skills["analysis"]
1405
+ semantic_query_skill = installed_skills["semantic-query"]
1393
1406
  progress.update("workspace-skills", 5, "Registering native DSH Skills", fraction=0.1)
1394
1407
  onboarding_skill = {
1395
1408
  "path": str(skill_root()),
@@ -1414,7 +1427,7 @@ def install_command(args: argparse.Namespace) -> dict:
1414
1427
  },
1415
1428
  "cli": {"version": cli_component["version"], "command": str(cli_command), "mode": cli_mode},
1416
1429
  "launcher": {"version": components["launcher"]["version"], "path": str(launcher_dir)},
1417
- "skills": {"onboarding": onboarding_skill, "analysis": analysis_skill},
1430
+ "skills": {"onboarding": onboarding_skill, "analysis": analysis_skill, "semanticQuery": semantic_query_skill},
1418
1431
  "verifiedAssets": verified,
1419
1432
  "securityMode": versions["defaults"]["securityMode"],
1420
1433
  "productionReady": False,
@@ -1433,6 +1446,7 @@ def install_command(args: argparse.Namespace) -> dict:
1433
1446
  "cliVersion": cli_component["version"],
1434
1447
  "launcherVersion": components["launcher"]["version"],
1435
1448
  "analysisSkill": analysis_skill,
1449
+ "semanticQuerySkill": semantic_query_skill,
1436
1450
  "onboardingSkill": onboarding_skill,
1437
1451
  "java": java_probe(),
1438
1452
  "next": "run doctor, then runtime-start",
@@ -3324,8 +3338,10 @@ def doctor_command(args: argparse.Namespace) -> dict:
3324
3338
  launcher_checks.append({"file": asset["file"], "present": path.is_file(), "sha256Valid": path.is_file() and sha256(path) == asset["sha256"]})
3325
3339
  launcher_ok = bool(launcher_checks) and all(item["present"] and item["sha256Valid"] for item in launcher_checks)
3326
3340
  analysis_skill_root = normalized(state.get("skills", {}).get("analysis", {}).get("path") or install_root / "skills" / "foggy-ai-analysis") if state else install_root / "skills" / "foggy-ai-analysis"
3341
+ semantic_query_skill_root = normalized(state.get("skills", {}).get("semanticQuery", {}).get("path") or install_root / "skills" / "foggy-semantic-query") if state else install_root / "skills" / "foggy-semantic-query"
3327
3342
  onboarding_skill_root = skill_root()
3328
3343
  analysis_skill = managed_skill_status(analysis_skill_root, "analysis", versions["components"]["analysisSkill"]["version"])
3344
+ semantic_query_skill = managed_skill_status(semantic_query_skill_root, "semantic-query", versions["components"]["semanticQuerySkill"]["version"])
3329
3345
  onboarding_skill = {
3330
3346
  "path": str(onboarding_skill_root),
3331
3347
  "present": (onboarding_skill_root / "SKILL.md").is_file(),
@@ -3348,6 +3364,7 @@ def doctor_command(args: argparse.Namespace) -> dict:
3348
3364
  "cli": cli_ok,
3349
3365
  "launcher": launcher_ok,
3350
3366
  "analysisSkill": analysis_skill["valid"],
3367
+ "semanticQuerySkill": semantic_query_skill["valid"],
3351
3368
  "onboardingSkill": onboarding_skill["valid"],
3352
3369
  }
3353
3370
  if args.strict_runtime:
@@ -3362,7 +3379,7 @@ def doctor_command(args: argparse.Namespace) -> dict:
3362
3379
  "java": java,
3363
3380
  "cli": cli,
3364
3381
  "launcherAssets": launcher_checks,
3365
- "skills": {"analysis": analysis_skill, "onboarding": onboarding_skill},
3382
+ "skills": {"analysis": analysis_skill, "semanticQuery": semantic_query_skill, "onboarding": onboarding_skill},
3366
3383
  "workspace": {"path": str(project_root), "mode": "dsh-session-cwd"},
3367
3384
  "runtime": runtime,
3368
3385
  "environmentPresence": {name: bool(os.environ.get(name)) for name in ("DEEPSEEK_API_KEY", "ALIYUN_TOKEN_PLAN_API_KEY", "FOGGY_RUNTIME_API_AUTH_CODE", "FOGGY_RUNTIME_AUTHORIZATION")},
@@ -3380,7 +3397,7 @@ def uninstall_command(args: argparse.Namespace) -> dict:
3380
3397
  if install_root == data_root:
3381
3398
  raise OnboardingError("Install root and data root must be different")
3382
3399
  skills_root = install_root / "skills"
3383
- skill_targets = [skills_root / "foggy-ai-analysis"]
3400
+ skill_targets = [skills_root / "foggy-ai-analysis", skills_root / "foggy-semantic-query"]
3384
3401
  plan = {"installRoot": str(install_root), "dataRoot": str(data_root), "removeSkills": args.remove_skills, "purgeData": args.purge_data}
3385
3402
  if args.dry_run:
3386
3403
  return {"success": True, "dryRun": True, "plan": plan}
@@ -3415,7 +3432,7 @@ def build_parser() -> argparse.ArgumentParser:
3415
3432
  install.add_argument("--project-root")
3416
3433
  install.add_argument("--asset-cache-dir", action="append", default=[])
3417
3434
  install.add_argument("--replace-skill", action="store_true")
3418
- install.add_argument("--repair-component", choices=("cli", "launcher", "analysis-skill"))
3435
+ install.add_argument("--repair-component", choices=("cli", "launcher", "analysis-skill", "semantic-query-skill"))
3419
3436
  install.add_argument("--skip-cli-install", action="store_true")
3420
3437
  install.add_argument("--cli-command")
3421
3438
  install.add_argument("--progress-file")
@@ -1,61 +0,0 @@
1
- # Foggy DeepSeek Harness plugin 0.4.0-rc.1 release candidate
2
-
3
- Assessment date: 2026-09-05
4
-
5
- ## Decision
6
-
7
- The implementation is ready for a public release-candidate build on Windows
8
- 10/11 x64 and Linux/WSL2 x64. It remains a development and evaluation plugin;
9
- the bundled Runtime defaults are not a production security profile.
10
-
11
- No Java engine or `foggy-runtime-cli` source was changed for this candidate.
12
- The plugin consumes the independently accepted Runtime Launcher 0.1.20 and CLI
13
- 0.1.23 releases.
14
-
15
- ## Rehearsed chain
16
-
17
- 1. Installed DeepSeek Harness 0.1.2-rc.1 and the packed plugin in isolated
18
- Windows and WSL profiles.
19
- 2. Downloaded and verified the managed Python 3.12.13 distribution, CLI 0.1.23,
20
- Runtime Launcher 0.1.20, and analysis Skill 0.1.17.
21
- 3. Started Java Runtime instances on both hosts and passed readiness checks.
22
- 4. Connected the LAN MySQL demo database without restarting the active
23
- development Runtime, created namespace `tms_beta18`, inspected 127 tables,
24
- and selected `eo_express_order` as the waybill fact table.
25
- 5. Validated and published one TM and one QM with 29 query fields. Eight
26
- executable question-bank cases passed; three additional cases remained
27
- explicit clarification or capability-gap cases.
28
- 6. Verified Runtime 0.1.20 WARN behavior with unknown `groupBy[].grain`: the
29
- query continued, and the plugin surfaced the warning code, JSON path,
30
- normalized fragment, allowed properties, documentation reference, and
31
- suggested action.
32
- 7. Delivered the model as a Git bundle to `dev-kvm-jdk17`, installed a private
33
- Temurin JRE 17, Python 3.12.13, CLI 0.1.23, and Launcher 0.1.20, then bound
34
- the remote namespace and passed the same eight executable questions.
35
- 8. Published model commit `3f2a019`, verified a remote query, rolled back to
36
- baseline `bf6b70e`, and verified another remote query. The remote model was
37
- left at the baseline revision.
38
-
39
- ## Compatibility and operating boundaries
40
-
41
- - Unknown Query DSL input warnings are visible in both command output and the
42
- plugin settings contract. IGNORE and STRICT remain Runtime policy choices;
43
- protected authorization, datasource, namespace, model, and governance fields
44
- continue to fail closed.
45
- - Datasource passwords are accepted directly for development experience and
46
- are excluded from plugin onboarding state, evidence, TM/QM source, and Git.
47
- Runtime 0.1.20 persists them in its private datasource registry; production
48
- publication must use target-environment credential controls.
49
- - Copying a JRE from a newer Linux distribution failed on Ubuntu 22.04 because
50
- of glibc compatibility. Remote deployment therefore uses an official
51
- target-compatible Temurin archive with checksum verification.
52
- - DeepSeek Harness minimum-release-age policy can reject an immediately
53
- preceding plugin version recorded in its lockfile. The documented recovery
54
- is to inspect and rebuild the profile lockfile or wait for the policy window;
55
- this is not handled by weakening plugin integrity checks.
56
-
57
- ## Remaining publication gate
58
-
59
- The package must pass the final automated test and tarball inspection, then be
60
- published to npm and tagged as a GitHub prerelease from the same commit. npm and
61
- GitHub artifacts must be checked against the local tarball before announcement.