Misraj AI — GTM Ecosystem Report

Autonomous go-to-market engine for the full Misraj AI product portfolio (9 sellable products) · GCC enterprise · three GTM motions
Status: Operational · 2026-07-10

The system that started as "Baseer GTM" is now the go-to-market engine for the whole Misraj AI product portfolio. A 24/7 multi-agent pipeline finds the right GCC enterprise accounts, scores each one against all nine sellable products (not just Baseer), drafts personalized outreach in the product's own voice, runs dedicated partnerships/BD and expansion (upsell/cross-sell) motions alongside cold sales, and routes every outbound action through a human approval gate — while a dashboard gives the operator full visibility and control, including an editable per-product ICP config that now actually steers the agents.

9
sellable products in the catalog
3
GTM motions live — cold sales · BD/partnerships · expansion
059
migrations head (up from 055)
0
un-approved sends possible

Milestone update · 2026-07-10 (late) — Expansion ships, the ICP Map goes live and actually steers the agents, and email routing splits by product

Same day, later wave. The multi-product ecosystem (P1–P7, documented below) finished with P6 closing; on top of that foundation this wave shipped the third GTM motion (Expansion), an editable ICP Map that operators can use to steer sourcing/signals/enrollment without a code change, a round of multi-product dashboard polish, and per-product outbound email domains. Nothing here is exploratory — the Expansion agent and the ICP Map are both live, human-reviewed surfaces with no autonomous outbound action.

Expansion (upsell/cross-sell) — the third motion Done, task #48/#50

  • A crm.lead-only Odoo reader pulls closed-won deals and reconciles them into accounts (migration 058 widens relationship_role to prospect|customer|partner|both and adds customer_deals/account_products/expansion_opportunities).
  • The expansion_opportunity agent reasons over cross-sell adjacency against the other 8 products — read-only, capped at 3 candidates per run, with government-adjacent accounts forced onto a manual track twice over (prompt and projection).
  • A weekly weeklyExpansionScan job + the new /expansion dashboard (board + drawer) surface it to the operator. Output is recommendations only — no autonomous send anywhere in this surface.
  • This closes what the prior milestone below still listed as "Planned, not built" — existing relationships like MNGHA, KAEC, Sukuk Capital, Deloitte, and Libya Diwan can now be worked as expansion once an operator makes the un-park call.

ICP Map — an editable, agent-steering control surface Done, tasks #51 + #81

  • The new /icp dashboard page lets an operator edit each sellable product's personas, wedge line, priority rank, status, signal queries, and booking URL — reusing the existing products catalog and account_product_fits, no new tables.
  • Critically, those edits now reach the running agents. Before this wave's follow-up fix, dailyAccountSourcing's fit matrix and dailySignalsScan's per-product rotation read the compile-time product catalog, not the DB row an operator had just edited — so an ICP Map change was invisible to the pipeline. Sourcing, signals, and enrollment (including the Worker's backstop) now all read the DB, with a same-payload fallback to the compile-time catalog only when the DB has zero sellable rows.
  • The daily contact-enrollment draft also now prefers the product's DB-configured booking URL, so an ICP Map edit to the booking link is live end to end, not just on the page itself.

