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:
Guido Schmit
2026-08-10 16:47:54 +02:00
commit 41ee3cc174
11 changed files with 1085 additions and 0 deletions

62
Spikes/smc-diff.sh Executable file
View File

@@ -0,0 +1,62 @@
#!/bin/bash
# Spike A, Teil 2 — SMC-Differenzmessung
#
# Identifiziert den Ladelimit-Key, ohne je in den SMC zu schreiben: zwei
# vollständige Dumps vergleichen, zwischen denen macOS selbst die Ladegrenze
# umgestellt hat.
#
# Ablauf:
# ./smc-diff.sh vorher # Ladegrenze AUS
# (in den Systemeinstellungen umschalten, ~30 s warten)
# ./smc-diff.sh nachher # Ladegrenze AN
# ./smc-diff.sh vergleich
#
# Lesend. Dieses Skript ruft nur smc-dump auf, das keinen Schreibpfad besitzt.
set -euo pipefail
DIR="${TMPDIR:-/tmp}/onyx-smc-diff"
DUMP="${DUMP:-/tmp/smc-dump}"
mkdir -p "$DIR"
if [[ ! -x "$DUMP" ]]; then
echo "smc-dump nicht gefunden unter $DUMP" >&2
echo "Bauen mit: xcrun swiftc -O Spikes/smc-dump.swift -o /tmp/smc-dump" >&2
exit 1
fi
# Werte, die sich ohnehin ständig ändern — sie würden die Differenz zumüllen.
# Temperaturen (T*), Lüfter (F*), Leistung (P*), Spannungen/Ströme und Zähler.
RAUSCHEN='^ (T|F[0-9]|P[A-Z]|V|I|B0A|B0R|BRSC|CH0V|CHA|CHB|CHI[0-9]|CHNI|MSS|D[0-9])'
snapshot() {
"$DUMP" --all | awk '/ALLE KEYS/,0' | grep -E '^ [A-Za-z#]' \
| grep -vE "$RAUSCHEN" | sort > "$DIR/$1.txt"
echo "$DIR/$1.txt ($(wc -l < "$DIR/$1.txt" | tr -d ' ') Keys nach Rauschfilter)"
}
case "${1:-}" in
vorher|nachher)
echo "Nehme Snapshot '$1' auf …"
snapshot "$1"
[[ "$1" == "vorher" ]] && echo "Jetzt die Ladegrenze in den Systemeinstellungen umschalten, dann: $0 nachher"
;;
vergleich)
for f in vorher nachher; do
[[ -f "$DIR/$f.txt" ]] || { echo "Snapshot '$f' fehlt." >&2; exit 1; }
done
echo "Geänderte Keys zwischen 'vorher' und 'nachher':"
echo "────────────────────────────────────────────────────────────────"
if diff "$DIR/vorher.txt" "$DIR/nachher.txt" | grep -E '^[<>]'; then
echo
echo "Ein Key, der hier auftaucht und nach CH*/bf*/AC* aussieht, ist der Kandidat."
else
echo "Keine Unterschiede — wurde die Einstellung wirklich umgeschaltet?"
echo "Manche Änderungen brauchen bis zu einer Minute, bis der SMC sie übernimmt."
fi
;;
*)
sed -n '2,14p' "$0" | sed 's|^# \{0,1\}||'
exit 1
;;
esac