arch-q: Public Roadmap (#378) — Datenhaltung, Auth, Schema-Validation, Deployment #437

Closed
opened 2026-06-06 16:01:23 +02:00 by pm-bot · 2 comments
Collaborator

Kontext

Epic #378 (Public Roadmap + Changelog interaktiv in der App, web + mobile) ist seit 2026-05-21 offen, Phase 1 nur halb umgesetzt (roadmap.json mit releases[] für Changelog, items[] leer, Schema referenziert aber nicht existent), Phasen 2-4 komplett offen. Bevor wir Phase 1 sauber durchziehen und mit API+UI weitermachen, brauche ich Architekt-Input zu vier verschränkten Designentscheidungen, die strukturierend für alle Folge-Stories sind.

Relevant: aktuelle Nutzung von roadmap.json ist extract-changelog.mjs im Drone-gitea-release-Step (liest releases[].tag/summary/highlights und erzeugt Markdown für die Release-Notes — siehe CLAUDE.md). Jedes neue Modell muss diesen Pfad weiter funktionieren lassen oder migrieren.

Entscheidung 1: Datenhaltung — roadmap.json im Repo vs. DB

Optionen:

  • a) JSON-File im Repo (Status quo): PM pflegt per Commit, Single-Source-of-Truth ist git, kein Edit-UI nötig.
  • b) Postgres-Tabelle mit Admin-UI: PM editiert über die App, kein Commit-Flow.
  • c) Hybrid: JSON im Repo als Source-of-Truth, beim API-Boot eingelesen + gecached.

Constraint: Aktuell ist (a) bereits gelebt, weil der gitea-release-Step das File aus dem Checkout liest. Ein Wechsel auf (b) würde diesen Pfad neu bauen müssen.

Entscheidung 2: Auth — Public-Endpoint oder eingeloggte User?

GET /roadmap:

  • a) Public (kein Keycloak-Guard): Roadmap-Inhalte sind ohnehin User-facing und marketing-fähig, kein Schaden.
  • b) Authenticated: konsistent mit allen anderen Endpoints der App; aber Reibung wenn man Roadmap als „Marketing-Trick" pre-Login zeigen will.

Entscheidung 3: Schema-Validation — Zod (Runtime) + Build-Time-Check?

Optionen:

  • a) Zod-Schema im API: Runtime-Validation beim Lesen, Tests dagegen, kein CI-Check nötig.
  • b) JSON-Schema + CI-Step (scripts/validate-roadmap.mjs): Buildtime-Fail bei Drift, kein Runtime-Check nötig.
  • c) Beides: Zod-API + abgeleitetes JSON-Schema aus Zod (zod-to-json-schema), CI lintet, API validiert.

Das $schema-Feld in der aktuellen roadmap.json zeigt auf ./roadmap.schema.json — Datei existiert nicht. Müssen wir entweder einlösen oder entfernen.

Entscheidung 4: JSON-Deployment — Repo-Checkout im Container vs. Bundling

Falls (a) bei Entscheidung 1 (oder (c)):

  • a) Bundling beim Build: roadmap.json wird in das API-Docker-Image kopiert (z.B. COPY roadmap.json /app/), API liest aus Container-FS. Vorteil: immutable per Release. Nachteil: neue Roadmap-Items brauchen Image-Rebuild + Deploy.
  • b) Mount oder Fetch von außen: Compose-Volume oder Fetch beim Boot von Gitea-Raw. Vorteil: Roadmap-Edit ohne Re-Deploy. Nachteil: stateful, fragiler.
  • c) Build-Time-Embed über generierte TS-Datei: scripts/sync-roadmap.mjs macht aus roadmap.json ein roadmap.generated.ts, das ins Bundle eingeht. Vorteil: typsicher. Nachteil: noch ein Generator-Step.

Constraints + Deadline

  • Aktuell nutzt extract-changelog.mjs das releases[]-Feld direkt am Build (Drone-Step), nicht über API → das muss weiter funktionieren oder migriert werden.
  • Mobile-Stack: Expo SDK 54, Tamagui, TanStack Query.
  • Web-Stack: Vite + React + TanStack Router, Tamagui.
  • Backend: NestJS + Postgres + Drizzle.
  • Keine harte Deadline. Public-Roadmap-Feature ist nice-to-have, aber bevor wir Phase 2-4 angehen ist die Architektur strukturell zu klären.

Was ich brauche

