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.

Issue #485 Captured: 2026-07-01 Tegy prod: app.tegy.io Source: src/App.tsx on branch agent-2/map-claude-settings-state-graph

Executive Summary

8
Tegy settings sections
7
settings-related API endpoints
18
material Claude parity gaps

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

Claude settings General section screenshot
Claude General: search, editable profile, custom instructions, preferences, voice, notifications.
Tegy settings General section screenshot
Tegy General: read-only profile fields plus browser-local model and effort controls.
Claude settings Capabilities section screenshot
Claude Capabilities: memory, tool access, connector search, safety switch, visuals toggles.
Tegy settings Usage section screenshot
Tegy Usage: billing-backed workspace plan, seats, billing period, and View all plans handoff.
Tegy billing handoff screenshot
Tegy Billing handoff: opened from Settings Usage or account menu View all plans.

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