Repository navigation
Conversation
… réconciliation (PR 2-a) Module pur, n'active rien : le mode legacy reste le défaut. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
| fd, tmp = tempfile.mkstemp(dir=p.parent if str(p.parent) else ".", suffix=".tmp") | ||
| try: | ||
| with os.fdopen(fd, "w", encoding="utf-8") as f: | ||
| f.write(payload) |
There was a problem hiding this comment.
WARNING: save_state() n'ecrit pas les donnees sur le disque avant os.replace()
os.replace() est atomique pour l'entree de repertoire, mais ne force pas l'ecriture du contenu : si le processus (ou la machine) s'arrete juste apres cet appel, portfolio_books_state.json peut etre laisse tronque ou vide. Ce fichier est le seul enregistrement de la repartition core/sleeve des quantites, que le broker ne peut pas fournir (une seule position pour les deux livres) : l'etat est alors perdu definitivement.
Le depot resout deja exactement ce probleme dans _atomic_json_write (src/t212_executor.py:32-33) avec tmp_file.flush() puis os.fsync(tmp_file.fileno()) avant le rename. Reutiliser ce motif ici.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| p = Path(path) | ||
| if not p.exists(): | ||
| return BooksState() | ||
| data = json.loads(p.read_text(encoding="utf-8")) |
There was a problem hiding this comment.
WARNING: load_state() laisse remonter une JSONDecodeError brute sur un fichier tronque
Le fichier existant mais corrompu (ecriture interrompue, disque plein, edition manuelle) leve une JSONDecodeError non traitee qui remonte jusqu'a l'appelant et arrete le cycle. Le motif retenu dans le depot pour ce fichier de litteral est _read_with_retry (src/t212_executor.py:45-61), qui tolere le JSON invalide.
Attention however : ici le fallback ne doit pas etre un BooksState() vide — un etat vide se lirait comme « aucune position core/sleeve » alors que le broker en detient une (invariant « Failed fetch != empty »). attraper l'erreur et la re-lever avec un message explicite (ou renvoyer un etat None/inconnu que l'appelant doit traiter comme tel) est plus sûr qu'un état vide silencieux.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
Code Review SummaryStatus: 2 Issues Found | Recommendation: Address before merge Overview
Both findings are in the persistence layer of the new Fix these issues in Kilo Cloud Issue Details (click to expand)WARNING
Files Reviewed (2 files)
Reviewed by free · Input: 0 · Output: 0 · Cached: 0 |
Socle du mode cœur + poche active (plan §2.6, PR 2-a) : livres avec rôle et poids cibles (cœur 90 %, poche + pétrole ≤ 10 %), quantités par livre et par instrument (le cœur et la poche partagent la position Nasdaq-100 côté broker), pic d'equity et drawdown, réconciliation broker (signale, ne corrige jamais), interrupteur STRATEGY_MODE (legacy par défaut, valeur inconnue = erreur). Module pur : aucun câblage, le démo n'est pas touché. 15 tests.
🤖 Generated with Claude Code