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.
This commit is contained in:
45
docs/spikes/D-appgroup.md
Normal file
45
docs/spikes/D-appgroup.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user