Skip to content

fix(journaux): attribution correcte après bascule de chapitre/projet (#40, #31, #39)#47

Merged
cliodeck merged 1 commit into
mainfrom
fix/40-journal-attribution
Jul 24, 2026
Merged

fix(journaux): attribution correcte après bascule de chapitre/projet (#40, #31, #39)#47
cliodeck merged 1 commit into
mainfrom
fix/40-journal-attribution

Conversation

@inactinique

Copy link
Copy Markdown
Collaborator

Résumé

Trois écritures de journaux relisaient l'état vivant d'un singleton au moment où l'IPC/le callback s'exécute, au lieu de l'état capturé à l'émission — la famille de défauts documentée dans #31/#39/#40.

Correctifs

#31 — expiry des propositions (renderer). view.destroy() à la bascule de chapitre émet expired alors qu'editorStore.filePath porte déjà le nouveau chemin. recordAdjudication accepte désormais un contexte {filePath, projectPath} capturé à la création de la vue dans CodeMirrorEditor (même motif que la garde ownFilePath du content-sync, qui ne couvrait pas ce chemin). Les adjudications synchrones (accept/reject/modify) gardent le repli sur l'état courant.

#40 — handler d'adjudication (main). Le payload porte maintenant projectPath (schéma zod + preload typés) ; le handler compare au projet courant et ignore avec warning un événement émis pour un autre projet, plutôt que d'écrire dans les journaux (brain.db/journal.db) du mauvais projet. Best-effort assumé, cohérent avec le contrat du handler.

#39 — audit MCP (main). writeAuditLog prend le flux en paramètre ; chaque MCPClientManager est lié par closure au mcp-access.jsonl ouvert pour lui. Un callTool en vol résolu après la bascule ne peut plus écrire dans le journal du nouveau projet ; un événement tardif sur flux fermé est perdu avec warning (intégrité d'attribution > complétude).

Vérification

  • npx vitest run src/editor/proposals src/main/ipc : 114/114 verts.
  • npm run build vert.

Closes #40 · Closes #31 · Closes #39

🤖 Generated with Claude Code

…40, #31, #39)

Trois écritures de journaux relisaient l'état vivant d'un singleton
après coup, au lieu de l'état capturé à l'émission :

- #31 — l'événement `expired` émis par view.destroy() à la bascule de
  chapitre lisait editorStore.filePath, déjà remplacé : l'expiration
  était journalisée sur le NOUVEAU chapitre. Le contexte (fichier +
  projet) est désormais capturé à la création de la vue et passé à
  recordAdjudication — même motif que la garde ownFilePath du
  content-sync, qui ne couvrait pas ce chemin.

- #40 — proposals:adjudication écrivait dans historyService /
  usageJournalService, singletons remplacés par project:load : un
  événement en vol pendant la bascule atterrissait dans les journaux du
  nouveau projet. Le payload porte maintenant projectPath et le handler
  ignore (warning) tout événement d'un autre projet que le courant.

- #39 — le onEvent du manager MCP écrivait via this.auditLogStream, le
  flux COURANT : un callTool en vol sur l'ancien manager résolu après la
  bascule écrivait dans le mcp-access.jsonl du nouveau projet. Chaque
  manager est désormais lié par closure au flux ouvert pour lui ; un
  événement tardif sur flux fermé est perdu avec warning (intégrité
  d'attribution > complétude pour un journal d'audit).

Closes #40
Closes #31
Closes #39

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cliodeck
cliodeck merged commit 28892ee into main Jul 24, 2026
2 checks passed
@cliodeck
cliodeck deleted the fix/40-journal-attribution branch July 24, 2026 16:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants