Skip to content

feat: Epic 13 (Structured Questions) + Epic 14 (Native STT) - #8

Open
don-petry wants to merge 270 commits into
mainfrom
worktree-implement-sprint-1
Open

don-petry wants to merge 270 commits into
mainfrom
worktree-implement-sprint-1

Conversation

@don-petry

@don-petry don-petry commented Mar 24, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Epic 13 (FR57-FR59): Structured Question Input — When the agent responds with numbered questions, they're detected by a renderer-side parser and presented as interactive Question Card Stack in the right panel with per-question input, suggestion chips, dot navigation, and review-before-submit
  • Epic 14 (FR60-FR62): Native STT with sherpa-onnx — Replaced non-functional Web Speech API (Google servers unreachable in Electron) with sherpa-onnx local streaming speech recognition. Audio captured via getUserMedia, streamed as 16kHz PCM to main process via IPC, transcribed in real-time with endpoint detection
  • Bug fix: Removed hard-coded option cards — Option cards are now agent-driven only, not hard-coded on load

Commits (stacked)

  1. docs: Spec updates — PRD v2.4 (FR57-FR62), UX spec v1.3 (Journey 7), Epics (Epic 13 stories), Sprint status
  2. feat: Epic 13 implementation — question-parser.ts, QuestionCardStack, QuestionReview, SuggestionChips, E2E tests
  3. feat: Epic 14 implementation — sherpa-onnx-node adapter, IPC audio pipeline, mic permission handlers

New Files

File Purpose
src/shared/types/domain/question-parser.ts Pure parser: detects numbered questions in agent text
src/renderer/components/session/QuestionCardStack.tsx Card stack with useReducer, dot nav, chips
src/renderer/components/session/QuestionReview.tsx Review overlay with aggregated submission
src/renderer/components/session/SuggestionChips.tsx Selectable pill chips
src/main/speech/sherpa-onnx-stt.ts Main-process STT adapter using sherpa-onnx OnlineRecognizer
src/main/ipc/speech-ipc-handler.ts IPC bridge for audio streaming
src/renderer/speech/ipc-speech-stt.ts Renderer-side STT via getUserMedia + IPC

Test plan

  • 78 unit/component tests passing (question parser, card stack, review, ConversationView)
  • TypeScript clean (tsc --noEmit)
  • ESLint clean (--max-warnings 0)
  • Pre-commit hooks passing (lint-staged + tsc + vitest related)
  • E2E: structured-questions.spec.ts (requires built app + Claude subscription)
  • Manual: mic button → sherpa-onnx transcription → agent message
  • Manual: agent multi-question response → card stack appears → answer → submit

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings March 24, 2026 23:58

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR scaffolds the TalkTerm Electron (Forge + Vite) application and establishes the initial shared domain/port types, renderer UI components (setup + overlay/display primitives), speech adapters, and CI/tooling configuration.

Changes:

  • Add project build/test/tooling configuration (Vite configs, TS strict config, ESLint/Prettier/Husky, Vitest + coverage, Tailwind/PostCSS, GitHub Actions).
  • Introduce shared domain + port types (sessions, writeback, IPC envelopes/channels, agent events/errors, value objects).
  • Implement initial renderer components/hooks and main-process stubs/utilities with accompanying unit tests.

Reviewed changes

