@foggy-projects/deepseek-harness-plugin 0.4.0-beta.16 → 0.4.0-beta.17

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-beta.16.tgz
17
+ dsh plugin --profile web add --workspace-root ./foggy-projects-deepseek-harness-plugin-0.4.0-beta.17.tgz
18
18
  ```
19
19
 
20
20
  Restart `dsh web`, use the browser it opens (or the complete printed URL,
@@ -27,6 +27,24 @@ After npm beta publication, the corresponding one-line install is:
27
27
  dsh plugin --profile web add --workspace-root @foggy-projects/deepseek-harness-plugin@beta
28
28
  ```
29
29
 
30
+ DeepSeek Harness 0.1.2-rc.1 applies pnpm's minimum-release-age policy to its
31
+ profile lockfile. An upgrade performed shortly after publication can therefore
32
+ fail while naming either the new plugin or the previously installed Beta. This
33
+ is a DSH profile-policy failure, not a damaged Foggy package. Use the exact
34
+ profile directory printed in the error and rebuild its lockfile, then rerun the
35
+ same `dsh plugin add` command:
36
+
37
+ ```powershell
38
+ Set-Location "<the DSH profile directory printed in the error>"
39
+ npx --yes pnpm@11.7.0 clean --lockfile
40
+ ```
41
+
42
+ The failed add normally records the requested exact version under
43
+ `minimumReleaseAgeExclude` before returning. If the error repeats, confirm that
44
+ both the installed and requested exact Foggy versions named by the error appear
45
+ under that key in the profile's `pnpm-workspace.yaml`; do not disable the policy
46
+ globally.
47
+
30
48
  For development, `FOGGY_ASSET_CACHE_DIRS` can contain platform-delimited verified
31
49
  asset-cache directories. It is not required for a normal install.
32
50
 
@@ -50,7 +68,10 @@ Opaque CLI profiles remain available for users who prefer them and default to
50
68
  the private persistent `<dataRoot>/cli-profiles` directory, but they are not a
51
69
  prerequisite for ordinary development. Composite onboarding commands are
52
70
  idempotent: unchanged completed phases are resumed rather than re-adding a
53
- datasource or re-registering a local Bundle. Settings detects legacy temporary
71
+ datasource or re-registering a local Bundle. A resumed datasource checkpoint is
72
+ also reconciled against the live Runtime; if the datasource was removed outside
73
+ the wrapper, only datasource configuration, verification, and schema discovery
74
+ are resumed. Settings detects legacy temporary
54
75
  profiles and offers an explicit, validated migration into the persistent store.
55
76
 
56
77
  Private Python, CLI, Launcher, the analysis Skill, install state, and Runtime
@@ -1,10 +1,10 @@
1
- # Public beta readiness: 0.4.0-beta.16
1
+ # Public beta readiness: 0.4.0-beta.17
2
2
 
3
3
  Assessment date: 2026-09-05
4
4
 
5
5
  ## Verdict
6
6
 
7
- `0.4.0-beta.16` is suitable for a scoped public beta on Windows 10/11 x64 and
7
+ `0.4.0-beta.17` 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
@@ -42,7 +42,7 @@ system PATH, registry, or a user's existing Python installation.
42
42
  copy of the synthetic password.
43
43
  - The package and settings contract report Python 3.12.13 as `Foggy private`,
44
44
  CLI 0.1.23, Launcher 0.1.18, analysis Skill 0.1.17, and onboarding Skill
45
- 0.4.0-beta.16; the same component display was accepted in the preceding
45
+ 0.4.0-beta.17; 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
@@ -63,7 +63,7 @@ system PATH, registry, or a user's existing Python installation.
63
63
  downloaded artifacts are not trusted until the complete SHA256 matches.
64
64
  - Windows progress writes tolerate transient sharing violations without losing
65
65
  the previous valid progress document or leaving temporary files behind.
