Gap analysis & roadmap · 2026-07-16 · for red-pen

Neo: the road to chief of staff

Alie tested Neo live today and every beat went wrong — slow, blind to threads, dead-end answers, one claimed check that never happened, and not one offer to pick anything up. The autopsy: nearly every organ he needed already exists in his body and is simply not wired to his Slack mouth. This is the gap, receipted, and the six-phase road — under twin contracts: never overclaim, always carry.

Ratified 2026-07-16 (marked: SF writes in, complete & trustworthy) · the build wave is running
01

The day, in seven beats

Alie tested Neo live for the first time today. Here is her day walking through him — each beat is what happened, what a chief of staff does instead, and (one click deeper) exactly why it happened.

  1. “Tell me about my work queue” → “no data on file for you.” A real work queue exists inside Neo’s own runtime — the Slack mouth can’t reach it, and Slack-Robert has never been joined to real-Robert.
    ↘ go deeper
    A WSJF-ranked work-queue engine is live at worker.ts:3991 feeding a different surface. The Slack lane’s retrieval knows exactly two stores (entity files + ask ledger). Identity: personIdFor mints person:slack:U0D3K48GZ; the alias engine (person-basis.ts) that could join it to canonical-Robert is never called on this path, and no seed links the two.
  2. Two 7:36am questions — never answered, ever. Neo “claimed” them, died mid-cycle, and nothing ever recovers a claimed-but-unanswered ask. Silence, forever.
    ↘ go deeper
    Known failure, already named task #19 (stranded-claim recovery): two-phase claims, answered_at, reclaim horizon, dead-letter loud. Queued in the handoff chain.
  3. “Remind me to slack Alie today” → 1h43m later: “I don’t have a reminder system.” The reminder machinery exists and its flags are ON — wired to Telegram only. A Slack message never reaches it.
    ↘ go deeper
    The only dispatch() call site is runThinkConversationTurn, fed by Telegram’s inbound.chatId (worker.ts:9358). Slack’s own ingestion feeds the ask ledger — a sibling store that never touches obligation capture. Three gaps: no Slack→dispatch call site; unmerged sibling stores; Slack acts explicitly not-activated (hands-arc-2026-07-15.md:61-62).
  4. “What is Cement Creek’s payment status?” → “no known entity address on file.” Paying clients are structurally invisible to Neo: his Salesforce feed only ingests OPEN deals, and the payment-status lookup is declared in code but was never built.
    ↘ go deeper
    Ingestion SOQL: WHERE IsClosed=false (salesforce-transport.ts:30); the Stripe join repeats the same exclusion (stripe-account-transport.ts:100-103). Cement Creek is Closed-Won ⇒ never ingested ⇒ the literal miss string at eve-slack-lane-live.ts:273. billing_payment_status is a declared lookup type; every return site emits entity_status — dead code.
  5. “What all can you do and see?” → a vague, wrong list. The honest self-model exists in his codebase — a capability registry whose stated job is answering exactly this question. It’s wired to the Telegram brain, not the Slack mouth. The answer Alie and Robert got was free narration.
    ↘ go deeper
    capability-registry.ts:115-117: “the ‘what can you do’ answer all derive from this registry — never from prose.” Consumed by brain.ts:925 (Telegram). Zero imports from the Slack lane. The claimed “calendar and task list” access: the registry lists calendar_read as state: "absent" and has no task-list entry at all.
  6. Alie: “Did Robert send them the checkout link?” → “found nothing… check with him directly.” A dead end on a checkable question. The composer that wrote that answer runs with ZERO tools — no mail, no Stripe, no Salesforce, no ability to look anywhere beyond a small in-memory cache. Then Alie replied in the thread, and Neo never saw it: he literally cannot see thread replies.
    ↘ go deeper
    Compose: oneShotCompose is a raw completion, no tools field (eve-slack-lane.ts:186-261); the Rung-2 upgrade behind EVE_COMPOSE_RUNG2 (off today) adds exactly two read-only cache tools. Threads: mention discovery is search.messages, which never populates thread_ts (slack-transport.ts:20-23) — a reply with no @-mention is invisible before any later step runs. The push doorway (“knock”) that fixes this is specced, v2-reviewed, “cleared for build” — and zero code exists (no route, no handler, no flag in src; grep-verified).
  7. “I checked and couldn’t find any information in Salesforce.” He didn’t. He can’t. The trust bug, and the one beat that is a behavior defect rather than missing wiring: no Salesforce check is possible from that code path, and he claimed one anyway. This is the false-green class — the exact thing this whole system exists to never do.
    ↘ go deeper
    No Salesforce import exists in the Slack lane files (import blocks verified). The Telegram brain carries a grounding contract — HOW_LICENSE_BLOCK: “CAPABILITIES ARE FACTS: every item must trace to a capability entry” (brain.ts:679-687). The Slack compose prompt has no equivalent clause. Same root as beat 5: ungrounded narration when retrieval comes back empty.
