fix(gate): actionable recovery for mid-promotion failures; truthful solved-index copy; fast-follow notes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 14:07:00 +02:00
co-authored by Claude Fable 5
parent 8af0552dcc
commit 8d427a2ccb
3 changed files with 14 additions and 5 deletions
+10 -1
View File
@@ -53,7 +53,7 @@ Opens frontend at http://localhost:5173 → backend :8787.
- frontend: `cd frontend && npm run dev` (Vite; `VITE_BACKEND_URL` → backend)
- harness install: `cd harness && python -m venv .venv && pip install -e ".[dev]"` → `tht` on PATH
## How to test (all green as of 2026-07-07: harness pytest 314 / gate JS 103 / backend 71 / frontend 182)
## How to test (all green as of 2026-07-07: harness pytest 330 / gate JS 107 / backend 71 / frontend 182)
- harness: `cd harness && .venv/bin/pytest -q` (5 L2/real-DB tests are deselected by default)
- backend: `cd backend && npx vitest run` · typecheck `npx tsc --noEmit -p .`
- frontend: `cd frontend && npx vitest run` · typecheck `npx tsc -b` · e2e `npm run e2e` (Playwright)
@@ -104,6 +104,15 @@ workspace `psd` via `./scripts/run-stack.sh` to verify (a) the promotion checkli
pre-selected and persists selected/declined correctly, (b) finalize indexes the pair,
(c) `tht memory solved-search` returns it with sql + tables.
**Fast-follow:**
- RestSearcher top-k dilution: `memory` and `solved_question` share the pgvector table and
`search_similar` has no server-side kind filter — with many solved records the client-side
filter can starve `tht memory search` results (and vice versa); fix = over-fetch (top_n*3)
when kinds is a strict subset, or kind param in the RPC — da fare prima che i solved record
si accumulino.
- `tht memory solved-search` muore con traceback grezzo se il vectordb è irraggiungibile
(SKILL.md la prescrive in F4/F6/F7) — degradare a messaggio di una riga.
## Review gates v2 — payload strutturati + viewer dedicati — COMPLETE (2026-07-07)
Plan: `~/.claude/plans/prima-di-passare-ai-inherited-marshmallow.md`. Merged to `main` @ `2410f01`
+2 -2
View File
@@ -1076,13 +1076,13 @@ export default function (pi) {
ctx,
["memory", "save-one", "--session", session,
"--decision", String(c.decision_seq), "--json"],
"",
`Recupero manuale (umano): tht memory save-one --session ${session} --decision ${c.decision_seq}. Finora salvate: ${saved}.`,
);
if (err) return err;
const e2 = relayIfThtFails(ctx, decisionAddArgs(session, {
type: "memory_promoted", subject: c.subject,
detail: `seq:${c.decision_seq}`, rationale: c.rationale || c.detail || "",
}), "");
}), `Memoria salvata nel vectordb ma decisione memory_promoted NON registrata: recupero manuale (umano) con tht decision add --session ${session} --type memory_promoted --subject "${c.subject}" --detail seq:${c.decision_seq}.`);
if (e2) return e2;
saved++;
}
+2 -2
View File
@@ -456,8 +456,8 @@ def index_solved_session(cfg, session_id: str) -> int:
if not has_vector_write_rest(cfg):
raise RuntimeError(
"vector_write_rest assente: la coppia domanda->SQL si indicizza con la "
"writer key (workstation) o dal server"
"vector_write_rest assente: la coppia domanda->SQL si indicizza solo con la "
"writer key configurata nel workspace yaml"
)
manifest = load_session_or_exit(cfg, session_id)
record = build_solved_record(