fix(mac): herstel de logmap bij elke boot #281

Merged
janpeter merged 2 commits from fix/mac-log-dir-boot-repair into main 2026-10-04 20:53:03 +02:00
Owner

Wat

jp-ops-projections (de root-taak die bij elke boot en bij elke deploy draait) zet /Library/Logs/jpvisser terug op root:_jpops 0770.

Waarom

Een macOS-update bouwt /Library/Logs opnieuw op. Bij de herstart daarna maakt launchd de map voor de root-daemons aan als root:wheel zonder groepstoegang. De drie _jpops-diensten stoppen dan met exit 78 (EX_CONFIG) voordat de launcher draait, omdat launchd hun logbestanden niet kan openen. Er verschijnt dus ook geen logregel.

Gezien op de Mac-productiehost na de update naar macOS 27.0.1 (2026-10-01 01:42): mac-prod gaf 502 tot de rechten op 2026-10-04 met de hand waren hersteld. Dat launchd de map zelf terugzet is afgeleid uit de eigenaar, de rechten en de tijdstempels; het systeemlog van dat moment gaf er geen regels over.

Hoe

  • opsprojection.Host.RepairLogDir: maakt de map aan als hij ontbreekt, zet 0770 en root:_jpops. Een symlink of ander niet-map-object op die plek wordt geweigerd.
  • main.go roept dit aan bij write en refresh-boot, los van de projecties: een fout in de logmap blokkeert geen deploy, en een verouderde projectie houdt het herstel niet tegen.
  • README: de regel bij ops-boot-projection beschrijft het gedrag.

De diensten hebben KeepAlive met een interval van tien seconden, dus ze komen vanzelf op zodra de map klopt.

Getest

  • Twee nieuwe tests (map ontbreekt, map zonder groepstoegang, symlink geweigerd); eerst rood gezien, daarna groen.
  • go build ./... && go test ./... in deploy/mac-production/go: groen.
  • Niet getest: een echte boot op de Mac met een verkeerde map. Dat kan pas na install van een release met deze wijziging.

Uitrol

deploy-ops-release.sh install installeert jp-ops-projections mee; er is geen aparte stap nodig.

🤖 Generated with Claude Code

## Wat `jp-ops-projections` (de root-taak die bij elke boot en bij elke deploy draait) zet `/Library/Logs/jpvisser` terug op `root:_jpops 0770`. ## Waarom Een macOS-update bouwt `/Library/Logs` opnieuw op. Bij de herstart daarna maakt launchd de map voor de root-daemons aan als `root:wheel` zonder groepstoegang. De drie `_jpops`-diensten stoppen dan met exit 78 (`EX_CONFIG`) voordat de launcher draait, omdat launchd hun logbestanden niet kan openen. Er verschijnt dus ook geen logregel. Gezien op de Mac-productiehost na de update naar macOS 27.0.1 (2026-10-01 01:42): `mac-prod` gaf 502 tot de rechten op 2026-10-04 met de hand waren hersteld. Dat launchd de map zelf terugzet is afgeleid uit de eigenaar, de rechten en de tijdstempels; het systeemlog van dat moment gaf er geen regels over. ## Hoe - `opsprojection.Host.RepairLogDir`: maakt de map aan als hij ontbreekt, zet `0770` en `root:_jpops`. Een symlink of ander niet-map-object op die plek wordt geweigerd. - `main.go` roept dit aan bij `write` en `refresh-boot`, los van de projecties: een fout in de logmap blokkeert geen deploy, en een verouderde projectie houdt het herstel niet tegen. - README: de regel bij `ops-boot-projection` beschrijft het gedrag. De diensten hebben `KeepAlive` met een interval van tien seconden, dus ze komen vanzelf op zodra de map klopt. ## Getest - Twee nieuwe tests (map ontbreekt, map zonder groepstoegang, symlink geweigerd); eerst rood gezien, daarna groen. - `go build ./... && go test ./...` in `deploy/mac-production/go`: groen. - Niet getest: een echte boot op de Mac met een verkeerde map. Dat kan pas na `install` van een release met deze wijziging. ## Uitrol `deploy-ops-release.sh install` installeert `jp-ops-projections` mee; er is geen aparte stap nodig. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(mac): herstel de logmap bij elke boot
All checks were successful
CI / Select checks (pull_request) Successful in 17s
CI / Ops-agent checks (pull_request) Successful in 44s
CI / DB access operator (pull_request) Successful in 1m16s
CI / Deploy artifact checks (pull_request) Successful in 36s
CI / Docker image build (pull_request) Successful in 1m23s
CI / Root app checks (pull_request) Successful in 9m47s
CI / Mac foundation hermetic checks (pull_request) Successful in 2m13s
CI / Required checks (pull_request) Successful in 35s
974126c763
Een macOS-update bouwt /Library/Logs opnieuw op. launchd maakt de map daarna
voor de root-daemons aan als root:wheel zonder groepstoegang, waarna de drie
_jpops-diensten met exit 78 (EX_CONFIG) stoppen voordat de launcher draait:
hun logbestanden kunnen niet worden geopend. Gezien na de update naar 27.0.1
op 2026-10-01; mac-prod lag eruit tot de rechten met de hand waren hersteld.