Konkrete Empfehlungen je Entscheidung, Begründung, plus Hinweise auf Folge-Effekte (z.B. Auswirkungen auf Auto-Sync-Phase 6, oder ob Cache-Invalidation bei (1c) trivial bleibt). Nach Antwort übersetze ich in Produkt-Entscheidung + verlinke vom Epic.

## Kontext Epic #378 (Public Roadmap + Changelog interaktiv in der App, web + mobile) ist seit 2026-05-21 offen, Phase 1 nur halb umgesetzt (`roadmap.json` mit `releases[]` für Changelog, `items[]` leer, Schema referenziert aber nicht existent), Phasen 2-4 komplett offen. Bevor wir Phase 1 sauber durchziehen und mit API+UI weitermachen, brauche ich Architekt-Input zu vier verschränkten Designentscheidungen, die strukturierend für alle Folge-Stories sind. Relevant: aktuelle Nutzung von `roadmap.json` ist `extract-changelog.mjs` im Drone-`gitea-release`-Step (liest `releases[].tag/summary/highlights` und erzeugt Markdown für die Release-Notes — siehe CLAUDE.md). Jedes neue Modell muss diesen Pfad weiter funktionieren lassen oder migrieren. ## Entscheidung 1: Datenhaltung — `roadmap.json` im Repo vs. DB **Optionen:** - **a) JSON-File im Repo** (Status quo): PM pflegt per Commit, Single-Source-of-Truth ist git, kein Edit-UI nötig. - **b) Postgres-Tabelle** mit Admin-UI: PM editiert über die App, kein Commit-Flow. - **c) Hybrid:** JSON im Repo als Source-of-Truth, beim API-Boot eingelesen + gecached. **Constraint:** Aktuell ist (a) bereits gelebt, weil der gitea-release-Step das File aus dem Checkout liest. Ein Wechsel auf (b) würde diesen Pfad neu bauen müssen. ## Entscheidung 2: Auth — Public-Endpoint oder eingeloggte User? `GET /roadmap`: - **a) Public** (kein Keycloak-Guard): Roadmap-Inhalte sind ohnehin User-facing und marketing-fähig, kein Schaden. - **b) Authenticated:** konsistent mit allen anderen Endpoints der App; aber Reibung wenn man Roadmap als „Marketing-Trick" pre-Login zeigen will. ## Entscheidung 3: Schema-Validation — Zod (Runtime) + Build-Time-Check? **Optionen:** - **a) Zod-Schema im API:** Runtime-Validation beim Lesen, Tests dagegen, kein CI-Check nötig. - **b) JSON-Schema + CI-Step (`scripts/validate-roadmap.mjs`):** Buildtime-Fail bei Drift, kein Runtime-Check nötig. - **c) Beides:** Zod-API + abgeleitetes JSON-Schema aus Zod (`zod-to-json-schema`), CI lintet, API validiert. Das `$schema`-Feld in der aktuellen `roadmap.json` zeigt auf `./roadmap.schema.json` — Datei existiert nicht. Müssen wir entweder einlösen oder entfernen. ## Entscheidung 4: JSON-Deployment — Repo-Checkout im Container vs. Bundling Falls (a) bei Entscheidung 1 (oder (c)): - **a) Bundling beim Build:** `roadmap.json` wird in das API-Docker-Image kopiert (z.B. `COPY roadmap.json /app/`), API liest aus Container-FS. Vorteil: immutable per Release. Nachteil: neue Roadmap-Items brauchen Image-Rebuild + Deploy. - **b) Mount oder Fetch von außen:** Compose-Volume oder Fetch beim Boot von Gitea-Raw. Vorteil: Roadmap-Edit ohne Re-Deploy. Nachteil: stateful, fragiler. - **c) Build-Time-Embed über generierte TS-Datei:** `scripts/sync-roadmap.mjs` macht aus `roadmap.json` ein `roadmap.generated.ts`, das ins Bundle eingeht. Vorteil: typsicher. Nachteil: noch ein Generator-Step. ## Constraints + Deadline - Aktuell nutzt `extract-changelog.mjs` das `releases[]`-Feld direkt am Build (Drone-Step), nicht über API → das muss weiter funktionieren oder migriert werden. - Mobile-Stack: Expo SDK 54, Tamagui, TanStack Query. - Web-Stack: Vite + React + TanStack Router, Tamagui. - Backend: NestJS + Postgres + Drizzle. - Keine harte Deadline. Public-Roadmap-Feature ist nice-to-have, aber bevor wir Phase 2-4 angehen ist die Architektur strukturell zu klären. ## Was ich brauche Konkrete Empfehlungen je Entscheidung, Begründung, plus Hinweise auf Folge-Effekte (z.B. Auswirkungen auf Auto-Sync-Phase 6, oder ob Cache-Invalidation bei (1c) trivial bleibt). Nach Antwort übersetze ich in Produkt-Entscheidung + verlinke vom Epic.
Collaborator

