Geteilte Chats: Importierter Chat wird beim Umbenennen unter seiner lokalen Job-ID exportiert, auf dem anderen Rechner entsteht ein zweiter Chat #249

Closed
opened 2026-10-31 08:31:31 +00:00 by alf · 3 comments
Owner

Befund

Ein geteilter Chat, der von einem anderen Rechner importiert wurde, wird beim Umbenennen (oder nach jedem Jobende) nicht unter seiner Repo-ID erneut exportiert, sondern unter seiner lokalen Job-ID. Auf allen anderen Rechnern entsteht dadurch ein zweiter Chat, der Original-Chat behält den alten Namen.

Beobachtet (2026-10-31, Mac Studio + Mac-VM)

  • Mac Studio: Chat B8D1C189 „Im Anhang ist eine Step Datei mit dem Raspber… (Klon)“ ist geteilt (Ordner Iris-Internal/Geteilte-Chats/B8D1C189…).
  • Mac-VM: importiert ihn als lokalen Job D07A68B3 mit shareID = B8D1C189 (so ist es vorgesehen).
  • Alf benennt den Chat auf der VM in „Raspberry Pi 4 Gehäuse“ um. Die VM exportiert nach Geteilte-Chats/D07A68B3… (neuer Ordner, chat.md mit job_id: d07a68b3…) statt nach B8D1C189.
  • Mac Studio: importiert D07A68B3 als neuen Job 289AFE5F („Raspberry Pi 4 Gehäuse“), B8D1C189 behält den alten Titel. Der Vault ist auf beiden Seiten synchron, das Repo-Bundle B8D1C189 hat weiter den alten Titel.

Ursache

  • Mac: ChatShareManager.export baut das Manifest über ChatExportManager.chatFiles mit jobID: job.id und ruft ChatShareFiles.write auf, das den Ordner aus manifest.jobID bildet; job.shareID (die Repo-ID) wird nur beim Import und im Abgleich benutzt, nie beim Schreiben. unshare nimmt ebenfalls job.id.
  • Linux: chat_share._export_sync nutzt job["id"] für Ordner, Manifest und chat.md, _unshare_sync ebenfalls; _share_id wird nur gesetzt/verglichen.

Plan

  1. Export und Unshare benutzen die Repo-ID (shareID/_share_id, sonst die Job-ID) für Ordner, Manifest und chat.md — auf beiden Servern.
  2. Alt-Bestand: Ein importierter Job, dessen Ordner unter der eigenen Job-ID liegt, entfernt diesen Ordner beim nächsten Export; beim Import wird ein solcher Alt-Ordner übersprungen (nicht erneut als eigener Chat oder als Überschreibung des Jobs).
  3. Tests auf beiden Seiten (Mac: swiftc-Kerntests; Linux: pytest), inklusive Mutationsprüfung.

Nicht Teil der Korrektur

Der schon entstandene doppelte Chat 289AFE5F auf dem Mac Studio bleibt als lokale Kopie, sobald der Alt-Ordner verschwindet; löscht Alf von Hand.

