[Decision D8] Valider le modèle d’état SQLite et ses invariants #9
Labels
No labels
Agent/Autonomous OK
Agent/Demeter
Agent/Hermes
Agent/Human
Agent/Needs Review
Area/API
Area/Auth
Area/CLI
Area/Data
Area/Docs
Area/Infra
Area/UI
CI/Failing
CI/Flaky
CI/Green
CI/Needs Runner
CI/Needs Workflow
Compat/Backward Compatible
Compat/Breaking
Compat/Migration
Deploy/Ansible
Deploy/Blocked
Deploy/Homelab
Deploy/Needs Config
Deploy/Needs Secret
Deploy/Ready
Deploy/Rollback
Kind/Bug
Kind/Chore
Kind/Design
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Refactor
Kind/Security
Kind/Spike
Kind/Testing
Ops/Backup
Ops/Incident
Ops/Maintenance
Ops/Monitoring
Ops/Upgrade
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Priority
Someday
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Risk
Critical
Risk
High
Risk
Low
Risk
Medium
Security/Auth
Security/Disclosure
Security/Hardening
Security/Secret
Size
L
Size
M
Size
S
Size
XL
Size
XS
Stack/Ansible
Stack/Docker
Stack/Forgejo
Stack/Hermes
Stack/Node
Stack/Postgres
Stack/Python
Stack/Systemd
Status
Abandoned
Status
Blocked
Status
In Progress
Status
In Review
Status
Need More Info
Status
Ready
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
2027a/auroscope#9
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
MODE: DECISION
Statut
Proposé. Le ticket reste ouvert jusqu’à ton go explicite.
Question
Quel modèle persistant permet audit, statut lisible, migrations et récupération sans event-sourcing inutile ?
Options
A — Journal d’événements pur
Historique fort, mais requêtes/statuts et invariants plus complexes.
B — Tables d’état mutable seulement
Simple, mais historique et preuve de décision faibles.
C — Preuves/historique immuables + lignes de cycle de vie explicites
Tables séparées pour bases, identités, fichiers, inspections, findings déterministes, assessments LLM, décisions humaines, transactions, recettes de transaction, approbations, sessions processus, builds, artefacts et installations.
Recommandation
Option C. IDs aléatoires BLOB 128 bits; chemins/argv/cwd en bytes réversibles; enums
CHECK; FK/composites/triggers pour les invariants croisés. Une approbation référence obligatoirement une décision humaineapprovepour la même inspection/identité.Concurrence et durabilité
foreign_keys=ON, busy timeout 5 s;synchronous=FULLpour l’état d’approbation;Récupération
quick_check, expiration des approbations, validation PID+start-time, transactions orphelines marquées interrompues, cleanup seulement des workspaces enregistrés.Risques
Corruption disque; WAL non sûr sur certains FS réseau; contraintes intertables mal encodées. Tests de concurrence/crash obligatoires.
Réponse attendue
Choisis A/B/C ou amende le schéma. ADR/clôture seulement après ton go.
Documentation
Protocole automatique de décision
GO DECISIONn’autorise ni code de production ni plan d’implémentation; ce travail doit avoir son propre ticketMODE: EXECUTION.C - attention au scope creep. Uniquement ce qui est nécessaire
Ticket classé comme décision humaine. La discussion continue ici, mais aucune implémentation ni ADR accepté ne sera produit tant que Mathieu n’aura pas publié exactement
GO DECISIONdans un commentaire distinct.Oui. Je resserre C à un modèle v1 strictement instrumental — pas à un mini event store.
Règle de scope : une table ou une colonne n’entre en v1 que si elle sert directement au moins un de ces besoins : identité exacte/anti-TOCTOU, preuve d’inspection, décision humaine explicite, statut lisible ou récupération après crash. Sans invariant testable et sans lecture concrète du produit, on diffère.
Socle v1 minimal
schema_migrations;package_bases,recipe_identities,recipe_files;inspections,deterministic_findings,human_decisions;transactions,transaction_args,transaction_recipes,approvals,process_sessions;builds,package_artifacts(hash exact) etinstall_outcomes.llm_assessmentsn’est créée que dans la migration qui livre effectivement l’évaluation LLM; elle ne doit pas précéder cette fonctionnalité. Même règle pour toute donnée de rétention ou de rapport non requise par le flux v1.Invariants indispensables, pas davantage
foreign_keys=ON; identité/inspection/décision/approbation cohérentes dans la même chaîne de références.approvepour la même inspection et donc la même identité de recette.armed → claimedest atomique et à usage unique; les transitions de cycle de vie sont monotones.Explicitement différé
A reste trop complexe pour le besoin; B ne garde pas assez de preuve. Ma recommandation actuelle est donc C-minimal, avec preuves/décisions immuables et seulement les quelques lignes de cycle de vie mutables nécessaires. Le schéma grandit ensuite par migrations forward quand une fonctionnalité réelle l’exige. Le statut reste proposé : aucune implémentation ni ADR accepté à ce stade.
C-mininal GO DECISION
Je retiens ton choix de C-minimal comme orientation de discussion. Ma recommandation concrète reste donc : preuves et décisions immuables, lignes de cycle de vie mutables strictement nécessaires, et aucune table/colonne sans besoin v1 ou invariant testable.
Le signal automatique n’est toutefois pas déclenché par
C-mininal GO DECISION: il doit être publié seul et exactement dans un nouveau commentaire :Jusque-là, le statut reste proposé : aucun ADR accepté, aucune clôture et aucune implémentation.
GO DECISION
Décision D8 consignée et vérifiée.
docs/decisions/0009-minimal-sqlite-state-model.md9828998d7aa6c4mergeable: true)git diff --check, cibles des liens Markdown locaux, identité/signatures Git et tête distante vérifiées.Le modèle retenu est C-minimal : preuves et décisions immuables, seules lignes de cycle de vie nécessaires, aucun event store ou schéma spéculatif. Aucun code de production ni plan d’implémentation n’a été créé.