Commit Graph
49 Commits
Author SHA1 Message Date
marcopan a35f52790d feat(thothctl): expose Pi restart command 2026-08-14 18:25:23 +02:00
marcopan 3a1f2ede4a fix(thothctl): harden Pi restart recovery 2026-08-14 18:15:00 +02:00
marcopan 422f1d47b4 feat(thothctl): add safe Pi core restart 2026-08-14 17:52:35 +02:00
marcopan e902f758b1 refactor(thothctl): share Pi lifecycle lock 2026-08-14 17:36:33 +02:00
marcopan 747020a330 feat: declare workspace repository in installation config 2026-08-14 16:32:58 +02:00
marcopan 0459a6cd3e feat: operator schema accept command for curated FK review (P5) 2026-08-13 05:06:23 +02:00
marcopan e056c19e62 feat: P4 qdrant collection lifecycle (self-heal + guarded rebuild)
- shared TS collection manager: self-heal creates missing collection (1024/cosine)
  and missing keyword payload indexes; never mutates incompatible contracts
  (semantic_index_incompatible); async index visibility polled with bounded deadline
- session admission (qdrantEnsure) uses the manager in self-heal mode; operator path
  keeps require_existing semantics
- runtime lease exposes semanticQdrantUrl to the operator
- operator commands vector-inspect/vector-rebuild with exact confirmation guards
- thothctl workspace vector inspect|rebuild (Go) with --collection/--confirm/--destroy
- p4 acceptance runner: real Qdrant (v1.18.2) lifecycle checks, 11/11 PASS
- docs: CLI contract, manual walkthrough P4 (PENDING), PROJECT_STATE
2026-08-12 20:00:14 +02:00
marcopan c4063eecb6 fix: accept P3 effective-config identity fields in thothctl results 2026-08-12 18:01:57 +02:00
marcopan da214820b0 fix: accept failed operator results without revision identity 2026-08-11 19:52:52 +02:00
marcopan 498a93d915 fix: treat the operator JSON result as authoritative across exit codes 2026-08-11 19:50:12 +02:00
marcopan ca552451a4 fix: carry the suggested FK artifact through thothctl JSON output 2026-08-11 19:38:20 +02:00
marcopan 3517cd8724 fix: treat operator checkpoint exit 3 as a valid machine result 2026-08-11 19:37:11 +02:00
marcopan 2cbb1a5496 test: align SQL ingress envelope assertions with name/sql 2026-08-11 19:35:33 +02:00
marcopan 920642673e fix: send SQL inputs as name/sql in the operator envelope 2026-08-11 19:34:29 +02:00
marcopan 929f7dcc5e test: align thothctl envelope tests with the operator contract 2026-08-11 19:22:52 +02:00
marcopan 632c1c1612 fix: align thothctl operator envelope with the workspace-maintenance contract 2026-08-11 19:22:01 +02:00
marcopan 99d1400ace fix: surface sanitized operator detail in thothctl compose failures 2026-08-11 19:19:40 +02:00
marcopan 17f2e48463 feat: thothctl workspace preprocessing CLI and file-ingress contracts (P2) 2026-08-11 18:40:11 +02:00
marcopan ddf60c9a95 fix: preserve portable rollback mount identity 2026-08-09 00:45:14 +02:00
marcopan fb95be3e62 fix: normalize Docker Desktop mount aliases 2026-08-09 00:28:25 +02:00
marcopan ece9cfda50 fix: validate deployment rollback and server topology 2026-08-05 15:15:06 +02:00
marcopan 5f015a5a37 fix: complete deployment release gates 2026-08-05 14:35:25 +02:00
marcopan fc349e634c fix: close server bypass edge cases 2026-08-05 12:09:32 +02:00
marcopan a94affd6ac fix: enforce server trust boundaries 2026-08-05 11:42:35 +02:00
marcopan 96fe5bfa79 fix: make server operations executable 2026-08-05 11:06:34 +02:00
marcopan d6b4a08a02 feat: expose safe pi management api 2026-08-05 00:31:44 +02:00
marcopan 09eeea17e5 fix: harden maintenance failure reconciliation 2026-08-05 00:10:13 +02:00
marcopan 70dabcc192 fix: preserve Pi recovery error semantics 2026-08-04 23:59:01 +02:00
marcopan 935bb1db0e fix: harden embedded Pi lifecycle recovery 2026-08-04 23:14:47 +02:00
marcopan a368889838 fix: finalize durable Pi lifecycle 2026-08-04 21:34:08 +02:00
marcopan 5ba2821a1b fix: harden Pi lifecycle recovery 2026-08-04 20:28:09 +02:00
marcopan 5b3ce93e31 fix: acknowledge pi maintenance barrier 2026-08-04 19:32:05 +02:00
marcopan 0b9ad7f53f fix: harden pi maintenance lifecycle 2026-08-04 19:09:04 +02:00
marcopan 8fde1f81c7 fix: harden thothctl pi lifecycle 2026-08-04 18:40:50 +02:00
marcopan 20e59b8d32 feat: manage embedded pi with thothctl 2026-08-04 18:20:39 +02:00
marcopan c90299f24d fix: harden thothctl Windows safe I/O 2026-08-04 17:55:36 +02:00
marcopan f5468f0d36 fix: harden thothctl file access 2026-08-04 17:34:46 +02:00
marcopan 35a000222c fix: fail closed thothctl secret sources 2026-08-04 17:17:39 +02:00
marcopan 4158990c10 fix: harden thothctl diagnostics 2026-08-04 17:00:05 +02:00
marcopan 853a151796 feat: add cross-platform thothctl 2026-08-04 16:48:40 +02:00
marcopanandClaude Fable 5 c4951e2aa5 chore: hygiene pass — ruff clean, docs storage-model truth, replay /me, failSession log
Audit findings 6.1-6.4 + the audit's remediation plan itself
(docs/superpowers/plans/2026-07-20-full-audit-remediation-plan.md).

- ruff: 34 → 0 (unused imports/f-strings auto-fixed; E702 semicolon lines
  split in test files; one unused local dropped). Suite still 819 green.
- CLAUDE.md + PROJECT_STATE.md no longer claim "no database / settings in
  settings.json": the harness selects filesystem OR PostgreSQL session
  storage (repository.py, server mode), and settings flow through harness
  preferences with the JSON file as fallback only.
- tools/replay: stub /me (SPA boot was parsing the SPA's own HTML as JSON)
  and /runtime/prewarm.
- failSession best-effort persistence now logs its failure server-side
  instead of vanishing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 01:55:41 +02:00
marcopanandClaude Fable 5 803b98de36 fix(frontend): center gate dialogs on the app area, not the browser viewport
Embedded in the Omics Portal the SPA sits to the right of the portal sidebar,
but dialogs used `fixed left-1/2` — centered on the whole browser window, so
gates rendered visibly off-center (overlapping the sidebar).

- AppShell publishes the app area's horizontal geometry (--app-area-left/width)
  as CSS vars on <html> via ResizeObserver + window resize.
- DialogContent centers on those vars (falls back to the viewport when the app
  is standalone, where the two coincide).
- ArtifactGateWidget: narrower — cap at 52rem instead of 70vw.
- tools/replay: resume now returns {id, alreadyActive} JSON — the post-f979ada
  frontend reads result.alreadyActive and a bare 204 broke replay resume.

Verified on the replay harness: with a simulated 300px portal sidebar the gate
centers on the app area (center 790 = 300 + 980/2); standalone unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 17:08:20 +02:00
marcopanandClaude Fable 5 87e875bc81 feat(replay): extract reviewer_schema_linking gates + de-slug question fallback
extract.mjs now emits a schema-linking ui_request descriptor (columns rendered
from the model's suggested_columns, since the live catalog enrichment needs the
DWH) and parses the reviewer's "N tabelle" outcome; when neither the manifest
nor question.md is reachable, the NL question is approximated by de-slugging
the session id. replay.json regenerated from the 2026-07-06-175012 session
(18 answered gates, includes the F4 schema-linking gate).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 16:04:00 +02:00
marcopan b089482b8d chore(replay): regenerated replay.json fixture (v2 artifact-gate payloads)
Regenerated demo fixture output with augment-schema-linking.mjs +
augment-review-gates.mjs applied, so the F6 cte_plan gate, CTE 1 cte_result
gate, and Fase 5 phase-summary gate carry v2 schema_version payloads and
render via CtePlanViewer/CteResultViewer/PhaseSummaryViewer in the replay
server. Regenerable; committed so the replay server serves it without a
build step.
2026-07-07 01:19:49 +02:00
marcopan 4042d0b44d feat(replay): fixtures + augment script for v2 artifact-gate viewers
Add cte-plan-fixture.json, cte-result-fixture.json, and
phase-summary-fixture.json — realistic Italian-language payloads for the
cardiology DWH replay session, conforming exactly to contracts.md (A/B/C).

Add augment-review-gates.mjs (pattern of augment-schema-linking.mjs): finds
the F6 cte_plan gate, first CTE 1 cte_result gate, and Fase 5 phase-summary
gate by title regex and swaps in the v2 artifact.data, so CtePlanViewer,
CteResultViewer, and PhaseSummaryViewer render in the offline replay.
Idempotent; exits 1 if an expected gate is missing.

Document the augment scripts and re-extract note in tools/replay/README.md.
2026-07-07 01:19:44 +02:00
marcopanandMarco Pancotti 7491e8c3ac chore(replay): regenerated replay.json fixture (phase tags + F4 schema-linking gate)
Regenerated demo fixture output of extract.mjs (WorkflowBar phase tags) with the
F4 gate-7 augment applied (tools/replay/augment-schema-linking.mjs, on the F4
branch). Regenerable; committed so the replay server serves it without a build step.
2026-07-06 23:29:49 +02:00
marcopanandMarco Pancotti 9403147c98 feat(replay): infer workflow phase from gate title so WorkflowBar lights the right dot
extract.mjs: inferPhase() maps gate titles ("F1 — …", "Fase 3 completata …") to F1..F8;
server.mjs: carries the inferred phase through the replayed ui_request stream.
2026-07-06 23:29:49 +02:00
marcopanandMarco Pancotti bfb54922f7 feat(replay): F4 schema-linking fixture + augment script from real catalog 2026-07-06 23:25:00 +02:00
marcopan c3a3cb8da5 feat(replay): standalone reviewer-gate replay server on :5333
Reproduces the real reviewer UI for any recorded session, with no VPN/Pi/
Python/DWH. The server (node:http, zero deps) serves the built SPA and a
tiny SSE/REST shim that re-emits the reviewer gates captured in a Pi
transcript, in their original order, with the reviewer's real 3-Jul
choices shown as comparison badges.

- tools/replay/extract.mjs: extracts gates from one or many transcripts
  (session-id, file, or directory). Handles sessions split across resume
  re-entries by sorting on message timestamp and dropping unanswered
  gates. Reads the question from session_manifest.yaml, resolving the
  sessions dir from any workspace yaml (no hardcoded paths).
- tools/replay/server.mjs: same-origin :5333. SSE streams gates; POST
  /response advances the cursor and pushes info badges (scelta reale).
  POST /resume and the final "Ripeti/Esci" widget close the SSE so the
  browser EventSource reconnects (cursor resets, gate 1 re-emitted) — the
  replay is re-runnable any number of times. GET /sessions/:id/documents
  reads the real session files so GateArtifactBody resolves file-reference
  artifacts. Exit emits system_event {event:"session_exit"} to return to
  the landing.
- scripts/replay.sh: launcher (extract / build / run / all).
- tools/replay/README.md: data flow, commands, fidelity notes.
- .gitignore: ignore tools/replay/web/ (built artifact, like dist/).
2026-07-05 18:24:26 +02:00