jp-ops-projections zet de map nu bij write en refresh-boot terug op
root:_jpops 0770. Een symlink op die plek wordt geweigerd.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

REQUEST_CHANGES

Findings:

  • error — deploy/mac-production/go/cmd/jp-ops-projections/main.go:60 — return logErr geeft ook na een succesvolle Host.Write exitcode 1 als logmapherstel faalt (bijvoorbeeld een geweigerde symlink of chmod/chown-fout). deploy-ops-release.sh:349-358 behandelt die exitcode als mislukte projectieschrijfactie: current wordt teruggezet en services worden niet herstart. Een blijvende logmapfout laat vervolgens ook de rollback-opdracht als mislukt eindigen. Dit maakt logmapherstel alsnog blokkerend voor deploy, in strijd met de expliciete intentie op regel 48. Meld de logmapfout afzonderlijk zonder een succesvolle write te laten falen, en voeg dekking toe voor succesvolle projecties met falend logmapherstel.

geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Context: de actieve optie-C-deployketen is beoordeeld volgens het ADR mac-foundation-reproduceerbaarheid-vervalt. Het README beschrijft het herstel en de nieuwe unit-tests dekken aanmaak, permissies en symlinkweigering, maar niet bovengenoemde CLI/deploy-foutcombinatie.

Verificatie: PR-head bevestigd als 974126c763189b7b04403000d38b89d2cf662a00; rollback bij niet-nul writer-exit bevestigd met het echte deployscript tegen een tijdelijke hostfixture. Go-tests niet uitgevoerd wegens ontbrekende Go-toolchain; Vitest-dependencies ontbreken eveneens. Geen macOS-bootproef uitgevoerd.

# REQUEST_CHANGES Findings: - **error — deploy/mac-production/go/cmd/jp-ops-projections/main.go:60** — `return logErr` geeft ook na een succesvolle `Host.Write` exitcode 1 als logmapherstel faalt (bijvoorbeeld een geweigerde symlink of chmod/chown-fout). `deploy-ops-release.sh:349-358` behandelt die exitcode als mislukte projectieschrijfactie: `current` wordt teruggezet en services worden niet herstart. Een blijvende logmapfout laat vervolgens ook de rollback-opdracht als mislukt eindigen. Dit maakt logmapherstel alsnog blokkerend voor deploy, in strijd met de expliciete intentie op regel 48. Meld de logmapfout afzonderlijk zonder een succesvolle `write` te laten falen, en voeg dekking toe voor succesvolle projecties met falend logmapherstel. geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. Context: de actieve optie-C-deployketen is beoordeeld volgens het ADR `mac-foundation-reproduceerbaarheid-vervalt`. Het README beschrijft het herstel en de nieuwe unit-tests dekken aanmaak, permissies en symlinkweigering, maar niet bovengenoemde CLI/deploy-foutcombinatie. Verificatie: PR-head bevestigd als `974126c763189b7b04403000d38b89d2cf662a00`; rollback bij niet-nul writer-exit bevestigd met het echte deployscript tegen een tijdelijke hostfixture. Go-tests niet uitgevoerd wegens ontbrekende Go-toolchain; Vitest-dependencies ontbreken eveneens. Geen macOS-bootproef uitgevoerd.
Author
Owner

Bevinding klopt en is verwerkt in ea25c7ebc.

  • deploy-ops-release.sh zet current terug bij een niet-nul exit van write; return logErr maakte het logmapherstel dus blokkerend voor deploy en rollback.
  • opsprojection.Host.Run voert nu herstel en projectie uit. Een logmapfout gaat alleen als waarschuwing naar stderr; de exitcode volgt uitsluitend de projectie (bij write en bij refresh-boot).
  • Nieuwe tests: geslaagde write en refresh-boot met falend logmapherstel (launcher start daarna), en herstel van de logmap bij een falende projectie.
  • go build ./... && go test ./... in deploy/mac-production/go: groen. Geen macOS-bootproef.