The business finding underneath it all: Cement Creek has been live since April at $199/mo and has never been billed — no checkout email ever went out (verified today across Robert’s sent mail), and the Stripe link is missing on the account. Alie’s question was real money, and a chief of staff should have raised it before she had to ask. The answer she needed is in the chat handoff.
02

The diagnosis, in one sentence

Neo’s Slack mouth is a peephole bolted onto a body whose organs already exist — almost everything wished for today is already built and simply not wired to the mouth — plus two twin behavior bugs: he claimed more than he did, and he did less than he could.

The carry (your ruling, in chat, 2026-07-16): a chief of staff doesn’t just answer — he picks things up. Every open item Neo touches gets driven to the edge of what he’s allowed: do it if he may, stage it and offer if it needs a confirm, route it with context if it’s someone else’s, resurface it if it’s yours alone. Today’s anti-carry at its starkest: asked for a reminder, he told you to jot it down yourself. The carry and the grounding contract are twins — never claim more than you did, never do less than you could — and they check each other: every offer must sit within receipted reach, so carry can never rot into overclaim. It installs at P0 and deepens every phase; every fixture below gains a carry assertion — the reply must END at a pickup, never a bare miss.
have it
The organs
Salesforce reader · Stripe reader · work-queue engine · reminder machinery · identity joiner · honest capability registry · investigation capability (built, sitting dark) — all real, all live for other surfaces.
thin today
The Slack mouth
Reads two in-memory stores through a zero-tool composer on a 15-minute heartbeat, blind to threads, joined to nobody. Every organ above is unreachable from here.
the build
The twin contracts
Grounding: the Telegram brain has it (“capabilities are facts”); the Slack mouth never got it — how “I checked Salesforce” happened. Carry: nowhere yet — how “jot it down” happened. Both install at Phase 0, and it goes first.

Contrast in the same channel: Arby (DE Brain’s bot) answered the same class of question beautifully — full account pull, evidence cited, honest caveats. The company-data layer works. Neo just isn’t connected to it — which sets up your Call 3.

03

The road — six phases, each with a visible outcome

The existing handoff chain (diary bound, knock, stranded claims) is preserved, not replaced — it IS Phase 1. Phase 0 is new and goes in front because it’s small and it kills the dishonesty class.

