Baseer GTM — System Report

Autonomous go-to-market engine for baseerocr.com · Arabic-first OCR / IDP · GCC enterprise
Status: Operational · 2026-07-08

Baseer GTM is a 24/7 multi-agent system that finds the right GCC enterprise accounts, researches and qualifies them, drafts personalized outreach across LinkedIn and email, and routes every outbound action through a human approval gate — while a dashboard gives the operator full visibility and control.

18
specialized agent roles
43
ICP-qualified accounts (live)
4
prospecting sources
0
un-approved sends possible

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 Baseer — not a prototype. It runs continuously on production infrastructure and covers the full GTM cycle:

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 unblocked; journey state machine, approvals, and execution rails all live
Qualified accounts43 loadedReal GCC targets incl. Saudi ministries (Justice, Health, HR), ZATCA, GOSI — more flowing in
Verified contactsMigrating434 verified contacts + 342 accounts from prior system being ICP-reviewed and imported
Marketing engineDeployedSignals, market analysis, content calendar, PR — all four dashboards live
Quality~1,458 testsFull automated test suite green (up from ~1,400 the day before); every change verified before deploy, and tests are now 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

Eighteen 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).

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)

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

Baseer now has an end-to-end GTM system that a solo operator can run: it discovers and qualifies the right GCC accounts, builds the outreach, and executes only what you approve — across LinkedIn, email, social, content, and PR — with full visibility and hard safety rails. The sales pipeline is live with real qualified accounts; the marketing engine is deployed; and the data foundation is being enriched with hundreds of previously-verified contacts.