Skip to content

Commit 52c3b42

Browse files
authored
Release 0.0.21: Cowork fixes and synchronized desktop train (#30)
Fixes the complete Cowork and Files acceptance ledger, adds the desktop sidebar control and Markdown-to-DOCX export, and requires macOS, Linux, and Windows to ship one synchronized version. Windows artifacts remain intentionally unsigned under the documented accepted policy.
1 parent 0318ce3 commit 52c3b42

30 files changed

Lines changed: 1019 additions & 171 deletions

CHANGELOG.md

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,65 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.0.21] - 2026-07-27
11+
12+
### Fixed
13+
14+
- Desktop release policy now fail-closes on platform parity: one version and
15+
exact source commit must produce verified macOS DMG/updater, Linux host, and
16+
Windows Setup/Squirrel artifacts before any tag or GitHub Release can be
17+
published. Windows signature status is disclosed and unsigned output remains
18+
accepted until a trusted signing identity is adopted. A missing platform
19+
pauses the whole release instead of leaving users on a stale update line.
20+
21+
- Cowork new-file prompts now start blank. Names with an explicit extension are
22+
preserved, while extensionless names receive the active section's `.md`,
23+
`.whiteboard.json`, `.txt`, or `.slides.json` default.
24+
- Presentation canvases anchor at the top of their scrollable stage, and the
25+
Excalidraw hamburger menu escapes the editor's inner clip into a bounded,
26+
scrollable overlay so its complete menu remains visible and interactive.
27+
- Cowork Code uses the normal light surface with readable dark text in light
28+
mode while retaining its navy editor treatment in dark mode.
29+
- Offline shell fallbacks always resolve service-worker requests with a valid
30+
response instead of producing a rejected FetchEvent conversion error.
31+
- Cowork's bare Option/Alt shortcut now carries the mic control belonging to
32+
the focused Notes, Docs, or agent input and uses a capture-phase fallback
33+
when the macOS desktop shell swallows the corresponding keyup.
34+
- Long Cowork Notes give CodeMirror a finite editor frame and scroll through
35+
its actual viewport in Write mode.
36+
- Leaving Cowork, changing sections, or opening another file now destroys the
37+
outgoing Yjs document and reloads the authoritative workspace file into a
38+
fresh document. The stale browser recovery copy that could resurrect or
39+
repeatedly duplicate prior text has been removed.
40+
- Files directory, tree, text, and content reads now paint from the host mirror
41+
immediately. One explicit background refresh coalesces the expensive channel
42+
computer export and repaints the current listing when it completes.
43+
44+
### Added
45+
46+
- Files now keeps `/workspace` and the five Cowork folders first in its visual
47+
navigation rail, with all remaining root files and folders grouped under an
48+
expandable **Other** disclosure without changing the underlying filesystem.
49+
- Selecting a Markdown file in Files exposes **Download - DOCX**, backed by an
50+
authenticated, contained Office Open XML export.
51+
- Desktop workspace navigation can collapse to a compact channel-icon rail and
52+
expand again. The profile-bound preference persists, while the existing
53+
mobile drawer remains unchanged.
54+
55+
### Tests
56+
57+
- Browser coverage toggles both Cowork editor and agent dictation through bare
58+
Option/Alt, scrolls a 120-line Note, and proves section changes, full Cowork
59+
navigation, and a five-line external replacement all reopen exactly once
60+
without a recovery prompt.
61+
- A fake Apple channel computer with an intentionally slow export proves cached
62+
Files reads stay responsive, simultaneous refreshes coalesce, and guest-only
63+
files appear after the background refresh.
64+
- Browser and server coverage verify blank Cowork naming, default and explicit
65+
extensions, presentation-menu stage bounds and pointer hit-testing, light
66+
Code contrast, Files grouping, real DOCX ZIP contents, and persistent
67+
desktop-only sidebar collapse.
68+
1069
## [0.0.20] - 2026-07-27
1170

1271
### Added
@@ -583,7 +642,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
583642
notarization, stapled tickets, Gatekeeper verification, persistent
584643
Application Support, and isolated Apple container machines.
585644

586-
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.20...HEAD
645+
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.21...HEAD
646+
[0.0.21]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.21
587647
[0.0.20]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.20
588648
[0.0.19]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.19
589649
[0.0.18]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.18

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,19 @@ update preserves it — credentials, databases, resident state, files, and
126126
workspaces. Profile → Check for updates asks the Mac running 1Helm—not the
127127
device displaying the web UI—to download and verify the signed update.
128128