Dashboard/UI polish + Market Analysis filter Done, tasks #60–#63, #79

  • Product filters and fit badges now surface on the Journey Board, Accounts, Contacts, and Signals pages (#60); Market Analysis gained a company-level Misraj vs. the competitor landscape section (#61) plus a per-product filter that scopes the competitor watch and signal feed while keeping the company-wide view always visible (#79, migration 059 tags market_intel_signals by product).
  • The Signals Hub is now paginated (12/page) with a dedicated Archived tab (#62, migration 057), and a daily Signal Archivist job auto-archives stale/cold signals so the feed stays current without manual cleanup (#63).

Copy audit + per-product email routing Done, tasks #80, #84

  • A system-wide copy pass rebranded 81 strings from Baseer-only framing to the Misraj ecosystem, and renamed the visible "Baseer fit" label to "Misraj fit" — the label operators actually see on every account card.
  • Non-Baseer products (Kawn, Seamless Enterprise, Workforces, and the rest) now send sales email from misrajtech.com through a second, dedicated Resend account, with the signature booking link pointed at misrajtech.com/book. Baseer is unchanged — trybaseerocr.com, its own Resend account, trybaseerocr.com/book. The sender resolver fails closed (never silently falls back to the wrong account) if a domain's key is missing.
  • Since misrajtech.com's inbound mail isn't live yet, its sends carry an interim Reply-To the verified trybaseerocr.com inbox so replies are never lost.
Known follow-ups from this wave (not done): the misrajtech.com inbound MX record is still pending (the Reply-To workaround above covers the gap); three older task-creation call sites in agent-runner.ts don't yet stamp a productSlug and default to Baseer; the E2E agent-testing harness (task #64) is designed (PLAN-e2e-agent-testing.md) but not built. None of these block anything shipped this wave.

Milestone update · 2026-07-09 to 07-10 — Misraj becomes a multi-product GTM system

This wave is the largest reframe since launch. The pipeline was built and hardened Baseer-only; it is now deliberately generalized so the same execution spine can sell any of Misraj's nine products to the right buyer, runs a second motion (partnerships/BD) end to end, and has a fully designed (not yet built) third motion (expansion into existing customers). Contact supply — the thing that had been silently starved for weeks — was also root-caused and fixed this wave.

The multi-product ecosystem (P1–P7) Done

  • A products catalog (9 sellable products — بصير/Baseer, Seamless Enterprise, كَون/Kawn, Workforces, Nova-star, 0plus, Compliance RAG, custom app development, Ark) and a new account_product_fits table replace the old single-product assumption; a DB trigger keeps the existing accounts.icp_score reconciled to max(fit_score), so nothing that already read icp_score had to change.
  • Proven in prod: account_product_fits holds 288 rows across all 9 products (up from 264 all-baseer). Elm, NHC, and Tawuniya each carry a live 9-product fit matrix with business-specific rationales (e.g. Tawuniya → Compliance RAG scored 62 for SAMA regulation; Elm → Nova-star scored 70).
  • Sourcing, contact targeting, the copywriter, the orchestrator's review checks, and funnel reporting are all now product-aware end to end: a candidate account is scored against the whole catalog, its contacts are targeted with that product's own personas, its outreach draft leads with that product's own wedge (not a generic Baseer pitch), and the funnel can be read broken out by product.
  • The last open phase — per-product signals/market-intel query rotation (P6) — closed this wave (commits 5842c5e/583eff2): the daily signals scan now rotates its Twitter/news/ LinkedIn queries across the sellable catalog instead of scanning only Baseer/OCR terms every day, and every surfaced signal is tagged with the product it was found under.
  • Result: all seven phases of the multi-product plan (P1–P7) are now done and deployed.

Partnerships / BD — a second GTM motion Done, task #47

  • A new BD/Partnerships agent sources exploratory partnership opportunities across all 10 partner types (reseller, technology, systems-integrator, and more) — deliberately exploratory-only, with no pricing or commercial terms drafted by the AI.
  • Accounts can now be tagged customer, partner, or both; a weekly sourcing job runs every Sunday 07:15 Riyadh; a new Partnerships tab on the dashboard gives the operator a read/curate board.
  • Fully human-gated — there is no send or draft action anywhere in this surface; a government-program partner candidate stays on a manual track even after approval (no contacts enrolled, channel forced to manual).

Expansion — the third motion Done — see the 2026-07-10 (late) update above

  • This card is kept as the historical record from the 2026-07-09/10 milestone below, written while Expansion was still planned. It has since shipped in full — see "Expansion (upsell/cross-sell) — the third motion" in the milestone update above this one for the built version.
  • The point of this motion remains: accounts like MNGHA, KAEC, Sukuk Capital, Deloitte, and Libya Diwan are existing relationships, not cold prospects, and should be approached as expansion now that it's live. MNGHA specifically is a 3-product customer already, but was auto-parked with the government-account exclusion — it still needs an explicit un-park + "existing customer" tag, pending an owner decision (the engine shipping doesn't auto-resolve this operator call).

Proposal generator + Vault versioning Done

  • The deck generator now spans the full ecosystem with fit-driven product selection — a capped 3–6 product cards per deck instead of always rendering the whole catalog — plus an optional commercial slide and a mandatory "client need" slide.
  • Fixed a single-language bug where an Arabic deck's RTL styling was contaminated by English-only override CSS.
  • A new owner-only force-redeliver route regenerates and re-pushes a corrected deck to its existing Vault link without touching Odoo/email/LinkedIn.
  • The separate Vault app (report-platform, a different repo, not touched by this wave) now versions every deck edit at the same URL — verified live on the Aramco deck (a re-upload created version 2 at the same link).

Contact-supply recovery Done, root-caused

  • Root cause found: the runner was calling Apollo's now-deprecated search endpoints (HTTP 422), silently starving every account-based contact-discovery of Apollo data since launch — the entire prior contact base had been migration imports, not pipeline-sourced. Fixed to call Apollo's current REST API directly.
  • Unblocked the orchestrator review queue (a signals-table upsert bug and an over-tight relay timeout were head-blocking every discovery/signal/market-intel output behind one stuck item); added an LLM-relay priority queue so contact-supply work jumps a backlogged relay instead of waiting in line.
  • Made the email-first pivot mandatory (not advisory) when a LinkedIn-dormant executive fails the activity gate, and loosened the reveal-corroboration gate so a verified corporate-domain email counts as sufficient on its own — raising yield from the newly-fixed Apollo path.

misrajtech.com + infra/UX Done

  • misrajtech.com now redirects to misraj.sa, with its own neutral /book Cal.com link for every non-Baseer product conversation (Baseer keeps trybaseerocr.com/book).
  • Outreach emails now render as real HTML with hyperlinked calls to action; the Approvals dashboard preview is WYSIWYG (the exact rendered body + real sender signature); Approvals and Journey pages now cross-link.
  • The LinkedIn booking link is now gated to post-engagement only (a reply, a positive signal) — never offered on a first-touch or bare-acceptance message.

Current status — what's done vs. pending

ItemStatus
P1 — Products catalog + fit foundationDone · migrations 052–054
P2 — Per-product fit scoring & sourcingDone · proven in prod · 288 fit rows / 9 products (migration 055)
P3 — Per-product contact targetingDone + deployed
P4 — Copywriter & orchestrator product rulesDone + deployed
P5 — Proposals & solution-area alignmentDone · shipped early via the Aramco deck overhaul
P6 — Signals/market-intel per-product alignmentDone · closed 2026-07-10
P7 — Funnel-by-product reportingDone + deployed
BD / Partnerships agent + dashboard (task #47)Done
Expansion motion (task #48/#50)Done + deployed · shipped 2026-07-10 (late), migration 058 — see the milestone update above
ICP Map page (task #51) + agent-steering (task #81)Done + deployed · shipped 2026-07-10 (late) — see the milestone update above
Multi-product UI polish (#60–#63), Market Analysis filter (#79), copy audit (#80), per-product email routing (#84)Done + deployed · shipped 2026-07-10 (late), migrations 057/059 — see the milestone update above
Phase-3 agentic upscalePlanning only · no implementation, sequenced after the ecosystem
MISRAJ OS blueprintPlanning only · no implementation, sequenced after Phase-3
Phase-3 horizon (planning only, nothing built). Two forward-looking plans now exist alongside the shipped work: an agentic upscale (Agent Theater, Ecosystem Galaxy, Account Brain, critic passes, a Roundtable-style @mention console) and a MISRAJ OS blueprint — generalizing this GTM system into a whole-company operational OS (a Company Graph, a permissions layer, SOPs as first-class nodes, humans and agents as peers). Both are explicitly sequenced to start only after the multi-product ecosystem is done, and both plans themselves flag the LLM relay's ~1 request/minute throughput ceiling as the hard constraint on how far either vision can scale before more inference capacity is added.

Data & scale (as documented)

  • ~260 accounts / 225 contacts loaded (V2 migration + old-prospect files), plus new net-new rows landing daily since the sourcing→contacts projection was fixed; 23 government accounts parked (excluded from automated discovery — Apollo has near-zero Saudi-gov coverage).
  • 288 account×product fit rows across all 9 products; 87 PR contacts (32 individuals + 55 outlets); 7 competitors tracked.
  • Schema at migration 059 as of the 2026-07-10 (late) wave (up from 055); ~1,458+ automated tests passing as of the last documented full run (2026-07-08) — an exact current count was not re-verified in this or the following docs-only pass.

What's next

  • Owner decision on un-parking MNGHA (and similar existing relationships) as "existing customer" — the Expansion engine (task #48/#50) is now live, but this specific tagging call is still pending.
  • Bring the misrajtech.com inbound MX record online to retire the interim Reply-To workaround; stamp productSlug on the three older agent-runner.ts task-creation sites that still default to Baseer; build the E2E agent-testing harness (task #64).
  • Watch the P4 product-match copy checks and the P6 signal-rotation change through their first live week before treating either as fully steady-state.

Milestone update · 2026-07-08 — the social channel gets a voice, a reply, and a freshness rule

Today's wave sharpened the demand-and-brand side. The content voices were corrected and made distinct across three accounts, Norah's X account went from draft-only to real, gated auto-posting, the operator can now reply as Norah directly on a live signal, the Signals Hub was fixed to pull from all three sources at once (news had been coming back empty), and a system-wide recency rule now stops the machine from ever studying or engaging stale content. Everything new is fail-closed and approval-gated, exactly like the sales spine.

Three distinct content voices Corrected

  • The content planner now writes in three clearly separate voices: Sara (bilingual Misraj founder), Rawan (Arabic business-development / digital-transformation), and Norah — corrected today to an independent Saudi AI enthusiast, not a Misraj voice.
  • Norah's content was regenerated as broad AI interest — trends, tools, papers, and ideas she finds genuinely useful — with no product pitching and no Misraj/Baseer affiliation. This keeps her account authentic rather than a disguised brand channel.

Norah X auto-post Live · fail-closed

  • Norah's approved, scheduled posts now publish to X automatically through twitterapi.io — no second browser, no manual copy-paste.
  • Gated in order: off unless TWITTER_AUTOPOST_ENABLED is exactly on, a 5 posts/day cap, optional business-hours-only window, operator-approved items only, kill-switch/global-pause respected, and idempotent (never double-posts). Drafts never auto-post.

Signals: "reply as Norah" Live · approval-gated

  • On any Twitter signal, the operator can now draft a reply in Norah's voice, edit it, and — after an explicit approval — have it posted as a real reply to that tweet.
  • The send clears the same execution gate as every other outbound action (content safety, exact-approval match, reply-target guard, kill-switch, idempotency) and is off unless TWITTER_REPLY_ENABLED is on. Recorded in a dedicated table (migration 047).

Signals Hub: multi-source + recency Fixed

  • The scan now pulls Twitter, news, and LinkedIn together — a bug that returned zero news was fixed by parsing the news RSS feeds server-side, so all three streams flow into one board.
  • A new rolling recency rule (migration 048, default 7 days) drops stale content at every layer — scan, projection, and the surface — so the system only ever studies, replies to, or retweets recent content, never a months-old post it just happened to discover today.

Quality & data model

  • ~1,458 automated tests passing (up from ~1,400), covering the Twitter auto-post and reply-as-Norah paths, the multi-source scan, and the recency gate.
  • Database schema is now at migration 048 — the twitter-reply drafts table (047) and the signal recency column (048), both additive and fail-closed.

What's next

  • Flip on Norah's auto-post and reply flags once the first approved items are queued, and watch the first live posts and replies land cleanly.
  • Tune the 7-day recency window per source if a channel proves faster- or slower-moving than the default.

Milestone update · 2026-07-07 — the pipeline actually produces contacts, and the content channel goes live

Yesterday the outbound channels went live; today the machine that feeds them was rebuilt. Approved AI outputs now become real database rows (they never did before), stalled contact-discovery loops were fixed, a top cohort of executives was moved onto an email-first track, the message-drafting funnel was un-jammed and re-voiced, and LinkedIn content auto-publishing went live under a strict safety envelope. We also had a serious production incident — a test wiped the live database — which we detected, fully recovered, and permanently prevented. Full detail below.

Contact-supply backbone Rebuilt

  • The core gap is closed: an approved sourced account or a discovered contact now lands as a real net-new row (the sourcing → accounts → contacts projection). Before today, approved AI outputs were reviewed and then evaporated — nothing became a contact the outreach engine could act on.
  • Contact-discovery is now scheduled daily and its runaway loops are fixed — tasks that used to churn to an 18-minute timeout now converge, with a per-task-type tool-round budget and a valid "found none" result.
  • A broken linkedin_profile_activity tool (was passing the wrong identifier) was fixed, so the LinkedIn activity gate that disqualifies dormant profiles works again.

Email-first for 17 top executives Live

  • An email-first exec gate now routes LinkedIn-inactive GCC decision-makers to email instead of a dead LinkedIn invite. A deterministic Apollo reveal-and-enroll pass ran on the stuck cohort.
  • 11 of 17 executives had a verified email revealed via Apollo and were enrolled on the email channel (e.g. geidea, Bank Albilad, Etihad, Jeel, ALDAR).
  • 6 had no Apollo email and were returned to the LinkedIn track — including a Deputy Minister who is now flagged for a manual, human-owned approach rather than automation.

Message-draft funnel Repaired & re-voiced

  • Outreach drafts were silently quarantining on a partial output shape — fixed, so a valid draft now reaches review. The orchestrator review path that 500-errored on a re-drafted touch is now an idempotent supersede.
  • 9 outreach drafts were regenerated in the new voice and are flowing to the approval queue.
  • New copywriter rule: no targeting-rationale openers ("given your role/segment…"), and a brief, recipient-first Misraj intro so a cold contact knows who is reaching out — context that earns the pitch, not a sender-centric headline.

Edit-before-approve + a real learning loop Live

  • The operator can now edit an AI draft before approving it directly on the approval dashboard, instead of only approve/reject.
  • Every edit is captured as a structured learning signal (original AI text vs. the operator's final text) in a new draft_edit_feedback table — the single highest-leverage input for teaching the copywriter what "good" looks like. This closes a gap the 2026-07-04 audit flagged: the learning loop had no outcome linkage.
Sourcing now biases to private-sector GCC enterprises. Apollo has near-zero coverage of Saudi government ministries and authorities, so pure government bodies are now excluded from the automated pipeline (they were producing unreachable, un-enrichable dead ends) and are handled manually where they matter. Commercial, state-owned companies stay in scope — this sharpens the machine on the accounts it can actually reach and convert.

LinkedIn content auto-publish Live · safety-envelope

  • Sara's and Rawan's approved, scheduled LinkedIn posts now publish to their real personal feeds automatically. LinkedIn has no posting API, so this drives the logged-in browser session through the existing MCP (a small additive create_post tool installed on both seats) — no second browser, no re-login.
  • Fail-closed by design: off unless explicitly enabled, and every publish must clear a stack of gates — 1 post/day/account, business hours only (Sun–Thu, 09:00–17:00 Riyadh), operator-approved items only, kill-switch/global-pause respected, idempotent (never double-posts). Drafts are never auto-posted.

Personal-account voice + weekly performance review Live

  • The content planner was re-grounded on each person's real voice (read live from their accounts). Sara's and Rawan's posts broadened from Baseer-only to the whole Misraj ecosystem (Arabic-AI thought leadership, not a product ad); Norah's X account is treated as an independent Saudi AI enthusiast — broad AI-interest content, not affiliated with the company (operator correction 2026-07-08).
  • A Thursday weekly content-performance review now captures per-post engagement. Twitter/X metrics are read for real; LinkedIn per-post metrics are stored honestly as unavailable via the LinkedIn MCP (it exposes no per-post read) rather than fabricated.
Incident — detected, recovered, and permanently prevented. On 2026-07-07 a test run was accidentally pointed at the production database and executed drop schema public cascade, wiping the live data. It was caught immediately and fully recovered via Neon point-in-time restore; a post-restore verification confirmed the data intact (225 contacts, 260 accounts). A permanent, fail-closed test-safety guard now blocks any test from ever touching production — tests refuse to run against a production connection and CI runs with no database URL at all (commit 0a9dcb4). We report this plainly because it is exactly the class of risk decision-makers should see how we handle: it was contained, reversed with zero lasting loss, and closed off so it cannot recur.

Quality & data model

  • ~1,400 automated tests passing (up from ~1,202 yesterday), covering the new projection, enrollment, approval-with-edits, and auto-publish paths.
  • Database schema is now at migration 046 — adding draft-edit learning capture (045) and per-post content metrics (046) on top of the approval↔AI-draft linkage (042).

What's next

  • Watch the first live auto-published LinkedIn posts land cleanly, then loosen the 1/day cap only after several clean posts with no account warning.
  • Feed the captured draft-edits back into the copywriter so the learning loop starts improving drafts, not just recording them.
  • Work the email-first exec cohort's first approved sends, and progress the manual Deputy-Minister track.

Milestone update · 2026-07-06 — the biggest go-live day yet

In the last 48 hours the two channels that actually generate pipeline — outbound LinkedIn and inbound CRM leads — both went live in production, the approval funnel that connects a drafted message to an actual send was found broken end-to-end and repaired the same day, and the whole system passed a five-flow safety audit. Here is exactly what changed and what is still open.

LinkedIn outreach Live

  • Connection requests now send from Sara's and Rawan's own LinkedIn seats, capped at 20 invites/day and 100/week per seat, with ban-safety pacing (3–8 minute randomized gaps between invites, max 8 per batch).
  • The kill-switch blocking all LinkedIn sends was deliberately turned off today, with an audited database record of the change and who made it.
  • First live invites are scheduled from 09:00 Riyadh time today, 2026-07-06.

Inbound CRM pipeline Live

  • New CRM leads in Odoo are now automatically researched by an AI agent, turned into a branded proposal deck, and posted back to the CRM as an internal note for sales — no manual work.
  • First lead through the full pipeline: Saudi Aramco, with a live, ready-to-share proposal deck link generated automatically.
  • Nothing is emailed to the lead directly — the only external action is an internal CRM note visible to the sales team.

Approve-to-send funnel Repaired

  • Found and fixed today: approvals were not actually arming anything to send — a broken link between "you approved this" and "the system sends this" meant zero approved messages had ever gone out. That link is now rebuilt and verified end-to-end.
  • Every seat now sends from its own identity — sara@trybaseerocr.com and rawan@trybaseerocr.com — with a consistent bilingual sign-off, replacing a shared generic address.

Safety audit Passed

  • A full audit of every live flow — LinkedIn, email, inbound, PR, and the agent runtime itself — ran today, producing a 16-fix hardening wave shipped the same day (pacing bugs, stuck-task recovery, duplicate-send protection, and more).
  • 1,202 automated tests passing (up from roughly 1,072 a week ago), plus new process-supervision watchdogs that keep the agent runner, scheduler, and LinkedIn bridge alive and self-restarting.
Cost discipline. The Prospeo email-lookup subscription has been cancelled — a $59/mo Apollo plan with a hard daily reveal budget, plus the free LinkedIn and web-research tools already in the system, now covers contact enrichment. Provider order is Apollo first, LinkedIn read-only second, web search/scraping third — no paid lookup is spent until the cheaper options are exhausted.

What's next

1 · For the decision-maker: what we have built

We have built a complete, automated sales-and-marketing machine for the whole Misraj AI product portfolio — not a prototype, and not a single-product tool. It runs continuously on production infrastructure and covers the full GTM cycle across three distinct motions: cold direct sales (the original, hardened pipeline, described below), partnerships/BD (a second agent + dashboard tab, done), and expansion into existing customers (fully designed, not yet built).

The outbound sales engine (Phase 1)

  • Sourcing — discovers GCC large enterprises in document-heavy industries (banking, insurance, government, telecom, healthcare).
  • Qualification — a deep ICP rubric scores every account/contact and disqualifies SMEs, off-segment, and non-GCC targets automatically.
  • Journey — per-contact state machine: LinkedIn invite → acceptance → your-approved message → 3-business-day reminders → email hand-off.
  • Booking — Cal.com bookings close the loop and stop all outreach to that contact.

The demand & brand engine (Phase 2)

  • Signals Hub — Twitter/X, LinkedIn, GitHub, community and news signals in one actionable stream.
  • Market intelligence — 7 competitors under watch (ABBYY, Nanonets, Upstage…), research papers, tenders, news.
  • Content calendar — weekly planning + publish-on-approval for Sara & Rawan (LinkedIn) and Norah (X).
  • PR workspace — 20 seeded GCC press contacts, pitch drafting, approval, reply tracking.
The safety guarantee. No email, LinkedIn message, tweet, or PR pitch can ever leave the system without an exact, owner-approved match. LinkedIn connection requests auto-execute after safety checks; everything that carries a message waits for approval. A global kill-switch halts all outbound instantly, and volume caps protect the accounts and email domain.

Where things stand today

AreaStatusDetail
Production infrastructureLiveAPI (Cloudflare Workers), dashboard (Cloudflare Pages), database (Neon Postgres), agent runtime (this machine, 24/7)
Sales pipelineRunningApollo sourcing fixed at the REST layer; journey state machine, approvals, and execution rails all live
Qualified accounts~260 loadedReal GCC targets across Saudi/UAE/Qatar; 23 government accounts parked (private-sector bias); net-new rows now land daily via the sourcing→contacts projection
Multi-product fit scoringLive · proven in prod288 account×product fit rows across all 9 products (up from 264 all-Baseer); icp_score auto-reconciles to max(fit)
Marketing engineDeployedSignals (now rotating per-product), market analysis, content calendar, PR — all live
Partnerships / BD (task #47)LiveWeekly Sunday sourcing job + Partnerships dashboard tab; 10 partner types; fully human-gated, no auto-send
Expansion motion (task #48/#50)LiveOdoo won-deal sync → cross-sell reasoning → /expansion board; weekly scan job; recommendations only, no auto-send
ICP Map (task #51, steering task #81)LiveEditable per-product persona/wedge/signal-query/booking config at /icp; edits now actually reach sourcing/signals/enrollment, not just the page
Per-product email routing (task #84)LiveNon-Baseer products send from misrajtech.com via a second Resend account; Baseer unchanged on trybaseerocr.com
Quality~1,458+ testsSchema at migration 059 (up from 055); every change verified before deploy, tests are hard-blocked from ever touching production

2 · How the system works

Everything flows through one disciplined spine — the same pattern for every channel, which is what makes the system safe and auditable:

Scheduler
spawns daily work
Specialist agent
produces typed output
Orchestrator
reviews & routes
Your approval
exact-match gate
Execution
policy checks + send
Dashboard
tracks & logs

Every step writes to Neon; nothing is implied. Malformed or unsafe outputs are quarantined, not shipped.

The two runtimes

  • Hermes agent runtime — runs the LLM reasoning for every agent on the shared Hermes/OAuth configuration (no per-agent API keys). A 1-minute relay carries each agent's request to the model and back.
  • Cloudflare edge — the API worker (business logic, approvals, execution, a 5-minute maintenance cron) and the dashboard, both close to GCC users.

The data source of truth — Neon

  • 48 database migrations define accounts, contacts, journeys, approvals, execution queue, signals, competitors, content plans, PR, draft-edit learning capture, content-post metrics, twitter-reply drafts, signal recency, and audit tables.
  • Every agent output, review, approval, send, and state change is recorded — the dashboard is a live window onto Neon, never a guess.
  • Typed status constraints and idempotency keys make the pipeline crash-safe.

3 · The agents — who does what

Twenty specialized roles, each with its own instructions, allowed tools, and hard safety constraints. They never talk to each other directly — they collaborate through data and one referee (the Orchestrator). The two newest roles extend the system beyond Baseer-only cold sales: a dedicated BD/Partnerships agent, and a lead-research agent that drives inbound CRM leads into an auto-generated proposal.

Sales pipeline agents

AgentJobTools
Account SourcingDiscover GCC enterprise accounts that fit the ICPApollo · web search · ScrapeGraphAI
Contact DiscoveryFind reachable decision-makers at sourced accountsApollo · LinkedIn (active-only) · Prospeo
EnrichmentComplete + verify account/contact data with evidenceApollo · Prospeo · web research
Account IntelligenceDeep account research: digitization signals, tech stackApollo · ScrapeGraphAI (Arabic-aware)
ICP StrategistRefine targeting from performance dataAnalytics reads
Outreach CopywriterDraft personalized, evidence-grounded outreachContract-producer (no sends)
SDR SequencePlan multi-touch cadencesSequence planning
LinkedIn — SaraPropose LinkedIn actions from Sara's account (read-only)LinkedIn search + activity gate
LinkedIn — RawanPropose LinkedIn actions from Rawan's account (read-only)LinkedIn search + activity gate
Booking & PipelineHandle bookings, prep notes, pipeline healthCal.com reads
Safety & BookingEnforce booking-driven stop rulesContract-producer
Learning & QAWeekly performance review + learning loopAnalytics reads
GTM OrchestratorThe quality gate — reviews every output, decides approve / route / reject / spawn childrenEvidence + policy context

Demand & brand agents (Phase 2)

AgentJobTools
Social ListenerScan Twitter/X, community, GitHub for Baseer-relevant signalsTwitterAPI · news RSS · read tools
Twitter Engagement (Norah)Draft replies to relevant tweets (approval-gated, Arabic-aware)TwitterAPI read → draft only
Market IntelligenceMonitor competitors, research papers, tenders, newsNews RSS · arXiv · ScrapeGraphAI
Content PlannerWeekly content calendar for Sara/Rawan/NorahResearch + persona validators
PR OutreachDraft per-outlet press pitches from the GCC media listContract-producer (approval-gated)

Multi-product & partnerships agents (new this wave)

AgentJobTools
BD / PartnershipsSources exploratory partner opportunities across all 10 partner types (reseller, technology, systems-integrator, etc.) — no pricing or commercial termsApollo · web search · contract-producer (no sends)
Lead ResearchResearches inbound CRM (Odoo) leads and drives the auto-generated Vault proposal deckWeb research · ScrapeGraphAI · deck generator

Product-fit scoring isn't a separate agent role — the existing Account Sourcing agent now scores every candidate against the whole 9-product catalog in the same pass; a backfill-only product_fit_audit task type reuses that same prompt to re-score an already-sourced account.

4 · How the agents interact — with each other, Neon, and the dashboard

Agent ↔ Agent (via the Orchestrator)

Agents never call each other. A sourcing agent's approved accounts become child tasks the Orchestrator spawns for contact-discovery; approved contacts spawn enrichment; enriched contacts spawn outreach drafts. Depth is capped (≤3), duplicates are deduped, and only whitelisted task types can be spawned — so no runaway loops.

Sourcing Contact discovery Enrichment Outreach draft

Agent ↔ Neon

The runtime claims a queued task from Neon, gives the agent its data + tools, and records the typed output back to Neon — where it is schema-validated. A valid output moves the task to awaiting orchestrator review; an invalid one is quarantined. Heartbeats and a stale-task reaper keep the 24/7 loop crash-safe.

Agent ↔ Dashboard (you)

When an agent proposes something that sends — a message, reminder, tweet, or pitch — it becomes an approval item you see on the dashboard. You approve, reject, or request an edit. Only your approval, matched exactly to the drafted content, lets the execution layer send it. The dashboard also shows agent health, the task board, quarantine, relay status, and the full contact journey for every prospect.

The four prospecting sources

  • Apollo — primary structured account + people search.
  • Web search — open-web discovery of companies and Vision-2030/digitization signals.
  • LinkedIn MCP — GCC contacts, gated on genuine profile activity (dormant profiles disqualified).
  • ScrapeGraphAI — deep, Arabic-aware extraction of evidence from a candidate's own web presence.

Every finding, from any source, must clear the ICP rubric before it enters the pipeline.

5 · Safety & control

ControlWhat it guarantees
Exact-match approvalA send only fires if an approved record matches the drafted message, target, channel, and timing exactly.
Global kill-switchOne action halts all outbound instantly; resuming is owner-only.
Volume caps + warm-upLinkedIn ≤100 invites/week per account; email ramps gradually and self-throttles if bounces rise.
Suppression & stop rulesBounces, complaints, replies, and bookings automatically stop further outreach to a contact.
Role-based accessSensitive actions (autonomy level, pause-clear) are owner-only; every change is audit-logged.
Read-only agentsAgents propose; they cannot send. Only the policy-gated execution layer talks to providers.

6 · Bottom line

Misraj AI now has an end-to-end GTM system that a solo operator can run across the whole product portfolio, not just Baseer: it discovers and qualifies the right GCC accounts, scores each one against all nine sellable products, runs a second motion for partnerships alongside cold sales, builds the outreach and proposals in the right product's own voice, and executes only what you approve — across LinkedIn, email, social, content, and PR — with full visibility and hard safety rails. The multi-product foundation (P1–P7) is now fully shipped, all three GTM motions (cold sales, partnerships/BD, expansion) are live, and the ICP Map gives an operator a real steering wheel over sourcing/signals/enrollment; the next frontier, further out, is the Phase-3 agentic-upscale and MISRAJ-OS visions.