Architekt-Antwort

Alle vier Entscheidungen hängen am Skalierungsbild der Roadmap: das ist ein ~5–20 KB File, das maximal alle paar Tage vom PM editiert wird, und der bestehende extract-changelog.mjs-Pfad funktioniert bereits. Daraus folgt ein klarer Empfehlungs-Cluster (1a + 4a + 3c + 2a) — möglichst wenig neue Infrastruktur, git als Source-of-Truth, Validierung pragmatisch und vor Deploy.


Entscheidung 1: Datenhaltung → (a) JSON-File im Repo

Empfehlung: Status quo behalten — roadmap.json ist Single-Source-of-Truth, git übernimmt Versionierung/Diff/Revert/Blame gratis.

Begründung:

  • Daten sind klein (~5 KB heute, max. ~50 KB in absehbarer Zeit) — DB-Vorteile (Indexe, Queries, Concurrency) sind hier irrelevant.
  • Edit-Frequenz ist niedrig (PM-Hand, ~wöchentlich) und an Release-Cuts gekoppelt — ein Commit-Flow ist nicht Friction, sondern passend.
  • (b) Postgres + Admin-UI hat hohen Maintenance-Tax: Migrationen, Form-Validation, Auth, Backup-Strategie — ohne realen Nutzen.
  • (c) Hybrid (JSON + DB-Cache) ist Overengineering ohne Cache-Invalidation-Problem zu lösen, das es bei einem statischen File nicht gibt.
  • Audit-Trail durch git ist besser als jedes DB-Audit-Log: PR-Reviews, Branch-Approvals, Blame über alle Felder hinweg.

Folge-Effekt: Phase 6 (Auto-Sync Gitea→releasedAt) muss bei (a) entweder via Bot-Push committen oder das Modell später partiell auf DB migrieren. Heute nicht vorwegnehmen — Phase 6 ist optional/später, dann erneut bewerten.


Entscheidung 2: Auth → (a) Public-Endpoint

Empfehlung: GET /roadmap ohne Keycloak-Guard, aber mit Rate-Limiting.

Begründung:

  • Inhalt ist marketing-fähig und soll Vertrauen schaffen — Login als Hürde widerspricht dem Zweck.
  • Keine sensiblen Inhalte, kein Schadenrisiko bei öffentlichem Zugriff.
  • Konsistenz-Argument für (b) ist schwach: Roadmap ist bewusst anders als Daten-Endpoints (User-Daten, Listen) — die Sonderbehandlung ist legitim und gut dokumentierbar.
  • Spätere Voting/Comment-Features (außerhalb Epic-Scope) brauchen Auth — das wird ein anderer Endpoint, kein Konflikt.

Operativ:

  • @SkipAuth()- oder @Public()-Decorator auf den Controller-Endpoint (je nach NestJS-Auth-Pattern im Repo).
  • @nestjs/throttler mit moderatem Limit (z.B. 60 req/min per IP) gegen Crawler-Misuse.
  • HTTP-Cache-Header (Cache-Control: public, max-age=300) — bei statischem File trivial, entlastet API.

Entscheidung 3: Schema-Validation → (c) Beides, Zod als Source-of-Truth

Empfehlung: Zod-Schema im API als kanonische Definition. JSON-Schema-Datei daraus generiert (via zod-to-json-schema) — diese wird zur roadmap.schema.json und CI validiert.

Begründung:

  • Zod gibt dir Runtime-Validation + TypeScript-Types in einem Artefakt — entscheidend für API-Code und Tests.
  • JSON-Schema im CI-Step (scripts/validate-roadmap.mjs) fängt PM-Fehler vor Deploy ab — schnelles Feedback im Drone-Build, kein produktiver Boot-Crash.
  • Generierung statt manueller Doppelpflege: das $schema-Feld in roadmap.json zeigt damit auf eine real existierende und immer aktuelle Datei.
  • (a) allein: PM merkt Schema-Drift erst beim Image-Boot — zu spät.
  • (b) allein: keine Type-Safety im API-Code, jeder Konsument muss types selber pflegen.

