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

2.0 KiB

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.