03 · How
Not a chatbot. A stateful system.
Morra combines durable memory, deterministic workflow, model judgment, and human control—then turns every result into the context for what happens next. Rules carry the campaign. Models help with language and ambiguity. You keep authority.
One loop. Every result re-enters at the top.
Six responsibilities
The architecture is a sequence of responsibilities, not a cloud of logos.
-
Signals become structured events
Goals, contacts, outreach, replies, meetings, referrals, notes, and outcomes enter the system as durable events—not as a conversation that evaporates.
In Morra todaySent mail, replies, and bounces are observed through the Gmail API. LinkedIn events are recorded by you—a click that says "I sent this" is itself the event. Each lands in a ledger under an idempotency key—the guard that keeps a fact seen twice from becoming an action taken twice.
-
Durable state preserves the campaign
Morra knows what has happened, what is pending, what is unknown, and what must not happen twice. The campaign survives the conversation.
In Morra todayA Google Sheets CRM row per contact, a sidecar tab for per-channel state, and SQLite ledgers for actions, scheduled tasks, moves, receipts, and campaigns. Timers are dates in state, not threads in memory.
Morra runs its cycle while you have it open—on a five-minute admission gate, or on demand with Sync. A week away loses nothing: it catches up the moment you return.
-
Rules handle what can be known
Timing, eligibility, transitions, deduplication, and other determinate logic are not improvised by a model on every run.
In Morra todayBusiness-day clocks; the 3B backup branch and the 7B return; reply gates that stand a branch down when there is evidence of an answer; bounce handling that separates a dead address from a person's interest; a closed registry of scheduled-task types; invariants every CRM write must pass. The method's rules live in the engine, not in the mood of the model.
-
Inference handles what requires judgment
Models interpret ambiguous context, choose among plausible readings, or draft language where nuance matters.
In Morra todayClassifying a reply—scheduling, nurture, not interested, met, out of office, or honestly unknown. Drafting the six-point email from verified context. Summarizing. Every call goes through one tiered client, and the campaign's controlling state is written only through validated, deterministic paths: models help Morra read and write; they do not get to reinvent the campaign.
-
The human remains in control
The review, decision, and send boundary is real, and it is where consequence lives.
In Morra todayOutreach is created as a draft in your Gmail; there is no code path that sends it—you press send. LinkedIn is copy-paste. Ambiguity—a reply Morra cannot attribute, a meeting it cannot confirm—becomes a decision on Command, not a guess. Strategy changes are proposals you ratify in Playbook Review.
The one thing Morra can send on its own is an optional status digest—to you, never to a contact.
-
Outcomes close the loop
The result is recorded, state changes, and the next decision begins with more context than the last one.
In Morra todayA reply stands the backup branch down. A bounce retracts the phantom send and returns the address to work. A meeting starts the Harvest follow-through. Your snooze, dismissal, or confirmation is itself an event. The result changes the next move. Broader calibration from longitudinal outcomes belongs to the north star below.
The core principle
Push inference as far back in the chain as possible. Use simple, reliable machinery wherever the answer can be known; reserve model judgment for the uncertainty that actually requires it.
This is an architecture choice that shows up as product behavior: less drift, less duplicated action, more predictable timing, and expensive intelligence spent only where it earns its keep. Rules own the campaign. Models help where language and judgment are required.
Solid = rules and records · dashed = model · gold = human
One clean loop. The representative path is a 2-Hour Job Search campaign.
The current architecture: one feedback loop, not a stack poster.
- State
Campaign goal and contact field
Objective, target companies, people, stages, channel state.
- Events
Observed events and due timers
Gmail: sent, replied, bounced. You: LinkedIn sent, met, referred. The clock: business days elapsed.
- Rules
Deterministic 2HJS engine
States, timers, 3B / 7B branching, reply and bounce gates, idempotency.
- Model-assisted
Prepared action or grounded draft
A six-point email drafted from verified context; a reply classified—validated before it counts.
- Human
Decision and send
Command shows the few things that matter. You send from Gmail, confirm, snooze, or stop.
- Outcome
Reply · bounce · meeting · referral · silence
Recorded as an event, which changes state, which changes what is due.
Google Sheets CRM row per contact · SQLite ledgers and stores · a sidecar for per-channel state
Reply classification · fact-grounded six-point drafting · summarization · one tiered model client
A web console: Command, the action queue and schedule, Campaigns, Discovery, Playbook Review, Ask Morra
Gmail API · human-recorded LinkedIn evidence · an opportunity feed where configured
The proof, from the inside
A reply arrives while two actions are pending.
The same moment the WHAT page showed on the board—now from the machinery's side. This is why state matters more than a database icon: the event changes the state, the state changes what is due, and you get one decision instead of three.
Events · observed
State · timers
Command · you
Rules
- State, timing, branching
- Reply and bounce gates
- Eligibility and deduplication
- What is due, and what must not happen twice
Models
- Classify the reply—or say unknown
- Draft the six-point email from verified context
- Summarize and synthesize
- Never write the controlling state
Human
- Judge the person and the message
- Press send; record LinkedIn yourself
- Resolve the ambiguous cases
- Ratify or decline strategy changes
Dashed lines are direction, not delivery. Nothing in this section is a live feature.
Why the state engine cannot simply grow forever—and what grows instead.
2HJS works because the method is narrow: objective, timing, stages, and stopping rules are largely specified in advance. Long-term professional relationships are not like that. History is incomplete; goals change; politeness can resemble enthusiasm; silence is ambiguous; the correct move is often to wait. So the future architecture separates what is known from what is inferred, and makes unknown a state the system can act on carefully.
- Factual · replayable
Evidence ledger append-only, with provenance
Messages, meetings, referrals, promises, user decisions, observed outcomes, and where each came from. The original artifact stays available: a transcript is evidence, not controlling truth.
- Deterministic · sparse-safe
Protocol projection what can be derived with high confidence
Who owes what, who is waiting on whom, due dates and cooldowns, channel constraints, open commitments. Morra can know you owe a promised deck even when it does not know the contact's long-term priorities.
- Probabilistic · incomplete
Relationship model evidence, not verdicts
Affinity, tie strength, disposition, shared goals, mutual-value potential, trajectory, receptivity—and the asymmetry of how each side sees the relationship. Every field carries its epistemic status:
CONFIRMEDOBSERVEDINFERREDCONFLICTEDSTALEUNKNOWNNOT APPLICABLE - Hybrid · temporary
Action policy a proportionate next move, reason-coded
Combines protocol state, relationship evidence, triggers, uncertainty, and risk. The recommendation is ephemeral: it is not relationship truth, and it does not authorize a send.
- Human · real world
Review and outcome then back to the ledger
You keep authority over consequential and high-social-cost action. The outcome and your decision are recorded, and—transparently—calibrate the next recommendation.
Unknown is not false, zero, or permission.
When knowledge is weak, Morra should reduce the burden, intimacy, certainty, and irreversibility of what it proposes—and say what it does not know.
This is the humane center of the future architecture.
Ranking is three different problems.
Not one mysterious number.
- Portfolio rank
Is this relationship worth scarce attention over time?
- Touch readiness
Is there an authentic, appropriate reason to act now?
- Action policy
What is the socially correct move—including none?
A valuable relationship may not be ready for a message. A secondary relationship may have a real opening today. Morra separates importance from readiness—and readiness from the move itself. Obligations outrank speculative touches: an overdue promise should never lose to a high score.
The pipeline, inference last
- 1Ingest without interpretation
- 2Normalize mechanically: dedupe, threads, identities, dates
- 3Derive observable behavior: latency, follow-through, commitments
- 4Extract high-precision facts: dates, requests, promises, referrals
- 5Retrieve relevant history—structured first, semantic last
- 6 · modelRoute a bounded question with evidence candidates and a required schema
- 7Validate and gate: evidence IDs, conflicts, high-impact → review
- 8Project structured state from validated evidence only
- 9Generate a reason-coded, temporary action candidate
The model is a constrained adjudicator and synthesizer—not the parser, the database, or the owner of state. That is the destination; today's model calls already sit late in the chain, and the full contract is the work ahead.
- Who
- Jane
- Why now
- Her advice produced a result this week
- Move
- Send a brief update and thank her
- Do not
- Ask for another favor yet
- Uncertainty
- Her current priorities are unknown—not needed for this move
- Then
- Wait for her response; reconsider later if none
Jane is illustrative.
Behind the simple card, the system keeps the reasoning.
- Supporting evidence
- Blocking evidence
- Missing information, and its impact
- Not-before and expiry dates
- Confidence and risk flags
- Prohibited moves
- The fallback action
- The next observation to wait for
The first field with this discipline is live: every email address Morra holds carries how it came to be known—human_attested, observed_reply, model_supplied, or legacy_unknown—and a bare address with no provenance is refused rather than trusted. Unknown is already first-class for one field. The north star makes it the rule.
Execute a deterministic method.
Next target, stage, timer, branch, stopping rule.
Steward known relationships.
Who, why now, the move, the restraint, the next observation.
Find gaps; convert a goal into a coalition.
Search missions and candidates with rationales; role map, target graph, activation order—on the same evidence, never a second contact truth.
The close
The product gets smarter without forgetting who it serves.
See clearly. Move decisively. Keep the judgment human. The machinery above exists so that the person using it can be aggressive about the opportunity and careful with the relationship—at the same time.
- 50+durable table structures defined in the local store
- 17modules in the background-processing layer: mail, bounces, branches, harvest, capture, digest, scout, and more
- 6,900+tests in the suite gate that every change must pass
- 0code paths that send outreach to a contact. You press send.
Measured on the repository on 2026-08-19 · counts, not a quality score