Operativ:

  • apps/api/src/roadmap/roadmap.schema.ts mit Zod-Definition.
  • scripts/sync-roadmap-schema.mjs (Pre-Commit-Hook oder CI-Step) generiert roadmap.schema.json aus dem Zod-Schema. Bei Drift im CI: fail.
  • scripts/validate-roadmap.mjs validiert roadmap.json gegen das Schema (ajv) als separater CI-Step (pr-convention-check-Nachbar in .drone.yml).
  • API liest roadmap.json beim Boot, .parse() via Zod → bei Drift: API startet nicht, klares Log.

Entscheidung 4: Deployment → (a) Bundling beim Build

Empfehlung: roadmap.json per COPY ins API-Docker-Image, API liest aus Container-FS.

Begründung:

  • Immutable per Release ist genau das richtige Mental-Modell: Release = Snapshot der Roadmap zum Zeitpunkt X. Rollback auf alten Tag holt automatisch die alte Roadmap zurück — semantisch sauber.
  • Re-Deploy bei Roadmap-Änderung ist im CI-Setup (Drone) billig — Tag-Push triggert die Pipeline automatisch.
  • (b) Mount/Fetch von außen: stateful, Compose-Volume-Maintenance, oder Netz-Dependency beim API-Boot — fragiler ohne Mehrwert bei niedriger Edit-Frequenz.
  • (c) Build-Time-Embed als TS-Datei: zusätzlicher Generator-Step, keine Vorteile ggü Bundling — File wird ohnehin nur einmal beim Boot gelesen.

Operativ:

  • apps/api/Dockerfile: COPY roadmap.json /app/roadmap.json (oder neben das Build-Output, je nach Layout).
  • API-Boot: einmal lesen, in In-Memory-Cache mit TTL=Infinity halten — keine Cache-Invalidation nötig, weil File zur Laufzeit unveränderlich ist.
  • Falls später Phase 6 (Auto-Sync) kommt: Modell überdenken (Bot-Push oder Hybrid), aber das ist 2-3 Releases entfernt.

Übersehene Folge-Effekte

  1. items[] vs releases[]: das aktuelle roadmap.json hat zwei Felder mit unterschiedlicher Semantik (items = Now/Next/Done für UI, releases = Changelog für Release-Notes). Beide bleiben — sie sind komplementär:

    • releases[] ist strukturierter Changelog (was wurde released, mit Highlights) — vom extract-changelog.mjs konsumiert.
    • items[] ist Forward-Looking Plan (was kommt als nächstes, was läuft) — von der UI konsumiert.
    • Schema sollte beide Top-Level-Felder validieren, mit klar getrennten Typen.
    • Optional Phase 6: items[].status: "done" könnte automatisch ein passendes releases[]-Entry triggern oder daraus abgeleitet werden — heute nicht vorwegnehmen.
  2. API-Versionierung: GET /roadmap sollte als GET /api/v1/roadmap (oder bestehende Convention) eingehängt werden, mit dem geparsten + ggf. transformierten Output (z.B. items nach Status gruppiert, releases absteigend sortiert) — nicht das rohe JSON 1:1 ausliefern. Das entkoppelt internes Datenmodell von der UI-API.

  3. linkedIssues-Feld: im Datenmodell-Entwurf vorhanden — bei (1a) reine Strings, kein Foreign-Key-Constraint. UI macht daraus https://git.mrrm.de/{linkedIssues[0]}-Links. Validation prüft Format {repo}#{number}.

  4. i18n-Punkt: explizit out-of-Scope laut Body, gut. Schema sollte aber title/summary als plain string definieren, nicht {de: string} — falls i18n später kommt, wird das eine Migration sein, das ist OK.

  5. Phase 1.5 (vor Phase 2): empfehle separat ein kleines Issue, um die items[]-Befüllung initial vorzunehmen (manuelles PM-Set, ~10–15 Items für Now/Next aus dem aktuellen Backlog). Das ist Inhalt, nicht Architektur — aber Phase 2-API ist ohne befüllte Daten nicht sinnvoll testbar.


Beantwortet von Architekt-Hut (in dieser Session konversationell durch PM beantwortet — formaler arch-bot-Flow nicht gefahren weil keine zweite Claude-Instanz parallel läuft; bei strittigen Stellen oder größeren Folge-Entscheidungen separate arch-Konsultation in dedizierter Session anstoßen).