129-
Windows 11 x64 gets a [signed Setup executable](https://1helm.com/download/windows)
129+
Windows 11 x64 gets a [Setup executable](https://1helm.com/download/windows)
130130
that provisions one private WSL 2 world per channel. Linux hosts use a verified
131131
installer that provisions a durable systemd service with an atomic,
132132
digest-verified, health-checked updater — see the
133133
[Linux install guide](https://1helm.com/manual/install-linux). Whichever platform,
134134
it works best on a dedicated machine: your crew works around the clock, and
135135
your everyday computer takes naps.
136136

137+
Mac, Linux, and Windows use one synchronized desktop release version. A release
138+
is held in full until the DMG/updater ZIP, Linux host archive, and signed
139+
Windows Setup/Squirrel feed have all passed native install and update
140+
acceptance from the same source commit.
141+
137142
### Connect from iPhone, iPad, or Android
138143

139144
The mobile apps are thin, native gateways to a 1Helm you already run. Install
@@ -268,7 +273,7 @@ and an audit trail. A prompt saying “use this service” is not a connector.
268273
|---|---|
269274
| **Apple Silicon macOS 26** | Native desktop product and real isolated Linux computer per resident (Apple `container machine`, `home-mount=none`). |
270275
| **Linux / CI** | Supported headless systemd host with one unprivileged LXC per resident (subordinate UID/GID mapping, exact ownership checks); CI may select an explicit test backend. |
271-
| **Windows 11 x64** | Native desktop product with one private WSL 2 world per resident (Windows-drive mounts and interop disabled); the signed Setup executable ships with every release. |
276+
| **Windows 11 x64** | Native desktop product with one private WSL 2 world per resident (Windows-drive mounts and interop disabled); the Setup executable ships with every release and its signature status is disclosed. |
272277
| **iPhone and iPad** | App Store gateway to an already configured HTTPS 1Helm host; sessions live in the device-only iOS Keychain. |
273278
| **Android 7+** | Directly distributed signed universal APK gateway; sessions are encrypted by a key held in Android Keystore. |
274279

@@ -296,7 +301,7 @@ A fresh data directory opens first-run setup. The source runtime defaults to
296301
| `PORT` | `8123` | HTTP/WebSocket control-plane port. |
297302
| `CTRL_DATA_DIR` | `./data` | Databases, routing state, uploads, and narrow workspace mirrors. |
298303
| `HELM_CHANNEL_COMPUTER_BACKEND` | `apple` on macOS, `lxc` on Linux, `wsl` on Windows | Host isolation backend; `native` and `mock` are explicit development/test overrides. |
299-
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.20` | Versioned channel-machine image contract. |
304+
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.21` | Versioned channel-machine image contract. |
300305

301306
### Agent-first JSON CLI
302307

docs/GOVERNANCE.md

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,37 @@ contract as the slice hardens.
5757
8. A multi-item user request retains a numbered acceptance ledger in the pull
5858
request and GitHub Release. Do not collapse completed items into a generic
5959
summary or rely on generated commit notes as the user-facing release record.
60-
9. The retained Apple Silicon release host owns both artifact production and
61-
public-download installed-app verification.
60+
9. Each supported desktop platform owns its native artifact and installed-app
61+
verification lane. The retained Apple Silicon host owns macOS signing and
62+
notarization; Linux owns the systemd/LXC artifact and updater acceptance;
63+
Windows 11 x64 owns Squirrel and WSL acceptance. Authenticode is optional
64+
until 1Helm adopts a trusted Windows signing identity; unsigned artifacts
65+
must be identified honestly, but their signature status is not a release
66+
blocker.
6267

6368
## Versioning
6469

6570
- Semantic versioning on `package.json`.
6671
- **Do not** reuse a published version tag for different bits.
67-
- A release requires a unique version, changelog, exact tag, verified public
68-
artifact, and platform-appropriate clean installation evidence.
72+
- A desktop release requires one unique version and exact commit, changelog,
73+
complete Mac + Linux + Windows artifact matrix, and clean-install plus
74+
prior-to-new update evidence on every platform. Partial platform releases
75+
under the shared product version are prohibited. If one platform is blocked,
76+
the entire tag/publication waits.
6977
- GitHub Release notes are a first-class product artifact. They must enumerate
7078
every user-visible fix and feature accepted for that release, using the same
7179
numbered ledger as the originating request when one exists. A short summary
7280
can introduce that ledger but cannot replace it.
7381
- macOS verification must use the exact publicly downloaded artifact, preserve
7482
Application Support, and prove signature/ticket/Gatekeeper, launch, version,
7583
loopback behavior, and retained state on the retained release host.
84+
- Linux verification must use the digest-qualified release archive and prove a
85+
real systemd update, health-failure rollback, and retained `/var/lib/1helm`.
86+
- Windows verification must prove the Setup/Squirrel signature status, clean
87+
install, old-to-new update, loopback health, WSL lifecycle, and retained
88+
application data on Windows 11 x64. Do not substitute a self-signed
89+
certificate or block an otherwise accepted release solely because the
90+
artifacts are honestly disclosed as unsigned.
7691

7792
Never hand-edit only a deployment target to fix the product. Fix in git,
7893
review, merge, and redeploy the exact source commit.

docs/VISION.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,12 @@ verification.
7979
- `https://1helm.com` is the standalone product and documentation site.
8080
- `https://demo.1helm.com` is a separate public sandbox, not the product site
8181
and not a dependency of an installed workspace.
82-
- Apple Silicon macOS and Linux systemd are public host products with one
83-
isolated Linux computer per ordinary resident.
84-
- The native Windows x64 + WSL implementation and real-host lifecycle are
85-
accepted, but its public installer is withheld until an Authenticode signing
86-
identity is available.
82+
- Apple Silicon macOS, Linux systemd, and native Windows x64 + WSL are the
83+
synchronized public desktop-host product. Every named desktop release must
84+
publish all three from one version and exact source commit.
8785
- 1Helm is self-hosted and open source. A hosted control plane, mobile clients,
88-
blind community-skill execution, a signed public Windows installer, and a
89-
native Linux desktop shell are not shipped.
86+
blind community-skill execution, and a native Linux desktop shell are not
87+
shipped.
9088

9189
## What 1Helm borrows—and what it does not
9290

docs/release-checklist.md

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ Process: [release-lifecycle.md](./release-lifecycle.md). Policy: [GOVERNANCE.md]
66

77
Docs-only governance can merge without a version bump; still update `CHANGELOG.md` Unreleased when operators should notice.
88

9-
**Do not say “done” for a ship until applicable checks pass.**
9+
**Hard gate:** every named desktop release must ship macOS, Linux, and Windows
10+
from the same version and exact source commit. There is no Mac-only fast path.
11+
Do not create the tag or GitHub Release, publish any platform, mark anything
12+
latest, or say “done” until all three lanes pass. If one lane is blocked, pause
13+
the whole release and report it.
1014

1115
## 1. Prepare
1216

@@ -63,21 +67,51 @@ MERGED_COMMIT="$(git rev-parse origin/main)"
6367
VERSION="$(node -p "require('./package.json').version")"
6468
```
6569

66-
## 5. Tag (optional but preferred for named cuts)
70+
## 5. Build the complete desktop matrix before tagging
6771

6872
```bash
69-
git tag -a "v${VERSION}" "$MERGED_COMMIT" -m "1Helm ${VERSION}"
70-
git push origin "refs/tags/v${VERSION}"
7173
HEADLESS="dist/1Helm-${VERSION}-linux-node.tgz"
7274
DMG="dist/1Helm-${VERSION}-arm64.dmg"
7375
UPDATE_ZIP="dist/1Helm-${VERSION}-mac-arm64.zip"
76+
WINDOWS_SETUP="dist/1Helm-${VERSION}-windows-x64-setup.exe"
77+
WINDOWS_NUPKG="dist/1Helm-${VERSION}-full.nupkg"
78+
WINDOWS_RELEASES="dist/RELEASES"
7479
ANDROID_APK="dist/1Helm-${VERSION}-universal.apk"
7580
RELEASE_NOTES="dist/1Helm-${VERSION}-release-notes.md"
81+
82+
# Build from clean snapshots of the same MERGED_COMMIT on the platform owners:
83+
# macOS arm64: npm ci && npm run typecheck && npm run build && npm test && npm run package:dmg:release
84+
# Linux: npm ci && npm run typecheck && npm run build && npm test && npm run package:linux
85+
# Windows x64: npm ci && npm run typecheck && npm run build && npm test && npm run package:windows
86+
87+
for artifact in "$DMG" "$UPDATE_ZIP" "$HEADLESS" "$WINDOWS_SETUP" "$WINDOWS_NUPKG" "$WINDOWS_RELEASES"; do
88+
test -s "$artifact"
89+
done
7690
# Author RELEASE_NOTES from docs/release-notes-template.md. It must contain the
77-
# complete numbered acceptance ledger, artifact digests, and verification.
91+
# complete numbered acceptance ledger, every desktop artifact digest, and all
92+
# three platform verification records.
7893
test -s "$RELEASE_NOTES"
7994
rg -q '^1\. ' "$RELEASE_NOTES" # multi-item ships must retain a numbered ledger
80-
gh release create "v${VERSION}" "$DMG" "$UPDATE_ZIP" "$HEADLESS" "$ANDROID_APK" --title "1Helm ${VERSION}" --notes-file "$RELEASE_NOTES" --draft
95+
```
96+
97+
The Windows `.nupkg` basename must exactly match the entry inside `RELEASES`.
98+
Record Authenticode status for Windows executable code and Setup. Trusted
99+
signing is optional until 1Helm adopts a Windows signing identity: an honestly
100+
disclosed `NotSigned` result is accepted and must not block the release. Never
101+
substitute a self-signed identity. When a trusted identity is configured, use
102+
the fail-closed `package:windows:release` command.
103+
104+
Only after Sections 6–8 pass for all three desktop platforms:
105+
106+
```bash
107+
git tag -a "v${VERSION}" "$MERGED_COMMIT" -m "1Helm ${VERSION}"
108+
git push origin "refs/tags/v${VERSION}"
109+
gh release create "v${VERSION}" \
110+
"$DMG" "$UPDATE_ZIP" "$HEADLESS" \
111+
"$WINDOWS_SETUP" "$WINDOWS_NUPKG" "$WINDOWS_RELEASES" \
112+
--title "1Helm ${VERSION}" --notes-file "$RELEASE_NOTES" --draft
113+
# Upload mobile artifacts through their applicable distribution lane; their
114+
# timing never permits a partial desktop release.
81115
# review notes, then:
82116
gh release edit "v${VERSION}" --draft=false
83117
```
@@ -117,16 +151,31 @@ curl -fsS "http://127.0.0.1:18123/api/setup/status"
117151

118152
Expect first-run / needs_setup on empty data dir.
119153

120-
## 7. Host updater acceptance
154+
## 7. Host updater acceptance — all three lanes are required
121155

122-
- Verify the native ZIP was created only after the app was notarized and stapled; extract it and repeat strict signature, ticket, and Gatekeeper checks.
123-
- Confirm the public Electron feed selects that ZIP for the prior Mac version and returns no update for the new version.
156+
- **macOS:** verify the native ZIP was created only after the app was notarized
157+
and stapled; extract it and repeat strict signature, ticket, and Gatekeeper
158+
checks. Confirm the staged/public Electron feed selects that ZIP for the
159+
prior Mac version and no update for the new version.
124160
- On the same retained Apple Silicon release host used for the clean build,
125161
install the **publicly downloaded** DMG/update with preserved Application
126162
Support, then verify the new version, loopback health, resident state, and
127163
data-directory identity.
128-
- Upload the exact `npm run package:linux` artifact and require GitHub's recorded `sha256:` digest before publication.
129-
- In a disposable systemd host running the prior release, invoke the same Captain host-update action, observe checking/downloading/installing/restarting, verify the new version and `/var/lib/1helm` identity, and exercise rollback with an intentionally unhealthy disposable fixture.
164+
- **Linux:** verify the exact `npm run package:linux` archive, its source commit
165+
and SHA-256, then stage equivalent release metadata. In a disposable systemd
166+
host running the prior release, invoke the Captain host-update action,
167+
observe checking/downloading/installing/restarting, verify the new version
168+
and `/var/lib/1helm` identity, and exercise health-failure rollback.
169+
- **Windows:** on Windows 11 x64, record Authenticode status for Setup, the
170+
packaged app, and its executable code; confirm `.nupkg` and `RELEASES`
171+
consistency; clean install Setup; exercise the real WSL 2 channel lifecycle;
172+
then expose staged
173+
Squirrel metadata to the prior public version and prove download,
174+
verification, restart installation, new version, loopback health, WSL state,
175+
and app-data preservation.
176+
- Before publication, compare each uploaded GitHub asset digest with the local
177+
verified digest and assert the release contains the complete six-file
178+
desktop matrix. A missing asset is a release blocker, not “not applicable.”
130179

131180
## 8. Clean deployment verify (when shipping install path)
132181

@@ -147,6 +196,8 @@ Local setup: needs_setup verified on clean CTRL_DATA_DIR
147196
Clean deploy: <pass / skipped + reason>
148197
Mac host update:<public artifact installed on release host + state preserved>
149198
Linux update: <old → new, digest + health + state preserved>
199+
Windows update:<old → new, disclosed signature status + Squirrel feed + WSL/app state preserved>
200+
Desktop matrix:<DMG + Mac ZIP + Linux TGZ + Windows Setup + nupkg + RELEASES, all same version/commit>
150201
Android: <public APK digest, certificate fingerprint, install/update smoke>
151202
iOS: <App Store build number + validation/upload result>
152203
CI: Actions green on main

0 commit comments

Comments
 (0)