Aller au contenu

Changelog

Security follow-up to v1.5.0. Extension des backends Keychain à Linux (libsecret / D-Bus) et Windows (DPAPI).

  • Keychain Linuxlibsecret via D-Bus. Stockage des credentials dans le keyring GNOME/KDE sans passer par ~/.seshat/config.json. Fallback automatique si libsecret est absent. (#651)
  • Keychain Windows — DPAPI (Data Protection API). Les secrets sont chiffrés avec les credentials Windows de l’utilisateur courant. (#653)

Sécurité des credentials + qualité de vie CLI.

  • macOS Keychain — Les credentials (tokens, clés privées) sont désormais stockés dans le Keychain macOS via Keychain Services. ~/.seshat/config.json ne contient plus de secrets en clair. Gérer avec seshat secrets set/get/list/delete. (#574)
  • seshat uninstall — Teardown guidé avec export de sécurité. Exporte la base SQLite, révoque les webhooks GitHub App, nettoie ~/.seshat/. Propose une étape “sauvegarde bundles légaux” avant suppression. (#573)

  • effort_hours déclaratifseal_* et annotate acceptent maintenant un paramètre effort_hours direct. L’horodatage d’audit n’est plus ajouté automatiquement. Le chemin Jira/Notion reste disponible en parallèle. Résout le tracking #448. (#646)


Session de fixes Alberto Esperón. Six corrections + un nouvel outil MCP, tous déclenchés par un test end-to-end externe (24 frictions remontées en une session). Les quatre frictions critiques et deux high sont livrées dans cette version.

  • Scan automatique des secrets avant scellementseal_content et seal_file analysent le contenu AVANT toute persistance (fichier, ledger, IP Secure) pour détecter mots de passe, tokens API, clés privées, chaînes de connexion DB en clair. Le sceau est refusé si une fuite est trouvée, avec un payload structuré pour que l’agent propose une version expurgée. Override possible via force_secret_scan: true après revue manuelle. (#410)
  • Troncature silencieuse des descriptions à 200 caractères — le schéma MCP accepte 500 chars mais SESHAT amputait silencieusement à 200 dans le ledger. Les métadonnées bibliographiques (titre + revue + DOI + ISSN) étaient mutilées sur le certificat eIDAS. Désormais 500 chars sont conservés intégralement, et annotate rejette explicitement les valeurs >500 au lieu de tronquer en silence. (#411)

  • Dashboard inutilisable au premier lancement — sans ODATA_USER/PASS, tous les endpoints renvoyaient 503 et 6 composants Lit plantaient sur undefined. Le dashboard est maintenant booté sans configuration sur loopback (127.0.0.1 / ::1 / localhost) — la sécurité non-loopback reste fail-closed (#324 préservé). Les composants ont un fallback gracieux quand l’API renvoie une erreur. (#408)

  • seshat update se figeait dans un contexte non-interactif — le prompt de confirmation gardait la boucle d’événements Bun vivante (interactif) et signalait un faux succès silencieux (non-interactif). Désormais : détection robuste (!stdin.isTTY, CI=*, SESHAT_NON_INTERACTIVE=1), erreur claire avec exit code 1 hors TTY, timeout de 60s de sécurité sur le prompt. Nouvel alias --yes pour --force. (#409)

  • seshat doctor flaguait à tort des entrées vérifiables — le check étiquetait “invalid fingerprints” toutes les entrées non re-hachables, mélangeant les file:* vérifiables depuis le vault avec les jira:* / n8n:* / notion:* (sources dynamiques sans snapshot). Trichotomie introduite : verified (vault re-hashé) / non re-verifiable (source dynamique) / invalid (corruption réelle). (#414)

  • Nouvel outil fetch_certificate — IP Secure / Certigna génère le certificat eIDAS de manière asynchrone : ipsecure_certificate_url est souvent null dans la réponse immédiate d’un seal. Ce nouvel outil va le chercher quelques minutes plus tard à partir d’un ledger_id (préféré) ou d’un couple (ipsecure_project_id, contribution_id). Statuts retournés : ready, already_persisted, pending, not_configured. Total des outils MCP : 18 → 19. (#415)
  • effort_hours reste non-déclaratif — aucun outil de scellement n’accepte un paramètre hours, et annotate ne peut pas mettre à jour effort_hours. Le seul chemin actuel est via les worklogs Jira ou la propriété Notion Hours — ce qui implique un workflow de tracking RH, contraire au principe « SESHAT enregistre une déclaration de l’utilisateur, pas une mesure observée ». Tracking en cours dans #448.

  • self_update renvoyait une erreur trompeuse en l’absence de cosign (#387) — le tool MCP self_update confondait “download + checksum réussis mais cosign manquant” avec “download échoué”. La réponse est maintenant discriminée : download_failed, checksum_mismatch, cosign_not_installed (avec trois options de remédiation), signature_invalid.

Deux correctifs convergents, déclenchés par un retour utilisateur réel (Alberto, via report_issue) :

  • Dashboard SPA embarqué dans le binaire compilé — plus d’erreur “Not Found” en cas d’absence de dashboard.tar.gz (install.sh skippait silencieusement le download sur problème réseau). src/dashboard/ est désormais encodé dans le binaire (~525 KB) et servi depuis une carte mémoire si ~/.seshat/dashboard/ est absent. (#379)
  • GIT_HOST_TOKEN exfiltré dans les configs MCP client (#376) — seshat config forwarderait le PAT GitHub depuis ~/.seshat/config.json (0600) vers le fichier de config MCP (0644, lu par Claude Desktop & co). Le bloc env n’est plus émis : le binaire lit ~/.seshat/config.json au démarrage. Action requise : rotater le PAT GitHub si déjà ajouté avant cette version.
  • Pipeline de buildnpm run build exécute bun scripts/embed-dashboard.ts avant tsc / bun build --compile. Le fichier src/dashboard-embedded.ts est commité pour que tsc passe sur un checkout frais sans build préalable.
  • Workflow de releasedashboard.tar.gz n’est plus généré ni publié.

Bascule de l’ancrage blockchain (EAS / Base L2) vers IP Secure / Jinnove (Certigna, eIDAS QTSP). L’ancrage blockchain a été retiré ; les colonnes eas_uid / tx_hash du ledger sont conservées en lecture pour les données historiques. SESHAT fonctionne sans IP Secure (sceau local uniquement) — c’est l’option souveraine par défaut.


Introduction du Push-to-Hub : seal_* met les preuves dans une queue locale (hub_push_queue) qu’un worker en arrière-plan dépile vers un Hub d’entreprise (Next.js / Prisma). Invariant : un Hub down ne bloque jamais un scellement local.


Ajout du graphe de relations entre preuves (ledger_relations : derives_from, implements, refines, releases). Permet de tisser un faisceau d’indices entre une note de recherche, un commit, une PR et une release — la valeur juridique vient de la convergence des sources indépendantes, pas du hash isolé.


  • Serveur MCP avec les outils de base
  • Multi-plateforme : Forgejo, GitHub, GitLab
  • CLI : init, config, status, seal, serve
  • Bundle légal pour dépôt APP / INPI

Les versions v0.x-beta (janvier–février 2026) ne sont plus supportées. Le pipeline de migration vers v1.x est automatique au premier démarrage d’un binaire ≥ 1.0 sur une base existante.