fix(journaux): attribution correcte après bascule de chapitre/projet (#40, #31, #39)#47
Merged
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 émetexpiredalors qu'editorStore.filePathporte déjà le nouveau chemin.recordAdjudicationaccepte désormais un contexte{filePath, projectPath}capturé à la création de la vue dansCodeMirrorEditor(même motif que la gardeownFilePathdu 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).
writeAuditLogprend le flux en paramètre ; chaqueMCPClientManagerest lié par closure aumcp-access.jsonlouvert pour lui. UncallToolen 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 buildvert.Closes #40 · Closes #31 · Closes #39
🤖 Generated with Claude Code