Le journal de chantier : le projet se souvientThe job journal: the project remembers
Pendant qu'un chantier avance, il arrive des choses qui ne demandaient pas à arriver : un défaut pressenti, une décision à prendre, un travail repéré en passant. Le journal de chantier les garde — dans un registre Markdown unique par projet, arbitré par vous quand l'approbation l'exige, et travaillé automatiquement quand le projet se repose.While a build runs, things happen that were not asked for: a suspected defect, a decision to make, work spotted along the way. The job journal keeps them — in a single Markdown register per project, arbitrated by you when approval demands it, and worked on automatically when the project rests.
Le journal, en deux motsThe job journal, in two words
Un chantier ressemble à une conversation : quand la session tourne, ce qui est remarqué en dehors du sujet demandé s'évapore avec le fil. Le journal de chantier est la réponse à cette perte : un registre unique — « le carnet du chantier » — où chaque constat a une fiche durable, un statut visible et une suite possible.
A build is like a conversation: while a session runs, whatever is noticed beyond the requested task evaporates with the thread. The job journal is the answer to that loss: a single register — the "site diary" — where each observation gets a lasting entry, a visible status and a possible follow-up.
Les sources sont deux : les agents, qui signalent un constat sans détourner le tour en cours, et vous, qui ajoutez ou corrigent ce qui compte. La politique d'approbation du projet décide si chaque entrée attend votre validation ; et quand le projet est inactif, un traitement de fond trie la file — sans jamais corriger votre code sans autorisation.
Two sources feed it: the agents, who report findings without derailing the running turn, and you, who add or sharpen what matters. The project's approval policy decides whether each entry waits for your go-ahead; and when the project is idle, a background triage works through the queue — never touching your code without authorization.
✓Un registre par projet, sous .visidog/journal/One register per project, under .visidog/journal/
✓Des entrées Markdown : un sujet, un statut, une chronologieMarkdown entries: one topic, one status, a timeline
✓Déduplication par signature : pas de doublonsSignature deduplication: no duplicates
✓L'approbation vous revient, jamais à l'automateApproval is yours, never the machine's
✓Le triage au repos : rien pendant vos sessionsTriage at rest: nothing during your sessions
✓Correction optionnelle, désactivable par projetOptional fixing, disablable per project
La vie d'une entréeAn entry's life
Une entrée naît d'un constat : l'IA remarque quelque chose en passant, ou vous consignez vous-même. Le registre la jauge, lui donne un statut, la garde ouverte, la bloque — et ne clôt jamais sans raison. Elle reste active tant qu'il y a quelque chose à en dire, et figée (source de vérité) une fois résolue.
An entry is born from a finding: the AI notices something along the way, or you log it yourself. The register sizes it up, gives it a status, keeps it open or blocks it — and never closes it without a reason. It stays alive while there is something to say, and frozen (source of truth) once resolved.
Schéma 2 — La vie d'une entrée : constat, déduplication, arbitrage humain, suivi au repos.Diagram 2 — An entry's life: spotted, deduplicated, human-arbitrated, cared for at rest.
Derrière ce parcours, un carnet honnête : chaque entrée vit dans son propre dossier JNL-…, avec un fichier entry.md qui porte le statut, la source, l'assigné, les priorités — et une chronologie tenue au cordeau, sans retour d'un rapprochement passé. Des commandes de garde comme /journal validate et /journal reindex surveillent la cohérence : le registre reste lisible même lorsque beaucoup de mains l'éditent.
Behind that flow, an honest ledger: each entry lives in its own JNL-… folder, with an entry.md carrying the status, source, assignee, priorities — and a tightly kept timeline, appended over time. Guard commands like /journal validate and /journal reindex watch over its consistency: the register stays readable even when many hands edit it.
1Garder le fil, pas le doublon. Quand un constat revient, il ne crée pas une fiche : l'entrée existante recueille l'occurrence, ses étiquettes et son histoire. Chaque retour sans suite est consigné, jamais raconté deux fois.Keep the thread, not the duplicate. When a finding returns, it does not create a record: the existing entry absorbs the occurrence, its labels and its history. A recurrence is noted, never told twice.
2L'humain tranche, l'automate suit. Approbation et reprise sont strictement humaines : les outils d'agent refusent sans exception de toucher à ces clés.The human decides, the machine follows. Approval and resumption are strictly human: agent tools refuse to ever touch those keys.
3À côté du livrable. Le registre se tient dans un dossier dédié du projet, hors code livré : vos exports et votre versionnement ne le découvrent pas.Next to, not inside, the deliverable. The register sits in a dedicated project folder, outside shipped code: your exports and versioning never discover it.
L'approbation humaineHuman approval
Chaque projet choisit sa politique d'approbation : none, les entrées partent dans la file dès la création ; ou human, chaque entrée nouvelle attend votre décision. Avec la politique humaine, une entrée en attente n'est pas bannie : elle reste consultable, éditable, annotée — simplement, elle ne participe pas au travail de fond tant que la validation n'est pas passée.
Each project picks its approval policy: none, entries join the queue as soon as they are created; or human, every new entry waits for your call. Under the human policy a pending entry is not banned: it stays readable, editable, annotatable — it just does not join the background work until it is approved.
Voter se fait d'un geste : /journal approve pour donner un feu vert, /journal reject pour clore avec motif, /journal reopen pour remettre en débat une entrée tranchée. La vue dédiée du terminal regroupe ces décisions : listing groupé par statut, pastille visible quand des validations attendent, détail complet de chaque fiche.
Voting is one gesture: /journal approve to give a green light, /journal reject to close with a reason, /journal reopen to put a decided entry back into debate. A dedicated view in the terminal groups these decisions: a listing grouped by status, a badge whenever approvals are pending, and the full details of any entry.
Ce verrou est absolu : les outils d'agent ne modifient jamais la clé d'approbation — c'est un contrat dur du terminal, pas une préférence. Une entrée approuvée ne repasse en débat que si vous le demandez explicitement, avec /journal reopen.
That lock is absolute: agent tools never change the approval key — a hard contract of the terminal, not a preference. An approved entry only goes back into debate if you explicitly say so, with /journal reopen.
Le triage automatique quand le projet est inactifAutomatic triage while the project rests
Le terminal garde une horloge intérieure : il sait quand une session travaille une cible (tour en cours, objectif, hook, workflow) et quand le projet, tout entier, est au repos. Le traitement de fond attend ce deuxième état : le triage ne démarre jamais pendant une session active — et, une fois lancé, il finit l'entrée en cours même si vous reprenez entre-temps.
The terminal keeps an inner clock: it knows when a session is working (a running turn, a goal, a hook, a workflow) and when the project as a whole is at rest. The background treatment waits for that second state: triage never starts during an active session — and once started, it finishes the entry at hand even if you come back meanwhile.
Schéma 3 — Le triage glisse dans les creux : la porte exige le repos, la passe lancée n'est jamais coupée.Diagram 3 — Triage slips into the lulls: the gate demands rest, and a started pass is never cut.
Concrètement, un run de triage : prend la tête de la file — l'entrée la plus urgente d'abord, selon priorité, gravité et ancienneté ; la lit en entier ; la fait examiner par un agent d'analyse en lecture seule, qui rédige une analyse et un diagnostic ; lui applique un statut — typiquement triaged. Puis passe à la suivante, au plus onze entrées par run, chacune vue une seule fois. Si la file est vide quand l'occasion se présente, rien ne démarre : aucun run ne tourne pour rien.
In practice, a triage run: takes the head of the queue — the most pressing entry first, by priority, severity and age; reads it in full; hands it to a read-only analyst agent, which writes an analysis and a finding; applies a status — typically triaged. Then moves on, at most eleven entries per run, each seen exactly once. If the queue is empty when the chance arrives, nothing starts: no run sits idle for nothing.
Cette occasion se présente sur des moments naturels : fin de tour, changement de projet, approbation rendue, démarrage du terminal. L'exécution tourne dans une session dédiée au fond — invisible dans la liste des sessions, sans trace au ménage : une fois le run fini, elle est purgée proprement, sans toucher au journal.
That chance arrives on natural occasions: the end of a turn, a project switch, an approval handed down, the terminal starting. The run executes on a dedicated session kept in the background — invisible in the session list, leaving no trace behind: once the run ends, it is cleanly purged, without touching the journal.
Et la correction ?And the fix?
Le triage qualifie, il ne répare pas. Pour autant, un statut triaged n'est pas un verdict mort : quand la file ne compte plus d'entrées ouvertes — souvent juste après le triage — un second workflow peut prendre le relais, activé par défaut : le correctif automatique.
Triage qualifies, it does not repair. Still, a triaged status is not a dead end: when the queue holds no more open entries — often right after triage — a second workflow can take over, enabled by default: the automatic fix.
Le correcteur est un agent dont la tâche reçoit uniquement l'entrée, jamais le fil qui l'a consignée : il confine son travail au constat, et s'il manque quelque chose, il ne devine pas — il le rapporte. Réussite : l'entrée passe in_progress puis resolved, avec sa note. Échec : elle devient blocked, avec le motif exact — une reprise humaine, jamais une boucle invisible. La correction automatique peut être désactivée par projet (/journal autofix off) : tout reste alors au triage, et la correction vous revient en entier.
The fixer is an agent whose task receives only the entry, never the thread that recorded it: it keeps its work within the finding, and when something is missing it does not guess — it reports. Success: the entry moves to in_progress then resolved, with its note. Failure: it becomes blocked, with the exact reason — resumed by a human, never an invisible loop. The automatic fix can be disabled per project (/journal autofix off): then everything stops at triage, and fixing is all yours.
L'utiliser dans VisiDogUsing it in VisiDog
1
Activez le registreTurn the register on
L'icône du carnet (à gauche de l'icône RAG) active le journal du projet, ou /journal enable : on choisit sur la même occasion la politique d'approbation — none ou human. La vue de suivi s'ouvre ensuite à tout moment par le bouton dédié ou Ctrl+Shift+J.
The diary icon (to the left of the RAG icon) turns the journal on, or /journal enable: on the same occasion you pick the approval policy — none or human. The tracking view opens anytime from the dedicated button or Ctrl+Shift+J.
2
Signalez, enrichissezReport, enrich
Vous : /journal new crée une entrée immédiate, /journal note apporte un complément sur une entrée existante. Les agents : ils signalent leurs constats sans interrompre le tour, avec leurs preuves ; le hors-périmètre remarqué en passant a une adresse.
You: /journal new creates an entry at once, /journal note adds a follow-up on an existing one. Agents: they report findings without interrupting the turn, with their evidence; off-task observations spotted along the way have an address.
3
Arbitrez, suivezArbitrate, follow
/journal list et /journal queue montrent la file ; /journal approve, reject (motif) et reopen tranchent ; /journal suspend et resume gèrent les suspensions. Laissez le terminal se reposer : la passe de fond constate, trie, et les runs enchaînés font avancer la file pendant votre absence.
/journal list and /journal queue show the queue; /journal approve, reject (with a reason) and reopen decide; /journal suspend and resume manage suspensions. Let the terminal rest: the background pass observes, sorts, and the chained runs keep the queue moving while you are away.
Cas d'usageUse cases
L'imprévu remarqué en passantThe aside worth keeping
Pendant une tâche en cours, l'IA remarque un contrat incomplet, un doublon éventuel, un module de test suspect : plus question de la perdre — une entrée la consigne, de façon durable : un statut, une source, des preuves.
While a task is under way, the AI spots an incomplete contract, a possible duplicate, a suspicious test module: no longer lost — an entry records it, durably: with a status, a source, evidence.
La même alerte qui revientThe alert that keeps coming back
Quatre étapes rencontrent le même défaut : quatre occurrences, une seule entrée. La fiche recueille chaque retour, grossit de preuves et de notes, et le statut reste clair : jamais trois tickets séparés à chasser le doublon.
Four steps meet the same defect: four occurrences, one entry. The file absorbs each return, grows with notes and labels, and the status stays clear: never three separate tickets hunting duplicates.
Le projet qui couve en votre absenceThe project that incubates while you are away
Pause déjeuner, week-end, onglet laissé ouvert : dès que plus rien n'active le projet, la file se vide — analyses, triages, correctifs —, et vous retrouvez des fiches classées, prêtes à lire.
Lunch break, weekend, a tab left open: as soon as nothing activates the project, the queue clears itself — analyses, triages, fixes — and you find back clearly stamped, sorted entries.
Le contrôle qualité qui reste humainQuality control that stays human
Politique human : chaque nouveau constat attend le feu vert. On rejette avec motif, on valide avec note, on réouvre en cas de désaccord — le fond ne travaille que ce que vous avez admis, et rien au-delà.
The human policy: every new finding waits for your go-ahead. You reject with a reason, approve with a note, reopen when you disagree — the background reaches exactly what you let it, and no further.
Ce que ça vous apporteWhat it brings you
✓Une mémoire longue : ce qui est remarqué une fois reste disponible pour tout le chantier, quel que soit le fil de session.A long memory: what is noticed once stays available for the whole build, whichever session's thread.
✓Une source de vérité honnête : chronologie append-only, commande de validation, index reconstruit.An honest source of truth: append-only timeline, a validation command, a rebuildable index.
✓Zéro doublon : la signature déduplique — le même sujet reste une seule fiche, nourrie de ses occurrences.No duplicates: the signature deduplicates — the same topic stays one entry, fed by its occurrences.
✓Vous gardez la main : approbation humaine, reprise humaine, motif obligatoire pour rejeter — l'automate ne tranche pas.You keep the hand: human approval, human resumption, mandatory reason to reject — the machine never decides.
✓Le fond travaille au repos : la porte d'inactivité garantit qu'aucune passe ne tourne pendant votre session.The background works at rest: the idle gate guarantees no pass runs during your session.
✓Le registre reste à l'écart : sous un dossier dédié, hors livrable exporté — votre ZIP et votre Git restent intacts.The register stays out of the way: under its own folder, outside the exported deliverable — your ZIP and Git stay intact.
Points d'attentionPoints of attention
Le journal n'est pas le livrableThe journal is not the deliverable
Le registre est exclu de l'indexation Git et de l'export ZIP : il décrit le chantier, pas le code livré. Pour conserver un historique d'entrées au-delà de la vie du projet, exportez d'abord ; le journal reste une trace du chantier, pas une copie de son livrable.
The register is excluded from Git indexing and from the ZIP export: it describes the build, not the shipped code. To keep an entry history beyond the project's life, export first; the journal itself stays a trace of the project, not a copy of its output.
L'attente est assuméeThe waiting is deliberate
Sous la politique human, une entrée non approuvée ne traverse jamais la porte du fond : les validations en attente sont à vous. Si le chantier doit filer sans frottement, la politique none reste disponible.
Under the human policy, an unapproved entry never crosses the background gate: pending approvals are yours. If the build must run friction-free, the none policy stays available.
La déduplication compte aussi sur vousDeduplication also relies on you
La signature fusionne un même sujet au même composant, formulé à la même façon : deux tournures très différentes peuvent donner deux entrées. Marquez alors la seconde comme doublon d'une existante, et la chronologie reste propre.
The signature merges the same topic on the same component phrased the same way: two very different wordings can yield two entries. Mark the second as a duplicate of the existing one, and the timeline stays clean.
Le triage qualifie, le correcteur confineTriage qualifies, the fixer confines
La passe de fond ne répare pas : elle analyse et oriente. Là où la correction automatique est active, le correcteur se limite au constat — s'il manque du contexte, il bloque l'entrée avec son motif, au lieu d'aller au-delà. Le vague est traité comme un motif de blocage, pas comme une invitation à improviser.
The background pass does not repair: it analyzes and routes. Where the automatic fix is active, the fixer stays within the finding — if context is missing, it blocks the entry with its reason instead of reaching beyond. Vagueness is treated as a blocker, not an invitation to improvise.