Repository navigation
Releases: lemonxiny55/dsh-lint-loop
Release list
dsh-lint-loop v0.7.0 - Evidence Integrity
dsh-lint-loop v0.7.0 — Evidence Integrity
Fix what the agent broke. Ignore what was already broken. Prove the change is clean.
Version 0.7.0 adds evidence integrity to the change-aware quality loop for DeepSeek Harness. It checks observable filesystem effects around DSH tool execution while keeping historical failures separate from regressions introduced by the current work.
What's New
Evidence Integrity
- Take bounded, read-only content checkpoints around DSH tool dispatch and after success, failure, or cancellation.
- Detect observable file content changes, additions, deletions, and renames caused by direct file tools, shell commands, or scripts. Coverage includes shell, bash, and pwsh scenarios in the test suite and host validation.
- Validate direct file operations against canonical before/after content, and distinguish known tool targets from changes whose attribution is uncertain.
- Record evidence scope, content identities, exclusions, budgets, and uncertainty in Quality Receipts.
- Return
incompletewhen evidence is missing, stale, unstable, opaque, out of budget, or insufficient to establish attribution. A successful command does not prove that all filesystem effects are understood and cannot by itself produce a clean claim.
Evidence Integrity does not prove which actor authored every change, observe transient write-and-revert activity, cover excluded paths and environment state, or confine arbitrary background scripts. When the configured evidence cannot establish the result, the receipt says incomplete rather than claiming CLEAN.
Faster Checkpoint Scanning
The bounded checkpoint reader limit increased from four to eight. In the Windows / Node 24.19 benchmark on a 1,000-file fixture, the median continuous-edit checkpoint time improved from 394.46 ms to 311.22 ms (about 21.1% lower). The comparison used 20 measured samples after a warmup, with complete Quality Receipt checks; receipt semantics matched.
This compares two reader limits within v0.7's evidence-integrity implementation. It is not a speedup claim over v0.6, whose less-complete scan did not inventory and hash all source files. The eight-reader limit keeps the scan bounded; sixteen readers were faster in the experiment but used substantially more batch heap memory.
DSH Working-Directory Compatibility
Fixes working-directory resolution on newer DSH hosts after cd by reading the current optional service through the public context API. The immutable-header fallback remains for older hosts. Existing configuration, public APIs, peer policy, regression-aware checks, and bounded safe lint repair remain compatible.
Verification
- The Windows/Linux × Node 22/24 CI matrix passed all four jobs. Each job passed 197 tests, typecheck, build, compatibility smoke, the published DSH API check, and a real AgentLoop integration demo. See the CI run.
- The final eight-reader candidate was installed and exercised in isolated DSH Web and official DSH Desktop profiles on Windows. Both used real DSH lifecycle, file tools, and check processes. Each produced
regression → regression → clean → clean, with the same three historical failures preserved. - The Web/Desktop acceptance archive was
0.7.0-rc.0, not the published npm0.7.0tarball. The accepted candidate and the stable npm package carry the same eight-reader runtime bundle SHA-256:96d57d4c3f4cb053c41aac9fd7d9f657cbaf27466922792a38e18142ec837d5e. Model input in acceptance was a deterministic scripted adapter; no live-model quality claim is made. - On both Windows hosts, pwsh success, failure, and cancellation-after-write cases retained their observed file effects, marked changes
unattributed, and returnedincomplete. A zero exit code did not implyCLEAN. Real bash success/failure/cancellation and file-change assertions are also covered by Linux CI host tests.
See the detailed release verification record and Evidence Integrity architecture and limits.
Install
Install the published package into a DSH profile:
dsh plugin --profile web add dsh-lint-loop@0.7.0Replace web with the profile you use. The stable package is published as dsh-lint-loop@0.7.0 on npm.
Links
- GitHub repository
- PR #7 — DSH working-directory compatibility
- PR #8 — Evidence Integrity
- Evidence Integrity architecture
- v0.7.0 release verification
- Windows/Linux × Node 22/24 CI run
- npm v0.7.0
中文更新摘要
dsh-lint-loop v0.7.0:证据完整性升级
- 在 DSH 工具调用前后执行有界、只读的内容检查点,追踪 shell、bash、pwsh 和文件工具可观察到的内容变化、新增、删除与重命名。
- 直接文件操作按规范化的前后内容验证;无法确定来源的变化会标记为
unattributed。证据缺失、过期、不稳定或超出预算时返回incomplete,不会仅凭命令成功就宣称CLEAN。 - 检查点读取上限从 4 提高到 8。在 Windows / Node 24、千文件连续编辑基准中,中位时间从 394.46 ms 降至 311.22 ms,约降低 21.1%。这是 v0.7 完整证据实现内部对比,不代表相对 v0.6 提速。
- Windows/Linux × Node 22/24 四个 CI job 均通过,每个 job 有 197 项测试,并通过类型检查、构建、兼容性检查及 AgentLoop 集成验证。
- 最终八读者
0.7.0-rc.0候选包在隔离的 DSH Web 与官方 Desktop 环境完成实机验收,两者均得到regression → regression → clean → clean,并保留三项历史失败。正式 npm 版本是0.7.0;本说明明确区分候选包验收与正式包发布。 - 修复新版 DSH 在
cd后的工作目录解析,同时保留旧版 host 的回退行为。
证据完整性不会证明每项变化由谁编写,也无法观察所有瞬态写入或覆盖配置范围之外的文件。无法证明时会明确返回 incomplete。
dsh-lint-loop v0.6.0 — Quality Loop
v0.6.0 — Quality Loop
Fix what the agent broke. Ignore what was already broken. Prove the change is clean.
The regression-aware lint loop now checks the completed change against evidence
captured before the agent's first edit. Historical lint, type and test failures
remain visible without blocking an unrelated task.
- Two speeds: fast post-edit lint feedback and safe repair, followed by bounded
completion checks for lint delta, TypeScript diagnostics and impacted tests. - Change-aware tests: select affected Vitest/Jest tests through reverse
dependencies and package scope; uncertain relationships broaden the supported
suite, while missing evidence stays explicitly incomplete. - Quality Receipt: actual commands, executed tests, ignored debt, new
regressions, automatic/agent repairs, budgets, elapsed time and final verdict. - Simple presets: balanced by default, fast for lint-only work, strict for
repository package test suites, with advanced overrides retained.
Existing eslint/biome/ruff behavior, configuration and Node 22/24 support remain.
The DSH 0.1.x / 0.2.x peer policy fixed in 0.5.1 is unchanged. Lifecycle handling
covers cancellation and model errors; Electron-hosted compiler/test tools run
in supported Node mode. Repairs preserve historical debt and file scope.
The release passed 162 tests on both supported Node lines, real desktop
regression/repair and automatic-gate acceptance, and a native GUI smoke from
task entry to expanding the saved receipt. Release PR and merged main CI passed
Windows/Linux on Node 22/24; links to both completed runs are below.
UI boundary: the structured receipt is available through ordinary DSH tool
results and the native event detail viewer. A dedicated Quality Bar is deferred
because the audited client does not consume Host presentation descriptors.
No client injection or mockup is presented as an implemented UI.
Static dependency selection is conservative. Shell/custom edits, deletion,
flaky tests, custom/chained runners, node:test and TypeScript reference builds
remain documented limitations. This release adds no LLM review, requirements,
security/coverage platform, CI replacement or mandatory companion plugin.
dsh plugin --profile web add dsh-lint-loop@0.6.0Full verification
· Native desktop GUI smoke
Formal release validation
- Release PR #6 merged after all four PR CI jobs passed.
- Merged main CI passed Windows/Linux × Node 22/24: frozen install, typecheck, 162 tests, build and compatibility smoke.
- Fresh local validation also passed DSH 0.1/0.2 runtime smokes and isolated 0.2 declaration checks.
- The exact seven-file npm tarball was installed in an isolated directory and passed DSH 0.2 load/dispose/remount checks.
- The existing disjunctive DSH peer range and root lockfile remain unchanged.
Reproducible desktop demo / 可复现实测演示
Demo repository · 中文步骤 · Raw Quality Receipt.
Real DSH Desktop result: 17 historical lint findings retained, 2 new regressions safely auto-fixed, impacted tests 12/12, lint/types/tests clean. Initial baseline: 15/15; full source byte-identical after repair.
The 30-second GIF shows actual saved DSH tool results in the native viewer, not continuous live footage. Original captures, MP4, actual terminal verification recording and scripts · Run provenance and limitations. All checks finished before a model rate limit interrupted the prose summary; the continuation was text-only. The fixture introduces lint issues only. No new plugin version or dedicated Quality Bar is implied.
桌面实测保留 17 个旧 lint 问题,安全修复 2 个新增回归,受影响测试 12/12,三项检查均 clean;首次基线为 15/15,整个源码修复前后逐字节一致。GIF 是真实工具记录导览,不是连续实时录像,原始帧、终端复验录屏与脚本见上方链接。编辑与检查已在限流前完成,下一轮只补文字总结;本例只引入 lint 问题。已发布的软件包不变,独立 Quality Bar 未上线。
dsh-lint-loop v0.5.1 — DSH 0.2 compatibility
DSH 0.2 compatibility patch
- Admit the DSH 0.2 prerelease and stable host line while retaining every previously supported 0.1.x version.
- Use the peer range
>=0.1.0-rc.1 <0.2.0-0 || >=0.2.0-0 <0.3.0-0; exclude the future 0.3 line. - Align dev/test Cordis to
~4.0.4fordsh-tools@0.1.7-rc.2. - Remove the stale smoke lockfile importer and correct the compatibility changelog.
- No feature logic changes.
Thanks
Thank you @heptaspirit (David Wong) for identifying and fixing the DSH 0.2 compatibility issue in #3. Your original commit a2756f19ab49d3cc837b0d96fca8781db0883a84 and author attribution are preserved in the release history. The maintainer follow-up restores legacy compatibility and aligns Cordis peers; integration PR #4 retains both contributions.
Validation
- Node 22.23.3 and 24.19.0: frozen install, typecheck, 131 tests, build and 13 semver boundaries passed.
- Official main CI and release PR CI passed both Node 22/24 matrix jobs before release.
- The inspected npm package contains seven expected files.
Install: pnpm add dsh-lint-loop@0.5.1
dsh-lint-loop v0.5.0
Regression-aware self-repair loop
lint_repair({ scope: "turn" }) repairs only lint regressions introduced or changed in files edited during the current Agent turn, leaving pre-existing lint debt alone.
What's new
- Batches fixes by linter and package/crate, reuses existing fixers, and re-lints after each pass with a two-round maximum.
- Verifies fixer output. File-local fixers roll back a file if validation introduces a finding; package/crate fixers report actual touched files and run only when their scoped findings are current-turn regressions.
- Returns a repair receipt with regressions found, fixed and remaining; affected files; fixer changes; and ignored pre-existing findings.
- Adds the
lint_statusAgent tool for turn-scoped status. - Keeps ESLint, Biome, Ruff, golangci-lint and Cargo Clippy support.
Verification
- 131 automated tests; typecheck and build passed.
- Real DSH Web smoke completed: edit → regression detected →
lint_repair→ re-lint clean; the pre-existingno-unused-varsfinding remained and introduced regressions returned to zero. - Details: 0.5.0 release evidence
dsh-lint-loop v0.4.0
Regression-aware lint loop
Version 0.4.0 captures a per-file lint baseline before harness edits and separates pre-existing findings from problems introduced or changed during the current turn.
- The completion gate steers only for unresolved introduced or changed lint errors, while keeping the bounded
gateMaxSteersguard. lint:findingsprioritizes regressions;lint_diagnosticsadds optionalall,introduced, andpreexistingscopes.lint_fixre-lints after fixing without resetting the original baseline.- Finding matching uses rule, message, source context, and bounded location to tolerate line drift and duplicate findings.
- Supports ESLint, Biome, Ruff, golangci-lint, and Cargo Clippy, including package-scoped result distribution.
Validated with 121 automated tests, typecheck/build, and real DSH plus JavaScript/TypeScript, Python, Go, and Rust linter smoke checks. See release evidence for environment details and limitations.
v0.3.0 — Go (golangci-lint) + Rust (cargo clippy)
Go and Rust support: dsh-lint-loop now drives golangci-lint (Go) and cargo clippy (Rust) alongside eslint / biome / ruff.
Package-scoped linters — unlike the single-file linters, golangci-lint analyzes a package directory and cargo clippy analyzes a crate. Findings are distributed to the file each one reports, so lint_diagnostics { file } stays per-file; and a batch (the completion gate / injected section) runs each package linter once per package, not once per edited file.
Detection — Go via any .golangci.{yml,yaml,toml,json}; Rust via a Cargo.toml (clippy ships with the toolchain). .go routes to golangci-lint, .rs to clippy.
Parsing — golangci-lint { Issues: [...] } (empty Severity counts as error; SuggestedFixes in v1.64+/v2 or a legacy Replacement marks fixable), emitted via run --output.json.path=stdout (v2) with an automatic --out-format=json fallback (v1). cargo clippy NDJSON compiler-message lines (clippy::* / E#### codes; a child-span suggestion marks fixable), run in the nearest Cargo.toml directory.
Timeouts — per-linter floors (golangci-lint 60s, cargo clippy 120s) so a cold cargo build is not killed by the 10s default.
Verification — 109 vitest cases (up from 94): Go/Rust detection + routing, both parsers, package-scope distribution, single-run batching, crate-root resolution, and package-linter auto-fix.
Install: dsh plugin add dsh-lint-loop · npm: https://www.npmjs.com/package/dsh-lint-loop
v0.2.0 — completion gate, code frames, errors-only section
The P0 loop upgrades: a completion gate, source code frames, and a slimmer injected section — plus two bugs found and fixed during real-harness verification.
Completion gate — on the harness agent/turn-stopping seam, while files edited during the turn still carry errors the plugin steers the agent for another step instead of letting it finish. Self-limiting: each file is evaluated once per stopping, each turn forces at most gateMaxSteers (default 2) continuations, and lint_fix re-arms the check after it rewrites a file (the linter process bypasses fs/observed). gate: false disables.
Source code frames — rendered findings carry the offending line marked █ plus a line of context (codeFrames / frameLines / frameLimit), so the model fixes without re-reading the file.
Errors-only injected section — sectionSeverity (default error) keeps warnings out of the prompt; settleMs (default 600ms) is the quiet period before re-linting.
Fixes (found in live verification)
agent/turn-stoppinglistener now returns its async handler so the harness awaits the lint + steer before committing the boundary — previously fire-and-forget, so the steer could land after the turn closed.lint_diagnostics/lint_fixaccept the harness-consistentfile_pathargument alongside the originalfilealias.
Verification — 94 vitest cases; validated against real eslint 10 / biome 2.5 / ruff 0.16; end-to-end on the real Windows harness (web + headless): edit → gate fires → model runs lint_fix → file rewritten → gate re-checks → turn admitted, final file clean.
Install: dsh plugin add dsh-lint-loop · npm: https://www.npmjs.com/package/dsh-lint-loop
v0.1.0 — initial release
Initial release — the edit → lint → fix loop for dsh agents.
Tools — lint_diagnostics (per-file or seen-files findings: rule, file:line:col, message, fixable flag, severity filter, cap) · lint_workspace_errors (all errors seen this session) · lint_fix (runs the repo's own auto-fixer — eslint --fix / biome check --write / ruff check --fix — then re-lints and reports what changed, a +added/-removed line summary, and the remaining findings).
Zero-config detection — probes the repo root for eslint (eslint.config.* / .eslintrc.*), biome (biome.json[c]), and ruff (ruff.toml / [tool.ruff]); JS-family routes to eslint by default, biome only without eslint config; .py/.pyi to ruff. Repo-local node_modules/.bin resolved before PATH. Nothing bundled; a repo with no linter config gets friendly init hints.
Auto-injected section — lint:findings (order 75) wired to the harness fs/observed event: only the NEW/CHANGED findings per edit, top 5, TTL-expiring.
Robustness — serial per-(root, linter) runner lanes, 10s timeout degradation, defensive JSON parsers for all three linters (biome ≥ 2 line/column and legacy byte-offset shapes), friendly errors (missing linter → exact install command) that never throw to the model. 72 vitest cases against a marker-driven fake linter.
Install: dsh plugin add dsh-lint-loop · npm: https://www.npmjs.com/package/dsh-lint-loop
