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:
+10
-1
@@ -53,7 +53,7 @@ Opens frontend at http://localhost:5173 → backend :8787.
|
|||||||
- frontend: `cd frontend && npm run dev` (Vite; `VITE_BACKEND_URL` → backend)
|
- 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
|
- 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)
|
- 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 .`
|
- 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)
|
- 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,
|
pre-selected and persists selected/declined correctly, (b) finalize indexes the pair,
|
||||||
(c) `tht memory solved-search` returns it with sql + tables.
|
(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)
|
## 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`
|
Plan: `~/.claude/plans/prima-di-passare-ai-inherited-marshmallow.md`. Merged to `main` @ `2410f01`
|
||||||
|
|||||||
@@ -1076,13 +1076,13 @@ export default function (pi) {
|
|||||||
ctx,
|
ctx,
|
||||||
["memory", "save-one", "--session", session,
|
["memory", "save-one", "--session", session,
|
||||||
"--decision", String(c.decision_seq), "--json"],
|
"--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;
|
if (err) return err;
|
||||||
const e2 = relayIfThtFails(ctx, decisionAddArgs(session, {
|
const e2 = relayIfThtFails(ctx, decisionAddArgs(session, {
|
||||||
type: "memory_promoted", subject: c.subject,
|
type: "memory_promoted", subject: c.subject,
|
||||||
detail: `seq:${c.decision_seq}`, rationale: c.rationale || c.detail || "",
|
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;
|
if (e2) return e2;
|
||||||
saved++;
|
saved++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -456,8 +456,8 @@ def index_solved_session(cfg, session_id: str) -> int:
|
|||||||
|
|
||||||
if not has_vector_write_rest(cfg):
|
if not has_vector_write_rest(cfg):
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
"vector_write_rest assente: la coppia domanda->SQL si indicizza con la "
|
"vector_write_rest assente: la coppia domanda->SQL si indicizza solo con la "
|
||||||
"writer key (workstation) o dal server"
|
"writer key configurata nel workspace yaml"
|
||||||
)
|
)
|
||||||
manifest = load_session_or_exit(cfg, session_id)
|
manifest = load_session_or_exit(cfg, session_id)
|
||||||
record = build_solved_record(
|
record = build_solved_record(
|
||||||
|
|||||||
Reference in New Issue
Block a user