client: name the three host facts that make a consumer's tests pass locally - #40
client: name the three host facts that make a consumer's tests pass locally#40iceteaSA wants to merge 1 commit into
Conversation
…ocally Each was found by a consumer shipping green and failing elsewhere: a connection file the daemon leaves at the default path, a suite defaulting into the operator's live config, and a bare `bun` run auto-installing the dependency whose absence the test exists to catch. The last one is measured rather than asserted -- compiled binaries have no auto-install, which is every consumer this client has.
|
The three facts are right and this is worth having in the README. I reproduced the one that is checkable from here, and it does not behave the way the text says. The asymmetry is real; the named symptom is notMeasured on bun 1.4.0, empty temp dir, an uninstalled public package: So your conclusion holds and your recommendation is sound — a bare It fails at BUILD, not at run. The README says the compiled loader gives It also strengthens the point rather than weakening it: a build-time refusal is louder and earlier than a runtime throw, so the compiled path is a better oracle than your text claims. The Both may be version-dependent, which is the argument for pinning the reading: I would add On the other twoThe connection-file one I can confirm from the other side. I shipped this exact defect in a Rust fixture earlier this week — a temp-dir override that took on macOS and Linux and silently did not on Windows, so the suite passed on two platforms while scanning the runner's real temp directory on the third. A fixture that redirects on some hosts and not others is worse than one that redirects on none, because it passes everywhere you can run it. The closing line is the transferable part
That generalises past this client and past testing. It is the same reason a green gate on my machine says nothing about a fork PR's CI, and the same reason a |
|
Correcting my own review above. I said the compiled loader "fails at BUILD, not at run". That is true of the shape I tested and false of the shape you meant, and the difference is the whole point. Both reproduce here, on bun 1.4.0: Same toolchain, opposite failure points, and yours is the one that matches a plugin or a path-imported client under a shipped host. My correction was scoped to my test rather than to your claim, which is the error I have been naming in other people's work all week. So the README should say which shape it means. I would name both, because the pair is more useful than either: a bare dep the compiler can see is refused early and loudly; one it cannot see survives the build and fails at import time in the consumer's process, which is exactly where a credential client cannot afford to fail. An instrument note, because it nearly manufactured a false confirmationMy first run of your shape returned this: Read casually that is "the compiled binary failed", which agrees with your conclusion — and it is not your mechanism at all. macOS SIGKILLs a freshly linked unsigned 64 MB binary; Worth adding to the README beside the third fact, since anyone reproducing this on macOS will hit it: sign the compiled probe, or you are measuring Gatekeeper. On #39Your follow-up there changes the shape of the packaging question rather than just supporting it, and I think you are right: documenting |
Docs only,
packages/client/README.md, +23 lines. Gate green.Three ways a consumer's suite passes on the machine that runs the vault and proves nothing. Each was found the same way — someone shipped green and failed elsewhere — so this is a record of observed traps, not anticipated ones.
The connection file at the default path. If the daemon runs on the box,
detectClaustrumConnectionfinds its socket whether or not a test arranged one. Two ofanthropic-auth's suites passed on my daemon's real connection file and went red on CI, which has none. The daemon leaving that file is a host fact; a test that does not force it absent is asserting my machine's state.Suites defaulting into
~/.config/opencode. Same PR, same day: tests resolving the real config path wrote lock files beside the operator's live credentials. Locally invisible, because the writes succeed.A bare
bunrun as a resolution oracle. This one I got wrong myself in #39 before testing it. The Bun CLI auto-installs a public dependency it cannot resolve — it needs only apackage.jsonin scope, nonode_modules— so a bare-CLI repro silently supplies the dependency whose absence is under test. A compiled binary has no auto-install:Same file, only the loader differs. Consumers of a credential client are daemons and plugins, so the compiled case is the one that matters and the convenient case is the one that gets tested.
I stated the shape rather than only the three instances, because the instances are not the useful part: the producing machine supplies the thing under test, so a passing check is evidence only once the ambient supply is removed. Naming that is what lets the next consumer recognise a fourth one.
Related to #39 but independent of it — this lands regardless of how the packaging question resolves.
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Summary by cubic
Adds a docs-only section to
packages/client/README.mdcataloguing three host-environment traps that make a consumer's tests pass locally and fail elsewhere.detectClaustrumConnectionwithout a test arranging one.~/.config/opencodewithout an override write lock files beside the operator's live credentials.bunrun auto-installs unresolvable public dependencies, while compiled binaries do not — sobun -eis not a valid oracle for module resolution.Written for commit 8a8512c. Summary will update on new commits.