Fix packaged Tailscale CLI detection - #65
Conversation
There was a problem hiding this comment.
ℹ️ No critical issues — one minor test-coverage suggestion inline.
Reviewed changes
- Forced Tailscale CLI mode in packaged launches —
createSystemTailscaleCommandRunnernow injectsTAILSCALE_BE_CLI=1into every invocation (withenvironment/execute/resolveBinaryseams for testing). I verified the env var is honored by the macOS app and is documented in Tailscale's KB 1080, and that setting it on non-macOS CLI builds is inert. - Categorical status-read diagnostics — failures classify as
command-failed/invalid-response/timed-outwith no command output retained, and production emitstailscale-status-read-unavailablewith closed enum fields throughwriteDiagnosticEvent. - Local-ready vs Tailscale-verified distinction — the settings UI shows
Local ready · <badge>/Local service readywhen the listener runs but Tailscale Serve readiness isn't verified, instead of a blanketReady. - Tests for the runner environment, failure categories, diagnostic field filtering, and the new UI copy; docs and plan index updated.
DeepSeek Pro | 𝕏
There was a problem hiding this comment.
Important
The declared version 0.35.76 was already published before these commits, so merging this will skip the release entirely — the production fix will not ship under this version.
Reviewed changes
- Version bump
0.35.0→0.35.76— twochore(release)commits (first0.35.1, corrected to0.35.76) touchingpackage.jsonand bothpackage-lock.jsonversion entries, kept in sync.
DeepSeek Pro | 𝕏
| { | ||
| "name": "aiden-agent", | ||
| "version": "0.35.0", | ||
| "version": "0.35.76", |
There was a problem hiding this comment.
0.35.76 is already published: a non-draft release "Aiden Agent 0.35.76" tagged v0.35.76 targets 8c0e411 (a main commit ~19h before these commits) and does not contain this PR's fix. On merge, release.yml's version resolution sees the tag exists and skips publishing entirely (publish=false, "skipping release without changing its version"), so the Tailscale fix never reaches auto-update users until another version bump. Declare an untagged version (e.g. 0.35.77) so the main-push release publishes a build containing the fix.
Technical details
# Declared release version already published
## Affected sites
- package.json:3 — `"version": "0.35.76"` (same on package-lock.json:3 and :9)
- .github/workflows/release.yml:44-58 — `base_tag_exists` probe against `refs/tags/v${base_version}`; `publish = !baseTagExists` in scripts/prepare-ci-release.mjs
## Required outcome
- Merged `package.json` version must correspond to a tag that does not exist yet, so the main-push release builds and publishes a distribution containing 7cf174b0's fix.
## Open questions for the human
- Was the `0.35.76` release intentionally cut early from `8c0e411` (without the fix)? If so, the shipped artifacts should be verified against what updaters currently serve.There was a problem hiding this comment.
ℹ️ No new issues in this delta — the timeout-shape test addresses the prior suggestion. The version finding from the prior review still stands.
Reviewed changes
- Timeout-category test coverage — a new
combined route inspection categorizes both Node CLI timeout shapestest drives bothcode: "ETIMEDOUT"andkilled: trueerrors throughstatusReadFailureCategory, pinning thetimed-outclassification (and that error text is never retained). This closes the coverage gap flagged in the initial review; the assertions would fail if categorization regressed tocommand-failed.
DeepSeek Pro | 𝕏

Summary
TAILSCALE_BE_CLI=1mode for the shared macOS Tailscale app/CLI executable so Finder and Dock production launches behave like terminal-launched development0.35.76This is a focused follow-up to merged PR #64.
Root cause
The macOS Tailscale app and CLI share one executable. Development inherited terminal environment variables, but a packaged Aiden launch did not, so the executable selected GUI mode and returned a zero-exit non-JSON error. Aiden then failed closed while reading status and could not safely configure Serve.
Validation
npm run test:aiden-remote— 338 passed, 1 host-dependent skip; 7 transport proofs passedETIMEDOUTandkilled: truetimeout shapesnpm run test:diagnostics— 65 TypeScript tests and 7 policy tests passednpm run type-checknpm run lintnpm run buildnpm run test:branding— 32 TypeScript and 18 Node tests passed underaiden-agent@0.35.76npm run release:check-consumersorigin/maindiff — 91/100, no issues0.35.76