From f4147cef301f2679873838a668c875f182aeda03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Tue, 22 Sep 2026 12:48:32 +0100 Subject: [PATCH] caldav cannot install radicale on macOS, and retries forever MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Confirmed on macbookpro (macOS 26.6.2): four boots, four identical failures. caldav's manifest declares apt/pacman/dnf and no brew, so the installer falls back to the binary name — and radicale is not a Homebrew formula at all, it is a Python app (pipx/uv). There is nothing correct to put in a brew field, which is the real gap: PackageManager has no pipx member and osDependencies has no way to say "unavailable on this platform", so the choice is a wrong guess retried every boot or silence. Also recorded, as a NON-bug, because it looked like the real failure and was already over: the motion/react resolve error appeared on exactly one boot, when m3e-canvas landed before plugins/node_modules/motion existed. Verified on the machine — motion is installed and import('motion/react') resolves with 398 exports, and the current boot builds cleanly. The gap that one exposes is still real: installNpmDependencies is called only from the install flow, never at boot, so a plugin that arrives without that flow completing leaves every boot failing a rebuild with "Maybe you need to bun install" and nothing that ever will. Co-Authored-By: Claude Opus 5 Officer-Session: f7a62308-0977-4cf4-aa29-c020853fd420 --- TODO.md | 6 +-- .../radicale-cannot-be-installed-on-macos.md | 54 +++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 todo/known-bugs/radicale-cannot-be-installed-on-macos.md diff --git a/TODO.md b/TODO.md index 9394c55f..58e5c48d 100644 --- a/TODO.md +++ b/TODO.md @@ -22,7 +22,7 @@ the owner's OS user and can never be granted. Indirection there really is accide ## Themes -**109 open, 33 closed**, across 35 themes. +**110 open, 33 closed**, across 35 themes. | Theme | Open | Closed | | --- | --- | --- | @@ -41,7 +41,7 @@ the owner's OS user and can never be granted. Indirection there really is accide | [Headscale](todo/headscale/) | 0 | 5 | | [Infra (alpha)](todo/infra/) | 7 | 0 | | [Integrations — external tools worth wrapping as a plugin](todo/integrations/) | 1 | 0 | -| [Known bugs](todo/known-bugs/) | 7 | 4 | +| [Known bugs](todo/known-bugs/) | 8 | 4 | | [Memory — one store instead of per-harness files](todo/memory/) | 1 | 0 | | [Mobile apps](todo/mobile-apps/) | 5 | 0 | | [Multi-user](todo/multi-user/) | 17 | 5 | @@ -71,6 +71,7 @@ the owner's OS user and can never be granted. Indirection there really is accide ## Newest ten +- `2026-09-22` **caldav retries `brew install radicale` on every boot, and there is no such formula** — [known-bugs/radicale-cannot-be-installed-on-macos](todo/known-bugs/radicale-cannot-be-installed-on-macos.md) - `2026-09-04` **M3E Canvas as a plugin — sketch a UI, hand the prompt to the agent** — [backburner/m3e-canvas-as-a-plugin](todo/backburner/m3e-canvas-as-a-plugin.md) - `2026-08-29` **Officer blocks its own event loop for ~0.9s re-parsing a live transcript, and everything it serves stalls with it** — [known-bugs/officer-blocks-its-event-loop-parsing-transcripts](todo/known-bugs/officer-blocks-its-event-loop-parsing-transcripts.md) - `2026-08-27` **Turn an ordinary chat into a commander or a bot, carrying its context along** — [agent-coordination/turn-a-chat-into-a-commander-or-a-bot](todo/agent-coordination/turn-a-chat-into-a-commander-or-a-bot.md) @@ -80,4 +81,3 @@ the owner's OS user and can never be granted. Indirection there really is accide - `2026-08-27` **The calendar/contacts skill has never been exercised by an actual agent** — [known-bugs/calendar-skill-never-used-by-an-agent](todo/known-bugs/calendar-skill-never-used-by-an-agent.md) - `2026-08-27` **Setting up a phone for calendar and contacts should be one link inside Officer, not a manual account form** — [mobile-apps/setting-up-a-phone-should-be-a-link-in-the-app](todo/mobile-apps/setting-up-a-phone-should-be-a-link-in-the-app.md) - `2026-08-27` **Marketplace: browse by tag — filter list, card grid, detail with a back button** — [plugin-ecosystem/marketplace-browse-by-tag](todo/plugin-ecosystem/marketplace-browse-by-tag.md) -- `2026-08-25` **An affordance: a scoped agent warns when a request lands outside its scope** — [affordances/an-affordance-a-scoped-agent-warns-on-the](todo/affordances/an-affordance-a-scoped-agent-warns-on-the.md) diff --git a/todo/known-bugs/radicale-cannot-be-installed-on-macos.md b/todo/known-bugs/radicale-cannot-be-installed-on-macos.md new file mode 100644 index 00000000..25cbd9c7 --- /dev/null +++ b/todo/known-bugs/radicale-cannot-be-installed-on-macos.md @@ -0,0 +1,54 @@ +--- +id: known-bugs/radicale-cannot-be-installed-on-macos +title: 'caldav retries `brew install radicale` on every boot, and there is no such formula' +theme: known-bugs +status: open +created: 2026-09-22 +date_source: stated +order: 8 +--- + +**On macOS, caldav fails its own dependency install on every single boot**, logging a line that reads like +a transient error and is permanent: + +``` +[caldav] radicale install failed (exit 1): … Warning: No available formula with the name "radicale". +``` + +Confirmed on `macbookpro` (macOS 26.6.2) 2026-09-22 — four consecutive boots, four identical failures. + +**Two things are wrong and only one is caldav's.** `plugins/caldav/manifest.ts` declares +`packages: { apt, pacman, dnf }` with **no `brew` entry**, so the installer falls back to the binary name +and runs `brew install radicale`. And the fallback cannot succeed anyway: **radicale is not a Homebrew +formula.** It is a Python application, installed with `pipx install radicale` or `uv tool install radicale`. +Homebrew's suggestion in the log — "Did you mean radicle or cadical?" — is two unrelated projects. + +So the manifest has nothing correct to put in a `brew` field, which is the actual gap: +`PackageManager` is `'apt' | 'pacman' | 'dnf' | 'brew'` (`plugins/manifest.ts`). There is no way to express +"this comes from pipx", and no way to say "not available on this platform" — so the only outcomes are a +wrong guess retried forever, or silence. + +Consequences, in order of how much they matter: caldav does not work on that machine at all (no calendars, +no contacts — the manifest's own `reason` says so); the failure repeats every boot with no backoff and no +memory; and the log line is indistinguishable from something worth chasing, which is how it cost a +debugging session that had been opened about something else entirely. + +Worth deciding rather than patching: either `PackageManager` grows a `pipx`/`uv` member, or +`osDependencies` grows a way to declare a platform where a binary is genuinely unavailable, so the +installer can say it once and stop. + +--- + +**Found alongside, and NOT a bug — recorded so the next person does not chase it.** The same log carried +`[plugins] frontend rebuild failed: ResolveMessage: Could not resolve: "motion/react"`, which looked like +the real failure and was already over. It appeared on exactly one boot: the m3e-canvas plugin had landed on +disk before `plugins/node_modules/motion` existed. Verified on the machine afterwards — `motion` is listed +in the generated `plugins/package.json`, installed, and `import('motion/react')` resolves with 398 exports; +the current boot rebuilds cleanly. + +**The gap it exposes is real even though it healed.** `installNpmDependencies` is called from exactly one +place, `plugins/install.ts`, the install flow. Boot (`plugins/mount.ts`) rebuilds the plugin frontend and +never installs anything. So a plugin that reaches `plugins/` without that flow completing — cloned by hand, +or an install interrupted — leaves every subsequent boot failing the rebuild with a message that says +_"Maybe you need to bun install"_ while nothing ever will. Here the install finished and the next boot was +fine; on a machine where it does not, the platform cannot recover on its own.