Files
onyx/docs/spikes/D-appgroup.md
Guido Schmit 41ee3cc174 Phase 0: Repo-Gerüst und vier Verifikations-Spikes
Vier Annahmen des Plans vor jedem Implementierungscode geprüft:

A (SMC):  Lüftersteuerung bestätigt — F0md/F1md (klein!) als Auto/Manuell-
          Umschalter, F0Tg als Ziel, Grenzen aus F0Mn/F0Mx. SMC-Integer sind
          little-endian, nicht big-endian wie im verbreiteten Intel-Beispielcode.
          Ladelimit: CHWA/CH0B/CH0C/bfE0/bfF0 existieren auf Mac17,9 nicht.
          Key noch nicht identifiziert, deshalb smc-diff.sh für eine
          Differenzmessung ohne jeden Schreibzugriff.
B (Media): mediaremote-adapter läuft unter 26.6.1, aus dem Quellcode gebaut.
          Liefert vollständige Metadaten inkl. Cover aus Google Chrome — der
          Fall, den AppleScript nicht erreicht.
C (Audio): Process Tap + privates Aggregate-Device liefern echte Samples
          (469 Callbacks/5 s, 0 stille Puffer). Konflikt gefunden: SoundSource
          6.1.1 mit ARK.driver ist bereits installiert.
D (Group): App-Group-Container ist aus einem nicht-sandboxed Prozess erreichbar.
          Damit trägt die Sandbox-Entscheidung, die Bridge-App entfällt.

Spikes sind Wegwerfcode zur Verifikation, kein Produktionscode.
2026-08-10 16:47:54 +02:00

46 lines
2.0 KiB
Markdown

# Spike D — App-Group-Container ohne Sandbox
Gemessen am 10.08.2026. Werkzeug: `Spikes/appgroup-probe.swift`,
gebaut und signiert über `Spikes/build-appgroup-probe.sh`.
## Ergebnis: bestätigt
Ein **nicht sandboxed** Prozess, signiert mit `Apple Development (PP34X97WS3)` und der
Entitlement `com.apple.security.application-groups`, erhält den Container:
```
/Users/scarriffle/Library/Group Containers/PP34X97WS3.group.com.scarriffleservices.calendarr
```
- `containerURL(forSecurityApplicationGroupIdentifier:)` liefert einen Pfad, nicht `nil`
- Schreibzugriff vorhanden
- `CFNotificationCenterAddObserver` auf dem Darwin-Center registriert ohne Fehler
Damit ist die Kernannahme des Plans belegt: Onyx kann nicht-sandboxed sein — und damit
IOKit, den privilegierten Helper und den MediaRemote-Adapter nutzen — **und** trotzdem den
Calendarr-Snapshot über `CalendarrCore` lesen. Die Bridge-App als Rückfalloption entfällt.
## Zustand des Containers
```
.com.apple.containermanagerd.metadata.plist
Library/
```
Kein `widget-cache.json`. Die Calendarr-Mac-App ist auf dieser Maschine noch nie gelaufen,
`SnapshotStore().read()` wird also korrekt `.neverWritten` liefern. Das ist der erste Zustand,
den das Kalender-Widget behandeln muss, und der einzige, der sich derzeit real testen lässt.
Anmerkung: das Verzeichnis existierte vor diesem Spike nicht — `containermanagerd` legt es beim
ersten Zugriff an. Ein vorhandener Container ist also **kein** Beleg dafür, dass Calendarr
jemals geschrieben hat. Genau deshalb ist `.neverWritten` ein eigener Zustand und nicht
„Datei fehlt".
## Offener Punkt
Der Spike signiert eine nackte Binary ohne Provisioning-Profil. Das App-Bundle bekommt von
Xcode ein eingebettetes Profil — das ist der weniger strenge Fall, der Zugriff kann dort nicht
schlechter sein. Beim ersten echten Build wird trotzdem gegengeprüft, dass `containerURL`
nicht `nil` ist; das ist laut Integrationsanleitung der Fehler, der sich sonst als leere App
ohne jede Meldung zeigt.