# v1.3.0 Preview release evidence ## Scope This release adds a separate `plugin-evolution` capability for the current DSH Profile: - Actor resolves one to three installed plugin identities from the real Profile inventory. - Builder edits only immutable trusted-source copies under `plugins//`. - Host-owned build/test commands, source provenance, package identity, diff policy and supply-chain checks are rerun independently. - All candidate tarballs are installed together into a Shadow Profile, cold-loaded and, for multi-plugin plans, checked by a host-owned integration probe. - The live Profile is changed only by a startup transaction. It either activates the complete package set or restores the complete previous package state. - Deterministic install, exact update, remove and restore use the same transaction layer without invoking Builder. `dsh-loom`, DSH host packages, credentials, the Agent Loop, Verifier and Gate remain protected targets. This is a Preview release: it proves the tested transaction and source paths, not arbitrary plugin compatibility or model success. ## Linux multi-plugin E2E Two fixture plugins (`cost` and `notify`) were changed as one Builder plan. The requested coupled behavior added a model dimension to the cost event and rendered it in the notification with a premium marker. The complete observed sequence was: `baseline fail → Builder edit → per-plugin build/test → Verifier → Shadow Profile → cold Loader → atomic activation → integration pass → immutable restore → baseline fail` The effective output was: ```json { "passed": true, "event": { "tokens": 1000, "costUsd": 0.02, "model": "deepseek-v4-flash" }, "message": "tokens=1000; cost=$0.0200; model=deepseek-v4-flash (premium)" } ``` Raw records are retained under: `/chenzute/dsh-src/eval/run-records/2026-08-21-plugin-evolution-v13-linux/` ## Windows same-artifact E2E The exact two tar artifacts produced by the Linux flow were transferred to an isolated Windows Profile. Their SHA-256 values were: - cost: `b3639b051bf34f75175b69f6d4f7c9dbee02527d6c9f047af673988ad43b8309` - notify: `677cc7798f7c43fec4739291472cf3e85d412509decf050d725bba9dcab5020f` Windows independently approved 18 verifier checks, reached `ready_to_activate`, completed cold activation and Loader/integration reconciliation, reproduced the Linux behavior, then restored the old combination. A deliberately stale same-host activation lock was recovered; a live-owner lock remains fail-closed. Raw records are retained under: `/chenzute/dsh-src/eval/run-records/2026-08-21-plugin-evolution-v13-windows-lock-recovery/` ## Public-source plugin E2E The installed public package `dsh-find-plugin@0.3.7` was tied to: - repository: `https://github.com/awesome-dsh-plugin/dsh-find-plugin.git` - commit: `e7a27eb01606e6deccdaacccb8e0cfd992c0bcdc` - frozen source tree SHA-256: `8e3345f66885da3a03c364c78279e0d241628d019ad2a40f38e3aa6c20c968af` - installed npm integrity and live lockfile agreement The Builder submitted after 15 model turns and 15 tool steps. It added `trust: "unverified-community"` to each result and rendered the trust marker. Independent npm install/build/probe, package verification, Shadow Profile, cold Loader, live activation and immutable restore all passed. The before and after-restore probes both rejected the new expectation, proving that the behavior came from the candidate and was removed by restore. Raw records are retained under: `/chenzute/dsh-src/eval/run-records/2026-08-21-plugin-evolution-v13-public-linux/` ## Deterministic registry lifecycle `@huanlin/dsh-plugin-sleep@0.1.0` completed exact-version/integrity freeze, Shadow Profile mutation, cold Loader, live activation and immutable restore without invoking Builder. After restore, both the dependency entry and installed artifact were removed. Raw records are retained under: `/chenzute/dsh-src/eval/run-records/2026-08-21-plugin-lifecycle-v13-registry-linux/` ## Defects found before publication Real cross-platform runs found and fixed failures that deterministic happy-path tests did not expose: 1. Windows cannot safely spawn npm-family `.cmd` files with `shell:false`; Loom now resolves npm/npx/pnpm shims to Node plus their CLI entry without enabling a command shell. 2. Windows tar paths are normalized to the exact `file:C:/...` dependency form used by pnpm. 3. A crashed activation process could leave a permanent empty lock; structured owner locks now reclaim only a confirmed dead same-host PID. 4. Git smart-HTTP was unavailable in the evaluator, so exact GitHub HTTPS repository plus 40-character commit sources may use codeload while preserving commit/tree pins. 5. npm packages often omit `gitHead`; registry repository/commit/integrity metadata must agree with the installed exact version and live lockfile before Loom attests the source. 6. Independent setup defaulted plugin transactions to the wrong Profile (`loom` instead of the documented `web`). Setup/start now share `web` unless explicitly overridden. 7. A Profile drift preflight incorrectly entered rollback and could overwrite the external change. It now refuses activation without touching the drifted Profile; rollback begins only after mutation starts. 8. Direct `pnpm dsh web --patch` bypassed pending transaction activation. `dsh-loom start` now owns the activation hook and automatically invokes the source-checkout CLI. ## Release gate - TypeScript check: pass - Vitest: **311/311** - build: pass - `git diff --check`: pass - package dry-run: pass; 130 files, 1,317,824-byte tarball, no docs candidates/eval workspace/credentials - Linux two-plugin transaction and restore: pass - Windows same-tar transaction, stale-lock recovery and restore: pass - public-source plugin Builder transaction and restore: pass - deterministic registry lifecycle and restore: pass ## Publication verification - npm `latest`: `dsh-loom@1.3.0` - npm-pack / registry SHA-1: `bd2fbd53b2ada34794c22c72c6e9047fdcef505a` - registry integrity: `sha512-8+EM4S+c6cOj2DGXsM0H7CbwvkTPBPrKy2CaHUTt1YakymAho0lr6MtigdkAMmRK1njKwElDGwoNOsuHIdAurw==` - tarball SHA-256: `8b7f765baf5a6419694c772b824406426b85a4ccdb221ca70d9e7d57bcd2578f` - a fresh `npm pack dsh-loom@1.3.0` download was byte-identical to the tested local tarball - Git source commit: `772b163` - Git tag: `v1.3.0` - GitHub prerelease: ## Distribution boundary The v1.3 plugin transaction is enabled only when setup can identify a DSH source checkout and construct a real cold Loader command. In a standalone/global CLI environment without that probe, setup explicitly keeps `pluginEvolution.enabled=false`; existing v1.2 Config/Skill evolution remains available. This is a deliberate fail-closed boundary, not a silent fallback to `--dump-config` or a fake cold boot. Generated Hero/context raster images are intentionally not part of this release. README keeps non-rendering insertion comments so the later assets can be reviewed and added without blocking the code release.