Mise à jour atomique des bases Fluent

VérifiéPrudence

Mettez à jour atomiquement les 6 bases Fluent en fin de session avec un seul payload JSON. Persiste erreurs, résultats de révision, nouveau vocabulaire et métadonnées.

Spar Skills Guide Bot
Data & IAIntermédiaire
23/07/2026
Claude Code
#state-persistence#json-database#atomic-write#spaced-repetition#session-logging

Recommandé pour

Synthèse automatique

Ce skill enregistre de façon atomique les résultats d'une session d'apprentissage des langues dans les six bases JSON du plugin Fluent, via un unique payload transmis à update-db.py.

Points forts

  • Regroupe en une seule écriture atomique (tmp + fsync + rename) les mises à jour des 6 bases, avec sauvegardes préalables et validation du payload
  • Évite l'édition manuelle des fichiers JSON et les risques de désynchronisation ou de concurrence
  • Recalcule automatiquement la file de répétition espacée (SM-2) à partir des review_results fournis
  • Documente clairement le payload attendu, les champs requis et les codes de sortie (0/1/2)

Limites

  • Ne couvre que les deltas de session : l'initialisation des bases relève du skill fluent-setup
  • Suppose d'appeler read-db.py au préalable pour obtenir next_session_id et l'état courant
  • Dépend des variables d'environnement du plugin (CLAUDE_PLUGIN_ROOT / CLAUDE_PROJECT_DIR) et de l'arborescence .claude/hooks
  • Une entrée new_vocabulary incomplète produit un enregistrement de répétition espacée incomplet
Quand l'utiliser

À utiliser à la fin de toute session d'entraînement (écriture, vocabulaire, oral, lecture, révision, apprentissage) lorsque les erreurs, résultats de révision et nouveaux mots doivent être persistés.

Quand l'éviter

À éviter pour les opérations en lecture seule ou pour la configuration initiale des bases, qui passent respectivement par fluent-progress/read-db.py et fluent-setup.

Analyse de sécurité

Prudence
Score qualité88/100

The skill uses bash and Python for a legitimate local database-update workflow. It does not fetch remote content, exfiltrate secrets, disable safety mechanisms, or use destructive commands. Risk is limited to executing a trusted local script and mutating local JSON files, with backups and atomic writes described.

Points d'attention
  • •Executes a local Python script (`update-db.py`) via bash; the script source is not included, so safety depends on the trusted plugin repository contents.
  • •Resolves the script path from environment variables (`CLAUDE_PLUGIN_ROOT`/`CLAUDE_PROJECT_DIR`), which could run a different script if those variables are misconfigured.
  • •Writes/overwrites six learner JSON databases and regenerates the spaced-repetition queue; backups mitigate but same `session_id` intentionally overwrites prior data.
  • •No `allowed-tools` are declared even though the skill requires shell execution and file mutation.
Comment cette analyse est faite

Exemples

Fin de session de révision
Termine la session de révision : enregistre les 5 résultats de révision, les erreurs repérées et les nouveaux mots via update-db.py.
Persister une session d'écriture
La session d'écriture est finie — mets à jour les bases avec les skill_scores, les erreurs et les notes de session.
Ajouter du vocabulaire à la file SRS
Ajoute ces nouveaux mots à la file de répétition espacée et incrémente total_sessions et total_study_minutes.

name: fluent-db-updater description: Atomically update all 6 Fluent learner databases (learner-profile, progress, mistakes, mastery, spaced-repetition, session-log) at session end by calling .claude/hooks/update-db.py with a single JSON payload. Use at the end of every practice session — fluent-writing, fluent-vocab, fluent-speaking, fluent-reading, fluent-review, fluent-learn — to persist the session's errors, review results, new vocabulary, and session metadata.

DB Updater

Overview

Every practice skill ends with a DB update. Instead of hand-editing 6 JSON files (error-prone, racy, easy to desync), pipe one JSON report to update-db.py. The script runs pre-write backups, validates the payload, applies all changes atomically via .tmp + fsync + rename, and rebuilds the spaced-repetition queue.

When to Use

Load this skill whenever the tutor:

  • Finishes a practice session and needs to persist results.
  • Needs to add new vocabulary to the spaced-repetition queue.
  • Needs to record new errors, review results, or mastery changes.
  • Needs to bump total_sessions, current_streak_days, or total_study_minutes.

Skip this skill for read-only operations (use the fluent-progress skill or read-db.py directly) and during session setup (use fluent-setup skill instead — update-db.py is for session deltas, not bootstrap).

Instructions

1. Call the script

Run from the repo root:

python3 "${CLAUDE_PLUGIN_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.claude/hooks/update-db.py" <<'EOF'
{ ...payload... }
EOF

Exit codes: 0 success, 1 validation error, 2 I/O error.

2. Fill the payload

Required fields

  • session_id — string, convention session-NNN. Use computed.next_session_id from read-db.py.
  • date — YYYY-MM-DD.

Optional fields — omit to skip. Full canonical example (copy-paste this and fill in):

