Zentrale Stelle fuer den aktuellen Stand: OFFEN.md und /stand

Ansage des Eigentuemers: ueber eine zentrale Datei bzw. einen zentralen Aufruf
muss immer klar sein, was aktuell zu tun ist.

OFFEN.md ist diese Datei. Sie nennt den Zustand, nicht die Geschichte, und
teilt sich die Arbeit mit den vorhandenen: AGENTS.md beantwortet WARUM etwas so
ist, APPLE_DEV_BACKLOG.md was davon Xcode oder das Portal braucht, OFFEN.md WAS
JETZT zu tun ist. Jeder Punkt sagt auch, was konkret zu tun ist - nicht nur,
dass etwas offen ist.

Gegliedert nach Zustaendigkeit statt nach Thema: was auf den Eigentuemer wartet
(Xcode-Lauf, Gitea-Token DM180, steuer.faellig), was eine Entscheidung braucht
(Uebersicht-Box Versicherung), was eine Sitzung bauen kann (PDF-Ablage,
Notizfeld, Dokumentendrift), was gemeldet aber nicht reproduzierbar ist, und
was bewusst so bleibt - letzteres, damit bekannte Grenzen nicht als Fehler
wiederkommen.

/stand (.claude/commands/stand.md) ist der zentrale Aufruf. Er misst den
mechanischen Teil selbst - Repo-Gleichstand, Manifest gegen OTA-Buendel samt
sha256, Fassung der ausgelieferten .ipa, ob die eigenen Plugins darin
registriert sind, und welche nativen Commits sich seit ihr angesammelt haben -
und liest OFFEN.md dazu. Dieser Teil kann deshalb nicht veralten. Probelauf
ausgefuehrt: er meldet korrekt 2026.9.6.5, Buendel passend, .ipa auf
2026.9.4.17 ohne die beiden eigenen Plugins, zwei native Commits wartend.

