diff --git a/mcp-server/alerts.html b/mcp-server/alerts.html
index beb3c90..5378f28 100644
--- a/mcp-server/alerts.html
+++ b/mcp-server/alerts.html
@@ -78,6 +78,7 @@ input:focus{border-color:#388bfd}
Spec
Onboard
Alerts
+ Workspaces
diff --git a/mcp-server/console.html b/mcp-server/console.html
index 87c7066..e89bcc9 100644
--- a/mcp-server/console.html
+++ b/mcp-server/console.html
@@ -99,6 +99,7 @@ details .body{padding-top:10px;font-size:12px;color:#8b949e}
Spec
Onboard
Alerts
+ Workspaces
Reading live state…
diff --git a/mcp-server/index.ts b/mcp-server/index.ts
index bc3e1f9..f6ec07e 100644
--- a/mcp-server/index.ts
+++ b/mcp-server/index.ts
@@ -660,6 +660,16 @@ async function main() {
});
}
+ // Workspaces — per-contract state (Phase 8.5). UI layer over the
+ // gateway's /workspaces/* routes: list, create, detail, handoff,
+ // save-search, shortlist, log-activity. All persisted on the
+ // Rust side; this page is a pure viewer + editor.
+ if (url.pathname === "/workspaces") {
+ return new Response(Bun.file(import.meta.dir + "/workspaces.html"), {
+ headers: { ...cors, "Content-Type": "text/html" },
+ });
+ }
+
// Alerts — push/daemon settings page + config API + test-fire.
if (url.pathname === "/alerts") {
return new Response(Bun.file(import.meta.dir + "/alerts.html"), {
diff --git a/mcp-server/onboard.html b/mcp-server/onboard.html
index 1d585ec..21b7602 100644
--- a/mcp-server/onboard.html
+++ b/mcp-server/onboard.html
@@ -95,6 +95,7 @@ table.preview tr:hover td{background:#0d1117}
Spec
Onboard
Alerts
+ Workspaces
30 minutes from CSV to live search
diff --git a/mcp-server/proof.html b/mcp-server/proof.html
index 6a769e4..ceb428a 100644
--- a/mcp-server/proof.html
+++ b/mcp-server/proof.html
@@ -85,6 +85,7 @@ pre{background:#161b22;border:1px solid #171d27;border-radius:8px;padding:14px 1
Spec
Onboard
Alerts
+ Workspaces
Running live tests…
diff --git a/mcp-server/search.html b/mcp-server/search.html
index 2a0cf1d..c4c95f4 100644
--- a/mcp-server/search.html
+++ b/mcp-server/search.html
@@ -108,6 +108,7 @@ body{font-family:'Inter',-apple-system,system-ui,'Segoe UI',sans-serif;backgroun
Spec
Onboard
Alerts
+ Workspaces
Loading...
diff --git a/mcp-server/spec.html b/mcp-server/spec.html
index 0753701..1b38c86 100644
--- a/mcp-server/spec.html
+++ b/mcp-server/spec.html
@@ -82,6 +82,7 @@ table.plain tr:hover td{background:#0d1117}
Spec
Onboard
Alerts
+ Workspaces
v1 · 2026-04-20
diff --git a/mcp-server/workspaces.html b/mcp-server/workspaces.html
new file mode 100644
index 0000000..d73b59f
--- /dev/null
+++ b/mcp-server/workspaces.html
@@ -0,0 +1,487 @@
+
+
+
+Lakehouse — Workspaces
+
+
+
+
+
+
+
+
+
Per-contract workspaces
+
+ Each contract gets its own workspace: saved searches, shortlisted candidates, activity log, tier (daily / weekly / monthly / pinned). Persisted across sessions. One-click zero-copy handoff between staffers — Sarah hands off to Kim, Kim opens the workspace and sees everything Sarah saw. This is the layer that keeps institutional memory per-contract, not per-person.
+
+
New workspace
+
+
+
+
+
+
Select a workspace from the list, or create one.
+
+
+
+
+
+
+
+
+
+
+
Hand off to another staffer
+
+ Transfers ownership of this workspace. The prior owner is preserved in previous_owners for the audit trail.
+ The recipient sees all saved searches, shortlist entries, and activity from the prior owner — no copy, no migration.
+
+
+ New owner
+
+ Reason
+
+
+ Hand off
+ Cancel
+
+
+
+
+
+
+
+
+
+
+
Save a search
+
+ Search name
+
+ SQL (will run against the catalog via /query/sql)
+
+
+ Save search
+ Cancel
+
+
+
+
+
+
+
+
+
Log activity
+
+ Action
+
+ Detail
+
+
+ Log activity
+ Cancel
+
+
+
+
+
+
+
+
+
+