Act 2 lands: approval-style work windows, hidden agents, factories — and the two directions we carved in stone
Two days after judging our own navigation-first shell 'not best', Act 2 shipped: every business zone now has a card-first, approval-style work window backed by a DEDICATED agent in a hidden tmux session — no terminal in sight, taps over typing. Plus a UI factory (widgets as specs), an agent factory (hire a named specialist in one line), ordered phrase stories with narrative-aware correction, and two spec'd directions: the architecture heat map with open-in-IDE deep links, and the ledger as the company's permanent memory.
The structural fix: coding and business never share a surface again
The founder's objection that reshaped the week: zone tasks (marketing, billing) were landing in the CODING agent's terminal session — context pollution, zero specialization, and a surface a non-developer could never use. The fix is structural now:
- Every zone gets a dedicated agent running in a hidden tmux session — it never appears in the coding mosaic. Boot order is safe by construction: spawn shell → start the agent → wait for its hook signal → only then deliver text (typing into a bare shell would execute on Enter; that path cannot happen).
- Its face is an approval-style chat, not a terminal: the agent reports (summary cards), asks (question cards with tappable option buttons — one tap answers), raw output collapses behind "details". The owner types only one-line instructions; suggestion chips surface the zone's unchecked playbook items. The boss-employee model: 지시/결재/보고/답변 — and only 지시 needs a keyboard.
The factories
- UI factory v1: standing operational widgets per zone are SPECS (data), not components — counts, lists, identity lines, friction gauges, all filled from the ledger and pulse. Sources that aren't connected render as honest connect-prompts wired to the real setup playbook (no fabricated numbers — test-locked). "Add widget" appends a spec; one renderer serves builtin, industry-pack, and custom specs alike.
- Agent factory v1: hire a named specialist ("번역봇") in one line — a new dedicated role on the same hidden-session machinery, its hiring brief delivered as the first message, chatting through the same approval-style window.
Phrase stories — narrative-aware English
My Phrases/Terms restructured around stories: ordered narratives of what you actually want to say (an interview intro, a demo walkthrough), reorderable, with each expression in a corrected line clickable for its explanation (collocation/phrasal verb/pattern + a Korean nuance note) — explanations persist after saving. The correction itself became story-aware: the story's previous lines feed the model as context, so each new sentence continues the narrative — consistent register, coherent pronouns, no repetition — with the exact lines shown on hover (nothing invisible goes into the prompt). The chat directive mines the same reusable chunks now, so polishing a message also feeds the phrase bank.
Two directions carved in stone (specs, deliberately not built yet)
- The architecture view (docs/designs/ARCHITECTURE_VIEW_SPEC.md): the whole-system module map IDEs can't hold — change heat from the ledger's existing git-stat data, a live "the agent is editing HERE" pulse from the hook stream, and open-in-IDE deep links: Talkak holds the whole picture; inspecting a part summons Cursor/VS Code at that exact file. The layer thesis, honestly argued: IDEs stay the verification instrument; the operating layer above them is the unclaimed land — and partial precedents (CodeScene's hotspots) stayed analytics tools because the question "who is editing my system right now" only existed once agents started editing.
- The ledger as permanent memory (CONNECTIVE_LAYER.md v2): five layers — collect (more truth sources through one validator), validate, store (append-only JSONL forever authoritative; indexes only ever derived), connect (agent-pushed EDGES turn the log into causal chains: issue → fix → release → metric movement), answer (deterministic queries, time-travel, an advisor that must cite node ids). Next two moves named: Stripe PULL for breadth, edges for depth.
Honest notes
- A cross-session catch worth recording: the machine-wide honesty gate (a Stop hook) was being
inherited by one-shot helper calls (
claude -pfor corrections/summaries) through the pane's environment — arming the summary requirement on calls that aren't pane sessions and corrupting results. Found by an end-to-end probe, fixed with an env guard, post-mortemed in full. The enforcement layer needed its own boundary drawn: a helper call is not a session. - Build remains gated by 93 web + 7 Rust tests; the public update channel hasn't moved during the Act 2 experiments — local installs only until the founder calls it.