Stockage
arka-deck stocke localement trois types de données : des fichiers (sessions, mémoire, ArkaDoc, marker projet), des bases SQLite (sessions chat, provider instances, ArkaDoc manifest), et des secrets chiffrés (clés provider, OAuth tokens).
Aucune donnée utilisateur ne quitte la machine sauf trafic explicite vers le Cortex public (catalogue) ou le provider IA configuré.
Filesystem — allowlist anti-symlink
Section intitulée « Filesystem — allowlist anti-symlink »Le port Filesystem applique une allowlist au boot :
~/.arka-deck/(arkaHome global)<projectPath>/.arka-deck/(pour chaque projet ouvert)- Les chemins de pièces jointes explicitement importées via l’UI
Toute écriture en dehors de l’allowlist est refusée. La protection inclut le realpath avant matching, pour éviter les contournements via symlinks.
Voir ADR 0001 pour la décision globale et adapters/outbound/system/preferences-path-policy.ts pour l’impl.
SQLite — bases locales
Section intitulée « SQLite — bases locales »| Base | Chemin | Contenu |
|---|---|---|
chat.db | ~/.arka-deck/chat/chat.db | Sessions et messages chat (timeline complète) |
providers.db | ~/.arka-deck/providers/providers.db | Instances providers (clés chiffrées) |
| Per-project | <projet>/.arka-deck/squad/missions.sqlite | Missions multi-agents (Squad Orchestration) |
Le moteur est better-sqlite3 (synchrone, performant, sans dépendance native compliquée). Toutes les écritures critiques sont atomiques (transaction).
Secrets — AES-256-GCM local
Section intitulée « Secrets — AES-256-GCM local »Les secrets (clés API, tokens OAuth) sont chiffrés via le port SecretCipher :
| Élément | Détail |
|---|---|
| Algorithme | AES-256-GCM |
| Format | v1:<iv-base64>:<tag-base64>:<encrypted-base64> |
| Clé maître | ~/.arka-deck/secrets/secrets.key, mode 600, créée au 1er boot |
| Auth tag | 16 octets — flip de bit → SecretCipherFailedError visible |
| Migration | Port swappable vers Keychain macOS / libsecret Linux |
Si secrets.key est supprimé, une nouvelle clé est générée au prochain boot. Les anciennes instances chiffrées deviennent irrécupérables — c’est volontaire (aucune voie de récupération externe).
Voir ADR 0005.
Arborescence disque type
Section intitulée « Arborescence disque type »~/.arka-deck/ ← arkaHome (override par env ARKA_DECK_HOME) index/ workspaces.json projects.json preferences/ user.json security.json ← allowlist user cache/ catalogue/... providers/ providers.db ← SQLite instances provider secrets/ secrets.key ← clé maître (mode 600) chat/ chat.db ← SQLite sessions chat
<projectPath>/ ← n'importe où sur disque .arka-deck/ project/marker.json ← marker projet (source de vérité) agents/installed.json ← agents installés (Materializer track) hooks/installed.json skills/installed.json memory/ ← mémoire locale (memory-local) addons/<addon>/... ← données par addon cortex-actions/... ← logs cortex-actions squad/missions.sqlite ← SQLite missions Squad arkadoc/ ← documents projet .claude/ ← matérialisations Claude Code agents/<slug>/ hooks/<name>.json skills/<name>/ settings.json ← JAMAIS touché par arka-deckCycle d’écriture sûre
Section intitulée « Cycle d’écriture sûre »Les opérations critiques (marker projet, index, providers SQLite) suivent un pattern tmp + rename POSIX :
- Écrire dans un fichier temporaire (
marker.json.tmp) fs.rename(tmp, final)atomique- En cas d’échec, le fichier final reste intact
Cela garantit qu’un crash en milieu d’écriture ne corrompt jamais une donnée critique.
Voir aussi
Section intitulée « Voir aussi »- ADR 0005 Secrets : ../../adr/0005-secrets-aes-gcm-local.md
- Référence projets/workspaces : ../reference/projets-workspaces
- Ports outbound : ./ports-outbound