Skip to content

feat(tui): onboarding teaches the model + empty-state teachers#1746

Merged
pedrofuentes merged 2 commits into
mainfrom
feature/tui-onboarding-teach
Jun 26, 2026
Merged

feat(tui): onboarding teaches the model + empty-state teachers#1746
pedrofuentes merged 2 commits into
mainfrom
feature/tui-onboarding-teach

Conversation

@pedrofuentes

Copy link
Copy Markdown
Owner

Summary

Onboarding now opens with a teaching intro step before the model picker: shows the Council mental model (experts → panels → convene → debate → conclusion) with a static ASCII pipeline. Enter advances to the existing model picker; Esc skips to home directly from intro. All existing model-picker logic (inFlight guard, captured-input effect, ↑↓ cursor, confirmation flow) is preserved unchanged.

List-screen empty states became next-step teachers using each screen's actual keybindings:

  • Panels: No panels yet — [c] auto-compose from a topic, or [n] build from experts
  • Experts: No experts yet — [n] create one. Experts are the members of your panels.
  • Sessions: No debates yet — convene a panel to watch them deliberate

HomeScreen is untouched (launchpad already covers the first-move prompt).

Phase 10 TUI overhaul — PR-14

TDD

  • RED commit: test(tui): add failing tests for onboarding intro + empty-state teachers (13 failing tests)
  • GREEN commit: feat(tui): onboarding teaches the model + empty-state teachers (impl only, 4 source files)
  • Full TUI suite: 864/864 passing · lint zero · typecheck clean

pedrofuentes and others added 2 commits June 26, 2026 01:43
- OnboardingScreen: assert intro step renders teaching copy + pipeline
  before model picker; Enter advances to model picker; Esc on intro
  navigates home; update existing tests to advance through intro first
- PanelsScreen: assert new teacher empty text ([c]/[n] instructions)
- ExpertsScreen: assert new teacher empty text (members-of-panels copy)
- SessionsScreen: assert 'No debates' teacher text replaces 'No sessions'

Co-authored-by: Copilot <175574315+pedrofuentes@users.noreply.github.com>
OnboardingScreen: add teaching intro step (intro | model) before the
model picker. The intro pane shows the mental model pipeline
(Council assembles AI experts → panels → convene → debate → conclusion)
with a static ASCII pipeline and Enter/Esc hints. Enter advances to the
existing model picker; Esc skips directly to home. All existing model-
picker logic, inFlight guard, captured-input effect and useInput gating
are preserved on the model step unchanged.

PanelsScreen: emptyText now teaches [c] auto-compose and [n] build-from-
experts actions using the actual keybindings the screen already binds.

ExpertsScreen: emptyText now teaches [n] create and explains that experts
are the members of panels.

SessionsScreen: emptyText now says 'No debates yet' and teaches the user
to convene a panel to watch them deliberate.

HomeScreen is untouched (launchpad already covers the first-move prompt).

Co-authored-by: Copilot <175574315+pedrofuentes@users.noreply.github.com>
@pedrofuentes

pedrofuentes commented Jun 26, 2026

Copy link
Copy Markdown
Owner Author

Status: APPROVED

Sentinel Review Report

Ref: feature/tui-onboarding-teach → main
Report ID: sentinel-1746-c2e0668
Reviewed SHA: c2e0668
Sentinel ruleset: v1
Reviewed at: 2026-06-26T08:51:04Z
Mode: standard
Review depth: Tier 2 (full)
Required action: MERGE