Copilot reviewed 147 out of 162 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
vitest.config.ts Adds Vitest configuration with coverage thresholds.
vite.renderer.config.ts Configures PostCSS pipeline for the renderer build.
vite.preload.config.ts Adds preload Vite config placeholder.
vite.main.config.ts Adds main-process Vite resolution settings.
tsconfig.json Enables strict TypeScript options and path mapping.
test/setup-renderer.ts Adds Testing Library jest-dom matchers for Vitest.
tailwind.config.ts Defines design tokens (colors/type/spacing) for Tailwind.
src/shared/types/ports/text-to-speech.ts Defines TextToSpeech port contract.
src/shared/types/ports/speech-to-text.ts Defines SpeechToText port contract.
src/shared/types/ports/agent-backend.ts Defines AgentBackend port + session config.
src/shared/types/ports/.gitkeep Keeps ports directory in VCS.
src/shared/types/domain/writeback.ts Adds writeback target types + default selection by origin.
src/shared/types/domain/writeback.test.ts Tests default writeback selection.
src/shared/types/domain/value-objects.ts Adds branded value objects + constructors.
src/shared/types/domain/value-objects.test.ts Tests value-object validation.
src/shared/types/domain/user-profile.ts Adds UserProfile type + factory.
src/shared/types/domain/user-profile.test.ts Tests UserProfile factory behavior.
src/shared/types/domain/session.ts Adds Session type + factory.
src/shared/types/domain/session.test.ts Tests Session factory behavior.
src/shared/types/domain/project.test.ts Sanity tests for TS strictness flags.
src/shared/types/domain/preference.ts Adds preference threshold utilities/constants.
src/shared/types/domain/preference.test.ts Tests preference threshold logic.
src/shared/types/domain/launch-state.ts Adds setup-step routing helper.
src/shared/types/domain/launch-state.test.ts Tests setup-step routing priority.
src/shared/types/domain/ipc-message.ts Adds IPC message envelope + factory.
src/shared/types/domain/ipc-message.test.ts Tests IPC message factory timestamping.
src/shared/types/domain/ipc-channels.ts Defines canonical IPC channel constants + type.
src/shared/types/domain/ipc-channels.test.ts Tests channel naming + uniqueness.
src/shared/types/domain/electron-api.ts Declares preload bridge contract type for renderer.
src/shared/types/domain/avatar-persona.ts Adds MVP persona roster.
src/shared/types/domain/avatar-persona.test.ts Tests persona roster shape/uniqueness.
src/shared/types/domain/audit-entry.ts Adds AuditEntry type + factory.
src/shared/types/domain/audit-entry.test.ts Tests AuditEntry factory behavior.
src/shared/types/domain/api-key-state.ts Defines API key state + validation result types.
src/shared/types/domain/agent-event.ts Adds AgentEvent union for streaming events.
src/shared/types/domain/agent-error.ts Adds error classification + user-friendly messaging.
src/shared/types/domain/agent-error.test.ts Tests error classification and message safety.
src/shared/types/domain/.gitkeep Keeps domain directory in VCS.
src/renderer/types/web-speech.d.ts Adds Web Speech API window typings.
src/renderer/types/.gitkeep Keeps renderer types directory in VCS.
src/renderer/styles/global.css Adds Tailwind directives + global font/body styles.
src/renderer/speech/web-speech-tts.ts Implements TTS adapter using Web Speech API.
src/renderer/speech/web-speech-tts.test.ts Tests WebSpeechTts behavior under jsdom mocks.
src/renderer/speech/web-speech-stt.ts Implements STT adapter using Web Speech API.
src/renderer/speech/web-speech-stt.test.ts Tests WebSpeechStt behavior under jsdom mocks.
src/renderer/speech/barge-in-controller.ts Adds barge-in state controller (TTS stop + STT start).
src/renderer/speech/barge-in-controller.test.ts Tests barge-in state transitions and calls.
src/renderer/speech/.gitkeep Keeps speech directory in VCS.
src/renderer/renderer.tsx Adds React entrypoint mounting App.
src/renderer/hooks/useLayoutState.ts Adds reducer-driven layout mode hook.
src/renderer/hooks/useLayoutState.test.ts Tests layout mode transitions.
src/renderer/hooks/useDisplayMode.ts Adds display-mode selection state hook.
src/renderer/hooks/useDisplayMode.test.ts Tests display-mode state updates.
src/renderer/hooks/useAvatarState.ts Adds avatar animation-state reducer hook.
src/renderer/hooks/useAvatarState.test.ts Tests avatar state transitions.
src/renderer/hooks/.gitkeep Keeps hooks directory in VCS.
src/renderer/context/.gitkeep Keeps context directory in VCS.
src/renderer/components/setup/WorkspaceSelection.tsx Adds workspace selection UI.
src/renderer/components/setup/WorkspaceSelection.test.tsx Tests workspace selection callbacks.
src/renderer/components/setup/ProfileSetup.tsx Adds profile setup UI.
src/renderer/components/setup/ProfileSetup.test.tsx Tests profile setup interactions.
src/renderer/components/setup/AvatarSelection.tsx Adds avatar selection UI using MVP personas.
src/renderer/components/setup/AvatarSelection.test.tsx Tests avatar selection callback.
src/renderer/components/setup/ApiKeySetup.tsx Adds API key entry/validation UI (stub validation).
src/renderer/components/setup/ApiKeySetup.test.tsx Tests API key setup basic rendering.
src/renderer/components/setup/AdminBlockScreen.tsx Adds blocking admin-privileges screen UI.
src/renderer/components/setup/AdminBlockScreen.test.tsx Tests admin block screen rendering and buttons.
src/renderer/components/overlay/ActionPanel.tsx Adds action panel container (listbox) UI.
src/renderer/components/overlay/ActionPanel.test.tsx Tests action panel rendering and selection.
src/renderer/components/overlay/ActionCard.tsx Adds action card UI with option semantics.
src/renderer/components/overlay/ActionCard.test.tsx Tests action card semantics and interactions.
src/renderer/components/display/TaskProgress.tsx Adds task progress display mode.
src/renderer/components/display/TaskProgress.test.tsx Tests task progress rendering.
src/renderer/components/display/DocumentView.tsx Adds basic document display mode.
src/renderer/components/display/DocumentView.test.tsx Tests document rendering/path display.
src/renderer/components/display/ComparisonTable.tsx Adds comparison table display mode.
src/renderer/components/display/ComparisonTable.test.tsx Tests comparison table expand behavior.
src/renderer/components/display/ClusteredCards.tsx Adds clustered cards display mode.
src/renderer/components/display/ClusteredCards.test.tsx Tests clustered cards expand/priority tags.
src/renderer/components/display/ActivityFeed.tsx Adds activity feed display mode.
src/renderer/components/display/ActivityFeed.test.tsx Tests activity feed visibility/rendering.
src/renderer/components/avatar/TextInput.tsx Adds text input w/ Enter-to-send and mic button.
src/renderer/components/avatar/TextInput.test.tsx Tests text input send/newline/mic behavior.
src/renderer/components/avatar/StatusIndicator.tsx Adds avatar status pill.
src/renderer/components/avatar/StatusIndicator.test.tsx Tests status pill rendering and role=status.
src/renderer/components/avatar/CaptionBar.tsx Adds caption bar w/ delayed hide logic.
src/renderer/components/avatar/CaptionBar.test.tsx Tests caption bar basic rendering conditions.
src/renderer/components/.gitkeep Keeps components directory in VCS.
src/renderer/App.tsx Adds minimal App shell.
src/preload/preload.ts Adds preload bridge stub via contextBridge.
src/main/storage/.gitkeep Keeps storage directory in VCS.
src/main/security/admin-check.ts Adds admin privilege check helper + instructions.
src/main/security/admin-check.test.ts Tests admin privilege check across platforms.
src/main/security/.gitkeep Keeps security directory in VCS.
src/main/main.ts Adds Electron main window creation and lifecycle wiring.
src/main/ipc/.gitkeep Keeps IPC directory in VCS.
src/main/agent/fake-agent-backend.ts Adds FakeAgentBackend test double.
src/main/agent/fake-agent-backend.test.ts Tests FakeAgentBackend event streaming/cancel.
src/main/agent/agent-message-router.ts Adds router forwarding backend events to handler.
src/main/agent/agent-message-router.test.ts Tests router event forwarding and cancel.
src/main/agent/.gitkeep Keeps agent directory in VCS.
postcss.config.js Adds PostCSS config for Tailwind/autoprefixer.
package.json Adds dependencies, scripts, lint-staged config.
index.html Adds renderer entry HTML.
forge.config.ts Configures Electron Forge + Vite plugin + makers.
eslint.config.mjs Adds ESLint flat config with strict TS + React rules.
.prettierrc Adds Prettier config.
.prettierignore Adds Prettier ignore rules.
.husky/pre-commit Adds pre-commit quality gate commands.
.gitignore Adds repo ignore rules (build artifacts/coverage).
.github/workflows/release.yml Adds release workflow for tag builds.
.github/workflows/ci.yml Adds CI workflow with 3-OS matrix quality gates.
_bmad-output/implementation-artifacts/*.md Adds planning/implementation artifacts for stories.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/main/security/admin-check.test.ts
Comment thread src/shared/types/domain/ipc-message.ts
Comment thread .github/workflows/ci.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread src/shared/types/domain/agent-error.ts Outdated
Comment thread src/shared/types/domain/agent-event.ts Outdated
Comment thread src/renderer/components/overlay/ActionPanel.tsx
Comment thread src/renderer/components/avatar/CaptionBar.test.tsx
Comment thread src/renderer/components/setup/AdminBlockScreen.test.tsx Outdated
@coderabbitai

coderabbitai Bot commented Mar 26, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 216 files, which is 116 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration
Commits

Reviewing files that changed from the base of the PR and between d8b656a and 144a107.

Files ignored due to path filters: 14
  • _bmad-output/implementation-artifacts/sprint-status.yaml is excluded by !_bmad-output/**
  • _bmad-output/implementation-artifacts/tests/test-summary.md is excluded by !_bmad-output/**
  • _bmad-output/planning-artifacts/architecture.md is excluded by !_bmad-output/**
  • _bmad-output/planning-artifacts/epics.md is excluded by !_bmad-output/**
  • _bmad-output/planning-artifacts/prd.md is excluded by !_bmad-output/**
  • _bmad-output/planning-artifacts/ux-design-specification.md is excluded by !_bmad-output/**
  • _bmad-output/test-artifacts/ci-validation-report.md is excluded by !_bmad-output/**
  • _bmad-output/test-artifacts/system-test-design.md is excluded by !_bmad-output/**
  • _bmad-output/test-artifacts/test-review-report.md is excluded by !_bmad-output/**
  • _bmad-output/test-artifacts/traceability-report.md is excluded by !_bmad-output/**
  • _bmad/_config/bmad-help.csv is excluded by !**/*.csv, !_bmad/**
  • _bmad/_config/skill-manifest.csv is excluded by !**/*.csv, !_bmad/**
  • _bmad/bmm/config.yaml is excluded by !_bmad/**
  • package-lock.json is excluded by !**/package-lock.json
