projax: social-Grouping legt personen-benannten [project]-Knoten an statt den bestehenden [contact] zu verlinken (z.B. 'Dania' vs Kontakt 'Dania Esser') #6

Open
opened 2026-07-13 13:08:39 +00:00 by mAi · 3 comments
Collaborator

Problem

m hat's in mBrian bemerkt (2026-07-13): es gibt zwei "Dania"-Knoten, die wie ein Duplikat aussehen. Tatsächlich sind es zwei verschiedene Typen — und projax ist die Ursache:

  • dania-essertype=[contact] (id 5ead81e9-437d-4175-a3ac-625b040b7331). Der echte Kontakt: Dania Esser, Hogan Lovells, Partnerin, Geburtstag, CardDAV, ~60 with/references-Kanten (die ganze Beziehungs-Historie). Kanonisch.
  • daniatype=[project] (id e60e7d07-4b07-4aa4-b172-10c8f66a1f96, projax_origin=057ffcb7-7627-4423-9bc7-0dbefd1f3db0, metadata.projax.kind=project, status=active, child_of → social). Ein von projax automatisch erzeugter Gruppierungs-Knoten "Dania", unter dem D's RaceTrack einsortiert ist.
  • racetrack (D's RaceTrack, id a211b814-7064-4ace-9e41-697eb1f41811, projax_origin=e33c246d-..., type=[project,mai-managed], Repo m/racetrack, /home/m/dev/racetrack, tags [dev, social]) hängt child_of → dania und child_of → dev.

Root Cause

Wenn projax ein Projekt nach einer Person / einem social-Tag gruppiert, erzeugt es einen neuen [project]-Knoten mit dem Personennamen (hier "Dania") statt den bereits existierenden [contact]-Knoten (dania-esser) zu referenzieren. Ergebnis: Doppelung, die in mBrian/Obsidian wie ein Dupe aussieht.

Gewünschtes Verhalten (m's Entscheidung)

  • Die projax-Gruppe dania (personen-benanntes Projekt) soll weg.
  • D's RaceTrack bekommt als "Zuhause" den Kontakt dania-esser — m: "kann ja dasselbe sein". Also: RaceTrack behält child_of → dev, und wird mit dem Kontakt assoziiert (z.B. for/about → dania-esser), nicht child_of einer personen-benannten Projekt-Gruppe.

Fix (projax-seitig)

  1. Grouping-Logik: wenn ein Projekt einer Person zugeordnet wird, den bestehenden [contact]-Knoten per Name/Alias matchen und referenzieren (for/about/related_to), statt einen [project]-Knoten mit dem Personennamen zu minten. Nur eine echte Projekt-Gruppe anlegen, wenn kein passender Kontakt existiert.
  2. Bestehende dania-Gruppe (057ffcb7...) sauber zurückziehen (soft-delete über projax' eigenen Pfad, damit kein mBrian↔projax-Desync entsteht).
  3. racetrack neu einordnen: child_of → dania entfernen, child_of → dev behalten, for/about → dania-esser (Kontakt) setzen.
  4. Prüfen, ob weitere personen-benannte Gruppen-Projekte betroffen sind (gleiches Muster bei anderen Kontakten?).

Warum nicht in mBrian direkt fixen

Die Knoten sind projax-derived (projax_origin, derived-from, management:[mai]). Ein reiner mBrian-Umbau würde beim nächsten projax-Sync überschrieben/neu erzeugt. Der Fix muss in der projax-Grouping-Logik passieren.

Refs

  • mBrian-Kontakt: dania-esser (5ead81e9-...)
  • projax-Gruppe: dania (e60e7d07-..., origin 057ffcb7-...)
  • Projekt: racetrack (a211b814-..., origin e33c246d-...)
  • Ownership-Vertrag: m/mBrian#73 (projax_origin-scoped writes)
## Problem m hat's in mBrian bemerkt (2026-07-13): es gibt zwei "Dania"-Knoten, die wie ein Duplikat aussehen. Tatsächlich sind es zwei verschiedene Typen — und projax ist die Ursache: - **`dania-esser`** — `type=[contact]` (id `5ead81e9-437d-4175-a3ac-625b040b7331`). Der echte Kontakt: Dania Esser, Hogan Lovells, Partnerin, Geburtstag, CardDAV, ~60 `with`/`references`-Kanten (die ganze Beziehungs-Historie). **Kanonisch.** - **`dania`** — `type=[project]` (id `e60e7d07-4b07-4aa4-b172-10c8f66a1f96`, `projax_origin=057ffcb7-7627-4423-9bc7-0dbefd1f3db0`, `metadata.projax.kind=project`, `status=active`, `child_of → social`). Ein von **projax automatisch erzeugter Gruppierungs-Knoten** "Dania", unter dem `D's RaceTrack` einsortiert ist. - **`racetrack`** (`D's RaceTrack`, id `a211b814-7064-4ace-9e41-697eb1f41811`, `projax_origin=e33c246d-...`, `type=[project,mai-managed]`, Repo `m/racetrack`, `/home/m/dev/racetrack`, tags `[dev, social]`) hängt `child_of → dania` **und** `child_of → dev`. ## Root Cause Wenn projax ein Projekt nach einer Person / einem `social`-Tag gruppiert, **erzeugt es einen neuen `[project]`-Knoten mit dem Personennamen** (hier "Dania") statt den **bereits existierenden `[contact]`-Knoten** (`dania-esser`) zu referenzieren. Ergebnis: Doppelung, die in mBrian/Obsidian wie ein Dupe aussieht. ## Gewünschtes Verhalten (m's Entscheidung) - Die projax-Gruppe `dania` (personen-benanntes Projekt) soll **weg**. - `D's RaceTrack` bekommt als "Zuhause" den **Kontakt** `dania-esser` — m: "kann ja dasselbe sein". Also: RaceTrack behält `child_of → dev`, und wird mit dem Kontakt assoziiert (z.B. `for`/`about → dania-esser`), **nicht** `child_of` einer personen-benannten Projekt-Gruppe. ## Fix (projax-seitig) 1. **Grouping-Logik**: wenn ein Projekt einer Person zugeordnet wird, den bestehenden `[contact]`-Knoten per Name/Alias matchen und referenzieren (`for`/`about`/`related_to`), statt einen `[project]`-Knoten mit dem Personennamen zu minten. Nur eine echte Projekt-Gruppe anlegen, wenn kein passender Kontakt existiert. 2. **Bestehende `dania`-Gruppe (`057ffcb7...`) sauber zurückziehen** (soft-delete über projax' eigenen Pfad, damit kein mBrian↔projax-Desync entsteht). 3. **`racetrack` neu einordnen**: `child_of → dania` entfernen, `child_of → dev` behalten, `for/about → dania-esser` (Kontakt) setzen. 4. Prüfen, ob weitere personen-benannte Gruppen-Projekte betroffen sind (gleiches Muster bei anderen Kontakten?). ## Warum nicht in mBrian direkt fixen Die Knoten sind projax-derived (`projax_origin`, `derived-from`, `management:[mai]`). Ein reiner mBrian-Umbau würde beim nächsten projax-Sync überschrieben/neu erzeugt. Der Fix muss in der projax-Grouping-Logik passieren. ## Refs - mBrian-Kontakt: `dania-esser` (`5ead81e9-...`) - projax-Gruppe: `dania` (`e60e7d07-...`, origin `057ffcb7-...`) - Projekt: `racetrack` (`a211b814-...`, origin `e33c246d-...`) - Ownership-Vertrag: m/mBrian#73 (projax_origin-scoped writes)
mAi self-assigned this 2026-07-13 13:08:39 +00:00
Author
Collaborator

Read-Seite-Folgenotiz aus mBrian#77 (2026-07-14): mai-managed ist in mBrian kein type mehr — es ist jetzt ein Tag (tagged → tag-mai-managed) + steckt in metadata.projax.management. Die scoped projax-Write-API hängt es nicht mehr als Co-Type an; Migration db/046 hat die 44 Bestandsknoten umgestellt.

Falls projax je type @> [mai-managed] liest, um mai-managed Projekte zu erkennen: künftig das Tag tag-mai-managed bzw. metadata.projax.management lesen. Aktuell niedriges Risiko (projax läuft nicht aktiv als mai-Projekt).

Read-Seite-Folgenotiz aus **mBrian#77** (2026-07-14): `mai-managed` ist in mBrian **kein type** mehr — es ist jetzt ein **Tag** (`tagged → tag-mai-managed`) + steckt in `metadata.projax.management`. Die scoped projax-Write-API hängt es nicht mehr als Co-Type an; Migration db/046 hat die 44 Bestandsknoten umgestellt. **Falls projax je `type @> [mai-managed]` liest**, um mai-managed Projekte zu erkennen: künftig das Tag `tag-mai-managed` bzw. `metadata.projax.management` lesen. Aktuell niedriges Risiko (projax läuft nicht aktiv als mai-Projekt).
Author
Collaborator

Root cause: refuted — there is no auto-grouping engine

Erste Aufgabe war, die Diagnose zu verifizieren statt sie zu bauen. Ergebnis: die im Issue behauptete Ursache existiert nicht.

"Wenn projax ein Projekt nach einer Person gruppiert, erzeugt es einen neuen [project]-Knoten mit dem Personennamen"

Das tut projax nicht. Es gibt keinen Code-Pfad, der das könnte. Sweep über cmd/ store/ web/ gitea/ caldav/ mcp/ internal/ db/:

  • Nur 3 Go-Create-Stellen — MCP create_item (mcp/tools.go:886), /new-Form (web/server.go:1007), Task-Create (web/task.go:278). Alle nehmen Parents explizit entgegen und fehlern, wenn der Parent nicht existiert (mcp/tools.go:904). Keine mintet je einen Parent.
  • Kein Code liest [contact]-Knoten. Das Wort "contact" kommt im gesamten Go-Tree einmal vor — als Warnkommentar, sie nicht zu beschädigen (store/mbrian_writer.go:33).
  • Tags werden nie zu Knoten. "Grouping" ist reine In-Memory-Darstellung (web/kanban.go:132-146); group_by ist eine Render-Achse.
  • Einziger automatischer Insert ist der mai.projects-Trigger — der spiegelt und landet bewusst auf Root ('{}'::uuid[], db/migrations/0008:182), leitet also gerade keinen Parent ab.

Woher dania wirklich kommt

created_at = 2026-05-29 13:12:41.581 — dieselbe Sekunde wie die übrigen migrierten Knoten (racetrack 13:12:41.235, Kanten 13:12:42). Das ist der Phase-6-Snapshot-Import aus den alten projax.items. Dazu: keine "Dania"-Zeile in mai.projects → auch nicht trigger-erzeugt.

dania ist ein Alt-Item, das m selbst von Hand angelegt hat, als projax.items noch der Store war. Kein Sync-Artefakt. Fix #1 des Issues fällt damit weg — ich habe bewusst keine "Grouping-Engine" erfunden, um sie zu reparieren.

Der Datenstand hat sich seit dem Filing geändert

Am 2026-07-13 13:38 (also nach dem Filing) ist bereits passiert:

Stand
dania Knoten bereits soft-deleted (deleted_at 13:38:49) → aus projax' Tree verschwunden
racetrack child_of dania bereits hard-deleted
racetrack child_of dev intakt
racetrack child_of dania-esser neu (13:38:48) — ein [project] als struktureller child eines [contact]

Schritte 2+3 sind damit größtenteils erledigt — nur mit child_of statt der gewünschten Assoziation.

Blocker: projax kann Schritt 3 gar nicht ausführen

Das gewünschte Zielbild (for/about/related_todania-esser) ist über projax' Write-Pfad nicht umsetzbar:

  • rel-Allowlist ist ausschließlich child_of | projax-*related_to gibt 400 (mBrian src/lib/server/projax.ts:288).
  • Beide Kanten-Endpunkte müssen projax-owned sein → ein [contact]-Target gibt 403 (mBrian src/routes/api/projax/edges/+server.ts:19-27). dania-esser hat kein projax_origin (verifiziert).
  • for und about existieren in mBrians rel-Vokabular gar nicht (0 Verwendungen). related_to hat 390.
  • Aus demselben Grund kann projax die jetzt vorhandene child_of → dania-esser-Kante auch nicht löschen.

Das heißt: das lässt sich auch später nicht still aufräumen — es braucht eine Entscheidung. Zwei Optionen, beide bei m:

(a) AddLink-Self-Edge projax-contact mit Metadata — heute vertragskonform, aber keine echte mBrian-Kante → in mBrian/Obsidian unsichtbar, was den Sinn des Issues ("den bestehenden Kontakt verlinken") verfehlt.

(b) mBrian-seitig das Gate lockern: related_to erlauben, wenn die Source projax-owned ist und das Target nicht (asymmetrisches Gate). Sachlich richtig, aber cross-repo — und es gibt eine Ownership-Garantie aus, die genau m's Kontakte/Journal schützt.

Alle Datenschritte sind angehalten, bis m entscheidet.

Sweep (Schritt 4): es gibt einen zweiten

  • mama / "Mama" (b8be1744-2dc6-4ecc-b27e-339ec15111b1) — live, child_of → social, leer (null Kinder), gleiche Migrations-Sekunde → identisches Alt-Muster.
  • Passender Kontakt existiert: katrin-janßen-siebels (a763e8ef-...), aliases: ["Mama"] — ein Alias-Match, kein Titel-Match. (Falls (b) je kommt: Matching muss Aliases einschließen.)

Nicht angefasst — mama ist von #6 textlich nicht abgedeckt und es sind m's Daten.

Was gefixt wurde (Code, mergebar unabhängig von der Entscheidung)

Echter Bug gefunden — der mBrian#77-Rest im Write-Pfad. store/mbrian_writer.go schickte mai_managed: containsString(in.Kind, "mai-managed"). Seit #77 steht mai-managed nie in type[], und der Reader füllt Item.Kind aus type[] → der Ausdruck war immer false. Folge: projax konnte gar keinen mai-managed-Knoten anlegen bzw. die tagged → tag-mai-managed-Kante nie anstoßen.

Fix: Ableitung aus Management — dieselbe Quelle, die der Read-Pfad schon nutzt (MaiOrphans → HasManagement("mai")). Invariante in den Live-Daten geprüft: management:["mai"] ⇔ Tag-Kante gilt für 43/43 Knoten, null Abweichungen.

Zur Read-Seite aus dem Brief: kein Live-type @> [mai-managed]-Bug — die Lesepfade gehen über HasManagement. Der Treffer in cmd/projax-snapshot liest die alten projax.items (wo kind[] noch gilt) und ist read-only korrekt.

Dazu: docs/design.md §2.5 hält jetzt fest, dass es keine Grouping-Engine gibt — damit die nächste Session dieselbe falsche Ursache nicht in sechs Monaten erneut filet.

Commit: 2742038b76

Nebenbefund: die Parity-Tests sind rot — durch den Hand-Fix

TestParityListAll (store=73 vs mbrian=66) und TestParitySpotChecks (dania: mbrian err=item not found but store found) failen. Pre-existing, gegen den Baseline-Commit verifiziert, nicht von diesem Change. Ursache ist aber genau das Obige: dania wurde in mBrian soft-deleted, während die alten projax.items es noch führen — die Parity-Suite spot-checkt ausgerechnet dania. Sobald m die Datenfrage entschieden hat, gehört der Spot-Check-Fixture nachgezogen; als eigenes Issue sinnvoll, wenn #6 anders ausgeht.

## Root cause: refuted — there is no auto-grouping engine Erste Aufgabe war, die Diagnose zu **verifizieren** statt sie zu bauen. Ergebnis: die im Issue behauptete Ursache existiert nicht. > "Wenn projax ein Projekt nach einer Person gruppiert, **erzeugt es einen neuen `[project]`-Knoten** mit dem Personennamen" Das tut projax nicht. Es gibt keinen Code-Pfad, der das könnte. Sweep über `cmd/ store/ web/ gitea/ caldav/ mcp/ internal/ db/`: - **Nur 3 Go-Create-Stellen** — MCP `create_item` (`mcp/tools.go:886`), `/new`-Form (`web/server.go:1007`), Task-Create (`web/task.go:278`). Alle nehmen Parents **explizit** entgegen und **fehlern**, wenn der Parent nicht existiert (`mcp/tools.go:904`). Keine mintet je einen Parent. - **Kein Code liest `[contact]`-Knoten.** Das Wort "contact" kommt im gesamten Go-Tree **einmal** vor — als Warnkommentar, sie nicht zu beschädigen (`store/mbrian_writer.go:33`). - **Tags werden nie zu Knoten.** "Grouping" ist reine In-Memory-Darstellung (`web/kanban.go:132-146`); `group_by` ist eine Render-Achse. - **Einziger automatischer Insert** ist der `mai.projects`-Trigger — der spiegelt und landet bewusst auf **Root** (`'{}'::uuid[]`, `db/migrations/0008:182`), leitet also gerade *keinen* Parent ab. ### Woher `dania` wirklich kommt `created_at = 2026-05-29 13:12:41.581` — dieselbe Sekunde wie die übrigen migrierten Knoten (`racetrack` 13:12:41.235, Kanten 13:12:42). Das ist der **Phase-6-Snapshot-Import** aus den alten `projax.items`. Dazu: **keine "Dania"-Zeile in `mai.projects`** → auch nicht trigger-erzeugt. **`dania` ist ein Alt-Item, das m selbst von Hand angelegt hat**, als `projax.items` noch der Store war. Kein Sync-Artefakt. Fix #1 des Issues fällt damit weg — ich habe bewusst **keine** "Grouping-Engine" erfunden, um sie zu reparieren. ## Der Datenstand hat sich seit dem Filing geändert Am **2026-07-13 13:38** (also *nach* dem Filing) ist bereits passiert: | | Stand | |---|---| | `dania` Knoten | bereits soft-deleted (`deleted_at 13:38:49`) → aus projax' Tree verschwunden | | `racetrack child_of dania` | bereits hard-deleted | | `racetrack child_of dev` | intakt ✅ | | `racetrack child_of dania-esser` | **neu** (13:38:48) — ein `[project]` als struktureller **child eines `[contact]`** | Schritte 2+3 sind damit größtenteils erledigt — nur mit `child_of` statt der gewünschten Assoziation. ## Blocker: projax kann Schritt 3 gar nicht ausführen Das gewünschte Zielbild (`for`/`about`/`related_to` → `dania-esser`) ist über projax' Write-Pfad **nicht umsetzbar**: - **rel-Allowlist** ist ausschließlich `child_of | projax-*` → `related_to` gibt **400** (mBrian `src/lib/server/projax.ts:288`). - **Beide** Kanten-Endpunkte müssen projax-owned sein → ein `[contact]`-Target gibt **403** (mBrian `src/routes/api/projax/edges/+server.ts:19-27`). `dania-esser` hat kein `projax_origin` (verifiziert). - `for` und `about` existieren in mBrians rel-Vokabular **gar nicht** (0 Verwendungen). `related_to` hat 390. - Aus demselben Grund kann projax die jetzt vorhandene `child_of → dania-esser`-Kante auch **nicht löschen**. Das heißt: das lässt sich auch später nicht still aufräumen — es braucht eine Entscheidung. Zwei Optionen, beide bei m: **(a)** `AddLink`-Self-Edge `projax-contact` mit Metadata — heute vertragskonform, aber **keine echte mBrian-Kante** → in mBrian/Obsidian unsichtbar, was den Sinn des Issues ("den bestehenden Kontakt verlinken") verfehlt. **(b)** mBrian-seitig das Gate lockern: `related_to` erlauben, wenn die **Source** projax-owned ist und das Target nicht (asymmetrisches Gate). Sachlich richtig, aber cross-repo — und es gibt eine Ownership-Garantie aus, die genau m's Kontakte/Journal schützt. **Alle Datenschritte sind angehalten**, bis m entscheidet. ## Sweep (Schritt 4): es gibt einen zweiten - **`mama` / "Mama"** (`b8be1744-2dc6-4ecc-b27e-339ec15111b1`) — live, `child_of → social`, **leer** (null Kinder), gleiche Migrations-Sekunde → identisches Alt-Muster. - Passender Kontakt existiert: **`katrin-janßen-siebels`** (`a763e8ef-...`), `aliases: ["Mama"]` — ein **Alias**-Match, kein Titel-Match. (Falls (b) je kommt: Matching muss Aliases einschließen.) Nicht angefasst — `mama` ist von #6 textlich nicht abgedeckt und es sind m's Daten. ## Was gefixt wurde (Code, mergebar unabhängig von der Entscheidung) **Echter Bug gefunden** — der mBrian#77-Rest im Write-Pfad. `store/mbrian_writer.go` schickte `mai_managed: containsString(in.Kind, "mai-managed")`. Seit #77 steht `mai-managed` nie in `type[]`, und der Reader füllt `Item.Kind` aus `type[]` → der Ausdruck war **immer false**. Folge: **projax konnte gar keinen mai-managed-Knoten anlegen** bzw. die `tagged → tag-mai-managed`-Kante nie anstoßen. Fix: Ableitung aus `Management` — dieselbe Quelle, die der Read-Pfad schon nutzt (`MaiOrphans → HasManagement("mai")`). Invariante in den Live-Daten geprüft: `management:["mai"]` ⇔ Tag-Kante gilt für **43/43** Knoten, null Abweichungen. Zur Read-Seite aus dem Brief: **kein** Live-`type @> [mai-managed]`-Bug — die Lesepfade gehen über `HasManagement`. Der Treffer in `cmd/projax-snapshot` liest die alten `projax.items` (wo `kind[]` noch gilt) und ist read-only korrekt. Dazu: `docs/design.md` §2.5 hält jetzt fest, dass es keine Grouping-Engine gibt — damit die nächste Session dieselbe falsche Ursache nicht in sechs Monaten erneut filet. **Commit:** https://mgit.msbls.de/m/projax/commit/2742038b769f35d0d4ab5fc27d307253cea2199f ## Nebenbefund: die Parity-Tests sind rot — durch den Hand-Fix `TestParityListAll` (store=73 vs mbrian=66) und `TestParitySpotChecks` (`dania: mbrian err=item not found but store found`) failen. **Pre-existing**, gegen den Baseline-Commit verifiziert, nicht von diesem Change. Ursache ist aber genau das Obige: `dania` wurde in mBrian soft-deleted, während die alten `projax.items` es noch führen — die Parity-Suite spot-checkt ausgerechnet `dania`. Sobald m die Datenfrage entschieden hat, gehört der Spot-Check-Fixture nachgezogen; als eigenes Issue sinnvoll, wenn #6 anders ausgeht.
mAi added the
status:partial
label 2026-07-17 09:47:46 +00:00
Author
Collaborator

Erledigt (2026-07-17) — aber die Diagnose im Issue war falsch

Wichtigster Punkt zuerst: der im Issue beschriebene Root Cause existiert nicht. Der Worker hat ihn geprüft, bevor er etwas gebaut hat, und widerlegt.

Es gibt keine Grouping-Engine

Vollständiger Sweep über cmd/, store/, web/, gitea/, caldav/, mcp/, internal/, db/:

  • Nur drei Create-Stellen (MCP create_item, /new-Form, Task-Create). Alle verlangen Eltern explizit und brechen ab, wenn der Elternknoten fehlt (mcp/tools.go:904). Keine mintet je einen Elternknoten.
  • Kein Code liest [contact]-Knoten. Das Wort "contact" kommt im gesamten Go-Baum einmal vor — als Warnkommentar, sie nicht zu beschädigen (store/mbrian_writer.go:33).
  • Tags werden nie zu Knoten; "Gruppierung" ist reines In-Memory-Rendering (web/kanban.go:132-146).
  • Der einzige Auto-Insert ist der mai.projects-Trigger — der landet auf ROOT (db/migrations/0008:182). Spiegelung, keine Gruppierung.

Herkunft von dania: created_at 2026-05-29 13:12:41.58 — auf dieselbe Sekunde wie der übrige Phase-6-Snapshot-Import, und keine "Dania"-Zeile in mai.projects. Also Altbestand, den m selbst von Hand angelegt hat, als projax.items noch der Store war. Kein Sync-Artefakt.

Festgehalten in docs/design.md §2.5 („There is no auto-grouping engine"), damit der nächste nicht dasselbe falsche Issue nochmal filet.

Was tatsächlich zu tun war

  1. dania — war bereits erledigt: m hat am 2026-07-13 13:38 selbst von Hand aufgeräumt (soft-deleted, racetrack child_of dania entfernt). Das Issue war bei Aufgreifen schon überholt.
  2. mama (b8be1744-…) — heute zurückgezogen (soft-delete über projax eigenen Write-Pfad, deleted_at 2026-07-17 12:29:56). Vorher verifiziert: null Kinder, nichts ging verloren. Der echte Kontakt katrin-janßen-siebels trägt den Alias „Mama" ohnehin.
  3. racetrack — Endzustand verifiziert: hängt an dev [project] und dania-esser [contact], beide live. Bleibt so (m: „leave as-is").
  4. Keine neue Kante gelegt. ms „connect the right contact" beschreibt den Zustand, den wir behalten — nicht einen Auftrag. projax könnte eine Kante zu einem nicht-projax-eigenen Kontakt auch gar nicht setzen (403, Ownership-Wall aus m/mBrian#73). Die Wall hat hier korrekt funktioniert.

Mitgenommener echter Bug

store/mbrian_writer.go schickte mai_managed: containsString(in.Kind, "mai-managed"). Nach mBrian#77 ist mai-managed ein Tag, kein Co-Type — der Ausdruck war immer false, projax konnte also nie einen mai-managed-Knoten anlegen. Jetzt aus Management abgeleitet, konsistent mit der Read-Seite (MaiOrphansHasManagement("mai")). Mit Tests.

Commits

  • 2742038 — mai_managed aus Management ableiten + PRD-Notiz §2.5 (Details)
  • gemerged in 29a989f, live deployed (healthz == HEAD)

Kein related_to-Umbau, kein Cross-Repo-Issue auf m/mBrian — per ms Entscheidung nicht nötig.

Ich schließe nicht (nur m schließt).

## Erledigt (2026-07-17) — aber die Diagnose im Issue war falsch Wichtigster Punkt zuerst: **der im Issue beschriebene Root Cause existiert nicht.** Der Worker hat ihn geprüft, *bevor* er etwas gebaut hat, und widerlegt. ### Es gibt keine Grouping-Engine Vollständiger Sweep über `cmd/`, `store/`, `web/`, `gitea/`, `caldav/`, `mcp/`, `internal/`, `db/`: - Nur **drei** Create-Stellen (MCP `create_item`, `/new`-Form, Task-Create). Alle verlangen Eltern **explizit** und brechen ab, wenn der Elternknoten fehlt (`mcp/tools.go:904`). Keine mintet je einen Elternknoten. - **Kein Code liest `[contact]`-Knoten.** Das Wort "contact" kommt im gesamten Go-Baum *einmal* vor — als Warnkommentar, sie nicht zu beschädigen (`store/mbrian_writer.go:33`). - Tags werden nie zu Knoten; "Gruppierung" ist reines In-Memory-Rendering (`web/kanban.go:132-146`). - Der einzige Auto-Insert ist der `mai.projects`-Trigger — der landet auf ROOT (`db/migrations/0008:182`). Spiegelung, keine Gruppierung. **Herkunft von `dania`:** `created_at 2026-05-29 13:12:41.58` — auf dieselbe Sekunde wie der übrige Phase-6-Snapshot-Import, und keine "Dania"-Zeile in `mai.projects`. Also **Altbestand, den m selbst von Hand angelegt hat**, als `projax.items` noch der Store war. Kein Sync-Artefakt. Festgehalten in `docs/design.md` §2.5 („There is no auto-grouping engine"), damit der nächste nicht dasselbe falsche Issue nochmal filet. ### Was tatsächlich zu tun war 1. **`dania`** — war bereits erledigt: m hat am **2026-07-13 13:38** selbst von Hand aufgeräumt (soft-deleted, `racetrack child_of dania` entfernt). Das Issue war bei Aufgreifen schon überholt. 2. **`mama`** (`b8be1744-…`) — **heute zurückgezogen** (soft-delete über projax eigenen Write-Pfad, `deleted_at 2026-07-17 12:29:56`). Vorher verifiziert: null Kinder, nichts ging verloren. Der echte Kontakt `katrin-janßen-siebels` trägt den Alias „Mama" ohnehin. 3. **`racetrack`** — Endzustand verifiziert: hängt an `dev` `[project]` **und** `dania-esser` `[contact]`, beide live. Bleibt so (m: „leave as-is"). 4. **Keine neue Kante gelegt.** ms „connect the right contact" beschreibt den Zustand, den wir behalten — nicht einen Auftrag. projax könnte eine Kante zu einem nicht-projax-eigenen Kontakt auch gar nicht setzen (403, Ownership-Wall aus m/mBrian#73). Die Wall hat hier korrekt funktioniert. ### Mitgenommener echter Bug `store/mbrian_writer.go` schickte `mai_managed: containsString(in.Kind, "mai-managed")`. Nach mBrian#77 ist `mai-managed` ein **Tag**, kein Co-Type — der Ausdruck war **immer false**, projax konnte also nie einen mai-managed-Knoten anlegen. Jetzt aus `Management` abgeleitet, konsistent mit der Read-Seite (`MaiOrphans` → `HasManagement("mai")`). Mit Tests. ### Commits - `2742038` — mai_managed aus Management ableiten + PRD-Notiz §2.5 ([Details](https://mgit.msbls.de/m/projax/commit/2742038)) - gemerged in `29a989f`, live deployed (healthz == HEAD) **Kein `related_to`-Umbau, kein Cross-Repo-Issue auf m/mBrian** — per ms Entscheidung nicht nötig. Ich schließe nicht (nur m schließt).
mAi added
status:done
and removed
status:partial
labels 2026-07-17 12:30:46 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: m/projax#6
No description provided.