01

What it is

Definition

Jaewoo's Desk is a local desktop sales-intelligence workspace that produces and accumulates sales strategy through AI collaboration. It is not a chat app — it is a space that turns read-only Salesforce (CRM) data and external news into per-account analysis and strategy, saved as durable assets.

Evidence-based

Every figure comes from live CRM (SOQL) or a pre-computed fact. No guessing or fabrication; anything uncertain is marked "needs confirmation."

AI collaboration

A team of specialist agents (Sales · Renewal · Tableau · Verifiers) cross-checks each other to produce deep briefings and strategy.

Accumulation

Conversations are ephemeral; outputs (briefings, reports) are permanent — they stack per account and can be revisited.

The target user is a single Tableau Account Executive (focused on manufacturing & auto-parts). The whole book of business — existing customers + whitespace — is managed regardless of whether an opportunity exists.

02

Architecture

How it is built

Three layers — data, AI, and presentation — on top of Electron's 3-process model.

PRESENTATION renderer/app.js · three.js 3D · two-axis theme Dashboard · Customer 360 · Agent Office (3D) · Renewals · Activity Feed · News ORCHESTRATION agent-runtime.js — logged-in Claude CLI · serial queue (concurrency 1) fast = Sonnet solo · deep = Opus + 8 specialists + 2 verifiers (data-verifier / audit-verifier) Interactive turns get absolute priority · figures computed by JS and injected (no hallucination) PERSISTENCE better-sqlite3 · desk.db sessions · reports · opty · renewal_fresh agent_cache · external_intel · opty_seen · activity_log DATA SOURCES CRM = Salesforce prod (read-only MCP) SOQL only · no Email/Phone · deep links News = single-host RSS (main, direct https) AUTONOMOUS LOOP pre-analysis cycle → CRM diff (change detection) → news triggers → Scout signals → standing briefing Works unprompted and surfaces insights first via the activity feed and toasts
Presentationrenderer/app.js (single renderer) · three.js 3D · two-axis theme (light/dark × champagne/platinum/ink)
Orchestrationagent-runtime.js — drives a logged-in Claude CLI · serial queue (concurrency 1) · fast (Sonnet) / deep (Opus + 8 specialists + 2 verifiers)
Persistencebetter-sqlite3 desk.db — sessions · reports · CRM cache · agent briefings · news
Data sourcesCRM = Salesforce production org (read-only MCP) · news = single-host RSS (main, direct https)

Accuracy backbone — double fact-check

In deep mode the orchestrator delegates to specialists, then data-verifier (re-checks figures against CRM source) and audit-verifier (audits logic and evidence) cross-verify every claim. Only what passes verification reaches the user.

Speed design

Every CLI run pays an MCP cold-start (~35s), so interactive turns get absolute priority and background syncs are serialized. Numbers and lists are computed by JS (not the LLM) and injected into the prompt → no re-fetching, no hallucination.

03

Code structure

How it is organized

Vanilla JS ESM, no framework or bundler. Each file has a clear responsibility.

FileResponsibility
main/main.jsWindow lifecycle · IPC handlers · security harness (egress allowlist) · boot
main/agent-runtime.jsClaude CLI spawn · fast/deep modes · timeouts · interactive priority
main/agents.js8 specialist + 2 verifier personas · shared rules (Tableau-only · PII · fiscal quarter)
main/queries.jsSOQL builders + CRM response mappers (single source of truth)
main/db.jsSQLite schema + accessors
main/news.jsNews collector (single-host https, no key required)
renderer/app.jsAll view rendering · agent queue · coverage · Customer 360 · charts (~7,600 lines)
renderer/lib/*.jsData modules · 3D modules (territory/office/renewal) · utils
renderer/styles/tokens.css (design tokens) · app.css
scripts/harness-*.mjsStatic checks (400+ regex assertions) · visual capture

Data contract (SQLite)

sessions · messages · reports · territory · opty · license · account_detail · agent_cache · external_intel · renewal_fresh · opty_seen · activity_log

Each CRM cache table tracks freshness via synced_at and uses a cache-first → live re-fetch (stale-while-revalidate) pattern.

04

Invariants

Non-negotiable rules

Constraints upheld on every change — the basis of security and accuracy.

  • PII No Email/Phone in SOQL. Contacts limited to Name/Title/Department. CRM read-only deep links only.
  • No web Agents cannot WebFetch/WebSearch (that was the exfiltration channel). External info comes only from the out-of-band news collector.
  • Tableau-only An opty must have BOTH #ECS AND #JW in its name. Renewals and licenses are Tableau products only — no mixing other solutions.
  • Concurrency ≤ 2 Triple-parallel was the root cause of past timeouts. Interactive work keeps priority.
  • Auth Subscription-based Claude CLI. No metered ANTHROPIC_API_KEY.
05

Screenshots

The real UI

Below are real captures of the demo running the actual renderer on synthetic data — not mockups, but the same code the installed app runs.

Dashboard — KPIs · priority actions · team status
Dashboard — KPIs · priority actions · team status
Customer 360 — per-account renewal · open opty · strategy
Customer 360 — per-account renewal · open opty · strategy
Agent Office — 3D standing office · specialist debate → report
Agent Office — 3D standing office · specialist debate → report
Renewals — Asset-verified · 3-state accuracy (done / at-risk / needs check)
Renewals — Asset-verified · 3-state accuracy (done / at-risk / needs check)
Activity Feed — deal & news changes auto-detected via CRM diff
Activity Feed — deal & news changes auto-detected via CRM diff
News — continuous public news collection for your accounts
News — continuous public news collection for your accounts