The email wedge, end to end: AI drafts, you approve, it sends, it remembers
Talkak's thesis — AI does the work, you stay in control — finally ran a full loop on a real inbox: synced mail lands in the 팔다 (Sell) area, an AI drafts a reply grounded in company memory, a two-step human approval mints the receipt SMTP requires, the mail actually sends through Gmail, and the sent reply is written back as a memory node. Also: the 7-area 관제소 home, nav consolidation, and 만들다 = the terminal.
For weeks the answer to "what is Talkak, in one screen?" was a shrug. There were a dozen nav buttons, two homes competing to be the home, and a lot of code that looked like a product without ever closing a loop. This is the log of the day a loop closed.
The home became a control room, not a button menu
The renderer now opens on a 관제소 — the service's seven areas (만들다·돌리다·알리다·팔다·벌다·지키다·조종하다)
as tiles, each fusing what's here (record count, checklist progress, latest activity)
with what needs you (open items, in red). It's the same BusinessMap that existed,
grown a "needs-you" line and a one-line blurb per area so you know what's inside before
you click.
The nav shrank from ~11 flat buttons to Map + 더보기. The areas aren't buttons anymore — they're the tiles. Clicking 만들다 opens the terminal grid (build = code = the panes you already run Claude/Codex in); 알리다 → Marketing, 팔다 → the new Sell surface; everything else → its area page. Nothing was deleted — Marketing/Customers/작업장 just moved onto the tiles they always were. A persistent global top bar (service switcher · ⌘K · ⌨ shortcuts · 📖 glossary) now rides above every view instead of hiding inside the terminal toolbar.
팔다: the wedge, made real
The old Customer Ops screen was a beautiful 1,287-line shell wired to mina@example.com
mock CSV. The new SellArea reads the real sell-cluster graph nodes — the actual
synced inbox — and lets you, without leaving Talkak:
- Read the item (sender pulled from the message body).
- Draft a reply with
draft_reply(memory.rs), grounded in company memory via semantic retrieval — so the draft knows context instead of asking for it. - Approve + send with a two-step confirm.
send_reply(connector.rs) requires a human-approval receipt id, and that id is minted only on the second, human click — so the AI can never send on its own. The gate is structural, not a checkbox. - Remember: the sent reply is appended to the graph as a
change/supportnode with evidence (source: gmail_smtp,sent_at,approval_receipt_id, the message it answered).
It also drafts in parallel — each item owns its own reply state, so "✍️ 전체 초안 (N)" fires
N draft_reply calls at once and the rows light up "쓰는 중 → 준비" independently. Mission Control
for an inbox, except the workers are drafts, not coding agents. And the composer shows the real
email essentials: 보내는 사람 (the connected Gmail, address only — never the password), 받는 사람,
참조 (CC, newly wired through build_reply_message), 제목.
What "it works" actually means here
We verified the loop end to end on a real account: python probes confirmed SMTP and IMAP
auth succeed; the UI showed "📤 …에게 발송 완료 + 기억에 기록"; and reading the graph store on
disk showed the node:
title: Replied: Re: Indeed Application: Junior Software
node_type: change · domain: support
evidence: { source: gmail_smtp, sent_at: 2026-06-19T22:41:18Z, approval_receipt_id: human_approval:… }So "doing the work becomes memory" isn't a slogan today — it's a line in a JSONL file with a provenance receipt.
The honest edges
- It's local. History lives in
~/Library/Application Support/DalkkakAI/graph/*.jsonl(one append-only ledger per service) + an embeddings file. The cloud seam (CloudSync → Supabase) exists in code but is off in this build — durability and cross-device sync are the next job. - The data is noisy. The inbox filter lets job-application and notification mail through, so 팔다 currently holds newsletters, not customers — the mechanism (mail → area by nature) works; the classification accuracy doesn't yet. The test reply even went to an automated Indeed address the AI itself flagged as "doesn't need a reply."
- Bodies can be empty for old nodes. A MIME-walk fix (
readable_body) now extracts text from multipart/HTML mail, butappendis idempotent by node_id, so already-synced nodes keep their empty bodies until re-synced.
None of that changes the headline: the smallest complete version of the product — read → draft → approve → send → remember, all inside Talkak, on a real inbox — ran today.