diff --git a/AGENTS.md b/AGENTS.md index d16a4a4..59901f8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -183,6 +183,13 @@ the linked documents — this file points, it does not duplicate. > unreasonably large, say so explicitly instead of leaving it silently undone. This rule exists > because the two had already drifted six days apart once (see section A). +> **Apple-Regel (binding, stated by the owner 2026-09-06):** anything that needs an **Xcode run** or +> the **Apple Developer Portal** is tracked in [`APPLE_DEV_BACKLOG.md`](APPLE_DEV_BACKLOG.md) — in +> the same session it comes up, not in a report note and not only here. Runs are **batched**: they +> start only when a worthwhile amount has accumulated, and that call is the owner's. Never start one, +> and never treat a single native change as a reason to. What ships without Xcode does not belong in +> that file: app UI travels in the OTA bundle, panel and backend in the integration's self-update. + **How this file is loaded:** Claude Code does not read `AGENTS.md` natively; the root `CLAUDE.md` imports it via `@AGENTS.md` (official recommended pattern). Other agents (Codex, Cursor, Copilot) read `AGENTS.md` directly. Edit content here, not in `CLAUDE.md`. @@ -252,6 +259,8 @@ assets. Never mix these the other way around. 4. `COMPANION_APP_ARCHITECTURE.md` — authoritative for DataMetric360 (decided, phases 1–10 built) 5. `AUDIT_2026-08-10.md` — accessibility/platform audit of the panel (partly done, rest below) 6. `bauauftrag.md` — **historical only**; code has diverged (see SPECIFICATION.md §7) +7. `APPLE_DEV_BACKLOG.md` — everything waiting on an Xcode run or the Apple portal, and the + measured state of the shipped `.ipa`; read it before touching anything iOS-native ## The three projects in this repo @@ -12498,6 +12507,9 @@ selbst ist längst deckungsgleich (13px, `.01em`, `text-transform:none`, ## DH. Die ausgelieferte .ipa registriert zwei eigene Plugins nicht (2026-09-06) +> **Der offene Punkt daraus wird jetzt in [`APPLE_DEV_BACKLOG.md`](APPLE_DEV_BACKLOG.md) (A1) geführt.** Dieser Abschnitt bleibt +> als Untersuchungsbericht stehen; gepflegt wird der Zustand dort, nicht hier. + Gemessen am veroeffentlichten Artefakt, nicht am Projekt - die Regel aus Abschnitt AK. Entpackt aus `companion-app/auslieferung/App.ipa` (Stand `2026.9.4.17`, aus Commit `9652a43`): diff --git a/APPLE_DEV_BACKLOG.md b/APPLE_DEV_BACKLOG.md new file mode 100644 index 0000000..c1136d6 --- /dev/null +++ b/APPLE_DEV_BACKLOG.md @@ -0,0 +1,142 @@ +# Apple Dev Backlog (DM360) + +Alles, was einen **Xcode-Lauf** oder das **Apple Developer Portal** braucht, +wird hier gesammelt - und nur hier. + +**Warum:** ein Xcode-Lauf lohnt sich nicht für eine einzelne native Änderung. +Er wird erst gestartet, wenn eine nennenswerte Menge zusammengekommen ist; die +Entscheidung darüber trifft der Eigentümer, nicht eine Sitzung. + +## Arbeitsregel (verbindlich) + +* Jede Aufgabe, die Xcode oder das Apple-Portal braucht, kommt **in diese + Datei**, in derselben Sitzung, in der sie auffällt - nicht in eine Notiz im + Bericht und nicht nur in `AGENTS.md`. +* **Nichts davon wird von sich aus gestartet.** Ein Xcode-Lauf ist eine + Handlung des Eigentümers am Mac; eine Sitzung bereitet ihn vor und meldet, + wenn sich genug angesammelt hat. +* Was **ohne** Xcode geht, gehört nicht hierher: Änderungen an der Oberfläche + der App reisen im OTA-Bündel (`@capgo/capacitor-updater`), Änderungen am Panel + und am Backend über die Selbstaktualisierung der Integration. Nur nativer + Code, Plugins, Berechtigungen, Signatur und Auslieferungsweg brauchen einen + Lauf. +* Erledigtes wird **nicht gelöscht**, sondern nach unten unter „Erledigt" + verschoben - mit der Fassung, in der es ausgeliefert wurde. Sonst wird + dieselbe Frage in einem halben Jahr wieder aufgemacht. + +--- + +## Stand der ausgelieferten App + +Gemessen am Artefakt `companion-app/auslieferung/App.ipa`, nicht aus dem +Gedächtnis (06.09.2026): + +| | | +|---|---| +| Fassung | **2026.9.4.17** (Build 1), App und Erweiterung gleich | +| Bundle-ID | `app.datametric360`, Erweiterung `app.datametric360.teilen` | +| Profile | beide Ad Hoc, **2 Geräte**, gültig bis **2027-08-29** | +| Berechtigungen | Standort, Kalender (beide Schlüssel), Kamera - alle vorhanden | +| `packageClassList` | **6 Klassen - beide eigenen Plugins fehlen** | + +Zum Vergleich: das Repository steht auf `2026.9.6.5`. Der Abstand ist **kein** +Rückstand - alles dazwischen war Oberfläche und Backend und reist über OTA. Was +wirklich auf einen Lauf wartet, steht unten. + +--- + +## A. Wartet auf einen Xcode-Lauf + +### A1. Zwei eigene Plugins sind auf dem Telefon tot + +**Auswirkung: Zwischenablage und Kalendereintrag funktionieren nicht.** Das ist +die einzige Position mit sichtbarem Ausfall. + +Capacitor 8 registriert ausschließlich, was in `packageClassList` der +`capacitor.config.json` im Bündel steht (`CapacitorBridge.swift`, +`registerPlugins()`). Diese Liste erzeugt `cap sync` aus den installierten +npm-Paketen - app-eigene Plugins sind keine. Beide Klassen liegen nachweislich +im Programm der ausgelieferten `.ipa` und werden trotzdem nie registriert. + +*Korrektur liegt im Repo* (`a99ae43`): `ios-teilen-einrichten.mjs` trägt die +Klassen nach jedem `cap sync` nach und liest ihre Namen aus den Swift-Dateien +selbst, damit sie nicht an zwei Stellen gepflegt werden. `ios-signieren.sh` +**bricht ab**, wenn eine davon im fertigen Bündel fehlt. + +Hintergrund vollständig: `AGENTS.md`, Abschnitt DH und CM. + +### A2. Installationslink ohne zweites Fragezeichen + +`ios-luftweg.sh` hängte den Cache-Brecher `?v=` auch an die Manifest-Adresse +**innerhalb** des `itms-services`-Links - damit steht dort ein zweites `?`, der +Abruf scheitert, und weil iOS die Rückfrage erst aus dem geladenen Manifest +baut, passiert sichtbar gar nichts. + +*Korrektur liegt im Repo* (`6365136`). Die bereits ausgelieferte +`auslieferung/index.html` wurde von Hand nachgezogen; das Skript zieht beim +nächsten Lauf nach. Hintergrund: `AGENTS.md`, Abschnitt CK. + +--- + +## B. Wartet auf das Apple Developer Portal + +Derzeit **nichts offen.** App-Gruppe, beide App-IDs und die Gerätefreigabe sind +eingerichtet (Abschnitt AK), die Profile laufen bis 2027-08-29. + +Vorzumerken, aber noch lange hin: + +* **2027-07-17** - das Entwicklerzertifikat läuft ab. +* **2027-08-29** - beide Bereitstellungsprofile laufen ab. +* Ein **neues Gerät** braucht eine Registrierung im Portal *und* frisch + ausgestellte Profile. Ein bereits ausgestelltes Profil erfährt von einem neuen + Gerät nichts - deshalb räumt `ios-signieren.sh` die zwischengespeicherten + Profile vor dem Bauen weg (Abschnitt AI). + +--- + +## C. Nach dem Lauf zu prüfen + +Am **fertigen Bündel**, nicht am Projekt. Die Begründung steht in Abschnitt AK: +von fünf Fehlern der nativen Hülle haben vier einen erfolgreichen Archivlauf +erzeugt und sind erst am entpackten `.ipa` aufgefallen. + +Das Skript prüft selbst und bricht ab, wenn etwas fehlt: + +1. Die Erweiterung hat ein echtes Programm. +2. App und Erweiterung tragen dieselbe `CFBundleShortVersionString` **und** eine + brauchbare `CFBundleVersion` (ohne die lehnt iOS die Installation der ganzen + App ab - Abschnitt CD). +3. Die App-Gruppe steht in den Entitlements **beider** Ziele. +4. Beide eigenen Plugin-Klassen stehen in `packageClassList`. + +**Von Hand bleibt genau eine Prüfung** - auf dem Gerät: einen Beleg über das +Teilen-Blatt schicken, ein PDF aus der Zwischenablage einfügen, einen +Kalendereintrag anlegen. Ob die Plugins *registriert* sind, sagt Punkt 4; ob sie +*tun*, was sie sollen, sagt nur das Telefon. + +--- + +## Was der Lauf von selbst erledigt + +Damit es niemand ein zweites Mal von Hand macht: `ios-signieren.sh` trägt bei +jedem Lauf Standort-, Kalender- und Kamera-Berechtigung ein, richtet die +Share-Erweiterung ein, spielt das App-Symbol ein und setzt die Versionsnummern +in beide Ziele. Das muss sein, weil `companion-app/ios/` gitignored ist und von +`npx cap add ios` jederzeit neu erzeugt wird - alles, was man in Xcode +anklickt, wäre danach weg (Abschnitt AI). + +Unvermeidlich von Hand bleiben: die einmalige Portal-Einrichtung, das +Schlüsselbund-„Immer erlauben" beim ersten Signieren, und `git push` der +fertigen `.ipa`, weil das Telefon sie aus dem Repository lädt. + +--- + +## Erledigt + +| Fassung | Was | +|---|---| +| 2026.9.4.17 | Kamera-Berechtigung für den QR-Scanner | +| 2026.9.4.7 | `CFBundleVersion` in beiden Bündeln - die App war vorher nicht installierbar | +| 2026.9.4.5 | Versionsnummern von App und Erweiterung angeglichen | +| 2026.9.2.7 | Share-Erweiterung, Zwischenablage- und Kalender-Plugin gebaut und signiert | +| 2026.8.30.8 | Erste signierte `.ipa`, Luftweg über Gitea eingerichtet |