66
- - Current automated regression passes 20 Node tests and 23 Python tests. The
66
+ - Current automated regression passes 20 Node tests and 25 Python tests. The
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.
@@ -71,6 +71,17 @@ system PATH, registry, or a user's existing Python installation.
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.
74
+ - A separate recovery regression completed a SQLite onboarding composite,
75
+ removed the managed datasource outside the wrapper, and reran the same
76
+ composite. The wrapper detected the missing live datasource, reset only the
77
+ three dependent checkpoints, recreated and tested the datasource, rebound the
78
+ namespace, and rediscovered the selected table successfully.
79
+ - The full release rehearsal converted an inspected 126-column TMS order table
80
+ into versioned TM/QM source, passed eight development question-bank cases,
81
+ deployed the exact Git-tagged source to a separate Ubuntu host, published the
82
+ bundle, and passed the same question bank before and after a Runtime restart.
83
+ The remote Runtime retained its datasource binding, active bundle, query
84
+ model, and 11-tool MCP surface after restart.
74
85
 
75
86
  ## Beta boundaries
76
87
 
@@ -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-beta.16` on a clean 64-bit Windows 10 or Windows 11 machine. Use a local
4
+ `0.4.0-beta.17` 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
@@ -34,6 +34,14 @@ npx --yes --package=@deepseek-ai/dsh@0.1.2-rc.1 --package=pnpm@11.7.0 `
34
34
  npx --yes --package=@deepseek-ai/dsh@0.1.2-rc.1 --package=pnpm@11.7.0 dsh web
35
35
  ```
36
36
 
37
+ If an immediate upgrade reports
38
+ `ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION`, use the exact DSH profile directory
39
+ printed by the error, run `npx --yes pnpm@11.7.0 clean --lockfile` there, and
40
+ repeat the same plugin-add command. The failed add normally records the new
41
+ exact package version in that profile's `minimumReleaseAgeExclude`; if the
42
+ error names an older installed Beta, confirm that exact version is listed too.
43
+ Do not disable the policy globally.
44
+
37
45
  Let DSH open the browser automatically. If it does not, copy the complete URL
38
46
  printed by `dsh web`, including its `?token=...` query, into the browser. A new
39
47
  browser session cannot use the bare `http://127.0.0.1:3080/` URL until that
@@ -54,7 +62,7 @@ Expected component state:
54
62
  - CLI 0.1.23;
55
63
  - Launcher 0.1.18;
56
64
  - analysis Skill 0.1.17;
57
- - onboarding Skill 0.4.0-beta.16;
65
+ - onboarding Skill 0.4.0-beta.17;
58
66
  - Java 17+ available;
59
67
  - native DSH Skill registration available.
60
68
 
@@ -3,7 +3,7 @@ set -euo pipefail
3
3
 
4
4
  DSH_VERSION="0.1.2-rc.1"
5
5
  PNPM_VERSION="11.7.0"
6
- PLUGIN_VERSION="0.4.0-beta.16"
6
+ PLUGIN_VERSION="0.4.0-beta.17"
7
7
  PLUGIN_REF="v${PLUGIN_VERSION}"
8
8
  PLUGIN_REPOSITORY="https://github.com/foggy-projects/foggy-deepseek-harness-plugin.git"
9
9
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foggy-projects/deepseek-harness-plugin",
3
- "version": "0.4.0-beta.16",
3
+ "version": "0.4.0-beta.17",
4
4
  "description": "Foggy Java data analysis engine integration for DeepSeek Harness",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "foggy-deepseek-onboarding-versions/v1",
3
- "packageVersion": "0.4.0-beta.16",
3
+ "packageVersion": "0.4.0-beta.17",
4
4
  "validatedAt": "2026-09-04",