## Befund Ein geteilter Chat, der von einem anderen Rechner importiert wurde, wird beim Umbenennen (oder nach jedem Jobende) nicht unter seiner Repo-ID erneut exportiert, sondern unter seiner **lokalen Job-ID**. Auf allen anderen Rechnern entsteht dadurch ein **zweiter Chat**, der Original-Chat behält den alten Namen. ## Beobachtet (2026-10-31, Mac Studio + Mac-VM) - Mac Studio: Chat `B8D1C189` „Im Anhang ist eine Step Datei mit dem Raspber… (Klon)“ ist geteilt (Ordner `Iris-Internal/Geteilte-Chats/B8D1C189…`). - Mac-VM: importiert ihn als lokalen Job `D07A68B3` mit `shareID = B8D1C189` (so ist es vorgesehen). - Alf benennt den Chat auf der VM in „Raspberry Pi 4 Gehäuse“ um. Die VM exportiert nach `Geteilte-Chats/D07A68B3…` (neuer Ordner, `chat.md` mit `job_id: d07a68b3…`) statt nach `B8D1C189`. - Mac Studio: importiert `D07A68B3` als **neuen** Job `289AFE5F` („Raspberry Pi 4 Gehäuse“), `B8D1C189` behält den alten Titel. Der Vault ist auf beiden Seiten synchron, das Repo-Bundle `B8D1C189` hat weiter den alten Titel. ## Ursache - Mac: `ChatShareManager.export` baut das Manifest über `ChatExportManager.chatFiles` mit `jobID: job.id` und ruft `ChatShareFiles.write` auf, das den Ordner aus `manifest.jobID` bildet; `job.shareID` (die Repo-ID) wird nur beim Import und im Abgleich benutzt, nie beim Schreiben. `unshare` nimmt ebenfalls `job.id`. - Linux: `chat_share._export_sync` nutzt `job["id"]` für Ordner, Manifest und `chat.md`, `_unshare_sync` ebenfalls; `_share_id` wird nur gesetzt/verglichen. ## Plan 1. Export und Unshare benutzen die Repo-ID (`shareID`/`_share_id`, sonst die Job-ID) für Ordner, Manifest und `chat.md` — auf beiden Servern. 2. Alt-Bestand: Ein importierter Job, dessen Ordner unter der eigenen Job-ID liegt, entfernt diesen Ordner beim nächsten Export; beim Import wird ein solcher Alt-Ordner übersprungen (nicht erneut als eigener Chat oder als Überschreibung des Jobs). 3. Tests auf beiden Seiten (Mac: swiftc-Kerntests; Linux: pytest), inklusive Mutationsprüfung. ## Nicht Teil der Korrektur Der schon entstandene doppelte Chat `289AFE5F` auf dem Mac Studio bleibt als lokale Kopie, sobald der Alt-Ordner verschwindet; löscht Alf von Hand.
Author
Owner

PR #250 gemergt: fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249)
http://docker:3000/iris/Iris/pulls/250

Commits:

  • fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249)

Stand Mac: geteilte Chats unter der Repo-ID exportieren

Befund: siehe Beschreibung. Ein importierter Chat (lokale Job-ID ≠ shareID) wurde beim Export unter seiner lokalen ID abgelegt, nicht unter der Repo-ID; ein Umbenennen auf der VM erzeugte auf dem Mac Studio einen zweiten Chat (D07A68B3 → 289AFE5F), B8D1C189 behielt den Titel.

Geändert:

  • ChatShareFiles: repositoryID(jobID:shareID:), manifest(_:withJobID:), isLegacyDuplicate, removeLegacyFolder.
  • ChatShareManager.export: Manifest, Ordner und chat.md (job_id) mit der Repo-ID; danach wird ein Alt-Ordner unter der eigenen Job-ID abgeräumt. unshare entfernt den Ordner der Repo-ID (und den Alt-Ordner). importAll übernimmt einen Alt-Ordner nicht (weder als neuen Chat noch als Überschreibung des eigenen Jobs).

Geprüft: scripts/test-vault-sync-core.sh: 291 Prüfungen, 0 Fehler (vorher 280). Der neue Block exportiert „Original“ vom Ursprung und „Umbenannt“ von einem Import: ein Ordner, Titel „Umbenannt“, chat.md mit Repo-ID; Alt-Ordner wird erkannt und abgeräumt. Ohne die Korrektur schlägt der Block an 5 Stellen fehl. swiftc -parse für ChatShareManager.swift und ChatShareFiles.swift ohne Fehler.

Nicht geprüft: Kein Xcode-Build, ChatShareManager wurde nicht kompiliert (nur geparst); nicht auf VM und Mac Studio probiert; kein Sync über Forgejo.