Verankert in CLAUDE.md (wird beim Sitzungsstart geladen) und als Punkt 0 der
Leseordnung in AGENTS.md.
This commit is contained in:
2026-09-07 12:04:48 +02:00
parent 979ea92ce7
commit 2bf1691fb8
4 changed files with 210 additions and 2 deletions
+70
View File
@@ -0,0 +1,70 @@
---
description: Zeigt den aktuellen Stand von DM360 - was zu tun ist, und ob Repo, Versionen und ausgelieferte App zusammenpassen.
---
Zeige den aktuellen Stand dieses Projekts. Zwei Teile: den **gemessenen**
(unten selbst nachrechnen, nie aus dem Gedächtnis) und den **gepflegten** (aus
`OFFEN.md`).
## 1. Messen
Führe genau diesen Block aus:
```bash
R=$(git rev-parse --show-toplevel) && cd "$R"
echo "== Repository =="
echo " Zweig $(git branch --show-current) | HEAD $(git rev-parse --short HEAD) | origin $(git rev-parse --short @{u} 2>/dev/null || echo '?')"
printf " Arbeitsbaum: "; [ -z "$(git status --porcelain)" ] && echo sauber || git status --short
echo "== Versionen =="
python - <<'PY'
import json, hashlib, pathlib, zipfile, plistlib, re
b = "custom_components/audi_dashboard/"
m = json.load(open(b + "manifest.json"))["version"]
print(f" Integration {m}")
try:
j = json.load(open(b + "frontend/app/bundle.json"))
z = pathlib.Path(b + "frontend/app/bundle.zip").read_bytes()
ok = j["version"] == m and hashlib.sha256(z).hexdigest() == j["sha256"] and len(z) == j["bytes"]
print(f" OTA-Buendel {j['version']} {'passt' if ok else 'PASST NICHT - npm run ota faellig'}")
except Exception as e:
print(" OTA-Buendel nicht lesbar:", e)
try:
zf = zipfile.ZipFile("companion-app/auslieferung/App.ipa")
n = zf.namelist()
p = plistlib.loads(zf.read([x for x in n if re.match(r"Payload/[^/]+\.app/Info\.plist$", x)][0]))
print(f" .ipa auf dem Telefon {p.get('CFBundleShortVersionString')}")
c = [x for x in n if re.match(r"Payload/[^/]+\.app/capacitor\.config\.json$", x)]
if c:
L = json.loads(zf.read(c[0])).get("packageClassList", [])
fehlt = [k for k in ("BelegZwischenablagePlugin", "KalenderTerminPlugin") if k not in L]
print(" eigene Plugins registriert:", "ja" if not fehlt else "NEIN - " + ", ".join(fehlt))
except Exception as e:
print(" .ipa nicht lesbar:", e)
PY
echo "== Wartet auf einen Xcode-Lauf =="
B=$(git log --format=%H -1 -- companion-app/auslieferung/App.ipa)
N=$(git log --oneline "$B..HEAD" -- companion-app/native/ companion-app/scripts/ios-*.sh companion-app/scripts/ios-*.mjs companion-app/capacitor.config.ts)
[ -z "$N" ] && echo " keine nativen Aenderungen seit der ausgelieferten .ipa" || echo "$N" | sed 's/^/ /'
```
## 2. Lesen
Lies danach `OFFEN.md`. Steht dort etwas unter „Wartet auf einen Xcode-Lauf",
oder meldet die Messung nicht registrierte Plugins, lies zusaetzlich
`APPLE_DEV_BACKLOG.md`.
## 3. Berichten
Kurz und in dieser Reihenfolge:
1. **Stimmt der mechanische Stand?** Nur melden, was *nicht* passt - Repo nicht
synchron, Buendel-Version abweichend, Pluginliste unvollstaendig, native
Aenderungen aufgelaufen. Passt alles, genuegt ein Satz.
2. **Was wartet auf den Eigentuemer** (Abschnitt 1 und 2 von `OFFEN.md`).
3. **Was eine Sitzung bauen koennte** (Abschnitt 3), mit einer Empfehlung.
Nenne die Punkte aus `OFFEN.md`, statt sie neu herzuleiten - und wenn dir beim
Messen etwas auffaellt, das dort fehlt, sag es und trage es nach.
**Starte nichts von selbst.** Ein Xcode-Lauf ist immer die Handlung des
Eigentuemers (Apple-Regel in `AGENTS.md`).
+3
View File
@@ -252,6 +252,9 @@ uploaded to Claude Design), while the HA panel and the future sideload-only app
assets. Never mix these the other way around.
**Reading order for a new session:**
0. **`OFFEN.md` — what is to be done right now.** The one file that names the current state;
`/stand` measures repo, versions and the shipped `.ipa` on top of it. This file here answers
*why*, `OFFEN.md` answers *what now*.
1. This file (overview + open items)
2. `UMSETZUNGSPLAN.md` — the step-by-step execution plan for all open items (13 phases with
commands and acceptance criteria); when working on an open item, follow the plan's phase
+8 -2
View File
@@ -2,10 +2,16 @@
## Claude Code
- `AGENTS.md` above is the single source of truth for project state, rules, and open items —
edit it there, keep this file as a thin shim.
- **`OFFEN.md` says what is to be done right now** — start there, not in AGENTS.md's 12,000
lines. `/stand` measures the mechanical half itself (repo, versions, shipped `.ipa`) and reads
`OFFEN.md` alongside it. Keep `OFFEN.md` current in the same session something changes.
- `AGENTS.md` above is the single source of truth for **why** things are as they are — history,
rules, and the record of decisions including rejected ones. Edit it there, keep this file a
thin shim.
- Remember the AGENTS.md maintenance rule: update it (in English) in the same session whenever
your changes affect anything it records.
- Anything needing **Xcode or the Apple Developer Portal** goes in `APPLE_DEV_BACKLOG.md`, and
runs are batched — never start one; that call is the owner's (Apple rule in AGENTS.md).
<!-- Claude Code does not read AGENTS.md natively; this import is the officially recommended
pattern (code.claude.com/docs/en/memory, "AGENTS.md" section). -->
+129
View File
@@ -0,0 +1,129 @@
# Was jetzt zu tun ist (DM360)
**Die eine Datei, die den aktuellen Stand nennt.** Wer wissen will, was ansteht,
liest hier - nicht in 12.000 Zeilen `AGENTS.md`.
Die drei Dateien teilen sich die Arbeit so:
| Datei | beantwortet |
|---|---|
| **`OFFEN.md`** (hier) | **Was ist zu tun?** |
| `APPLE_DEV_BACKLOG.md` | Was davon braucht Xcode oder das Apple-Portal? |
| `AGENTS.md` | **Warum** ist etwas so, wie es ist - die Geschichte, nicht der Zustand |
**Arbeitsregel (verbindlich):** diese Datei wird in **derselben Sitzung**
nachgeführt, in der sich etwas ändert - erledigt, dazugekommen, entschieden.
Eine Liste, die man erst am Monatsende pflegt, ist keine.
Aufruf: **`/stand`** prüft den mechanischen Teil selbst nach und liest diese
Datei dazu.
---
## 1. Wartet auf Sie
### 1.1 Ein Xcode-Lauf - **zwei Funktionen sind auf dem Telefon tot**
Zwischenablage und Kalendereintrag sind in der installierten App wirkungslos.
Beide Korrekturen liegen im Repository und warten nur auf einen Lauf.
*Was zu tun ist:* am Mac `companion-app/scripts/ios-signieren.sh` laufen lassen,
danach die fertige `.ipa` pushen (das Telefon lädt sie aus dem Repository). Das
Skript prüft sich selbst und bricht ab, wenn etwas fehlt; von Hand bleibt nur
die Probe auf dem Gerät.
Vollständig samt Begründung: **`APPLE_DEV_BACKLOG.md`**, Abschnitte A1 und A2.
### 1.2 Gitea-Token für den Laborzweig DM180
Nicht dieses Repository - der Laborzweig (`tobias/Data-Metric-180`, privat).
Seine Selbstaktualisierung zeigt seit dem 06.09.2026 auf das eigene Repository,
ihr fehlt nur noch der Zugang.
*Was zu tun ist:* in der Laborinstanz unter Einstellungen -> Geräte & Dienste ->
Audi Dashboard -> Konfigurieren einen Gitea-Token mit Lesezugriff eintragen.
### 1.3 `steuer.faellig` ist leer
Betriebsdaten, kein Code - die Kfz-Steuer hat kein Fälligkeitsdatum.
*Was zu tun ist:* in der App unter Mein Audi -> Versicherung/Steuer eintragen.
---
## 2. Wartet auf eine Entscheidung von Ihnen
### 2.1 Die Übersicht-Box „Versicherung/Steuer" neu gestalten
Seit dem 19.08.2026 vorgemerkt und **bewusst nicht begonnen**: Sie hatten
gesagt, Sie wüssten noch nicht, was Sie dort sehen wollen. Ein Entwurf ohne
diese Antwort wäre geraten.
*Was zu tun ist:* ein kurzes Gespräch darüber, was auf einen Blick sichtbar sein
soll und was auf die Detailseiten gehört. Danach wie üblich erst ein Muster,
dann Code.
---
## 3. Wartet auf eine Sitzung
Buildbar, ohne Rückfrage, in dieser Reihenfolge sinnvoll:
### 3.1 Versicherung: PDF der Vertragsdetails ablegen
Die Police als PDF an den Vertrag hängen und später wieder ansehen können.
*Was zu tun ist:* zuerst den Ablageort entscheiden - spiegelt es die vorhandene
Fotoablage unter `/config/audi_dashboard/`, oder wird es ein eigenes
Anhang-Konzept? Danach Dienst, Ablage und beide Oberflächen (Paritätsregel).
### 3.2 Versicherung: freies Notizfeld
Eine eigene Zusammenfassung zur Versicherung, aus keinem strukturierten Feld
abgeleitet.
*Was zu tun ist:* Profilfeld, Textfeld in beiden Oberflächen. Das Panel hat mit
`.feld--breit` bereits das Muster für ein Feld über die volle Breite.
### 3.3 Restliche Dokumentendrift
`SPECIFICATION.md`, `homeassistant/README.md` und die Profilvorlage nennen noch
den WLAN-Sensor, der am 12.08.2026 entfallen ist; dazu eine falsche Aussage über
Beispielzahlen in der Statistik und ein überholter TODO-Kommentar.
*Was zu tun ist:* reine Textkorrekturen, kein Code.
---
## 4. Gemeldet, aber nicht reproduzierbar
Beide mehrfach gesucht und **nicht gefunden**. Sie bleiben stehen, bis sie
wieder auftreten - raten hilft hier nicht.
* **Das Kartenebenen-Symbol im Standort-Blatt** wirkt fehlerhaft. Dreimal
geprüft (Markup, Funktion, gerechnete Farbwerte), jedes Mal deckungsgleich mit
dem Panel. *Was hilft:* ein Bildschirmfoto vom Gerät.
* **Die Batteriespannungs-Zeile lässt sich am Rechner nicht antippen.** Mit
Trefferpunkt-Prüfung, synthetischen und echten Klicks getestet - navigiert
jedes Mal korrekt. *Was hilft:* die Fensterbreite und ein Blick in die
Browser-Konsole im Moment des Fehlversuchs.
---
## 5. Bekannte Grenzen - bewusst so, nicht offen
Damit sie nicht als Fehler wiederkommen:
* **Der Fahrtbeginn liegt bis zu neun Minuten zu spät.** Der Dongle wacht erst
über den Beschleunigungssensor auf; die verschlafenen Kilometer holt die App
seit `2026.9.6.2` aus dem Kilometerstand zurück, den *Zeitpunkt*
zurückzurechnen haben Sie abgelehnt, solange es eine gerechnete statt
gemeldeten Zahl wäre.
* **Werkbank und Fahrzeug lassen sich nicht automatisch trennen.** Ein
Werkbank-Schalter wurde am 06.09.2026 angeboten und abgelehnt - Sie
entscheiden selbst, welche Messwerte bleiben, über das Wischen in der
Messwertliste. **Nicht erneut vorschlagen.**
* **Das Panel wird nicht gelöscht, sondern archiviert** - aber erst, wenn die App
es wirklich abgelöst hat. Heute nicht.
* **HACS ist ein Sackgassenweg**, dauerhaft: es lehnt private Repositories
kategorisch ab. `install.ps1` ist der einzige Installationsweg, die
Selbstaktualisierung der einzige Aktualisierungsweg.