${CLAUDE_PLUGIN_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.claude/references/db-updater-payload.example.json

Key blocks the example covers: skill_scores, errors[], new_vocabulary[], review_results[], topics_covered, breakthroughs, focus_next_session, session_notes, achievements_earned, milestones.

3. Field notes

  • errors[] — one entry per distinct mistake this session. Collapse duplicates (same pattern_id) before sending; frequency is bumped by the script.
  • new_vocabulary[] — items the learner met for the first time. Fill every field; incomplete entries yield incomplete spaced-repetition records.
  • review_results[] — items already in the queue that were reviewed. The script runs SM-2 on each. See the fluent-sm2-calculator skill. Mapping: quality = floor(score / 2).
  • skill_scores[].correct counts correct exercises, not a percentage. Accuracy is derived.
  • confidence in learner-profile.skills is 0–100 integer; accuracy in progress-db is 0.0–1.0 float. The script handles the conversion.
  • milestones[] — each entry is a bare string OR an object { "milestone": <required non-empty string>, "date": <optional YYYY-MM-DD, defaults to the session date> }. Don't set a nested session_id; the script stamps the authoritative top-level one. A malformed entry (neither string nor object, or an object missing/empty milestone) exits 1 with no files written. Each milestone becomes both a session-log.milestones[] record and a learner-profile.achievements[] entry.

4. Read before writing

Always call read-db.py at session start to get current state + next_session_id. Don't read each JSON file separately:

python3 "${CLAUDE_PLUGIN_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.claude/hooks/read-db.py"

Returns all 6 databases plus computed fields (due_reviews_count, next_session_id, streak_active, days_since_last_session).

Examples

Example 1 — /fluent-review session with 5 items

python3 "${CLAUDE_PLUGIN_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.claude/hooks/update-db.py" <<'EOF'
{
  "session_id": "session-012",
  "date": "2026-04-24",
  "duration_minutes": 12,
  "command_used": "/fluent-review",
  "skills_practiced": ["vocabulary", "grammar"],
  "skill_scores": {
    "vocabulary": { "exercises": 3, "correct": 3, "time_minutes": 7 },
    "grammar":    { "exercises": 2, "correct": 1, "time_minutes": 5 }
  },
  "review_results": [
    { "item_id": "vocab_huis", "quality": 5 },
    { "item_id": "vocab_deur", "quality": 4 },
    { "item_id": "vocab_raam", "quality": 5 },
    { "item_id": "grammar_omdat_word_order", "quality": 2 },
    { "item_id": "grammar_past_tense", "quality": 4 }
  ],
  "errors": [
    {
      "pattern_id": "grammar_omdat_word_order",
      "category": "grammar",
      "your_answer": "omdat ik ben moe",
      "correct_answer": "omdat ik moe ben",
      "context": "subordinate clause word order",
      "severity": "critical"
    }
  ],
  "focus_next_session": ["Drill 'omdat' word order"]
}
EOF

Example 2 — /fluent-vocab session with a new word

python3 "${CLAUDE_PLUGIN_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.claude/hooks/update-db.py" <<'EOF'
{
  "session_id": "session-013",
  "date": "2026-04-25",
  "command_used": "/fluent-vocab",
  "skills_practiced": ["vocabulary"],
  "new_vocabulary": [
    {
      "item_id": "vocab_keuken",
      "item_type": "vocabulary",
      "content": "de keuken",
      "answer": "the kitchen",
      "category": "household_rooms",
      "difficulty": "A1",
      "initial_quality": 4,
      "priority": "medium"
    }
  ]
}
EOF

Critical Rules

  • Call once per session, at the end. The script rebuilds the review queue each run — partial updates risk inconsistency.
  • Never hand-edit spaced-repetition.review_queue. It's regenerated from scratch on every run.
  • Same session_id replaces. Sending the same ID twice overwrites the first call. Useful for corrections, dangerous if unintentional.
  • Backups are automatic. Written to .backups/pre-update-<session_id>/ before any change. Check there to roll back.
  • Exit code 1 means validation failed, no files touched. Fix the payload and retry.
  • Exit code 2 means I/O failure, no files touched. Check disk space, permissions, then retry.

Why This Matters

Six interdependent JSON files must agree: a new session-log entry, a bumped total_sessions, updated SM-2 params, new mistake patterns, recalculated accuracy, refreshed streak. Hand-editing causes silent desync — streak says 7 days but session-log has 6 entries, mastery says 4 stars but accuracy says 45%. The script is the single source of truth.

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/atomic-fluent-database-updater-mrx3xzpq/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/atomic-fluent-database-updater-mrx3xzpq' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/atomic-fluent-database-updater-mrx3xzpq/download' --output '.skill-downloads/atomic-fluent-database-updater-mrx3xzpq/SKILL.md.part' && mv '.skill-downloads/atomic-fluent-database-updater-mrx3xzpq/SKILL.md.part' '.skill-downloads/atomic-fluent-database-updater-mrx3xzpq/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/atomic-fluent-database-updater-mrx3xzpq/SKILL.md' && test -s '.skill-downloads/atomic-fluent-database-updater-mrx3xzpq/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/fluent-db-updater' && cp -R '.skill-downloads/atomic-fluent-database-updater-mrx3xzpq' '.claude/skills/fluent-db-updater'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/atomic-fluent-database-updater-mrx3xzpq'

openskills read 'atomic-fluent-database-updater-mrx3xzpq'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/atomic-fluent-database-updater-mrx3xzpq/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires