feat: docker, readme, jev goal gate
Dockerfile/compose written but never built or run on this machine (no Docker). smoke.sh now works in both modes and fails loudly. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
a5529ce542
commit
0db7b8140b
@@ -39,6 +39,18 @@ The demo value is Jev as the decision-maker: the generative model proposes,
|
||||
|
||||
Report actions: **Export to PDF**, **Copy**. History actions: **rename**, **delete**.
|
||||
|
||||
### Getting the input, and the two keys
|
||||
|
||||
The portal cannot reach the SQL Server. The user brings the plan XML, and the app must say so in the run screen:
|
||||
SSMS → **Ctrl+M** (include actual execution plan) → run the query → save the Execution Plan tab as `.sqlplan`, or
|
||||
copy the Showplan XML cell; without SSMS, prefix the batch with `SET STATISTICS XML ON;` and copy the XML result
|
||||
cell. A `.sqlplan` file can be dropped in (SSMS writes UTF-16 with a BOM; decode both) or pasted.
|
||||
|
||||
Both model credentials are typed by the logged-in user in `/setup` or `/settings` — never server config, so every
|
||||
user brings their own analyst endpoint and their own TypeSafe/Jev key (`console.typesafe.ai/keys`). Stored keys come
|
||||
back masked, and a blank field means keep the stored one. Nothing leaves the container except the digest, and only
|
||||
to the endpoints that user configured.
|
||||
|
||||
## Actors (two models, strict roles)
|
||||
|
||||
- **Analyst** — any OpenAI-compatible endpoint the user configures (`base_url`,
|
||||
@@ -82,3 +94,21 @@ Report actions: **Export to PDF**, **Copy**. History actions: **rename**, **dele
|
||||
Paste a real slow-query plan → under 60 s → a ranked set of remediations where the
|
||||
top pick is defensible because Jev's probabilities are on screen, and the winning
|
||||
SQL is one click from the clipboard.
|
||||
|
||||
## Acceptance
|
||||
|
||||
What has to be true before this counts as done, and how each part is proven:
|
||||
|
||||
- **Offline unit suites** (`npm test`, no keys, no network): a real ShowPlan digests to the right numbers; input
|
||||
that is not a plan is refused with a named reason; analyst output is schema-checked and 2–4 options are enforced;
|
||||
Jev's scores rank, an unknown Jev label cannot lead, and a silent Jev degrades to a labelled composite order;
|
||||
credentials seal/open/mask and a blank field never wipes a stored key.
|
||||
- **One live run** against the user's real analyst endpoint and a real Jev key: every SSE stage fires, several
|
||||
candidates come back, Jev returns a verdict with confidence, and OpenUI Lang arrives in deltas.
|
||||
- **Browser QA** (Chromium): signup → guide → settings → run → rendered report; Copy puts SQL on the clipboard;
|
||||
print emulation flips to paper and hides the rail and buttons; rename sticks and delete confirms first; no
|
||||
horizontal scroll from 320 px up.
|
||||
- **A smoke script** (`scripts/smoke.sh`) that a container or a plain `npm start` both pass: health, auth pages,
|
||||
signed-out redirect, and `/api/analyze` refusing an anonymous caller.
|
||||
- **A goal gate**: Jev scores the written plan against the goal in this document and answers the named-gap question
|
||||
with `nothing` before implementation starts.
|
||||
|
||||
Reference in New Issue
Block a user