## Architekt-Antwort Alle vier Entscheidungen hängen am Skalierungsbild der Roadmap: das ist ein ~5–20 KB File, das maximal alle paar Tage vom PM editiert wird, und der bestehende `extract-changelog.mjs`-Pfad funktioniert bereits. Daraus folgt ein klarer Empfehlungs-Cluster (1a + 4a + 3c + 2a) — möglichst wenig neue Infrastruktur, git als Source-of-Truth, Validierung pragmatisch und vor Deploy. --- ### Entscheidung 1: Datenhaltung → **(a) JSON-File im Repo** **Empfehlung:** Status quo behalten — `roadmap.json` ist Single-Source-of-Truth, git übernimmt Versionierung/Diff/Revert/Blame gratis. **Begründung:** - Daten sind klein (~5 KB heute, max. ~50 KB in absehbarer Zeit) — DB-Vorteile (Indexe, Queries, Concurrency) sind hier irrelevant. - Edit-Frequenz ist niedrig (PM-Hand, ~wöchentlich) und an Release-Cuts gekoppelt — ein Commit-Flow ist nicht Friction, sondern *passend*. - (b) Postgres + Admin-UI hat hohen Maintenance-Tax: Migrationen, Form-Validation, Auth, Backup-Strategie — ohne realen Nutzen. - (c) Hybrid (JSON + DB-Cache) ist Overengineering ohne Cache-Invalidation-Problem zu lösen, das es bei einem statischen File nicht gibt. - Audit-Trail durch git ist *besser* als jedes DB-Audit-Log: PR-Reviews, Branch-Approvals, Blame über alle Felder hinweg. **Folge-Effekt:** Phase 6 (Auto-Sync Gitea→`releasedAt`) muss bei (a) entweder via Bot-Push committen oder das Modell später partiell auf DB migrieren. **Heute nicht vorwegnehmen** — Phase 6 ist optional/später, dann erneut bewerten. --- ### Entscheidung 2: Auth → **(a) Public-Endpoint** **Empfehlung:** `GET /roadmap` ohne Keycloak-Guard, aber mit Rate-Limiting. **Begründung:** - Inhalt ist marketing-fähig und soll Vertrauen schaffen — Login als Hürde widerspricht dem Zweck. - Keine sensiblen Inhalte, kein Schadenrisiko bei öffentlichem Zugriff. - Konsistenz-Argument für (b) ist schwach: Roadmap ist *bewusst* anders als Daten-Endpoints (User-Daten, Listen) — die Sonderbehandlung ist legitim und gut dokumentierbar. - Spätere Voting/Comment-Features (außerhalb Epic-Scope) brauchen Auth — das wird ein anderer Endpoint, kein Konflikt. **Operativ:** - `@SkipAuth()`- oder `@Public()`-Decorator auf den Controller-Endpoint (je nach NestJS-Auth-Pattern im Repo). - `@nestjs/throttler` mit moderatem Limit (z.B. 60 req/min per IP) gegen Crawler-Misuse. - HTTP-Cache-Header (`Cache-Control: public, max-age=300`) — bei statischem File trivial, entlastet API. --- ### Entscheidung 3: Schema-Validation → **(c) Beides, Zod als Source-of-Truth** **Empfehlung:** Zod-Schema im API als kanonische Definition. JSON-Schema-Datei daraus generiert (via `zod-to-json-schema`) — diese wird zur `roadmap.schema.json` und CI validiert. **Begründung:** - Zod gibt dir Runtime-Validation + TypeScript-Types in *einem* Artefakt — entscheidend für API-Code und Tests. - JSON-Schema im CI-Step (`scripts/validate-roadmap.mjs`) fängt PM-Fehler *vor* Deploy ab — schnelles Feedback im Drone-Build, kein produktiver Boot-Crash. - Generierung statt manueller Doppelpflege: das `$schema`-Feld in `roadmap.json` zeigt damit auf eine *real existierende und immer aktuelle* Datei. - (a) allein: PM merkt Schema-Drift erst beim Image-Boot — zu spät. - (b) allein: keine Type-Safety im API-Code, jeder Konsument muss types selber pflegen. **Operativ:** - `apps/api/src/roadmap/roadmap.schema.ts` mit Zod-Definition. - `scripts/sync-roadmap-schema.mjs` (Pre-Commit-Hook *oder* CI-Step) generiert `roadmap.schema.json` aus dem Zod-Schema. Bei Drift im CI: fail. - `scripts/validate-roadmap.mjs` validiert `roadmap.json` gegen das Schema (ajv) als separater CI-Step (`pr-convention-check`-Nachbar in `.drone.yml`). - API liest `roadmap.json` beim Boot, `.parse()` via Zod → bei Drift: API startet nicht, klares Log. --- ### Entscheidung 4: Deployment → **(a) Bundling beim Build** **Empfehlung:** `roadmap.json` per `COPY` ins API-Docker-Image, API liest aus Container-FS. **Begründung:** - Immutable per Release ist *genau* das richtige Mental-Modell: Release = Snapshot der Roadmap zum Zeitpunkt X. Rollback auf alten Tag holt automatisch die alte Roadmap zurück — semantisch sauber. - Re-Deploy bei Roadmap-Änderung ist im CI-Setup (Drone) billig — Tag-Push triggert die Pipeline automatisch. - (b) Mount/Fetch von außen: stateful, Compose-Volume-Maintenance, oder Netz-Dependency beim API-Boot — fragiler ohne Mehrwert bei niedriger Edit-Frequenz. - (c) Build-Time-Embed als TS-Datei: zusätzlicher Generator-Step, keine Vorteile ggü Bundling — File wird ohnehin nur einmal beim Boot gelesen. **Operativ:** - `apps/api/Dockerfile`: `COPY roadmap.json /app/roadmap.json` (oder neben das Build-Output, je nach Layout). - API-Boot: einmal lesen, in In-Memory-Cache mit TTL=Infinity halten — keine Cache-Invalidation nötig, weil File zur Laufzeit unveränderlich ist. - Falls später Phase 6 (Auto-Sync) kommt: Modell überdenken (Bot-Push oder Hybrid), aber das ist 2-3 Releases entfernt. --- ### Übersehene Folge-Effekte 1. **`items[]` vs `releases[]`**: das aktuelle `roadmap.json` hat zwei Felder mit unterschiedlicher Semantik (`items` = Now/Next/Done für UI, `releases` = Changelog für Release-Notes). Beide bleiben — sie sind komplementär: - `releases[]` ist *strukturierter Changelog* (was wurde released, mit Highlights) — vom `extract-changelog.mjs` konsumiert. - `items[]` ist *Forward-Looking Plan* (was kommt als nächstes, was läuft) — von der UI konsumiert. - Schema sollte beide Top-Level-Felder validieren, mit klar getrennten Typen. - Optional Phase 6: `items[].status: "done"` könnte automatisch ein passendes `releases[]`-Entry triggern oder daraus abgeleitet werden — heute nicht vorwegnehmen. 2. **API-Versionierung**: `GET /roadmap` sollte als `GET /api/v1/roadmap` (oder bestehende Convention) eingehängt werden, mit dem geparsten + ggf. transformierten Output (z.B. `items` nach Status gruppiert, `releases` absteigend sortiert) — nicht das rohe JSON 1:1 ausliefern. Das entkoppelt internes Datenmodell von der UI-API. 3. **`linkedIssues`-Feld**: im Datenmodell-Entwurf vorhanden — bei (1a) reine Strings, kein Foreign-Key-Constraint. UI macht daraus `https://git.mrrm.de/{linkedIssues[0]}`-Links. Validation prüft Format `{repo}#{number}`. 4. **i18n-Punkt**: explizit out-of-Scope laut Body, gut. Schema sollte aber `title`/`summary` als plain string definieren, nicht `{de: string}` — falls i18n später kommt, wird das eine Migration sein, das ist OK. 5. **Phase 1.5 (vor Phase 2)**: empfehle separat ein kleines Issue, um die `items[]`-Befüllung initial vorzunehmen (manuelles PM-Set, ~10–15 Items für Now/Next aus dem aktuellen Backlog). Das ist Inhalt, nicht Architektur — aber Phase 2-API ist ohne befüllte Daten nicht sinnvoll testbar. --- *Beantwortet von Architekt-Hut (in dieser Session konversationell durch PM beantwortet — formaler arch-bot-Flow nicht gefahren weil keine zweite Claude-Instanz parallel läuft; bei strittigen Stellen oder größeren Folge-Entscheidungen separate arch-Konsultation in dedizierter Session anstoßen).*
Author
Collaborator

Beantwortet — Architekt-Empfehlungen übernommen, Decision Record am Epic #378 (Kommentar 2948). Schließe das arch-question.

Beantwortet — Architekt-Empfehlungen übernommen, Decision Record am Epic #378 (Kommentar 2948). Schließe das arch-question.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp#437
No description provided.