Offen / von Hand:

  • Der schon entstandene Doppel-Chat „Raspberry Pi 4 Gehäuse“ (289AFE5F) auf dem Mac Studio: Sobald die VM mit dem neuen Stand exportiert, verschwindet der Alt-Ordner D07A68B3, der Chat bleibt als lokale Kopie ohne Daumen und kann gelöscht werden.
  • Damit B8D1C189 den neuen Titel bekommt, muss die VM einmal neu exportieren (Umbenennen oder Jobende).
  • Linux-Server: eigener PR (iris-linux-server), gleiche Regel.
PR #250 gemergt: fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249) http://docker:3000/iris/Iris/pulls/250 Commits: - fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249) --- ## Stand Mac: geteilte Chats unter der Repo-ID exportieren **Befund:** siehe Beschreibung. Ein importierter Chat (lokale Job-ID ≠ `shareID`) wurde beim Export unter seiner lokalen ID abgelegt, nicht unter der Repo-ID; ein Umbenennen auf der VM erzeugte auf dem Mac Studio einen zweiten Chat (`D07A68B3` → `289AFE5F`), `B8D1C189` behielt den Titel. **Geändert:** - `ChatShareFiles`: `repositoryID(jobID:shareID:)`, `manifest(_:withJobID:)`, `isLegacyDuplicate`, `removeLegacyFolder`. - `ChatShareManager.export`: Manifest, Ordner und `chat.md` (`job_id`) mit der Repo-ID; danach wird ein Alt-Ordner unter der eigenen Job-ID abgeräumt. `unshare` entfernt den Ordner der Repo-ID (und den Alt-Ordner). `importAll` übernimmt einen Alt-Ordner nicht (weder als neuen Chat noch als Überschreibung des eigenen Jobs). **Geprüft:** `scripts/test-vault-sync-core.sh`: 291 Prüfungen, 0 Fehler (vorher 280). Der neue Block exportiert „Original“ vom Ursprung und „Umbenannt“ von einem Import: ein Ordner, Titel „Umbenannt“, `chat.md` mit Repo-ID; Alt-Ordner wird erkannt und abgeräumt. Ohne die Korrektur schlägt der Block an 5 Stellen fehl. `swiftc -parse` für `ChatShareManager.swift` und `ChatShareFiles.swift` ohne Fehler. **Nicht geprüft:** Kein Xcode-Build, `ChatShareManager` wurde nicht kompiliert (nur geparst); nicht auf VM und Mac Studio probiert; kein Sync über Forgejo. **Offen / von Hand:** - Der schon entstandene Doppel-Chat „Raspberry Pi 4 Gehäuse“ (`289AFE5F`) auf dem Mac Studio: Sobald die VM mit dem neuen Stand exportiert, verschwindet der Alt-Ordner `D07A68B3`, der Chat bleibt als lokale Kopie ohne Daumen und kann gelöscht werden. - Damit `B8D1C189` den neuen Titel bekommt, muss die VM einmal neu exportieren (Umbenennen oder Jobende). - Linux-Server: eigener PR (`iris-linux-server`), gleiche Regel.
Author
Owner

PR #131 gemergt: fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249)
http://docker:3000/iris/iris-linux-server/pulls/131

Commits:

  • fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249)

Stand Linux-Server: geteilte Chats unter der Repo-ID exportieren

