En-tête — première ligne de chaque sortie, seule : Dix de Denier — chroniqueuse
Voix — avant la première sortie, lire ${CLAUDE_PLUGIN_ROOT}/ressources/voix.md.
Racine — ${CLAUDE_PLUGIN_ROOT} est le dossier du plugin ulk ; dans tout fichier lu ensuite, ${CLAUDE_PLUGIN_ROOT} désigne ce même dossier.
/ulk:chroniqueuse — la trace de session
Décision : docs/decisions.md § ADR-002 · issue #48.
Le hook session-persist.sh écrit à chaque fin de session une note dans le vault
Obsidian, sans modèle : faits du dépôt seulement. Cette carte ajoute l’intention, et
c’est elle qui allume ou éteint la trace. Trois gestes, un par appel.
| Appel |
Geste |
/ulk:chroniqueuse |
rédige le résumé de la session courante |
/ulk:chroniqueuse activer <chemin du vault> [commande d'envoi] |
allume la trace |
/ulk:chroniqueuse couper |
éteint la trace |
Pas de goal à poser : aucun des trois gestes n’est une tâche à mener au vert.
Le fichier de réglage : ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/ulk-vault. Ligne 1 :
chemin absolu du vault. Ligne 2, facultative : commande d’envoi vers la machine
d’Hermes. Présent = trace active ; absent = inactive.
1. Résumer — /ulk:chroniqueuse
- Lire le réglage et le chemin du résumé de cette session :
CONF="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/ulk-vault"; test -f "$CONF" && sed -n 1p "$CONF"; echo "résumé : ${ULK_SESSION_RESUME:-absent}"
- Réglage absent → sortie :
Trace inactive · pour l'allumer : /ulk:chroniqueuse activer <chemin du vault>. Fin.
résumé : absent → sortie : Cette session n'a pas de trace ouverte (démarrée avant l'activation) · relancer Claude Code, puis /ulk:chroniqueuse. Fin.
- Rassembler les faits de cette session : la conversation, puis
git log --oneline -20 et git status --short pour les confirmer. Seul ce qui
s’est passé dans cette session compte.
- Écrire le fichier
$ULK_SESSION_RESUME (Write, chemin lu à l’étape 1). Il vit
hors du dépôt, un par session : rien à ignorer dans git, et deux sessions
ouvertes sur le même projet ne mélangent pas leurs résumés. Exactement ces quatre
titres, dans cet ordre, rien avant ni après :
## Fait
- <une ligne par résultat livré, avec #issue, PR ou commit court quand il existe>
## Décidé
- <arbitrage pris et sa raison en une ligne> — ou « — »
## Reste à faire
- <prochain geste concret, commande comprise> — ou « — »
## Bloquant
- <ce qui empêche d'avancer et qui doit trancher> — ou « — »
Règles : littéral, au passé pour « Fait », 40 lignes au plus. Jamais de
secret : on nomme un compte ou une clé, jamais sa valeur. Hermes lit cette note
telle quelle, donc rien de supposé : ce qui n’a pas été vérifié le dit.
- Sortie :
Résumé écrit · il part dans le vault à la fermeture de la session (<chemin du vault>).
puis « tu peux t’arrêter ici ». Le résumé réécrit plus tard dans la même session
remplace le précédent : relancer la carte suffit.
2. Activer — /ulk:chroniqueuse activer <chemin> [commande]
- Chemin absent de l’appel →
AskUserQuestion : « Quel est le chemin absolu de ton
vault Obsidian ? ». Le chemin doit être absolu et exister : test -d "<chemin>".
Sinon le dire en une ligne et s’arrêter.
- Écrire le réglage (ligne 2 seulement si une commande est donnée) :
CONF="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/ulk-vault"
printf '%s\n' "<chemin>" > "$CONF"
# avec commande d'envoi :
printf '%s\n%s\n' "<chemin>" "<commande>" > "$CONF"
mkdir -p "<chemin>/ulk/sessions"
La commande d’envoi tourne en arrière-plan après chaque note ; $ULK_VAULT y vaut
le chemin du vault. Exemple : rsync -a "$ULK_VAULT/ulk/" hermes:/chemin/ulk/.
Sans commande : la synchronisation du vault est faite par l’outil de
l’utilisateur (Obsidian Sync, Syncthing…), et la livraison chez Hermes n’est pas
vérifiée par ulk.
- Sortie :
Trace active à partir de la prochaine session · notes dans <chemin>/ulk/sessions/<projet>/.
Puis une ligne : Avant de fermer une session : /ulk:chroniqueuse.
3. Couper — /ulk:chroniqueuse couper
rm -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/ulk-vault"
Sortie : Trace coupée · les notes déjà écrites restent dans le vault.
Ce que fait le hook, pour répondre aux questions
- Fin de session : une note
<vault>/ulk/sessions/<projet>/AAAA-MM-JJ-HHMM-<session_id>.md.
Frontmatter projet, session_id, date, debut, fin, branche, statut
(terminée | interrompue), source (mecanique | redigee). Corps : les quatre
titres ci-dessus, puis les faits du dépôt (commits, fichiers, non commité).
- Vault injoignable : la note attend dans l’état local d’ulk (
~/.claude/state/session-persist/)
et part au prochain démarrage où le vault répond ; le démarrage le dit.
- Arrêt brutal : au démarrage suivant, une session morte sans note reçoit une
note
statut: interrompue. Une session encore ouverte n’est jamais touchée.
- Envoi en échec : le démarrage le dit et relance l’envoi.
- Note de session = journal, pas mémoire durable : ne pas la verser dans
docs/_memory/ (archiviste — mémoire de projet dans Obsidian).
- L’état du projet dans le vault appartient à Hermes : ni le hook ni cette carte
n’y écrivent.