Files selected for processing: 216
  • .env.example
  • .gitattributes
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .github/workflows/sonarcloud.yml
  • .gitignore
  • .gitleaksignore
  • .husky/pre-commit
  • .nvmrc
  • .prettierignore
  • .prettierrc
  • CLAUDE.md
  • assets/avatars/README.md
  • eslint.config.mjs
  • forge.config.ts
  • index.html
  • package.json
  • playwright.config.ts
  • playwright.electron.config.ts
  • postcss.config.js
  • sonar-project.properties
  • src/main/agent/.gitkeep
  • src/main/agent/agent-message-router.test.ts
  • src/main/agent/agent-message-router.ts
  • src/main/agent/claude-sdk-backend.test.ts
  • src/main/agent/claude-sdk-backend.ts
  • src/main/agent/fake-agent-backend.test.ts
  • src/main/agent/fake-agent-backend.ts
  • src/main/ipc/.gitkeep
  • src/main/ipc/agent-ipc-handler.test.ts
  • src/main/ipc/agent-ipc-handler.ts
  • src/main/ipc/ipc-registrar.ts
  • src/main/ipc/session-ipc-handler.test.ts
  • src/main/ipc/session-ipc-handler.ts
  • src/main/ipc/settings-ipc-handler.test.ts
  • src/main/ipc/settings-ipc-handler.ts
  • src/main/ipc/speech-ipc-handler.test.ts
  • src/main/ipc/speech-ipc-handler.ts
  • src/main/ipc/validate-string.test.ts
  • src/main/ipc/validate-string.ts
  • src/main/main.ts
  • src/main/security/.gitkeep
  • src/main/security/admin-check.test.ts
  • src/main/security/admin-check.ts
  • src/main/security/safe-storage-key-manager.test.ts
  • src/main/security/safe-storage-key-manager.ts
  • src/main/speech/sherpa-onnx-stt.test.ts
  • src/main/speech/sherpa-onnx-stt.ts
  • src/main/storage/.gitkeep
  • src/main/storage/database-initializer.test.ts
  • src/main/storage/database-initializer.ts
  • src/main/storage/electron-config-store.test.ts
  • src/main/storage/electron-config-store.ts
  • src/main/storage/memory-index-store.test.ts
  • src/main/storage/memory-index-store.ts
  • src/main/storage/sqlite-audit-repository.test.ts
  • src/main/storage/sqlite-audit-repository.ts
  • src/main/storage/sqlite-session-repository.test.ts
  • src/main/storage/sqlite-session-repository.ts
  • src/preload/preload.ts
  • src/renderer/App.test.tsx
  • src/renderer/App.tsx
  • src/renderer/components/.gitkeep
  • src/renderer/components/avatar/AvatarCanvas.test.tsx
  • src/renderer/components/avatar/AvatarCanvas.tsx
  • src/renderer/components/avatar/CaptionBar.test.tsx
  • src/renderer/components/avatar/CaptionBar.tsx
  • src/renderer/components/avatar/FileDropZone.test.tsx
  • src/renderer/components/avatar/FileDropZone.tsx
  • src/renderer/components/avatar/StatusIndicator.test.tsx
  • src/renderer/components/avatar/StatusIndicator.tsx
  • src/renderer/components/avatar/TextInput.test.tsx
  • src/renderer/components/avatar/TextInput.tsx
  • src/renderer/components/display/ActivityFeed.test.tsx
  • src/renderer/components/display/ActivityFeed.tsx
  • src/renderer/components/display/ClusteredCards.test.tsx
  • src/renderer/components/display/ClusteredCards.tsx
  • src/renderer/components/display/ComparisonTable.test.tsx
  • src/renderer/components/display/ComparisonTable.tsx
  • src/renderer/components/display/DocumentView.test.tsx
  • src/renderer/components/display/DocumentView.tsx
  • src/renderer/components/display/OutputPanel.test.tsx
  • src/renderer/components/display/OutputPanel.tsx
  • src/renderer/components/display/PlanPreview.test.tsx
  • src/renderer/components/display/PlanPreview.tsx
  • src/renderer/components/display/TaskProgress.test.tsx
  • src/renderer/components/display/TaskProgress.tsx
  • src/renderer/components/layout/AppLayout.test.tsx
  • src/renderer/components/layout/AppLayout.tsx
  • src/renderer/components/overlay/ActionCard.test.tsx
  • src/renderer/components/overlay/ActionCard.tsx
  • src/renderer/components/overlay/ActionPanel.test.tsx
  • src/renderer/components/overlay/ActionPanel.tsx
  • src/renderer/components/overlay/ConfirmPlan.test.tsx
  • src/renderer/components/overlay/ConfirmPlan.tsx
  • src/renderer/components/overlay/ErrorRecovery.test.tsx
  • src/renderer/components/overlay/ErrorRecovery.tsx
  • src/renderer/components/session/AuditLog.test.tsx
  • src/renderer/components/session/AuditLog.tsx
  • src/renderer/components/session/ConversationView.test.tsx
  • src/renderer/components/session/ConversationView.tsx
  • src/renderer/components/session/QuestionCardStack.test.tsx
  • src/renderer/components/session/QuestionCardStack.tsx
  • src/renderer/components/session/QuestionReview.test.tsx
  • src/renderer/components/session/QuestionReview.tsx
  • src/renderer/components/session/SessionGreeting.test.tsx
  • src/renderer/components/session/SessionGreeting.tsx
  • src/renderer/components/session/SuggestionChips.test.tsx
  • src/renderer/components/session/SuggestionChips.tsx
  • src/renderer/components/setup/AdminBlockScreen.test.tsx
  • src/renderer/components/setup/AdminBlockScreen.tsx
  • src/renderer/components/setup/ApiKeySetup.test.tsx
  • src/renderer/components/setup/ApiKeySetup.tsx
  • src/renderer/components/setup/AvatarSelection.test.tsx
  • src/renderer/components/setup/AvatarSelection.tsx
  • src/renderer/components/setup/ProfileSetup.test.tsx
  • src/renderer/components/setup/ProfileSetup.tsx
  • src/renderer/components/setup/WorkspaceSelection.test.tsx
  • src/renderer/components/setup/WorkspaceSelection.tsx
  • src/renderer/context/.gitkeep
  • src/renderer/hooks/.gitkeep
  • src/renderer/hooks/useAvatarState.test.ts
  • src/renderer/hooks/useAvatarState.ts
  • src/renderer/hooks/useDisplayMode.test.ts
  • src/renderer/hooks/useDisplayMode.ts
  • src/renderer/hooks/useLayoutState.test.ts
  • src/renderer/hooks/useLayoutState.ts
  • src/renderer/hooks/useNetworkStatus.test.ts
  • src/renderer/hooks/useNetworkStatus.ts
  • src/renderer/hooks/useSetupRouter.test.ts
  • src/renderer/hooks/useSetupRouter.ts
  • src/renderer/renderer.tsx
  • src/renderer/speech/.gitkeep
  • src/renderer/speech/barge-in-controller.test.ts
  • src/renderer/speech/barge-in-controller.ts
  • src/renderer/speech/ipc-speech-stt.test.ts
  • src/renderer/speech/ipc-speech-stt.ts
  • src/renderer/speech/web-speech-stt.test.ts
  • src/renderer/speech/web-speech-stt.ts
  • src/renderer/speech/web-speech-tts.test.ts
  • src/renderer/speech/web-speech-tts.ts
  • src/renderer/styles/global.css
  • src/renderer/types/.gitkeep
  • src/renderer/types/web-speech.d.ts
  • src/shared/types/domain/.gitkeep
  • src/shared/types/domain/agent-error.test.ts
  • src/shared/types/domain/agent-error.ts
  • src/shared/types/domain/agent-event.ts
  • src/shared/types/domain/api-key-state.ts
  • src/shared/types/domain/audit-entry.test.ts
  • src/shared/types/domain/audit-entry.ts
  • src/shared/types/domain/avatar-persona.test.ts
  • src/shared/types/domain/avatar-persona.ts
  • src/shared/types/domain/electron-api.ts
  • src/shared/types/domain/ipc-channels.test.ts
  • src/shared/types/domain/ipc-channels.ts
  • src/shared/types/domain/ipc-message.test.ts
  • src/shared/types/domain/ipc-message.ts
  • src/shared/types/domain/launch-state.test.ts
  • src/shared/types/domain/launch-state.ts
  • src/shared/types/domain/preference.test.ts
  • src/shared/types/domain/preference.ts
  • src/shared/types/domain/project.test.ts
  • src/shared/types/domain/question-parser.test.ts
  • src/shared/types/domain/question-parser.ts
  • src/shared/types/domain/render-markdown.test.ts
  • src/shared/types/domain/render-markdown.ts
  • src/shared/types/domain/session.test.ts
  • src/shared/types/domain/session.ts
  • src/shared/types/domain/user-profile.test.ts
  • src/shared/types/domain/user-profile.ts
  • src/shared/types/domain/value-objects.test.ts
  • src/shared/types/domain/value-objects.ts
  • src/shared/types/domain/writeback.test.ts
  • src/shared/types/domain/writeback.ts
  • src/shared/types/ports/.gitkeep
  • src/shared/types/ports/agent-backend.ts
  • src/shared/types/ports/audit-repository.ts
  • src/shared/types/ports/session-repository.ts
  • src/shared/types/ports/speech-to-text.ts
  • src/shared/types/ports/text-to-speech.ts
  • stryker.config.mjs
  • tailwind.config.ts
  • test/README.md
  • test/e2e/accessibility.spec.ts
  • test/e2e/conversation-patterns.spec.ts
  • test/e2e/design-tokens.spec.ts
  • test/e2e/electron-app.spec.ts
  • test/e2e/error-recovery.spec.ts
  • test/e2e/keyboard-navigation.spec.ts
  • test/e2e/setup-flow.spec.ts
  • test/e2e/structured-questions.spec.ts
  • test/integration/agent-message-flow.test.ts
  • test/integration/api-key-lifecycle.test.ts
  • test/integration/audit-trail.test.ts
  • test/integration/conversation-thread.test.ts
  • test/integration/error-pipeline.test.ts
  • test/integration/file-operations.test.ts
  • test/integration/ipc-roundtrip.test.ts
  • test/integration/retry-backoff.test.ts
  • test/integration/session-crash-recovery.test.ts
  • test/integration/session-lifecycle.test.ts
  • test/setup-renderer.ts
  • test/support/factories/index.ts
  • test/support/factories/session.factory.ts
  • test/support/fixtures/database.ts
  • test/support/fixtures/index.ts
  • test/support/fixtures/ipc.ts
  • test/support/fixtures/repositories.ts
  • test/support/fixtures/security.ts
  • test/support/fixtures/speech.ts
  • tsconfig.json
  • vite.main.config.ts
  • vite.preload.config.ts
  • vite.renderer.config.ts
  • vitest.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch worktree-implement-sprint-1
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
3 Security Hotspots
0.0% Coverage on New Code (required ≥ 80%)
D Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@don-petry don-petry changed the title Implement TalkTerm: All 12 epics across 4 sprints feat: Epic 13 (Structured Questions) + Epic 14 (Native STT) Mar 30, 2026
Comment thread .github/workflows/release.yml Fixed
@github-actions

