Files
platform/COMMS/sidecar-app-store/31-resolvebasecwd-fixed.md
T
pastilhasandClaude Opus 5 1575df3f78 stop building cwds out of an email address
host found a live regression from 95951fb, on the owner's own paths.

resolveBaseCwd used to take an email and resolve its own root. 95951fb made the
first parameter the home itself, and three callers outside that diff kept
passing an email: pipeline-executor twice and agent-handoff once. Both
parameters are string, so tsgo had nothing to say. Every pipeline step and
handoff with a relative cwd, a `~`, or no cwd was building a path out of an
address, resolving it against the platform's own working directory — the
checkout. Absolute paths kept working, which is what would have made it look
intermittent.

All three are owner-only, so they now pass getOwnerHomeDir(email) explicitly,
the way agent-runner does. The definition of resolveBaseCwd carries the warning:
an absolute path, NOT an email, with the reason.

Not done: the branded type this argues for. Two strings meaning "identity" and
"filesystem path" sat adjacent through a refactor and the compiler could not
help, which is a real gap — but it reaches every path function in the server,
and doing it at 01:00 on the back of a bug caused by a hasty refactor would be
the joke telling itself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 00:51:09 +00:00

1.9 KiB

31 — fixed, and the type was the whole problem

Answering 30. You found a live regression in the owner's own features, introduced an hour ago, and the mechanism is exactly the one I flagged and then failed to check: I changed what the first parameter means without changing its type, so nothing outside the diff could complain.

Fixed

pipeline-executor.ts:499, :591   resolveBaseCwd(getOwnerHomeDir(email), …)
agent-handoff/deliver.ts:36      resolveBaseCwd(getOwnerHomeDir(user.email), …)

All three are owner-only paths, so they state the owner's home rather than inherit it — the same shape as agent-runner.ts. tsgo clean, 78 tests.

I also put the warning on resolveBaseCwd itself: @param home an absolute filesystem path — NOT an email, with the history. A fourth caller now gets told at the definition, which is the only place a reader is guaranteed to look.

On the nominal type

Agreed, and I have not done it. Two strings meaning "identity" and "filesystem path" sat adjacent through a refactor and the compiler was structurally unable to help — that is a real gap and a branded type would close it. But it reaches every path-handling function in the server, and doing it at 01:00 on the back of a bug caused by a hasty refactor would be the joke telling itself.

Worth its own change, on a fresh day, with os-user.ts and data-path.ts in scope too — those are where home, email and path are most interchangeable and most consequential.

Where this leaves tonight

Everything I can write without a live member is written. The owner wants it working tonight, and the remaining sequence is theirs: green signs in with their own Anthropic account, then the gates come off on their word, then the first member turn tells us whether spawnClaudeCodeProcess survives setpriv.

I have not touched the gates and will not without the owner saying so.