Skip to content

fix: the install verb redacts its warnings, and no test touches /Applications - #53

Merged
REPPL merged 7 commits into
mainfrom
fix/lifecycle-captures
Sep 15, 2026
Merged

REPPL merged 7 commits into
mainfrom
fix/lifecycle-captures

Conversation

@REPPL

@REPPL REPPL commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Two lifecycle captures from the security review of #50

iss-2609120438396694 — gropius install printed error text unredacted. The quit, firewall and launch warnings and the nothing-to-repair line wrote the error as it came, home path inside it, and one of them redacted the destination on the same line while the error beside it was not. All four now pass through redact, the way the failure line always did. Held by TestInstallWarningsAreRedacted: three rows, each a seam answering with the home path inside a sentence somebody else wrote, watched red before the fix. CHANGELOG carries it under [Unreleased] → Fixed.

iss-2609120444017291 — a unit test created a file in the Mac's /Applications. The live install and update environments choose their destination by probing whether this account can write /Applications, and the tests that open the live-environment guard built those environments, so the suite wrote into the machine's applications directory and raced the installer tripwire in the merge queue (seen on #50). The probe is now a package variable, and allowLiveEnvInTest, the one door into the live environment inside a test, swaps it for an answer that touches nothing, restored on cleanup. Held by TestTheGuardCanBeOpenedForOneTest, red on this Mac before the fix. With the source closed, the tripwire's exemption for the probe's file name is removed, so it counts every entry again.

Gates. make test (race) green, 23 packages; gofmt -l . empty; go vet ./... clean; abcd docs lint 0 findings. Independent review: SHIP, with one minor finding (a vacuous test row) fixed in the last commit.

https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo

Four rows, each a seam answering with the home path inside a sentence
somebody else wrote, held to a report that prints none of them as they
came. Three are red before the fix (iss-2609120438396694).

Assisted-by: Claude:claude-fable-5-1
Claude-Session: https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo
…home

The quit, firewall and launch warnings and the nothing-to-repair line
printed the error text as it came, and one of them redacted the
destination on the same line while the error beside it was not. All
four now pass the text through redact, the way the failure line always
did. The refusal at the top of RunInstall stays as it is: it is the
live-environment guard's own sentence or a home directory that could
not be resolved, and neither carries a path of this account's
(iss-2609120438396694).

Assisted-by: Claude:claude-fable-5-1
Claude-Session: https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo
With the guard open, the live install environment's destination is this
account's own on every Mac, and the destination probe answers without
asking. Red before the fix on a Mac whose /Applications is writable,
which is every CI runner (iss-2609120444017291).

Assisted-by: Claude:claude-fable-5-1
Claude-Session: https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo
The live install and update environments choose their destination by
asking whether this account can write /Applications, which creates and
removes a file there; the tests that open the live-environment guard
built those environments, so a unit test wrote into the machine's
applications directory and raced the installer tripwire in the merge
queue. The probe is now a variable, and the one door into the live
environment inside a test swaps it for an answer that touches nothing,
restored when that test ends (iss-2609120444017291).

Assisted-by: Claude:claude-fable-5-1
Claude-Session: https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo
The exemption for the writability probe's file was a belt over a race
whose source is now closed: no test binary creates that file. A listing
that ignores nothing is the stronger tripwire.

Assisted-by: Claude:claude-fable-5-1
Claude-Session: https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo
Both issues move to resolved with their fixing commits; the changelog
carries the user-facing half under [Unreleased].

Assisted-by: Claude:claude-fable-5-1
Claude-Session: https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo
The review found the nothing-to-repair row vacuous: installedAt's
sentences carry no path, so the row passed on the destination already
redacted beside it. Three rows remain, each red without its fix.

Assisted-by: Claude:claude-fable-5-1
Claude-Session: https://claude.ai/code/session_01RooZgUESQnVnievtn48pHo
@REPPL
REPPL enabled auto-merge September 15, 2026 09:56
@REPPL
REPPL added this pull request to the merge queue Sep 15, 2026
Merged via the queue into main with commit 1cbc8cd Sep 15, 2026
6 checks passed
@REPPL
REPPL deleted the fix/lifecycle-captures branch September 15, 2026 15:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant