Tegy Settings Control Surface State Graph
Complete map of every current Tegy settings control surface, the API or local action it takes, Claude.ai evidence for the analogous surface, current coverage, and the remaining gaps.
Executive Summary
Tegy's current settings surface is mostly a read-only status and routing layer. It has real local behavior for settings hash routing, model selection, effort selection, org ID copy, modal close, and billing/invite/log-out handoffs. API-backed behavior exists for session, billing status, billing checkout/portal, org invite context, invite submission, and logout. Compared with Claude, the biggest gaps are editable profile/personalization, usage limits, capability toggles, trusted devices/sessions, Claude Code/StrategyOS controls, and real browse/connect/add surfaces for Skills, Connectors, and Plugins.
Evidence
State Graph
App boot
-> GET /api/auth/session
-> authenticated ChatApp
-> Account menu trigger
-> Settings menu item
-> set isSettingsOpen true
-> set settingsSection general
-> replace hash #settings/general
-> View all plans
-> set billingNotice null
-> set isBillingOpen true
-> BillingDialog
-> Invite users
-> set isInviteUsersOpen true
-> InviteUsersDialog
-> Log out
-> POST /api/auth/logout
-> reset analytics
-> set session null
SettingsDialog
open sources:
- account menu Settings
- Ctrl/Cmd + Shift + ,
- direct hash #settings/:section
close sources:
- close button
- dialog open-change false
- hash cleared
section nav:
- desktop settings-nav-*
- mobile settings-mobile-nav-*
- set settingsSection
- replace hash #settings/:section
Settings sections
general
-> profile fields are display/read-only
-> Default model select
-> setModelState
-> localStorage tegy.chat.model
-> Reasoning effort select
-> setEffort in React state only
account
-> Organization ID copy
-> navigator.clipboard.writeText(session.org.id)
-> copied label for 1600ms
-> Log out
-> close settings
-> POST /api/auth/logout
usage
-> enabled query GET /api/billing/status only while open and section usage
-> Loading usage | error row | plan/seats/period rows
-> View all plans
-> close settings
-> clear hash
-> set isBillingOpen true
-> BillingDialog
-> transient overlap is under 300ms during Radix exit
capabilities
-> display-only status rows
strategyos
-> display-only runtime/model/context/image rows
skills/connectors/plugins
-> display-only Active + Scope rows
BillingDialog
-> open from account menu, Settings Usage, billing route notices, welcome splash
-> GET /api/billing/status
-> Manage billing
-> POST /api/billing/portal
-> window.location.assign(portalUrl)
-> Upgrade plan
-> POST /api/billing/checkout
-> window.location.assign(checkoutUrl)
-> Close
-> clear action error and notice
-> set isBillingOpen false
InviteUsersDialog
-> open from account menu or sidebar invite
-> GET /api/orgs/current
-> local parse/classify invite emails
-> Send invites
-> POST /api/orgs/current/invites
-> analytics org_invites_created
-> invalidate org current query
-> Cancel/close
-> reset draft/error/notice/submitting
Tegy Control Map
| Surface | Control | Action | API or local state | Source | Coverage |
|---|---|---|---|---|---|
| Account menu | Settings | Open SettingsDialog on General. | Local: set settings open, section general, hash #settings/general. |
src/App.tsx:1861, 3908 |
covered |
| Account menu | Get help | Visible menu item, no handler. | No API, no route. | src/App.tsx:1869 |
gap |
| Account menu | View all plans | Open BillingDialog. | Local open; BillingDialog then GETs /api/billing/status. |
src/App.tsx:1874, 6055, 2412 |
covered |
| Account menu | Invite users | Open InviteUsersDialog. | Local open; dialog GETs /api/orgs/current. |
src/App.tsx:1882, 2873 |
partial |
| Account menu | Learn more | Visible menu item, no handler. | No API, no route. | src/App.tsx:1889 |
gap |
| Account menu | Log out | POST logout and clear session. | POST /api/auth/logout, reset analytics, set session null. |
src/App.tsx:1895, 3639 |
partial |
| Sidebar footer | Invite team members | Open InviteUsersDialog. | Same dialog path as account menu Invite users. | src/App.tsx:6040 |
partial |
| Settings shell | Close | Close dialog and clear hash. | Local: setIsSettingsOpen(false), clearSettingsHash(). |
src/App.tsx:1978, 3916 |
covered |
| Settings shell | Desktop and mobile section nav | Switch section. | Local: set section, replace hash. | src/App.tsx:2011, 2042, 3904 |
covered |
| Settings General | Avatar, Full name, What should Tegy call you?, Organization | Display only. | No API. Inputs are read-only values derived from session. | src/App.tsx:2067 |
partial |
| Settings General | Default model | Change default model for composer/new turns. | Local: React state plus localStorage via setStoredChatModelId. |
src/App.tsx:2103, 3900 |
partial |
| Settings General | Reasoning effort | Change composer effort. | Local: React state only, no persistence seen. | src/App.tsx:2123, 6425 |
gap |
| Settings Account | Email, Your role | Display only. | Session data from /api/auth/session. |
src/App.tsx:2145, 13320 |
partial |
| Settings Account | Organization ID copy | Copy org ID and show Copied for 1600ms. | Local clipboard API only. | src/App.tsx:1947, 2154 |
gap |
| Settings Account | Log out | Close settings, then logout. | POST /api/auth/logout. |
src/App.tsx:1962, 2170, 3639 |
gap |
| Settings Usage | Your usage rows | Load billing status while Usage section is open. | GET /api/billing/status via React Query. |
src/App.tsx:1933, 2189 |
covered |
| Settings Usage | View all plans | Close Settings, clear hash, open BillingDialog. | Local transition; BillingDialog GETs /api/billing/status. |
src/App.tsx:1957, 2226 |
covered |
| Settings StrategyOS | Runtime, model, context window, image input | Display only. | Local selected model config. | src/App.tsx:2245 |
partial |
| Settings Capabilities | File attachments, Project context, Artifacts | Display only. | No API or toggle. | src/App.tsx:2272 |
partial |
| Customize | Skills, Connectors, Plugins | Display Active and Scope only. | No API or management controls. | src/App.tsx:2288 |
gap |
| Billing dialog | Manage billing | Create portal session and redirect. | POST /api/billing/portal. |
src/App.tsx:2467, 13372 |
covered |
| Billing dialog | Upgrade plan | Create checkout session and redirect. | POST /api/billing/checkout. |
src/App.tsx:2446, 13361 |
covered |
| Invite dialog | Email draft, Cancel, Send invites | Classify draft locally; submit valid emails. | GET /api/orgs/current, POST /api/orgs/current/invites. |
src/App.tsx:2873, 13333, 13343 |
partial |
API Map
| Endpoint | Caller | Trigger | Observed or inferred state |
|---|---|---|---|
GET /api/auth/session |
App boot | Every authenticated app load. | Provides session, user, org, role, allowed domains. |
POST /api/auth/logout |
Account menu and Settings Account. | Log out click. | Deletes session cookie server-side; frontend clears session locally. |
GET /api/billing/status |
Settings Usage and BillingDialog. | Usage section opens; Billing dialog opens. | Returns billing state, plan list, config flags, seats, active status. |
POST /api/billing/checkout |
BillingDialog. | Upgrade plan click. | Creates provider checkout URL; browser redirects. |
POST /api/billing/portal |
BillingDialog. | Manage billing click. | Creates provider portal URL; browser redirects. |
POST /api/billing/refresh |
Billing return route. | Checkout return, not a direct visible Settings control. | Refreshes local billing state from provider. |
GET /api/orgs/current |
InviteUsersDialog. | Invite dialog opens. | Returns org members, pending invites, invite policy, allowed domains. |
POST /api/orgs/current/invites |
InviteUsersDialog. | Send invites click with valid drafts. | Creates invite records and attempts email delivery. |
Production runtime observation for this audit saw GET /api/auth/session
and GET /api/billing/status return 200 while opening Settings/Usage/Billing.
No console warnings or errors appeared during the verified Tegy settings run.
Claude.ai Surface Map
| Claude section | Observed controls | Tegy coverage |
|---|---|---|
| Shell | Search settings, Settings and Customize groups, close, hash-routed sections. | partial Same groups and hash idea; Tegy has no search and tests assert no search. |
| General | Editable avatar, full name, display name, work descriptor, custom instructions, appearance, chat font, motion, voice language/style/speed, notification switches. | gap Tegy only has read-only profile fields plus model/effort preferences. |
| Account | Log out of all devices, delete account/admin contact, role, primary owner, org ID copy, trusted devices table, active sessions table. | partial Tegy has role, org ID copy, and local log out only. |
| Usage | Current session usage, reset timing, weekly limits, refresh. | gap Tegy shows billing plan/seats/period, not session or weekly usage limits. |
| Capabilities | Memory switches, memory import, tool access mode, connector search, safety model switch, location metadata, artifact/AI artifact/visualization toggles. | gap Tegy capability rows are display-only. |
| Claude Code | Session classification, model-switch safety setting, code themes/font, high contrast mode, interface font, transcript size/width, branch prefix, PR automation, authorization tokens, delete server sessions. | gap Tegy has StrategyOS runtime status only; no operator/user controls. |
| Skills | Search skills, Browse, Add skill, All/Personal/Organization tabs, skill table. | gap Tegy shows Active/Scope only. |
| Connectors | Search connectors, Add, All/Connected/Not connected tabs, per-connector Connect controls. | gap Tegy shows Active/Scope only. |
| Plugins | Search plugins, Browse, Add plugin, plugin table with author/skills/updated data. | gap Tegy shows Active/Scope only. |
Coverage And Gaps
| Area | Current coverage | Gap | Suggested next issue |
|---|---|---|---|
| Settings shell | Browser tests cover account menu open, hash deep link, shortcut, close, nav, Pixel 5 layout. | Search is intentionally absent even though Claude has it. If parity matters, add search against section labels/control labels. | Decide whether search remains intentionally omitted or becomes searchable local filter. |
| Profile | Read-only session display. | No edit/save for avatar, name, display name, organization, work descriptor, or custom instructions. | Design profile persistence API. Custom instructions touch AI boundary and need operator approval first. |
| Preferences | Model changes persist in localStorage and sync with composer. | Effort changes are React-memory only; no regression test proves model/effort persistence or cross-surface sync. | Persist effort or explicitly document it as session-only, then add tests for model/effort settings-to-composer sync. |
| Account/security | Role and org ID visible; logout works by source inspection. | No trusted devices, active sessions, all-device logout, delete/deprovision state, or logout UI test from Settings. | Add session/device model only if product needs it before launch; at minimum test Settings logout and clipboard states. |
| Usage | Billing status and billing dialog flows are well-covered by product/browser tests. | No Claude-like session/weekly usage limits, reset timers, or usage refresh button. | Define Tegy quota model and expose current session/window usage once backend accounting exists. |
| Capabilities | Static capability rows exist. | No toggles, memory, import, tool access mode, connector search, safety switch, or location policy. | Split into product-policy toggles; do not add hidden AI routing/safety changes without AI boundary approval. |
| StrategyOS / Claude Code analogue | Runtime status, selected model, context window, image support display. | No controls for code/runtime appearance, branch prefix, PR automation, session classification, auth tokens, or delete sessions. | Decide which Claude Code controls make sense for a StrategyOS web workspace before implementing. |
| Skills/Connectors/Plugins | Placeholder Active/Scope rows. | No search, browse, add, connect, tables, or per-item state. | Build real list APIs before UI. Avoid fake rows that imply management exists. |
| Billing Workspace/Access tabs | Billing dialog has Claude-like side tabs visually. | Workspace and Access tabs are inert placeholders. | Either implement tabs or visually de-emphasize them until functional. |
| Invite users | Invite dialog has local validation, API submission, analytics event, and query invalidation. | It is outside Settings, while collaboration/admin settings are likely to need a full Workspace/Access settings surface. | Fold invite and workspace member management into the collaboration implementation tracked separately. |
Verification Notes
- Source inspected:
src/App.tsxsettings, billing, invite, account menu, state handlers, API wrappers. - Runtime inspected: production
app.tegy.io/new#settings/*with Chromium Profile 3 / tegy. - Claude evidence inspected:
claude.ai/new#settings/*with the same profile. - Existing tests inspected:
tests/browser/product-vision-ui.spec.ts,tests/browser/billing-return-edge-cases.spec.ts,tests/browser/chat-route-errors.spec.ts. - Live Tegy network during settings audit:
GET /api/auth/sessionandGET /api/billing/statusreturned 200. - Transient Settings-to-Billing overlap was measured as a dialog exit transition: Settings present at 0-100ms, removed by about 300ms, Billing remains open and hash is cleared.