5
5
  "components": {
6
6
  "deepseekHarness": {
@@ -72,7 +72,10 @@ tables list -> bounded schema inspection
72
72
  ```
73
73
 
74
74
  It does not stop or restart Runtime. Repeated calls reuse completed checkpoints when the public
75
- connection contract is unchanged. Inline password values are excluded from the comparison.
75
+ connection contract is unchanged. Before reusing a datasource checkpoint, the wrapper verifies that
76
+ the named datasource still exists with the expected public type in the live Runtime. If it was
77
+ removed outside the wrapper, datasource configuration, verification, and schema discovery resume
78
+ automatically from the first affected step. Inline password values are excluded from the comparison.
76
79
  Transient connection-pool readiness timeouts are retried a small, bounded number of times; invalid
77
80
  credentials, invalid URLs, and other configuration errors fail immediately.
78
81
 
@@ -2760,6 +2760,38 @@ def step_completed(state: dict, name: str) -> bool:
2760
2760
  return state.get("steps", {}).get(name, {}).get("status") == "completed"
2761
2761
 
2762
2762
 
2763
+ def reconcile_datasource_checkpoint(
2764
+ state: dict,
2765
+ install_state: dict,
2766
+ data_root: Path,
2767
+ runtime_state: dict,
2768
+ ) -> dict | None:
2769
+ """Reset dependent checkpoints when the live Runtime lost the datasource."""
2770
+ if not step_completed(state, "datasourceConfigured"):
2771
+ return None
2772
+ connection = state["connection"]
2773
+ listed = cli_json(
2774
+ install_state,
2775
+ runtime_state,
2776
+ connection["namespace"],
2777
+ ["datasources", "list"],
2778
+ "datasources list for checkpoint reconciliation",
2779
+ )
2780
+ if matching_datasource(listed, connection) is not None:
2781
+ return None
2782
+ reset_steps = ("datasourceConfigured", "datasourceVerified", "schemaDiscovered")
2783
+ for name in reset_steps:
2784
+ mark_step(state, name, "pending", reason="runtime-datasource-missing")
2785
+ state.get("artifacts", {}).pop("schemaDiscovery", None)
2786
+ write_onboarding_state(data_root, state)
2787
+ return {
2788
+ "recovered": True,
2789
+ "reason": "runtime-datasource-missing",
2790
+ "resetSteps": list(reset_steps),
2791
+ "dataSource": connection["name"],
2792
+ }
2793
+
2794
+
2763
2795
  def bound_project_roots(state: dict) -> list[Path]:
2764
2796
  values = [state.get("projectRoot"), *state.get("workspaceBindings", [])]
2765
2797
  result: list[Path] = []
@@ -2792,7 +2824,7 @@ def bind_completed_workspace(state: dict, data_root: Path, project_root: Path) -
2792
2824
 
2793
2825
 
2794
2826
  def datasource_run_command(args: argparse.Namespace) -> dict:
2795
- _install_root, install_state, data_root, _runtime_state = onboarding_context(args, require_runtime=True)
2827
+ _install_root, install_state, data_root, runtime_state = onboarding_context(args, require_runtime=True)
2796
2828
  project_root = normalized(args.project_root or Path.cwd())
2797
2829
  requested_connection = validate_connection(read_json_object(normalized(args.connection_file), "Connection plan"))
2798
2830
  resumable_connection = persisted_connection(requested_connection)
@@ -2834,6 +2866,9 @@ def datasource_run_command(args: argparse.Namespace) -> dict:
2834
2866
  ))
2835
2867
  save_composite_result(evidence_dir, "01-plan.json", plan_result, files)
2836
2868
  state = read_onboarding_state(data_root, profile)
2869
+ checkpoint_recovery = reconcile_datasource_checkpoint(
2870
+ state, install_state, data_root, runtime_state,
2871
+ )
2837
2872
 
2838
2873
  if step_completed(state, "datasourceConfigured"):
2839
2874
  configured = resumed_phase(profile, "datasourceConfigured")
@@ -2844,6 +2879,8 @@ def datasource_run_command(args: argparse.Namespace) -> dict:
2844
2879
  install_root=args.install_root, data_root=args.data_root, profile=profile, apply=False, replace=False,
2845
2880
  runtime_password=requested_connection.get("password"),
2846
2881
  ))
2882
+ if checkpoint_recovery:
2883
+ configure_dry["checkpointRecovery"] = checkpoint_recovery
2847
2884
  save_composite_result(evidence_dir, "02-datasource-dry.json", configure_dry, files)
2848
2885
  if not args.approve_configure:
2849
2886
  return {
@@ -2860,6 +2897,8 @@ def datasource_run_command(args: argparse.Namespace) -> dict:
2860
2897
  install_root=args.install_root, data_root=args.data_root, profile=profile, apply=True, replace=False,
2861
2898
  runtime_password=requested_connection.get("password"),
2862
2899
  ))
2900
+ if checkpoint_recovery:
2901
+ configured["checkpointRecovery"] = checkpoint_recovery
2863
2902
  save_composite_result(evidence_dir, "03-datasource-apply.json", configured, files)
2864
2903
  state = read_onboarding_state(data_root, profile)
2865
2904