P0
The twin contracts: never overclaim, always carry
Port the grounding contract to the Slack mouth (“what can you do” derives from the registry; un-run checks can’t be claimed) and install the carry beside it: every reply ends at a pickup — the staged next step or an in-reach offer; bare misses fail. The Alie exchange and the jot-it-down reminder both become regression fixtures. Outcome: he never again lies about what he did — and never hands work back without carrying it as far as he’s allowed.
P1
Heart and ears (in flight — finish the chain)
Diary bound: fix, re-verdict, merge, flip. Knock: build the specced push doorway, security pair-verdict, dark deploy, your flip. Stranded-claim recovery — itself a carry mechanic: a late answer beats one that never comes. Outcome: answers in seconds, inside threads, never permanently silent.
P2
Reach — wire the organs to the mouth
Join Slack-Robert to real-Robert; work-queue lookup; make paying clients visible (how = your Call 3); implement payment-status for real; grow and flip the composer’s tool rung. Sequenced after P1’s diary bound (memory). Outcome: Alie’s question gets an Arby-grade answer from Neo.
P3
Instinct — investigate before answering
Calibration-walk and flip the already-built investigation capability; install the never-dead-end contract — every answer is (a) the answer with evidence, (b) the trail so far + one crisp ask, or (c) a routed handoff with context. “Check with him directly” is a banned ending. Outcome: the checkout-link question gets a three-minute evidence trail, not a shrug.
P4
Hands — do, don’t just say
Slack obligation capture (gated on your Call 1 rulings), then acts by class behind confirm gates: reminders fire; drafts handed for human send; payment links if you allow them (Call 2). The carry gets its bank here: every open item Neo sights lands in one ledger with an owner, and his idle cycles work it — do what’s allowed, stage what’s gated, resurface what’s human. Outcome: “remind me” works; “generate the checkout link” produces a link or a filled draft awaiting a tap — never a refusal to try.
P5
The proactive chief of staff
Signals flywheel (specced); your already-ratified BIG ASK (proactively deliver team-allowed answers; when asked, DO the thing); re-open the Alie window pilot as a named queue item. Outcome: Neo raises “Cement Creek is live and unbilled” before anyone asks. Today’s incident is literally this phase’s fixture.
04

Your calls — RULED 2026-07-16

Ruled via your mark on this surface plus “otherwise agreed with recs” in chat. Recorded here; the build runs on these.

1
The three team-hands rulings — RULED, with one amendment.
Your mark: “He needs to be able to write to sf — complete and trustworthy.” So: Which acts — reminders yes; email/Slack drafts yes (a human sends); payment links confirm-gated; Salesforce writes IN, bar = complete and trustworthy — the full write surface Neo needs, every write receipted, undoable where the object allows, confirm-gated per class; graduates the existing shadow machinery and takes its own spec before build. Who confirms — the asker for their own personal acts; you or Alie for anything money- or client-facing. Where receipts post — in-thread plus a #neo-receipts audit channel.
3
One brain or two — RULED (c).
Neo consults DE Brain live for company truth and stays native for your personal world. Your audience-table rulings already authorize team visibility for Salesforce/Stripe.
2
Payment links — RULED YES,
confirm-gated by you or Alie, receipt in thread.
4
At knock-flip time (end of P1).
You name SLACK_SIGNING_SECRET and EVE_SLACK_EVENTS_PUSH, and paste the Request URL into the Slack app dashboard. The exact click-path arrives with the flip — nothing to decide now, just flagging the moment.
05

What could go wrong

Memory deaths at bigger scale
Widening Salesforce ingestion before the diary bound lands re-creates today’s outage, larger. Hard-sequenced: P2 waits for P1’s diary bound. No exceptions.
Investigation makes answers slower
Working before speaking costs seconds-to-minutes. The queued cycle stopwatch is the honest-stopping backstop; the calibration walk runs before the flip.
Hands without rulings
How a helpful bot becomes a liability. P4 stays gated on Call 1 — even for “just reminders.”
Team-facing register
Neo speaking to Alie and the team is team-facing words — trust-gated, draft-quality bars apply until his answers consistently clear them.
06

How we’ll know it worked

The seven bot-test failures become seven standing fixtures — today defined the bar, so nobody invents a new one later. Each phase names which fixtures it flips: P0 kills the overclaim AND the anti-carry (beats 7 and 3’s ending); P1 flips threads, latency, and silent death (beats 2, 6-thread); P2 flips the work queue and the Cement Creek answer (beats 1, 4, 6); P3 flips the dead-end (beat 6); P4 flips the reminder (beat 3); P5 adds the proactive fixture — the unbilled-client signal raised unprompted. Every fixture carries a second assertion: the reply ends at a pickup — a staged next step or an in-reach offer — never a bare miss. Done = all seven pass live in #bot-test, asked by Alie, not by us.