Bevinding klopt en is verwerkt in `ea25c7ebc`. - `deploy-ops-release.sh` zet `current` terug bij een niet-nul exit van `write`; `return logErr` maakte het logmapherstel dus blokkerend voor deploy en rollback. - `opsprojection.Host.Run` voert nu herstel en projectie uit. Een logmapfout gaat alleen als waarschuwing naar stderr; de exitcode volgt uitsluitend de projectie (bij `write` en bij `refresh-boot`). - Nieuwe tests: geslaagde `write` en `refresh-boot` met falend logmapherstel (launcher start daarna), en herstel van de logmap bij een falende projectie. - `go build ./... && go test ./...` in `deploy/mac-production/go`: groen. Geen macOS-bootproef.
fix(mac): logmapfout laat write niet falen
All checks were successful
CI / Select checks (pull_request) Successful in 37s
CI / Ops-agent checks (pull_request) Successful in 41s
CI / DB access operator (pull_request) Successful in 1m34s
CI / Deploy artifact checks (pull_request) Successful in 21s
CI / Root app checks (pull_request) Successful in 5m46s
CI / Docker image build (pull_request) Successful in 3m38s
CI / Mac foundation hermetic checks (pull_request) Successful in 2m12s
CI / Required checks (pull_request) Successful in 18s
ea25c7ebcb
Review op #281: write gaf na een geslaagde projectie exit 1 terug als het
logmapherstel faalde. deploy-ops-release.sh zet current dan terug en herstart
niets, dus het herstel blokkeerde alsnog de deploy en ook de rollback.

Host.Run meldt een logmapfout nu alleen op stderr; de exitcode volgt
uitsluitend de projectie. Tests dekken een geslaagde write en refresh-boot met
falend herstel, en herstel bij een falende projectie.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

COMMENT

Findings:

  • info — deploy/mac-production/go/internal/opsprojection/opsprojection_test.go:311: de toegevoegde tests dekken ontbrekende/verkeerd geconfigureerde logmappen, symlink-weigering en de onafhankelijkheid van logherstel en projectiepublicatie. Onafhankelijke uitvoering van build/tests/vet was hier niet mogelijk: Go ontbreekt op de worker en de tijdelijk gedownloade, SHA-256-gecontroleerde Go 1.26.6-toolchain kan op de noexec-mount /tmp niet starten. De in de PR gemelde groene checks zijn daardoor niet bevestigd; een echte macOS-boot is evenmin geverifieerd. Daarom COMMENT.

Geen blokkerende findings bij statische beoordeling. Het herstel gebeurt vóór projectievalidatie; herstelproblemen blijven waarschuwingen zodat de bestaande deploy-rollbacksemantiek behouden blijft. De eigenaar en modus volgen het bestaande foundation-patroon. De README beschrijft de wijziging. Beoordeeld tegen de actieve optie-C-route en ADR mac-foundation-reproduceerbaarheid-vervalt; eisen uit de bevroren foundation-keten zijn geen blokkade voor deze PR.

geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

PR en head-SHA zijn via Forgejo gecontroleerd; de checkout-diff is exact gelijk aan de payload. git diff --check slaagt. Review geldt voor commit ea25c7ebcb82b008bb05381245e7b5c4b71afff1.

## COMMENT Findings: - **info** — `deploy/mac-production/go/internal/opsprojection/opsprojection_test.go:311`: de toegevoegde tests dekken ontbrekende/verkeerd geconfigureerde logmappen, symlink-weigering en de onafhankelijkheid van logherstel en projectiepublicatie. Onafhankelijke uitvoering van build/tests/vet was hier niet mogelijk: Go ontbreekt op de worker en de tijdelijk gedownloade, SHA-256-gecontroleerde Go 1.26.6-toolchain kan op de `noexec`-mount `/tmp` niet starten. De in de PR gemelde groene checks zijn daardoor niet bevestigd; een echte macOS-boot is evenmin geverifieerd. Daarom COMMENT. Geen blokkerende findings bij statische beoordeling. Het herstel gebeurt vóór projectievalidatie; herstelproblemen blijven waarschuwingen zodat de bestaande deploy-rollbacksemantiek behouden blijft. De eigenaar en modus volgen het bestaande foundation-patroon. De README beschrijft de wijziging. Beoordeeld tegen de actieve optie-C-route en ADR `mac-foundation-reproduceerbaarheid-vervalt`; eisen uit de bevroren foundation-keten zijn geen blokkade voor deze PR. geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. PR en head-SHA zijn via Forgejo gecontroleerd; de checkout-diff is exact gelijk aan de payload. `git diff --check` slaagt. Review geldt voor commit `ea25c7ebcb82b008bb05381245e7b5c4b71afff1`.
janpeter scheduled this pull request to auto merge when all checks succeed 2026-10-04 20:52:04 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Ops-dashboard!281
No description provided.