PINGBO · THE DOOR — AGENT INTERACTION (ASK / TELL / STEER)
One primitive (words + actions) · one input bar · one container · three docks (board / line / draft) · spec: pingbo docs/adr/agent-interaction-uiux
9:41􀙇 􀛨 􀋨
Why this line
Cacafly owes $48K on the terminated Q2 contract; recovering it clears the AR hole before the round closes.
Done when
Cacafly countersigns and the SOC2 attestation is delivered, and the wire clears.
UPDATED JUST NOW · FROM THE DOOR
What date did I actually promise for SOC2?
On May 2 you told Ken: “the SOC2 audit will be complete before Q3.” Nothing since walks that back. May 2 · to Ken
OK — done-when should include delivering that attestation.
Noted — Done-when now includes the SOC2 attestation. recorded · settling into the case-file…
Anything else? 🎙
① The Door, opened by you (line scope). Docked bar at the case-file floor → tap → the sheet grows over a dimmed case-file; the evidence stays overhead. Every agent reply = words + actions. Words carry receipts and citations ( opens the original — trust ladder). Presentation law: an action on a visible section lets the section speak — Done-when above just crossfaded + highlighted (same muscle as draft steer); an action on invisible state (a world-fact, a timing fact) gets a spoken receipt instead. Receipts carry ✕ retract (supersede, bi-temporal) and are honest about the async queue (“settling in…” = Pattern-B pending; failure resurfaces on the Timeline, not just here). Close = the transcript evaporates; the outcomes stay (fact, section, timeline row) — scaffolding down, wall stays. Same law as plays/dough.
9:41􀙇 􀛨 􀋨
Status · needs you
Pingbo is blocked on your floor
they proposed $12K in four installments · quiet 4h
What’s the lowest total you’d take?
Ken proposes $12K in four installments Jul 9 — and you’ve said you want this closed before the round your note. I need your floor before I counter.
You think?
I’d hold at $14K, single payment — Ken already accepted $14K in April before legal stalled it Apr 18. Counter at that?
Tell it your floor… 🎙
② The same Door, opened by Pingbo (C). Entry = the needs-you card’s primary verb (Answer) or the notification deep-link — either way you land in the case-file with the door already open, its question seated first, carrying why it asks ( evidence). Not a separate surface — one SwiftUI component, two openings. The user’s “You think?” flips it into ask-direction mid-stream: the answer is a leaned recommendation (a COO has a view, never a neutral menu) with receipts, then the ball comes back. Quick-answer chips are C-only sugar (the agent knows its own question); the bar is always the main door. Answered → the fact lands (Pattern B) → the card digests (leaves needs-you; Pingbo resumes). Not now is always free — the card just stays.
9:41􀙇 􀛨 􀋨
Status · needs you
Ken’s indemnity cap is under your floor
ball on you · 2d · he proposed $25K vs your $40K
“Thanks, Ken. We’re firm on $40K for the cap — happy to walk through the reasoning on a call if useful — and we can countersign this week at that number.”
↪ Fwd · to Allister📎 contract-v3.pdf
Anything else? 🎙
Recipient changed by steer — send confirm will restate: to Allister, not Ken.
③ The Steer (B) — the door’s subclass where the reply IS the draft changing. Change ▾ splits the dough open: a steer row grows out of the draft itself (not a chat). Send an instruction → the draft crossfades in place, changed spans highlighted ~2s (the highlight is the answer — no “I changed it” narration); the ran-instruction collapses to a ✓ chip. ↺ = undo the last knead (snapshot of the whole dough incl. your hand-edits; no version rail, no redo — re-steer instead). The whole envelope is dough (shape_outbound): kind / recipients / subject / body — here a steer (typed or spoken; the mic live-transcribes in gray) just flipped reply→forward to Allister: the scope chip flips + highlights, and because a recipient changed, send-confirm will restate the envelope loudly (mis-send is the red line; every knead re-runs the guideline guard). Kneads evaporate on send — the sent mail is the only record.
9:41􀙇 􀛨 􀋨
Needs you2
KW
Settlement — Cacafly
Ken’s indemnity cap is under your floor. ⚠ his redline caps at $25K vs your $40K.
QUIET 2D · you’re accountable
SQ
Sequoia — diligence follow-up
You asked for a review of the whole history before replying.
digging through 41 emails with Sequoia · 2m tap to stop
Just got off a call with Cacafly — they’ll take 14k, signing Friday.
Logged to Settlement — Cacafly open — agreed $14K, countersign expected Friday. I’ll hold the counter-draft and watch for the doc. recorded · settling into the case-file…
Ask, tell, or find anything… 🎙
④ The board dock — same bar, inbox scope, dispatcher discipline. One component, three docks: the bar’s scope is the page you’re standing on (board = whole inbox · case-file = the line · draft = the outbound). Highest-frequency board use: deposit from anywhere — off a call, say it at the board; Pingbo resolves the host line, lands the fact, answers with a receipt + a pointer into the line. Dispatcher rule: anything line-owned routes into that line’s door (“what did we land on with Acme?” → opens Acme’s case-file, door open, answer seated); the board hosts only truly global exchanges (recall / aggregate — board:// read model + FTS are bounded-callable today). Research-grade asks auto-dispatch — no consent tap (read-only by construction; consent follows side-effects, not cost; quota gates silently until exhausted) — and run detached: coarse status on the card’s meta line (mono = machine fact), tap to stop; the result returns as a proposal wearing the verdict-brief anatomy, APNs when done. The door never blocks the day.
9:41􀙇 􀛨 􀋨
Nothing outstanding
This looks settled
every thread judged · none outstanding · you tapped Not yet
What’s still open here?
Every thread has been judged and none is outstanding Jul 14, so I read it as finished — but you know something I can’t see. Tell me what to chase and I’ll carry it.
Cacafly still owes the signed NDA amendment — chase if nothing by Friday.
Now on Re: Settlement — Cacafly open — waiting on the signed NDA amendment, nudging Friday. The Matter stays open and I won’t suggest done again while this stands. recorded · re-judging the thread…
Tell it what’s outstanding… 🎙
⑤ “Not yet” opens the Door — the decline is a conversation, not a dismissal. NOT BUILT YET. Contract: pingbo docs/adr/core-object-centred-ai/plan.md §The Done suggestion (2026-07-30). Entry = tapping Not yet on the settled card (case-file.html §Settled) — the same agent-opened Door as ②, question seated first, scope = this Matter. Why a conversation and not a status. A bare decline recorded only “the threads are done but the work is not”, which is the vaguest sentence in the product and had to be told apart from a supersede. The reason is the missing Now, stated by the only party who knows it — the user was always the cheapest source of it, and the old design threw it away. The reason becomes the Now, and that is what stops the nagging. It rides the existing reopenContext seam (≤2000 chars, whose prompt rule already says “high-priority evidence for re-evaluation, not a command”), so a re-judgment writes it as a Now on the thread it concerns — Nows stay thread-scoped and AI-authored, and the user supplies evidence rather than a verdict. The producer’s bar excludes any Matter with an outstanding Now, so the suggestion stops qualifying by the same condition that raised it: the Now is the pin, and it frees itself when that work is done. A decline that wrote no Now would re-propose on the next sweep — which is why the reason is required, and is a live defect in #577 (shouldProposeDone counts pending only). Leave it open is the free exit for “I can’t say why yet”: it declines without a reason, and accepts that the suggestion may return.
The Pingbo bar — one input, its states
One shared component across the three docks. + attach (a small sheet: camera tile + recent-photos strip + Files row — nothing more; no feature menu, depth is the agent’s judgment) · orb (the signature) · field · 🎙 recordshown only while the field is empty; text present → ↑ replaces it. Recording = a dedicated capture state: + becomes ■, the field shows a waveform (no live text); ■ = stop → transcribe on-device → text waits editable for your ↑; ↑ mid-recording = stop + transcribe + send in one tap. Leaving keeps the transcribed text. The waveform is live — bars move with the actual signal (silence flattens them; doubles as a “mic is really on” honesty cue). Haptics — the one exemption from the verdicts-only law: tap 🎙 = the app’s heaviest impact, tap ■ = a lighter one (a mode you physically enter and leave deserves physical feedback); nothing else in the bar buzzes. Mic hides where on-device recognition is unavailable — never a silent cloud fallback. Attachments never act alone: no intent text → the door asks back before anything lands.
idle — mic only while empty
Tell Pingbo, or ask about this line…🎙
text present — mic yields to ↑
Contract came back signed…
recording — +→■ · live waveform · ■ stop→text · ↑ = stop+send
attachments pending — thumb strip · ✕ each · scrolls sideways
📄 term-sheet.pdf
Contract came back signed…
working — ■ stops it; deferred runs stop from the card meta
reading the thread…
+ sheet — camera · recent photos · files, nothing more
📷
📁 Files…
rest — still · fixed glow (presence, nothing more)
listening — glow follows YOUR signal (reactive, jagged)
working — slow metronomic pulse (self-paced, ~2s)
settle — NOT a state: a one-shot landing (~0.5s) into rest, on receipt/Done · never overshoot
flat 2D core + fuzzy glow — a point of light, not a 3D object; same flat family as the zone glyphs (The Slide) · pareidolia rule holds: no dots-above-arc, never a face

What this pins

One primitive. Every exchange with Pingbo = words + actions, in one of two tenses: instant (bounded call, seconds) or deferred (dispatched research, minutes — coarse status on the card, result returns as a proposal in verdict-brief anatomy). The agent decides depth; the user never picks an engine.
Action taxonomy (the door contract’s typed union — supersedes the direction-pre-declared v0): shape_outbound (kind / recipients / subject / body — one message, many deformations) · compose_outbound (birth, not just reshape) · line updates: amend_done_when · dispute_why · add_guideline (incl. conditional watch-instructions; policy-smelling → the whisper “just this line / always”) · record_world_fact · record_progress (off-mail events → ledger + timeline) · set_timing · correct_person · routing: lifecycle / restructure verbs (done, archive, reopen, merge/split/rename — the door never invents verbs, only routes existing ones) · retract (✕ on any receipt; supersede via invalid_at) · dispatch_research. Cross-line references resolve deterministically (FTS) then join context — still bounded; ambiguity → the door asks back.
Presentation law. An action on a visible object lets the object speak: the section / draft / chip crossfades in place + highlights ~2s — never a narrated “I did it.” An action on invisible state gets a spoken receipt (restating what it understood, ✕ retract, honest queue states: pending → settled / failed, failures resurface on the Timeline). Pure asks are all words — answers cite or say “I don’t know”; refusals are quiet states, never toasts.
The Pingbo bar (one shared input): + attach (camera / photos / files — door docks only, not the compact steer row; a WhatsApp screenshot or signed-contract photo is off-mail evidence: rides the same three-tier attachment custody, provenance user_told, lands as a 📎 timeline row; shape_outbound gains an attachments field; document questions route to the deferred research tier) + orb + field + record mic (empty-field only — text present → ↑ replaces it; recording = +→■ + waveform, ■ stop → on-device transcribe → editable text awaits ↑, ↑ mid-recording = stop+transcribe+send; no voice-conversation mode) + ↑ send (■ stop while working) + context slot (↺ in steer only). Pending attachments = a sideways-scrolling thumb strip, ✕ on each. Placeholder teaches per dock.
Transcripts are scaffolding. Close the door → the conversation evaporates; what stays is what landed: facts, section changes, timeline rows (you told Pingbo: … ↗). The case-file is the memory — there is no second conversation store. Same law as plays: the sent mail / landed fact is the only record.
Consent follows side-effects, not cost. Read-only research auto-runs (SELECT-only by construction), cancel replaces consent; the confirmation taps live where mutation lives — send (recipient-confirm restates a steered envelope). Quota: reserve-then-settle, silent until exhausted.
L4 upgrade path: same contract, stronger engine — the words+actions response maps 1:1 onto the Shubo harness segment stream (text / working / operation); doors upgrade in place, the UI doesn’t change shape.