Copy link
Copy Markdown
Contributor

Auto-rebase failed — merge conflict — this branch has conflicts with main that must be resolved manually.

Please resolve the conflicts and push:

git fetch origin
git merge origin/main
# resolve conflicts, then:
git add .
git commit
git push

@don-petry

Copy link
Copy Markdown
Contributor Author

@claude Please address all open review comments on this PR from CodeRabbit and Copilot.

@claude

claude Bot commented May 6, 2026 •

Copy link
Copy Markdown

Claude finished @don-petry's task in 5m 30s —— View job


Addressing Open Review Comments

Finding: All 7 Copilot review items were already addressed in prior commits (the PR has 36 commits made after the review was posted). One gap remained: ActionPanel.tsx had keyboard navigation logic added in response to the review, but ActionPanel.test.tsx had no tests for those branches.

Tasks

  • Gather context and read relevant files
  • Verify admin-check.test.ts — vi.unstubAllGlobals() already in afterEach ✓
  • Verify ipc-message.ts — channel already typed as IPCChannel ✓
  • Verify agent-error.ts — TTS check already before STT ✓
  • Verify agent-event.ts — RecoveryOption already imported from agent-error.ts (no duplication) ✓
  • Verify ActionPanel.tsx — keyboard nav (ArrowDown/Up, Enter, Space) already implemented ✓
  • Verify CaptionBar.test.tsx — fake timer tests for 3s hide already present ✓
  • Verify AdminBlockScreen.test.tsx — @vitest-environment jsdom already on first line ✓
  • Add keyboard nav tests to ActionPanel.test.tsx — committed dddc998
  • Push to remote branch

