journal: la voce del giorno IN CORSO non si presenta piu' come una giornata
cron_daily (00:30 UTC) faceva DUE chiamate al giornale: chiudeva IERI (giusto)
e apriva OGGI. La pagina di oggi nasceva con ~30 minuti dentro e nessuno la
aggiornava fino alla notte dopo.
Il difetto non era il dato mancante: era che la pagina non lo diceva dove si
legge. Aveva TUTTE le sezioni di una chiusa -> passava ogni controllo di
completezza e freschezza, e la parzialita' stava solo in §Salute, quinta
sezione su otto. Stessa famiglia di "una barra presente non e' una giornata
presente", in veste nuova: la pagina e' presente, il giorno no.
Taglia misurata sul caso reale di oggi: la pagina congelata alle 00:37 diceva
"giorno: $+0.54 (1 letture)" e la regola [pnl] chiosava "senza operare". Alle
08:54 il libro aveva fatto 3 fill, 2 round-trip e +$25.86 ($642.56 -> $667.88).
Avrebbe raccontato una giornata ferma per tutta una giornata operativa.
Riparato in due pezzi indipendenti:
1. la pagina dichiara la parzialita' nel TITOLO e nella prima riga —
"PARZIALE (giorno in corso)", copertura esplicita (N giri su 24), il fatto
che non si aggiorna da sola, e quali numeri sono di quella frazione;
2. tolta la seconda chiamata dal cron. In docs/journal/ restano solo giorni
chiusi; lo stato corrente si prende da journal.py a mano (pagina marcata)
o da trades.db, che cron_book sincronizza ogni ora.
Scelta dichiarata: NON si rigenera ogni ora. Costerebbe una riga in cron_book
ma riscriverebbe un file tracciato da git 24 volte al giorno per un consumatore
che non esiste (l'analista legge il giorno chiuso). Se un domani servisse, la
strada e' RIGENERARLA, non congelarla: e' scritto nel commento del cron.
Prove (test_journal 28 -> 31): una accende la marcatura, una la tiene spenta su
un giorno chiuso (una marcatura sempre accesa non si legge), una e' guardia sul
SORGENTE di cron_daily.sh — ogni chiamata a journal.py deve avere --giorno
esplicito, perche' senza argomenti scrive OGGI.
Regolare docs/journal/2026-08-25.md rigenerato: ora si dichiara PARZIALE (9/24).
NON riparato, e registrato come debito aperto in CLAUDE.md §5:
test_wave_0726::test_t1_canonical_riproduce_il_backtest_ufficiale fallisce, e
falliva gia' prima di questa modifica (verificato con git stash sull'albero
pulito). Sharpe hold-out SKH01 canonical 1,9223 contro la banda cablata
1.3 < h < 1.9: il codice non e' cambiato, sono cambiati i dati (data/raw e'
gitignored, il cron lo ricostruisce ogni notte). La banda NON e' stata
allargata — lezione 07/08. Suite: 710 passati, 1 fallito.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -307,3 +307,54 @@ def test_concentrazione_si_accende_quando_la_taglia_conta(db):
|
||||
db.commit()
|
||||
v = _voce(libro=_libro(BTC=dict(posizione=100.0)), pnl=_pnl(), giorno="2026-06-28")
|
||||
assert "concentrazione" in _ids(J.lettura(db, v))
|
||||
|
||||
|
||||
# ------------------------------------------- il giorno IN CORSO non si presenta come chiuso
|
||||
#
|
||||
# Una pagina di giorno in corso ha TUTTE le sezioni di una chiusa: passa ogni controllo di
|
||||
# completezza e freschezza, e si legge come una giornata. Fino al 2026-08-25 lo diceva solo
|
||||
# la §Salute — quinta sezione su otto — mentre titolo, P&L e Lettura parlavano al passato di
|
||||
# una frazione di giornata. Le due prove sono accoppiate: una accende la marcatura, l'altra
|
||||
# verifica che su un giorno chiuso resti SPENTA (una marcatura sempre accesa non si legge).
|
||||
|
||||
def _voce_salute(con, in_corso: bool, giri: int):
|
||||
return dict(giorno="2026-08-25", ts_scritto=T.ora(), mercato={},
|
||||
libro=dict(giri=giri, ultimo_giro="2026-08-25T07:07:01+00:00", equity=642.0,
|
||||
barra="2026-08-25", feed_skh_min=0, nozionale_lordo=200.0,
|
||||
leva_lorda=0.31, asset={}),
|
||||
pnl=J.pnl_giorno(con, date(2026, 8, 25)),
|
||||
salute=dict(giri_book=giri, feed_skh_min=0, atteso_giri=giri if in_corso else 24,
|
||||
giorno_in_corso=in_corso, giri_mancanti=0))
|
||||
|
||||
|
||||
def test_una_pagina_di_giorno_in_corso_si_dichiara_parziale_nel_titolo(db):
|
||||
v = _voce_salute(db, in_corso=True, giri=8)
|
||||
J.salva(db, v)
|
||||
md = J.rendi_markdown(db, v)
|
||||
titolo = md.splitlines()[0]
|
||||
assert "PARZIALE" in titolo and "giorno in corso" in titolo # nel posto che si legge
|
||||
testata = "\n".join(md.splitlines()[:6])
|
||||
assert "NON e' chiusa" in testata # e non solo nel titolo
|
||||
assert "8 giri su 24" in testata # con la copertura dichiarata
|
||||
assert "non si aggiorna da sola" in testata # e col fatto che e' congelata
|
||||
|
||||
|
||||
def test_una_pagina_di_giorno_chiuso_non_si_dichiara_parziale(db):
|
||||
v = _voce_salute(db, in_corso=False, giri=24)
|
||||
J.salva(db, v)
|
||||
md = J.rendi_markdown(db, v)
|
||||
assert "PARZIALE" not in md and "non si aggiorna da sola" not in md
|
||||
assert md.splitlines()[0] == "# Giornale di bordo — 2026-08-25"
|
||||
|
||||
|
||||
def test_il_cron_non_apre_piu_la_voce_del_giorno_in_corso():
|
||||
"""Guardia sul SORGENTE: `journal.py` senza `--giorno` scrive OGGI, e alle 00:30 UTC oggi
|
||||
e' mezz'ora. Chi la rimettesse congelerebbe di nuovo una pagina che sembra una giornata.
|
||||
Il test non vieta di rigenerarla spesso: vieta di scriverla UNA volta e lasciarla li'.
|
||||
"""
|
||||
cron = (ROOT / "scripts" / "cron_daily.sh").read_text()
|
||||
chiamate = [r.strip() for r in cron.splitlines()
|
||||
if "scripts/live/journal.py" in r and not r.strip().startswith("#")]
|
||||
assert chiamate, "il giornale non gira piu' nel cron: e' un'altra rottura, non questa"
|
||||
for r in chiamate:
|
||||
assert "--giorno" in r, f"apre un giorno implicito (= oggi, parziale): {r}"
|
||||
|
||||
Reference in New Issue
Block a user