Gegenstück zum Mac-PR (#249). chat_share.repository_id(job) (_share_id, sonst Job-ID) bestimmt Ordner, Manifest (jobID) und chat.md (job_id) beim Export; _unshare_sync entfernt den Ordner der Repo-ID. Alt-Ordner unter der eigenen Job-ID eines importierten Chats werden beim Export abgeräumt und beim Import übersprungen (_is_legacy_duplicate).

Geprüft: tests/test_chat_share.py: 15 grün, davon 2 neu (Umbenennen auf Iris B aktualisiert den Chat auf Iris A; Alt-Ordner wird abgeräumt und nicht erneut importiert); ohne die Korrektur schlagen beide fehl.
Nicht geprüft: nicht auf iris-server deployt, kein Sync über Forgejo.

Hinweis: In einem breiteren Lauf war tests/test_vault_git.py::test_vault_git_init_creates_repo_and_bundled_hook einmal rot (parallele Last); einzeln besteht er mit und ohne diese Änderung. Die volle Suite brach bei test_backup_create_returns_metadata mit Timeout ab (Backup-Test, nicht Teil dieser Änderung).

PR #131 gemergt: fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249) http://docker:3000/iris/iris-linux-server/pulls/131 Commits: - fix(chats-teilen): Importierter Chat wird unter seiner Repo-ID exportiert, Umbenennen erzeugt keinen zweiten Chat (iris/Iris#249) --- ## Stand Linux-Server: geteilte Chats unter der Repo-ID exportieren Gegenstück zum Mac-PR (#249). `chat_share.repository_id(job)` (`_share_id`, sonst Job-ID) bestimmt Ordner, Manifest (`jobID`) und `chat.md` (`job_id`) beim Export; `_unshare_sync` entfernt den Ordner der Repo-ID. Alt-Ordner unter der eigenen Job-ID eines importierten Chats werden beim Export abgeräumt und beim Import übersprungen (`_is_legacy_duplicate`). **Geprüft:** `tests/test_chat_share.py`: 15 grün, davon 2 neu (Umbenennen auf Iris B aktualisiert den Chat auf Iris A; Alt-Ordner wird abgeräumt und nicht erneut importiert); ohne die Korrektur schlagen beide fehl. **Nicht geprüft:** nicht auf iris-server deployt, kein Sync über Forgejo. Hinweis: In einem breiteren Lauf war `tests/test_vault_git.py::test_vault_git_init_creates_repo_and_bundled_hook` einmal rot (parallele Last); einzeln besteht er mit und ohne diese Änderung. Die volle Suite brach bei `test_backup_create_returns_metadata` mit Timeout ab (Backup-Test, nicht Teil dieser Änderung).
Author
Owner

PR #136 gemergt: docs(wire): Geteilte Chats liegen unter der Repo-ID des Ursprungs (iris/Iris#249)
http://docker:3000/alf/2ndbrain/pulls/136

Commits:

  • docs(wire): Geteilte Chats liegen unter der Repo-ID des Ursprungs (iris/Iris#249)

Stand Wire-Doku zu #249

02-Wire-Protokoll.md, Absatz „Ablage im Vault“: <ID> ist die Repo-ID des Ursprungs-Chats (nicht die lokale Job-ID eines importierten Chats), Manifest-jobID und chat.md-job_id tragen dieselbe ID; Alt-Ordner aus dem Export vor #249 werden beim Export abgeräumt und beim Import übersprungen. Entspricht dem Code in Mac-PR #250 und Linux-PR #131. Reine Doku, nur mit dem Code abgeglichen. Daily-Log-Einträge vom 31.10. liegen im Vault.

PR #136 gemergt: docs(wire): Geteilte Chats liegen unter der Repo-ID des Ursprungs (iris/Iris#249) http://docker:3000/alf/2ndbrain/pulls/136 Commits: - docs(wire): Geteilte Chats liegen unter der Repo-ID des Ursprungs (iris/Iris#249) --- ## Stand Wire-Doku zu #249 `02-Wire-Protokoll.md`, Absatz „Ablage im Vault“: `<ID>` ist die Repo-ID des Ursprungs-Chats (nicht die lokale Job-ID eines importierten Chats), Manifest-`jobID` und `chat.md`-`job_id` tragen dieselbe ID; Alt-Ordner aus dem Export vor #249 werden beim Export abgeräumt und beim Import übersprungen. Entspricht dem Code in Mac-PR #250 und Linux-PR #131. Reine Doku, nur mit dem Code abgeglichen. Daily-Log-Einträge vom 31.10. liegen im Vault.
alf 2026-10-31 09:09:20 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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
iris/Iris#249
No description provided.