{a.title}
+ {a.error &&{a.error}
} + {a.verdict &&No report was stored for this run.
} +diff --git a/README.md b/README.md
index ee4bdcf..6ac8881 100644
--- a/README.md
+++ b/README.md
@@ -44,6 +44,9 @@ brings their own endpoint and their own spend. Blank key field = keep the stored
- Analyst: any OpenAI-compatible base URL + key + model, plus optional extra JSON params.
A local endpoint such as `http://192.168.88.131:8888/v1` works; use key `EMPTY` when the server has no auth.
+ For a reasoning model (Qwen3 on vLLM) put `{"chat_template_kwargs":{"enable_thinking":false}}` in **Extra params**:
+ with thinking on, the model spends the whole context budget reasoning and the report arrives empty.
+ Both model calls default to `max_tokens: 2048`; the same field overrides it.
- Jev: a TypeSafe API key from `console.typesafe.ai/keys`, model usually `jev-latest`.
## Tests
diff --git a/app/app/[id]/page.tsx b/app/app/[id]/page.tsx
new file mode 100644
index 0000000..b9624d7
--- /dev/null
+++ b/app/app/[id]/page.tsx
@@ -0,0 +1,20 @@
+import { notFound, redirect } from "next/navigation";
+import { requireUser } from "@/lib/auth";
+import { getAnalysis } from "@/lib/db";
+import { ReportView } from "@/components/report-view";
+import { ExportButtons } from "@/components/export-buttons";
+import { VerdictSummary } from "@/components/verdict-summary";
+
+export default async function Stored({ params }: { params: Promise<{ id: string }> }) {
+ const u = await requireUser();
+ const a = getAnalysis((await params).id, u.id);
+ if (!a) notFound();
+ if (a.status === "running") redirect(`/app/${a.id}`); // still streaming elsewhere; rare, bounce once
+ return {a.error} No report was stored for this run.{a.title}
+ {a.error &&