What was committed (dddc998):
Added 10 new tests to src/renderer/components/overlay/ActionPanel.test.tsx covering:

  • ArrowDown moves focus to next enabled card
  • ArrowUp moves focus to previous enabled card
  • ArrowDown wraps from last to first
  • ArrowUp wraps from first to last
  • Enter selects the focused card
  • Space selects the focused card
  • Disabled cards are skipped during navigation
  • Enter does not fire onSelect when focused card is disabled
  • All-disabled no-op (no throw)
  • aria-label prop and default title-as-accessible-name

Cannot address (GitHub App permissions restrict .github/workflows/ edits):

  • ci.yml — expand push trigger to all branches
  • release.yml — add GitHub Release creation step + explicit permissions block
    | Branch

@don-petry
don-petry requested a review from a team as a code owner May 6, 2026 11:37
@don-petry
don-petry enabled auto-merge (squash) May 12, 2026 01:41
@don-petry
don-petry force-pushed the worktree-implement-sprint-1 branch from dddc998 to 11dd524 Compare May 13, 2026 17:23
@donpetry-bot donpetry-bot added the needs-human-review Requires human review label May 14, 2026
@don-petry
don-petry marked this pull request as draft May 19, 2026 04:13
auto-merge was automatically disabled May 19, 2026 04:13