Phase 1 — TDD / Test Evidence

  • Tests exist & meaningful: ✅ New tests assert intro copy/pipeline, Enter/Esc transitions, preserved model confirmation, and list empty-state teacher text. Evidence: tests/unit/tui/onboarding-screen.test.tsx:75-78 contains expect(frame).toContain("Council assembles AI experts into panels"); and expect(frame).not.toContain("claude-sonnet-4.5");; tests/unit/tui/panels-screen.test.tsx:56 contains expect(lastFrame()).toContain("[c] auto-compose from a topic, or [n] build from experts");.
  • Test-first history verified: ✅ git --no-pager log --oneline origin/main..HEAD shows cdb7de9 test(tui): add failing tests for onboarding intro + empty-state teachers before c2e0668 feat(tui): onboarding teaches the model + empty-state teachers; git show --name-status c2e0668 lists only packages/cli/src/tui/screens/{ExpertsScreen,OnboardingScreen,PanelsScreen,SessionsScreen}.tsx; git show --name-status cdb7de9 lists only TUI test files.
  • RED evidence: ✅ On cdb7de9, targeted tests failed as expected: Test Files 4 failed (4) and Tests 13 failed | 25 passed (38); representative failure: expected 'Welcome to Council!\nChoose the defau…' to contain 'Council assembles AI experts into pan…'.
  • Full suite green on SHA: ✅ cd packages/cli && npx --yes pnpm@10.30.1 exec vitest run tests/unit/tui --reporter=dotTest Files 93 passed (93) and Tests 864 passed (864).
  • Lint: ✅ npx --yes pnpm@10.30.1 linteslint packages/cli/src packages/cli/tests exited 0.
  • Typecheck: ✅ npx --yes pnpm@10.30.1 typechecktsc --noEmit exited 0.
  • Coverage: N/A (threshold unset/not required for this review).

Phase 1.5 — Fast-path Evaluation

🔴 count: 0 | LOC: 149 non-test source changed (≤150: Y) | Security paths: Y (TUI terminal-rendering surface) | New deps: N | Commit types qualify: N (feat)
→ Fast-path eligible: NO → Phase 2

Phase 2 — Execution Log

Dim Tool Call Agent ID / Ref Status
A1 task(agent_type="general-purpose", name="sentinel-dim-a1", model="claude-sonnet-4.6") N/A (sync task tool returned no separate ID) ✅ No findings
A2 task(agent_type="general-purpose", name="sentinel-dim-a2", model="claude-sonnet-4.6") N/A (sync task tool returned no separate ID) ✅ No findings
B task(agent_type="general-purpose", name="sentinel-dim-b", model="claude-sonnet-4.6") N/A (sync task tool returned no separate ID) ✅ No findings
C task(agent_type="general-purpose", name="sentinel-dim-c", model="claude-sonnet-4.6") N/A (sync task tool returned no separate ID) ✅ No findings
D task(agent_type="general-purpose", name="sentinel-dim-d", model="claude-sonnet-4.6") N/A (sync task tool returned no separate ID) ✅ No blocking/material findings
E N/A N/A ✅ Auto-skipped: no dependency/supply-chain surface changed
F task(agent_type="general-purpose", name="sentinel-dim-f", model="claude-sonnet-4.6") N/A (sync task tool returned no separate ID) ✅ No material findings after Phase 3 calibration
Persist gh pr comment 1746 --body-file -; gh pr comment 1746 --edit-last --body-file - #1746 (comment) ✅ Report persisted

Findings

  • 🔴 CRITICAL: 0
  • 🟡 IMPORTANT: 0 new / 0 known
  • 🟢 MINOR: 0

Details (ordered by severity)

No findings. Dimension D's real-timer observation and Dimension F's documentation/i18n observations were calibrated below the materiality floor: they either follow an existing test convention, lack a concrete trigger→mechanism→consequence risk path, or match existing hardcoded-string practice.

Follow-ups & Actions

  • APPROVED → MERGE: no new Sentinel follow-up issues required by this report.

Decision rationale

  • Reviewed SHA is exactly c2e06683a049eb4bcadd58f116a1c974f0122524.
  • TDD choreography is compliant: RED test commit precedes GREEN feat commit, with tests/source separated by commit.
  • RED tests fail without implementation and the reviewed HEAD passes the targeted TUI suite, lint, and typecheck.
  • Correctness checks found the intro/model state machine preserves the model-confirm flow, in-flight guard, input capture, and isActive gating; intro Esc navigates home; listed action keys match screen bindings.
  • Phase 2 dimension review found no blocking or material follow-up findings.

@pedrofuentes pedrofuentes merged commit 7c4905d into main Jun 26, 2026
13 of 15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant