Repository navigation
Releases
DSH Workbench v0.2.0-rc.6
DSH Workbench 0.2.0-rc.6
Status: source preview. Distribution is source plus a downloadable GitHub
Release (two TGZs, two bootstrap scripts, SHA256SUMS, release-manifest.json),
SHA256-verified, not GPG-signed. No npm package.
v0.2.0-rc.5installed cleanly and then could not quote or ask. Both of
the plugin's headline features were dead from boot on the very Harness it
pins, and neither said anything: no console error, no server log, no visible
failure. Selection quoting was refused on every drag; Quick ask raised a
dialog and stopped. Split Pane, the settings section, and the shared-workspace
warning all worked, which is why the release looked healthy. rc.6 fixes both.
If you are on rc.5, install this over it — see § Upgrading. The Harness pin
does not move, so the fork checkout inside your target is already correct;
only the Workbench package changes.
Fixed
- Selection quoting reads the chat node table from where it now lives.
Upstream0.1.2-rc.1split the chat half ofui-conversationinto a new
ui-chatpackage, and the node table went with it. The Session snapshot now
carries fifteen lifecycle fields and its contract opens by saying it excludes
Conversation target data. Workbench was still readingsnapshot.chat.nodes
through an optional chain, so every lookup returnedundefinedand the
selection judge — which is deliberately fail-closed — refused every passage
in silence. The table now comes from
uiConversation.binding(sessionId).target('chat'), the same pathui-chat's
own consumer takes, resolved through one narrowing point in the harness
adapter.uiConversationjoins the cordis inject list; it is a different
service from theconversationalready injected, and needs no sub-path entry. - Interjected (
steering) messages can be quoted. The Harness renders a
steering row with the same component and the same DOM contract as an ordinary
user row — they are the sameuser/messageevent, differing only in whether
the agent claimed it mid-turn — but the judge's accepted-kind list named only
user. Some body rows quoted and some silently did not, which is worse to
diagnose than none of them working. - A half-written
chatpreset repairs itself. Quick ask
(Ctrl/Command+Shift+C) failed with "cannot create a chat-mode
Session" and nothing more. The cause was not the regression above: the RPC,
its request shape, the workspace and Session-list reads and the chord all
verified intact. The Harness was refusing the create with
agent-preset/invalid—$DSH_HOME/.agent-presets/chat/heldpreset.yml
and not theagent.cordis.ymlthe Harness mounts. Workbench's seeder asked
whether the directory existed, not whether a mountable preset was in it, so
it answered "already seeded" forever and no path through the product could
recover. It now gates on the composition file and writes only what is
missing, never overwriting a file that exists, and says so once when it
repairs. A deleted preset is still never re-created. - Everything past the first quote works. Saving a note on a quote answered
"the draft changed, please retry" and did nothing; so did adding a second
quote, and deleting one. The composer keeps two text projections of the same
document — in one, every chip expands to its display text; in the other,
every chip is exactly one character — and the two APIs involved disagree
about which they speak, in prose only.occurrences[].offset/lengthare
clipboard coordinates; theTokenSpanthatinsertReferencetakes is
resolved against the detect text. Workbench handed the first straight to the
second. With no chip in the draft the projections are identical character
for character, which is exactly why the first quote always worked and
nothing looked wrong. Every span is now converted before it is sent. - A face that moved no longer looks like a face that is absent. Both
rejections above were the same silentreturn null. Each now emits one
deduplicated diagnostic naming which of the two happened. That distinction is
the single thing that would have turned this from hours into minutes.
Changed
- The unit test doubles are built to the host's shape, not to the plugin's
convenience. rc.4 and rc.5 were the same failure twice: the fakes were
looser than the Harness, so the suite was fully green on a build that was
broken at boot. A shared double now enumerates the Session snapshot's fifteen
real fields and throws on an unknown one, and serves chat nodes only through
auiConversation-shaped binding that throws for unknown Sessions and
returnsundefinedfor an unactivated target, exactly as the Harness does.
The selection tests reach the node table through the product's own adapter,
so the next time a face moves they go red instead of green. dsh.client.injectnames@deepseek-ai/dsh-client-ui-chat, matching
upstream consumers of the same target. It orders bundle-factory arrival and
is skipped when absent; it changes nothing at runtime.- Product contract invariant 7's carve-out is restated. It said an existing
chat/directory is never modified; it now says no existing file is ever
overwritten, and names the one repair above as the single exception.
Verified
pnpm release:check, all nine steps, on the release commit:
| Step | Result |
|---|---|
scan-secrets.mjs |
high-confidence secret/privacy scan passed |
release-contract-check.mjs |
53 checks, all passed |
scan-secrets.test.mjs |
67 / 67 |
install/result.test.mjs |
47 / 47 |
bootstrap/bootstrap.test.mjs |
33 / 33 |
pnpm typecheck |
passed |
pnpm test |
673 / 673 across 36 files |
pnpm audit --audit-level=low |
no known vulnerabilities |
build-release-bundle.mjs |
four artifacts packed, SHA256SUMS written |
The package suite is 673 where rc.5 was 663: the chat-source seam, the
steering kind, the seeder repair and its no-overwrite rule, and the span
coordinate system are each pinned. Two test doubles were rebuilt to the
host's shape rather than the plugin's convenience — the session/chat face,
and the composer input, which had modelled one text projection where the host
keeps two and so accepted the wrong coordinates silently. Reverting either fix
now turns cases red.
SHA256SUMS describes the stamped installers, and the digest they embed
(b329024e…) is the digest of the TGZ packed beside them.
release-manifest.json records the release commit.
End-to-end on a real Harness, in a browser, with real input. This is what
rc.5 did not have, and it is the only check that would have caught it. The
packed rc.6 TGZ was installed into a profile, the pinned Harness booted against
a real ~/.dsh with real Sessions, and every item below was driven through the
browser — left_click_drag for the gesture, real key events for the chords.
Synthetic click() and programmatic range selection do not exercise these paths
and were not accepted as evidence.
| Check | Result |
|---|---|
Boot graph carries @wanyexin1998/dsh-workbench, console clean |
pass |
| Real drag-select over assistant prose raises the selection toolbar | pass |
| "Add to conversation" lands the badge, the quote band and the composer chip | pass |
| A second quote lands beside the first | pass |
| Saving a note on a quote | pass |
| Deleting one quote of two, then the last one | pass — composer ends empty |
| The same inside a Pane in split mode, routed to that Pane's composer only | pass |
Real Ctrl+Shift+C opens a chat-mode Session beside the current one |
pass |
Ctrl-click on a second Session yields two [data-session-pane] |
pass |
| The quote badge does not overlap the turn rail | pass — 145px clear |
| The Settings chord actually toggles Settings when pressed | pass |
The last two had never been verified before. The badge sits at x 1231–1247 and
the turn rail at 1392–1420 in a 1440px viewport; in split mode the rail is not
rendered at Pane width, so there is nothing to collide with. The Settings chord
was exercised at the chord it is bound to on that machine, which a saved user
override had moved off the Primary+, default; the default-chord dispatch path
was confirmed separately with Primary+/, which is both a default and
punctuation.
Still not verified. macOS, a read-only $DSH_HOME, and the stock-Harness
general-plugin path have never been run on any platform. The isolated installer
end-to-end evidence is unchanged from rc.5 and is described there; this release
does not repeat it, because the installer scripts changed only by their stamped
version and digest. Primary+, as a default — on a machine carrying no saved
override — remains unexercised.
Distribution boundary
The Harness pin (rc4/presentation-on-0.1.2,
c5a387cd2f781d4d9914ea0271ebb507984ca3f4) does not move. The tag
dsh-workbench-v0.2.0-rc.6-pin marks the same commit so a published installer
keeps resolving; every earlier pin tag and its branch stay in place, because
those installers are still out there. Panel Compatibility moves to
0.1.0-rc.4. Its source did not change, but its packed bytes did: the package
declares the Workbench as a workspace:* dev dependency and pnpm rewrites that
to the concrete version at pack time, so its bytes track the Workbench version
and cannot stay still across a bump. A name is bound to its bytes here, so this
cut takes a new one. The Better Sidebar fork is unchanged.
v0.2.0-rc.5 is not withdrawn and its tag is not reused; this repository has
immutable releases, so a burned name can never come back. rc.5 stays published
with this record of what was wrong with it.
Upgrading
See docs/INSTALL.md § Upgrading from v0.2.0-rc.3.
The installer refuses a target that already exists, and deleting the target
would take its isolated Harness home — every Session, Work...
DSH Workbench v0.2.0-rc.5
Source preview. Distribution is source plus these SHA256-verified (not GPG-signed) artifacts. No npm package.
This release replaces v0.2.0-rc.4, published and withdrawn earlier today. That build installed cleanly and then did nothing: the client entry declared the remote service without the remote.session namespace it dereferences, so cordis refused the lookup, the plugin's only apply entry threw, and the fail-soft catch swallowed it — no shortcuts, no Ask, no settings section, no Split Pane, and no error beyond one console warning. The isolated end-to-end run is what found it. rc.4 has been deleted and its number is not reused: this repository has immutable releases enabled, so a withdrawn tag cannot be republished. If you installed rc.4 (Workbench TGZ digest 5bdaf6b2…), install this over it.
Everything else here first appeared in rc.4 and is unchanged: the Harness pin is the same commit, and no source outside the client entry moved.
Pin: Harness fork rc4/presentation-on-0.1.2 @ c5a387cd2f781d4d9914ea0271ebb507984ca3f4, on upstream 0.1.2-rc.1 (a66e4702…), tagged dsh-workbench-v0.2.0-rc.5-pin.
Verified. pnpm release:check, all nine steps: 53 contract checks, 663/663 package tests, 67 secret-scanner, 47 install-contract, 33 installer, no known vulnerabilities. SHA256SUMS describes the stamped installers, and the digest they embed is the digest of the TGZ beside them.
Isolated end-to-end, Windows. Run against the withdrawn rc.4 installer, which pinned the same Harness commit this release does: downloaded from the release, verified against SHA256SUMS, run against a clean space-containing target with no -TgzSha256; state: installed / exit 0, with the detached checkout, TGZ digest, self-relative launcher and untouched real ~/.dsh each confirmed afterwards. It cloned from GitHub directly rather than a local mirror, so reachability is evidenced. The fix in this release was then verified in that same isolated install: clean console, the plugin in the client boot graph, and its own shortcut section in Settings.
Not verified. Split Pane itself, quote-badge placement against the host's turn rail, and whether the Settings chord fires when pressed — the first two need a configured model the isolated home does not have, and the third is evidenced only as registered. macOS, read-only $DSH_HOME, and the stock-Harness general-plugin path remain unrun on every platform.
Full notes: RELEASE_NOTES.md · Install: docs/INSTALL.md
DSH Workbench 0.2.0-rc.3
DSH Workbench 0.2.0-rc.3
Status: source preview. Distribution is source plus a downloadable GitHub
Release (two TGZs, two bootstrap scripts, SHA256SUMS, release-manifest.json),
SHA256-verified, not GPG-signed. No npm package.
Upgrading from 0.2.0-rc.2 re-pins the Harness fork. The bootstrap
installer now checks out 82de604afc683cd8c7692d0736f26f9ebc0f1823 on
feat/toggle-settings-verb instead of 1a8cf5ba… on
fix/plugin-spec-quoting. The new commit is a direct child of the old one, so
it carries the rc.2 Windows spaces-in-path fix forward; what it adds is
ctx.layout.toggleSettings(). Installing over an existing bootstrap target is
not supported — remove the target and run the installer again.
Added
- Quoted passages are now marked where they live. "Add to conversation"
used to repeat every quoted passage in a dock above the composer, putting the
same text on screen twice and growing the dock with each addition. The
passage is now marked in the conversation itself — a tinted band with an
underline, and a numbered badge in the margin beside it — and the composer
keeps only a numbered chip. The marking is painted through the browser's CSS
Custom Highlight API: Workbench hands the browser aRangeand inserts
nothing into the Harness DOM. Works on stock Harness. - Every quote can carry a note, typed where the quote is. Adding a quote
opens a comment card beside the passage with the caret already in it, so the
gesture is select, add, type. Leaving the card saves what you wrote; so do
the close button andEsc. Delete removes the quote in one click. After the
card closes nothing is parked beside the paragraph covering the text
underneath — hover the numbered badge to peek at the note, click it to edit,
or open the quote list from the composer chip. - The Settings shortcut can now close Settings, not just open it. On the
newly pinned Harness fork the action reads "Toggle settings" and the same
chord dismisses the panel it opened. A host still on the previous pin keeps
the open-only verb and its "Open settings" label; stock Harness registers no
Settings action at all. The plugin prefers the new verb and falls back, so no
host breaks.
Fixed
- Open Settings shipped with a default chord that could not be pressed.
Primary+Spaceis the language-toggle hotkey of most Chinese IMEs on Windows
and Spotlight's chord on macOS, so the keystroke was taken before the page
ever saw it: the action registered, the handler was correct, and pressing the
keys did nothing at all. The default is nowPrimary+,. Anyone who had
rebound the action keeps their own chord — only untouched defaults move.
Primary+Spacenow carries a warning in Settings explaining why a chord
bound to it may never arrive. - Selections put internal protocol markup in front of the reader. Side chat
opened with a<selected_context>tag carrying session ids, node keys,
sequence numbers and character offsets, and Add to conversation reached the
same shape at submit time. Nothing downstream read those identifiers, so they
were noise to the model and a leak to the user. A quote is now plain text: a
prose heading, the quoted text with a│gutter on every line, and the note
on a↳line. The HTML escaping went with the tags, so a quote of
Tom & Jerryno longer arrives asTom & Jerry. - The selection toolbar and reference dock did not follow the theme. They
set geometry but no colour and fell through to the browser's default buttons,
staying light in dark mode. Both now use the host's own design tokens, taking
their separation from shadow in light mode and from a border in dark. - A reply streaming in the other Pane re-resolved every quote anchor on every
frame, because the mutation observer watched character data across the whole
conversation. It now filters to mutations that can affect an anchored row.
Scrolling separately rebuilt the highlight registry every frame despite a
comment claiming otherwise; it now publishes only when the ranges really
change. - A saved note stayed parked beside the passage, covering the next
paragraph. Its landing point is computed directly under the passage's last
line, which is normally the following text. The collapsed state now parks
nothing at all. Removing the pinned state alone was not enough: the hover
preview is a latch that only a later pointer event clears, and it was armed
even while a card was open, hidden behind the render gate — so a save opened
the gate and the note appeared with no pointer having moved. Arming now
requires that nothing is open. - The default install path never stated that it needs
dshonPATH. A
reader with no Harness got through the download and the checksum and met a
rawCommandNotFoundExceptionon the third command, with nothing in the
repository explaining how to get one.docs/INSTALL.mdnow states the
prerequisite before the commands and points anyone without Harness at the
bootstrap path.
Documentation
The doc set was audited against the code rather than against itself, which
turned up a class of error no release gate was watching for:
- The compatibility table in both READMEs paired the fork branch
feat/toggle-settings-verbwith1a8cf5b…, that branch's parent — so a
reader who pinned what the table said got a Harness without
toggleSettings(). The pin advance had updated the branch name and left the
hash. Nothing compared either againstrelease-contract.json; that check now
exists (see below). - Neither README described the quote surface a user now literally sees in their
conversation. Both now do, including the guarantee that the host DOM is never
mutated — previously written down only in a source comment. docs/PRODUCT_CONTRACT.mdsaid More Details sends "escaped selected
context". It has not for several commits.- The Windows end-to-end evidence in
docs/COMPATIBILITY_MATRIX.mdand
docs/KNOWN_ISSUES.mdwas gathered against therc.2installer, which
pinned a different Harness commit. Both now say so, and say plainly that the
rc.3installer has not been re-run. Three checks that have never run on any
platform were listed as "targeted forv0.2.0-rc.2"; they are now listed as
outstanding work rather than as a plan attached to a release that shipped.
Release gates
Two releases in a row shipped a stale version string or commit hash with all
nine gates green, because no gate compared a document against the release
contract. Three checks now close that class:
scripts/release-contract-check.mjssweeps every user-facing document for
version strings and pinned commit hashes and fails on any that disagrees with
release-contract.json. Deliberate historical references are declared in a
visible allowlist that names the file and the reason, so an exemption cannot
be granted silently.scripts/build-release-bundle.mjsfails if either bootstrap installer's
embedded Workbench TGZ digest, version, or release URL disagrees with the
artifact it just packed.scripts/bootstrap/bootstrap.test.mjsasserts both installers' embedded
WORKBENCH_VERSIONand release URL against the contract. That assertion had
been written as a deferred TODO because the contract used to lag the scripts.
Verified
Measured on the 0.2.0-rc.3 release run, not carried over:
- Package unit tests: 42 files / 714 passing (
dsh-workbench40/707,
dsh-workbench-panel-compat2/7).tsc --noEmitclean. The rc.2 note said
36 files / 515; that figure was stale by roughly two releases of work. - Installer script tests: 32/32 (was 31 — the deferred installer-version
assertion is now one of them). Install-result contract tests: 47/47.
Secrets-scanner unit tests: 67/67. node scripts/release-contract-check.mjs: 52 checks, all passing (was 50 —
the document version and pinned-commit sweeps are the two new ones).pnpm release:checkis 9 steps and exits 0.- The packed Workbench TGZ hashed identically across the release's two bundle
passes. Those passes ran from different commits, differing only in the
installer scripts, which are outside the package'sfileslist — which is
precisely what makes the stamp-then-rebuild loop terminate rather than chase
its own tail. - Both installers' embedded TGZ digest, version, and release URL are asserted
against the packed artifact by the bundler itself. The unflagged build failed
on the stale rc.2 digest before it was stamped, which is the check doing its
job on its first real release.
Not verified, and unchanged from rc.2: no isolated end-to-end run has been
performed for this release on any platform. The only such run that has ever
happened exercised the rc.2 installer, which pinned a different Harness commit.
See docs/COMPATIBILITY_MATRIX.md § Outstanding verification.
Distribution boundary
The repository is public source, not an official DeepSeek Harness
distribution. Forked Harness and Better Sidebar packages retain their original
names and must not be republished under upstream package namespaces. The
Harness pin (feat/toggle-settings-verb,
82de604afc683cd8c7692d0736f26f9ebc0f1823) is public and independently
verifiable at https://github.com/wanyexin1998/deepseek-harness, and is tagged
dsh-workbench-v0.2.0-rc.3-pin so it stays reachable if the branch moves.
Panel Compatibility (0.1.0-rc.1) is unchanged this release.
v0.2.0-rc.2 — Workbench Ask, shortcuts, and a working installer
Status: source preview. Distribution is source plus a downloadable GitHub
Release (two TGZs, two bootstrap scripts, SHA256SUMS, release-manifest.json),
SHA256-verified, not GPG-signed. No npm package.
Fixed
- The installer scripts did not run at all. Both bootstrap scripts called
pnpm exec dshin ten places, but that bin does not exist —apps/cliis
not a root dependency, so pnpm never links it — and every run failed with
ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL. They now call the repository's own
root script,pnpm dsh, with a tripwire test guarding against a regression. - A path containing a space broke installation on Windows. The Harness
CLI'sdsh pluginforwarder runs withshell: trueon Windows without
quoting its arguments, socmd.exesplit afile:path at the first
space. The default install target,%USERPROFILE%\dsh-workbench\downloads\,
hits this whenever the Windows username contains a space, failing with an
ENOENTagainst a truncated path. Fixed in the pinned Harness fork
(fix/plugin-spec-quoting, commit1a8cf5ba416246f22d9526a917af5fb233170c58).
Stock Harness does not carry this fix; seedocs/INSTALL.mdand this
README for the warning. - Workbench Ask (
Primary+Shift+C) silently did nothing with no current
Session — reliably reproducible right after using the new-Session
shortcut. It now falls back to the host's most recent Workspace, and shows
the user a message instead of only logging to the console when no
Workspace can be resolved at all. Alt+Q(switch to previous Session) never fired on macOS. Option
synthesizeskeyintoœ, notq, while the binding matched onq— so
Settings showed "bound to ⌥Q" while the chord silently did nothing. Chords
that include Alt are now derived fromevent.code, which is consistent
across platforms.- An action bound only to its shipped default could never be unbound.
The Settings "Clear" control required an existing override, so an action
still on its default (e.g. sidebar toggle's browser-reservedPrimary+B)
had both Clear and Reset greyed out — there was no way to free a reserved
key without first recording a throwaway chord. Primary+Shift+Ccollides with the DevTools "Inspect element" shortcut
in every major browser. Settings now surfaces the same browser-reserved
warning this action already showed for the new-Session/new-window
collision. The default chord itself is unchanged.- Workbench Ask waited a full second before showing the stock-Harness
degradation notice, even though the composer-focus probe it was waiting
on can never succeed on stock Harness. It now shows immediately. - The compatibility guard's verdict was not enforced everywhere. When the
host's Presentation face failed the startup guard, side chat and Workbench
Ask still treated it as protocol-2-capable — a click could fork a child
Session and replace the source Pane. The guarded-incompatible state is now
invisible to every downstream module, matching stock behavior exactly. - The security statement undersold an actual filesystem write. It claimed
no added Host filesystem capability, but the Host entry seeds the bundled
chatagent preset into$DSH_HOME/.agent-presets/(create-only, never
overwrites, never re-creates after user deletion). Wording now matches
docs/PRODUCT_CONTRACT.md.
Verified
- Package unit tests: 36 files / 515 passing;
tsc --noEmitpasses clean. - Installer script tests: 31/31. Install-result contract tests: 47/47.
- New: secrets-scanner unit tests, 67/67 — previously that scanner shipped
with zero test coverage of its own, so a broken rule would have gone
unnoticed. pnpm release:checkis now 9 steps (adds the scanner unit-test step).- TGZ packing is reproducible: two builds from the same source produce
byte-identical hashes. - Both TGZ SHA256 values are recorded in
dist/SHA256SUMS; the general
plugin installer scripts embed the Workbench TGZ hash directly.
Distribution boundary
The repository is public source, not an official DeepSeek Harness
distribution. Forked Harness and Better Sidebar packages retain their
original names and must not be republished under upstream package
namespaces. The Harness pin (fix/plugin-spec-quoting,
1a8cf5ba416246f22d9526a917af5fb233170c58) is public and independently
verifiable at https://github.com/wanyexin1998/deepseek-harness. Panel
Compatibility (0.1.0-rc.1) is unchanged this release.
DSH Workbench v0.2.0-rc.1
DSH Workbench 0.2.0-rc.1
Status: source preview. No npm package or automatic installer is published.
Included
- Two visible Session Panes over Harness Session Presentation protocol 2.
- Stable
visiblemembership and independentfocusedinteraction ownership. - Explicit SessionProvider binding, Pane-local right/bottom panel hosts, and focus-safe lifecycle teardown.
- Conversation Navigator with one precise marker per human input.
- Host-backed shortcuts with Simplified Chinese and English names.
- Optional Better Sidebar 0.16.1 Pane protocol 1 adapter.
Verified
- Workbench: 180 tests, typecheck, build, and TGZ pack.
- Panel Compatibility: 7 tests, typecheck, build, and TGZ pack.
- Harness fork: 748 focused tests and 5 capacity-2 assembled Web snapshot tests.
- Dependency audit: no known vulnerabilities in the two distributed source packages at verification time.
Distribution boundary
The repository is public source, not an official DeepSeek Harness distribution. Forked Harness and Better Sidebar packages retain their original names and must not be republished under upstream package namespaces.
End-user source installation requires a user-approved full Workbench commit and detached HEAD verification before repository code executes. Pinned Harness and optional Better Sidebar checkouts receive the same error, HEAD, detached, and clean-worktree verification before their instructions run. The Workbench TGZ includes the complete MIT notice for its bundled Schemastery and Cosmokit code.
Immutable source and artifacts
- Source commit:
577874a6b88449ca959b883369d3b37a18697121 - Final Codex Security scan: 109/109 tracked files, 0 findings.
- Assets: two local TGZ packages,
SHA256SUMS, andrelease-manifest.json - GitHub Actions and GitHub Packages/npm publication remain disabled.