Pull request was converted to draft

@don-petry

Copy link
Copy Markdown
Contributor Author

@dev-lead - please fix this PR

@github-actions

Copy link
Copy Markdown
Contributor

CI Failure: SonarCloud Code Analysis

Step: Quality Gate (New Code Coverage condition)
Root cause: Test failure

The SonarCloud quality gate failed because coverage on new code is 45.9%, below the required 80%. No individual test failed and there are no annotations. The PR adds code (the diff is over 20,000 lines) that the test suite does not exercise enough.

Suggested fix: Add unit tests for the uncovered new code, starting with the files that have the lowest new-code coverage in the SonarCloud "Coverage on New Code" measures view. If some of the added files are generated or vendored, exclude them via sonar.coverage.exclusions.

View run logs

@don-petry don-petry left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — changes requested (posted as comment: GitHub does not allow requesting changes on your own PR)

Top line: the test suite is genuinely green, but as shipped the app is blocked on Windows, re-runs setup on every launch, and gives the agent auto-approved file edits with no working confirmation path. Details are in the line comments; the blockers are the Windows admin gate, the no-op admin Retry, the per-launch setup repeat, and the acceptEdits tool policy.

Verification I ran locally (head d0009ef)

  • tsc --noEmit — clean. eslint --max-warnings 0 — clean. prettier --check . — clean.
  • vitest run — 670/670 pass (77 files) with better-sqlite3 rebuilt; test:coverage passes its 90% thresholds.
  • GitHub checks: quality passes on ubuntu/macos/windows; the e2e job is failing on this PR (job 121075002536; it's continue-on-error, and its logs weren't retrievable while the run was still in progress — worth investigating before merge, since the PR's own E2E/manual test-plan items are still unchecked).

Themes across the line comments

  1. Broken first-run paths — Windows admin gate can never pass; Retry returns the cached result; launch-state assessment (assessLaunchState/determineFirstIncompleteStep) is implemented and tested but never called, so setup repeats every launch; a failed session start silently swaps in a random UUID and runs the agent in the wrong cwd.
  2. Agent trust boundary — turns run acceptEdits with unrestricted tools and no canUseTool; the ConfirmPlan/confirm-request confirmation flow is never emitted; full prompts and SDK payloads are logged verbatim; error retries re-execute whole turns (duplicate side effects, no per-turn budget cap).
  3. Dead wiring from the sprint build-out — Rive avatar (emoji ships), memory index + user-name personalization, native folder picker + workspace persistence, startSession/resumeSession backend paths, the kind: 'menu' question branch, and WebSpeechStt/BargeInController are all implemented-but-unreachable. Each is small; together they mean several PRD-facing features only exist in tests.
  4. Epic 14 robustness — unverified/partial model downloads trusted forever, and the STT wrapper is excluded from the coverage gate with no test file.

Scope note

This PR is 229 files / +37,305 lines / 259 commits — effectively the entire application — while the description frames it as Epic 13 + 14 on top of Sprint 1. Landing it as one draft makes line-level review of everything else (storage, audit, CI hardening) cursory at best. If the history allows, splitting already-landed sprints from the Epic 13/14 delta would make the next review round far more effective. Not blocking on this, but flagging it.

Suggested order: fix the Windows/retry blockers and wire assessLaunchState, decide the tool-confirmation policy, then re-run the e2e job to green before marking ready.

Comment thread src/main/security/admin-check.ts Outdated
Comment thread src/main/main.ts Outdated
Comment thread src/renderer/App.tsx
Comment thread src/renderer/App.tsx Outdated
Comment thread src/main/agent/claude-sdk-backend.ts Outdated
Comment thread vitest.config.ts Outdated
Comment thread src/renderer/components/avatar/AvatarCanvas.tsx Outdated
Comment thread src/renderer/components/setup/WorkspaceSelection.tsx Outdated
Comment thread src/main/main.ts
Comment thread src/main/main.ts Outdated
@don-petry
don-petry marked this pull request as ready for review October 25, 2026 04:36
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-26T02:46:21.745519Z 144a107 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d0009ef326

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/main/agent/claude-sdk-backend.ts
Comment thread src/main/agent/claude-sdk-backend.ts Outdated
Comment thread src/renderer/App.tsx
Comment thread src/renderer/components/session/QuestionCardStack.tsx
Comment thread src/main/security/admin-check.ts Outdated
Comment thread src/renderer/components/session/ConversationView.tsx Outdated
Comment thread src/renderer/speech/ipc-speech-stt.ts
Comment thread src/main/speech/sherpa-onnx-stt.ts Outdated
Comment thread src/renderer/components/session/ConversationView.tsx

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7f90f93939

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/renderer/App.tsx Outdated
Comment thread src/main/main.ts Outdated
Comment thread src/main/ipc/agent-ipc-handler.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 175f387cca

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/renderer/components/session/ConversationView.tsx
Comment thread src/main/speech/sherpa-onnx-stt.ts
Comment thread src/renderer/components/session/ConversationView.tsx

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7ee6a998a8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/renderer/speech/ipc-speech-stt.ts Outdated
Comment thread src/renderer/components/session/QuestionCardStack.tsx
Comment thread src/renderer/App.tsx
Comment thread src/main/speech/sherpa-onnx-stt.ts
Comment thread src/renderer/hooks/useSetupRouter.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 51208925aa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/main/ipc/session-ipc-handler.ts Outdated
Comment thread src/shared/types/domain/render-markdown.ts Outdated
Comment thread src/renderer/components/setup/ApiKeySetup.tsx
Comment thread src/main/agent/claude-sdk-backend.ts Outdated
Comment thread src/renderer/components/session/ConversationView.tsx Outdated
…y decline, keep transient retry context, and cancel live mic restart

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c7ab178d10

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/main/speech/sherpa-onnx-stt.ts
Comment thread src/main/agent/claude-sdk-backend.ts Outdated
Comment thread src/renderer/App.tsx Outdated
Comment thread src/renderer/components/setup/ApiKeySetup.tsx Outdated
Comment thread src/renderer/components/session/QuestionCardStack.tsx Outdated
Comment thread .github/workflows/ci.yml
…ion ID, default workspace, key validation, and question skip state
@don-petry
don-petry force-pushed the worktree-implement-sprint-1 branch from c7ab178 to 85ae538 Compare October 26, 2026 02:03

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 85ae5381f7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/renderer/components/session/ConversationView.tsx
Comment thread src/renderer/speech/ipc-speech-stt.ts
Comment thread src/main/agent/claude-sdk-backend.ts Outdated
Comment thread src/main/main.ts
…op, load tracked analyst skill, and ensure userDataDir exists

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cc1857db8a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/renderer/components/session/ConversationView.tsx
Comment thread src/renderer/components/session/QuestionCardStack.tsx
Comment thread src/main/agent/claude-sdk-backend.ts
Comment thread src/renderer/components/session/ConversationView.tsx
…ctured content, ignore review speech, and skip budget retries

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1f3debe4e7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/main/ipc/agent-ipc-handler.ts
Comment thread src/renderer/speech/ipc-speech-stt.ts
Comment thread src/renderer/App.tsx Outdated
Comment thread src/renderer/components/session/QuestionReview.tsx Outdated
…r stored key for ENV_KEY, and make question review scrollable
@sonarqubecloud

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 144a107467

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +604 to +605
setActiveError(null);
displayMode.clear();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Clear obsolete question state when sending a new message

If the user bypasses a question stack by sending a follow-up through the main text input, this handler leaves activeQuestionSet intact. A subsequent plain-text response does not clear it either, so future microphone transcripts are intercepted by startListening() and entered into the old questionnaire instead of being sent to the agent. A mocked component reproduction confirmed that a new voice request populated the obsolete stack without invoking sendAgentMessage. Clear the active question set and its pending speech answer when starting a new conversational turn.

Useful? React with 👍 / 👎.

Comment thread src/renderer/App.tsx
Comment on lines +174 to +176
.catch(() => {
// Setup IPC failure — proceed anyway; key is validated client-side
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Surface credential-storage failures in API key setup

If OS-backed encryption is unavailable or safeStorage.encryptString() throws, SafeStorageKeyManager.storeKey() rejects the storage IPC request, but this catch silently discards the failure. ApiKeySetup has already set isValid to true and displays “Continuing...”, so setup neither advances nor reports why the validated key could not be saved. A reproduction with encryption unavailable confirmed that the setup step remains unchanged without receiving an error or reset signal. Return the storage failure to the setup component and restore an actionable error/retry state rather than leaving it waiting indefinitely.

Useful? React with 👍 / 👎.

maxBudgetUsd: 1.0,
continue: useContinue,
...(persistedSdkId !== null && !resumeFailed ? { resume: persistedSdkId } : {}),
...(isApproved ? { permissionMode: 'acceptEdits', allowedTools: undefined } : {}),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Forward shell-action approval to the SDK permission callback

In a workspace without preconfigured Bash allow rules, approving a command such as npm install cannot authorize its execution. ConversationView.handleConfirmApprove() sends a new message containing approved, and this override only enables acceptEdits; the SDK permission documentation explicitly states that non-filesystem Bash commands still require normal permissions. A repository-wide search of src found no canUseTool callback or permission-response bridge, and this override adds no command-specific allow rule, so the approved command remains subject to denial. Connect the confirmation result to the pending SDK permission decision rather than treating approval as another conversational turn.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dev-lead:needs-human dev-lead could not complete this issue; needs human attention needs-human-review Requires human review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants