diff --git a/docs/VOICE-FIRST-REVIEW.md b/docs/VOICE-FIRST-REVIEW.md deleted file mode 100644 index 20688eb..0000000 --- a/docs/VOICE-FIRST-REVIEW.md +++ /dev/null @@ -1,52 +0,0 @@ -# Voice First / Executive Board — Review Report - -**Audience:** Ingo Wagner -**Branch:** `antigravity-handoff/project-timeline` @ `8d0b8e3` (PRs #33–#40 merged + follow-up fixes) -**Date:** 2026-09-19 (Europe/Vienna) -**Verifier host:** evOo Linux box (Tailscale `grokbot-box`). Ingo’s Mac was **not** SSH-reachable from this host (no key / Tailscale SSH off). - -## Definition of done checklist - -| # | Criterion | Result | Evidence | -|---|-----------|--------|----------| -| 1 | Dev stack healthy: API `:3100/health` + web `:5173` | **BLOCKED (Mac)** | Mac mini / MacBook Air online on Tailscale; ports 3100/5173 not exposed; SSH `Permission denied (publickey)`. Could not restart `pnpm dev` on `/Users/ingowagner/evOo`. | -| 2 | Executive Board: user VOICE FIRST turn → UX Designer replies with concept thoughts + ≥1 question; no raw `handoff_to_bot` JSON; no bounce to Boss | **PASS (unit / code)** · **UNVERIFIED (live)** | PRs #39–#40 + `bot-reply-sanitize`, `prose-handoff-recovery`, `group-handoff` workshop instructions. 56 focused tests green. Live group chat not exercised (no Mac API). | -| 3 | Transcript: no tool JSON blobs / no `assistant:` role leaks | **PASS (unit)** · **UNVERIFIED (live)** | `sanitizeBotReplyText` strips prose tool JSON + role prefix; `speechFromBlocks` skips tool-activity + unspeakable blobs (regression fixed after merge). | -| 4 | Voice Mode (CallView) UX Designer: invite before mic when owning work; after outgoing handoff mic stays closed + transfer line | **PASS (code + unit)** · **UNVERIFIED (live)** | CallView rebuilt: `speakUserTurnInvitation` / `handleSpeechIdle` / `shouldSpeakOpeningInvitation`; `parkAfterHandoff` + `voiceHandoffTransferLine`; mount no longer auto-opens mic. | - -## What was done on this pass - -1. Merged open PR heads **#33–#40** into `antigravity-handoff/project-timeline` and **pushed** to origin. -2. Fixed merge regression in `packages/core/src/speech-text.ts`: `speechFromBlocks` again drops tool-activity chips and unspeakable tool JSON (test was failing after `-X theirs` merge). -3. Fixed merge regression in `apps/web/src/pages/CallView.tsx`: invitation-before-mic restored; outgoing handoff keeps mic closed and speaks transfer line. -4. Focused vitest: **56 passed** (`call-view-voice`, `voice-handoff`, `speech-text`, `bot-reply-sanitize`, `prose-handoff-recovery`). - -## Remaining gaps (for Ingo’s Mac) - -1. **SSH / Tailscale SSH** from agent hosts to `macbook-air-von-ingo` / `mac-mini-von-ingo` so localhost verify can run without manual UI. -2. On Mac repo path `/Users/ingowagner/evOo`: - ```bash - git fetch origin && git checkout antigravity-handoff/project-timeline && git pull - pnpm install && pnpm dev # ensure :3100 + :5173 - ``` -3. Live Executive Board check (RPC/DB preferred): - - Find Executive Board `chat_groups` id. - - Post a fresh user turn about **VOICE FIRST AI Talks**. - - Confirm UX Designer message: concept prose + question; no `handoff_to_bot` JSON; Boss not re-tasked with the same work. -4. Open Voice Mode on UX Designer: hear invite before mic; after a specialist handoff, mic stays closed with transfer caption. - -## Sample expected UX Designer reply shape (sanitized) - -> I’ve been thinking about VOICE FIRST AI Talks as a short, spoken workshop: one specialist owns the lane, invites you before the mic opens, and never dumps the same task back upstairs. For the first talk, I’d keep it to three beats — hook, one demo, one ask. -> **Which audience should we design for first — founders, designers, or internal execs?** - -## Group id tested - -*None live — Mac localhost unreachable.* After Mac verify, record `chat_groups.id` here. - -## Branch / PR notes - -- Timeline branch now contains merges of `cursor/voice-mic-energy-2d2c` … `cursor/handoff-prose-sanitize-d1d4` plus commits: - - `fix(core): drop tool-activity and unspeakable blobs from speechFromBlocks` - - `fix(web): restore invite-before-mic and keep handoff mic closed` -- Draft PRs #33–#40 can be closed or marked superseded once this branch is the review source of truth. diff --git a/packages/db/create-user.ts b/packages/db/create-user.ts deleted file mode 100644 index 3a2e757..0000000 --- a/packages/db/create-user.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createDb } from "./src/client"; - -process.env.DATABASE_URL = "postgres://rakazo:rakazodev@127.0.0.1:5433/rakazo"; -const { prisma: db } = createDb(process.env.DATABASE_URL, { applicationName: "check-users" }); - -const allUsers = await db.user.findMany({ - select: { id: true, email: true, name: true, createdAt: true, emailVerified: true }, - orderBy: { createdAt: "desc" }, -}); - -console.log("All users:", JSON.stringify(allUsers, null, 2)); - -// Check spaces -const allSpaces = await db.space.findMany({ - select: { id: true, name: true, ownerId: true, createdAt: true }, - orderBy: { createdAt: "desc" }, -}); - -console.log("\nAll spaces:", JSON.stringify(allSpaces, null, 2)); - -// Check space members -const allMembers = await db.spaceMember.findMany({ - select: { id: true, spaceId: true, userId: true, role: true }, -}); - -console.log("\nAll members:", JSON.stringify(allMembers, null, 2)); - -await db.$disconnect(); diff --git a/packages/db/query-users.mjs b/packages/db/query-users.mjs deleted file mode 100644 index 17c0f3b..0000000 --- a/packages/db/query-users.mjs +++ /dev/null @@ -1,13 +0,0 @@ -import { createDb, createPool } from "./src/client.js"; - -const pool = createPool(process.env.DATABASE_URL, { applicationName: "query-users" }); -const db = createDb(pool); - -const users = await db.user.findMany({ - orderBy: { createdAt: "desc" }, - take: 10, - select: { email: true, name: true, createdAt: true }, -}); - -console.log(JSON.stringify(users, null, 2)); -await db.$disconnect(); diff --git a/packages/db/query-users.ts b/packages/db/query-users.ts deleted file mode 100644 index 0f55d41..0000000 --- a/packages/db/query-users.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createDb } from "./src/client"; - -// Override to port 5433 (Docker published port) -process.env.DATABASE_URL = "postgres://rakazo:rakazodev@127.0.0.1:5433/rakazo"; -const { prisma: db } = createDb(process.env.DATABASE_URL, { applicationName: "query-users" }); - -const users = await db.user.findMany({ - orderBy: { createdAt: "desc" }, - take: 10, - select: { email: true, name: true, createdAt: true }, -}); - -console.log(JSON.stringify(users, null, 2)); diff --git a/packages/db/setup-user.ts b/packages/db/setup-user.ts deleted file mode 100644 index 4184e42..0000000 --- a/packages/db/setup-user.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { randomUUID } from "node:crypto"; -import { createDb } from "./src/client"; - -process.env.DATABASE_URL = "postgres://rakazo:rakazodev@127.0.0.1:5433/rakazo"; -const { prisma: db } = createDb(process.env.DATABASE_URL, { applicationName: "setup-user" }); - -const user = await db.user.findUnique({ - where: { email: "ingo.wagner1303@gmail.com" }, - select: { id: true, name: true }, -}); - -if (!user) { - console.log("User nicht gefunden!"); - await db.$disconnect(); - process.exit(1); -} - -console.log("User:", user); - -// Step 1: Get or create Organization -let org = await db.organization.findUnique({ where: { slug: "ingo-workspace" } }); -if (!org) { - org = await db.organization.create({ - data: { - id: randomUUID(), - name: "Ingo's Workspace", - slug: "ingo-workspace", - createdAt: new Date(), - }, - select: { id: true, name: true, slug: true }, - }); - console.log("Organization created:", org); -} else { - console.log("Organization exists:", org); -} - -// Step 2: Get or create Organization Member -let member = await db.member.findUnique({ - where: { - organizationId_userId: { organizationId: org.id, userId: user.id }, - }, -}); -if (!member) { - member = await db.member.create({ - data: { - id: randomUUID(), - userId: user.id, - organizationId: org.id, - role: "owner", - createdAt: new Date(), - }, - }); - console.log("Organization member created"); -} else { - console.log("Organization member exists"); -} - -// Step 3: Get or create default Space -let space = await db.space.findFirst({ - where: { organizationId: org.id, isDefault: true }, -}); -if (!space) { - space = await db.space.create({ - data: { - id: randomUUID(), - name: "Mein Space", - isDefault: true, - createdByUserId: user.id, - organizationId: org.id, - }, - select: { id: true, name: true }, - }); - console.log("Space created:", space); -} else { - console.log("Space exists:", space); -} - -// Step 4: Get or create space member -const existingMember = await db.spaceMember.findUnique({ - where: { - spaceId_userId: { spaceId: space.id, userId: user.id }, - }, -}); -if (!existingMember) { - await db.spaceMember.create({ - data: { - id: randomUUID(), - spaceId: space.id, - organizationId: org.id, - userId: user.id, - role: "owner", - createdAt: new Date(), - }, - }); - console.log("Space member created"); -} else { - console.log("Space member exists"); -} - -// Verify -const finalSpaces = await db.space.findMany({ - where: { organization: { members: { some: { userId: user.id } } } }, - select: { id: true, name: true, isDefault: true }, -}); -console.log("\nUser spaces:", JSON.stringify(finalSpaces, null, 2)); - -await db.$disconnect(); -console.log("\nDone!");