The model writes. The code decides.

Three systems in three domains — investor relations, institutional real-estate underwriting, and cross-functional business tooling — built on one architecture: a deterministic, tested core that owns every consequential decision, with the language model bounded to the work it is genuinely good at. The domains change; the shape does not.

I architect and engineer reliable AI systems across models, deterministic logic, data, APIs, permissions, human review, and existing software.

01 · Fintech AI Brain
2,225Leads captured
~400Filtered as bot
02 · REIDE
16Underwriting stages
13Data providers
03 · Jidoka Core
200Agent specifications
11Business functions
Architecture at a glance Deterministic decision engines Agent orchestration Human-in-the-loop controls Evidence & provenance API & data integration Governance & observability
Case studies
Featured system Case Study 01 · Aurumverse · Dec 2025 – Aug 2026 · Built solo

Fintech AI Brain

Lead intelligence and governed investor workflow.

Website / waitlist Telegram intake Score · segment · dedupe Postgres system of record Concierge qualification Human handoff Registration = KYC verified
Key decision
Separated identity credibility from capital potential, so a large stated figure could not by itself produce high-priority investor status.
Proof
2,225leads~400filtered as bot7,500 → <10API callsPostgressystem of record
Why it mattered
Prioritisation became auditable and resistant to false high-value claims.

Every decision that could be wrong was moved out of the language model and into deterministic, testable code. The model converses; the code decides who a lead belongs to.

Lead intake pipeline
Telegram notification for a new waitlist lead. Lead ID hash 2225, investment range under ten thousand dollars, submitted 15 August 2026. Name, email, phone, Telegram handle, wallet, message and IP address are covered by solid black redaction bars.
Exhibit · one raw input, redacted

This is what the pipeline consumes: an unstructured Telegram notification, one per submission. Everything the parser extracts is visible as a label — identity, contact, wallet, stated range, source page, message, IP, timestamp — and the identifying values are redacted here.

The sequential counter reads #2225. The Name and Message on this particular lead were random character strings, and the IP falls in a known Tor exit range — three of the signals that push a submission toward Spam Review rather than an alert. This is the class of input the scoring engine exists to separate.

The defect the engine exists to fix

A whale-sized allocation with a fake identity is not a hot investor

My first version scored a lead's stated investment range as real even when the name, company and message were keyboard mash — a gibberish $1M submission would have fired a red whale alert straight at the CEO. Auditing my own system surfaced it, and the fix was to make identity and capital independent signals. A credible whale now requires the capital and a real name and a real company or LinkedIn and either an institutional signal or a high quality score and low spam risk; high capital alone never escalates. When the two disagree — large money, unconvincing identity — the lead is classified Spam Review / Whale Conflict and sent to manual review, explicitly never escalated. That single rule is the difference between an alerting system a team trusts and one they learn to ignore.

lead_intelligence.py · classify() · _whale_credible()
Scoring · pure module

Two scores, every point explained

Each lead is parsed field by field — blanks stay blank, nothing is inferred — then scored twice. Investor quality 0–100 across seven weighted components: stated range 25, crypto and RWA relevance 20, real-estate relevance 15, professional credibility 15, contact completeness 10, message quality 10, prior engagement 5. Spam risk 0–100 additively, where every point is attributable: gibberish name +25, gibberish message +20, disposable email domain +20, hosting or Tor IP range +15, no reachable handle at all +10. The two together resolve to one of eight segments. No network, no model calls — the classification is reproducible and unit-testable. Across the 2,225 leads the system captured, roughly 400 resolved to bot or disqualified segments — close to one in five of everything inbound, held back from a person's attention without a human ever reading it.

score_investor_quality() · score_spam_risk()
Precision

Catching keyboard mash without false positives

The gibberish detector reads three signals: lower-to-upper camel transitions inside one token (eHdgDaskrup), an implausibly low vowel ratio on long tokens, and runs of six or more consonants. The hard part is not catching junk — it is not catching real names. The tests pin that ordinary title-case entities like "Hartwell Family Capital" score clean, because a filter that rejects genuine institutional leads is worse than no filter at all.

looks_random() · lead_intelligence.py
Ingestion · Telegram Bot API

Parse, deduplicate, alert by segment

Leads are deduplicated against the live CRM across email, phone, Telegram handle and — for anonymous website events — IP plus exact timestamp. Segment then decides the alert: credible whales raise a red card to the CEO chat and a Telegram ping, whale conflicts go orange to manual review, hot investors trigger a 24-hour outreach card, warm leads queue quietly, and spam is summarised in the daily report rather than pinged per lead, so the team's attention stays worth something.

telegram_intake.py · fire_alerts()
Reliability

No lead is ever lost

Two transports — a long-polling loop and a webhook that verifies Telegram's secret-token header and fails closed. Processing retries with bounded exponential backoff. The polling offset only advances past updates that were handled or were never ours, so a genuine failure is written to a dead-letter log and re-fetched next poll rather than being checkpointed away. Dead-letter records store a redacted preview, never the full payload.

poll_once() · _process_with_retries() · webhook_security.py
Cost engineering

7,500 API calls down to under 10

The CRM's API was capped at 10,000 calls a month. The naive import spent about five calls per lead, so a single 1,500-lead backfill would have burned three quarters of the monthly budget. I rewrote it to index the entire CRM once at maximum page size, deduplicate the whole batch in memory, and bulk-create only genuinely new records — roughly 7,500 calls became fewer than ten.

_index_existing_records() · process_notifications_bulk()
Architecture

Moving the system of record to Postgres

Rather than keep optimising against a quota, I moved the source of truth to Supabase Postgres and left the CRM as a synced view. Deduplication became a database guarantee: every lead resolves to one dedup_key — Telegram, then email, then phone, then IP plus timestamp — and writes are upserts that skip existing keys, so re-importing months of history is a no-op that can never clobber enriched data.

supabase_store.py · sync_supabase_to_lark.py
Web3 · Ethereum

Reading purchases straight off the chain

Knowing who actually bought normally means waiting on DApp backend access. Instead the tracker reads Ethereum directly, in either of two modes: watching token transfers from the sale contract to buyers — which is the purchase event — or watching stablecoin inflows to the treasury address. Purchase reality reaches the CRM without depending on another team's API or release schedule.

onchain_tracker.py · JSON-RPC
Governance

Nothing sends without a human

The daily queue selects whale, then hot, then warm leads with complete contact details, ranks by priority and score, and drafts a configurable top fifteen — fewer if fewer qualify, never padded to hit the number. Each draft carries why that lead was selected, a personalised opening line, per-channel messages and a soft call to action, and lands in the queue as Pending Approval. The system proposes; a person sends.

capital_relations_daily.py · build_outreach_queue()
Data recovery

Reading history a bot cannot see

Telegram bots cannot read chat history and cannot see messages posted by other bots — and the entire lead archive sat in a private group, posted by a bot. I built a user-account client to extract it: joins once via invite link, pulls full history or only new messages, writes a raw export, and remembers its position so daily runs never re-import. Alerts are silenced during backfill so importing months of history doesn't spam the team.

telegram_history_extractor.py · Telethon
Concierge & human handoff
  • Deep-link onboarding, chosen deliberately. Mass-DMing from a user account gets the account banned, and a bot may only message people who start it. Leads arrive through a per-lead deep link placed in waitlist emails, the group pin and broadcasts — after which the conversation is unrestricted and permanent.
  • Escalation at a five-figure signal, or on request. The bot stops auto-replying, alerts the team chat with a summary and the lead's conversation id, and opens a relay: an operator replies in the team chat and the bot delivers it, forwarding the lead's answers back. The whole thread stays in one place and stays logged, with commands to hand control back or claim the lead outright.
  • Owner-aware routing on first contact. Stated allocation maps to a capital segment, which maps to a named owner, who is pinged directly with the lead's contact block rather than into a shared queue.
  • Nurture that respects a clock. Three hours of silence triggers re-engagement, then a 30-day sequence fires at days 1, 4, 10, 20 and 30. Sends are gated on the lead's own timezone, so nobody is messaged at 4am.
  • Correct under concurrency. Each incoming update is claimed atomically through a unique-constrained insert, so overlapping workers and retries can never double-process a message — and if the migration is absent the claim fails open rather than taking the bot dark.
  • Document delivery in-thread. Project proof, the investment pack, the whitepaper and subscription documents are sent as media with tracked links, so interest becomes measurable rather than anecdotal.

The anti-hallucination boundary

A conversational agent in a securities-adjacent context cannot be allowed to improvise. I built a knowledge and policy layer where every fact is source-tagged: entries marked general are safe to answer with careful, non-promissory framing; entries marked official require a real company document, and until one is loaded the bot gives a short verified framing and escalates instead of inventing. Project specifics — price, returns, timelines, structure — are deliberately absent from the codebase so they cannot be guessed at; they live in a curated document set (whitepaper, KYC/AML policy, buying guide, per-project documents) that the layer folds into the system prompt at load time. A compliance classifier scores each message, and legal, tax, media, complaint or KYC-rejection topics force immediate human escalation regardless of what else the conversation is doing.

Deterministic routing engine
PriorityClassificationRouted toObjective
1Institutional InvestorCapital leadImmediate human escalation — no automated sales process
2Strategic PartnerPartnershipsPartnership qualification
3Developer / Asset OwnerOriginationAsset origination — never left in bot nurture
4Major Investor six-figureCapital leadQualify, educate, hand off, raise a priority alert
5Qualified Investor five-figureInvestor relationsEducation, qualification, meeting booking
6Existing InvestorSupportService, not sales
7Retail CommunityAI conciergeEducation and long-term nurture

Capital is read from the message itself where stated, otherwise from CRM history, and major investors are sub-tiered across four escalating bands so the alert carries the size with it. Above the table sit two overrides that always win: an explicit request for a human, and any sensitive topic.

KYC & registration webhook

Account creation on the platform is KYC verification, so the registration webhook is the one place a lead's state may be promoted on trust. Getting it right meant getting four things right at once.

  • Atomic promotion. One write sets Account Created, the creation date, KYC State and KYC Status together, so a lead can never exist half-verified.
  • Idempotent by construction. A replayed event on a fully-registered record mutates nothing and sends no duplicate owner notification. Partial or legacy records are repaired to a correct verified state — while a lead already onboarding or active is never regressed backwards.
  • The event is never lost. If registration arrives for someone not in the CRM, a minimal record is created rather than the signal being dropped.
  • Privacy enforced in code. Bearer tokens are compared in constant time. Wallet addresses are stored masked to first six and last four characters, and the full address is never persisted. Logs carry a random correlation id and never the email address; error responses return a type, never a message.
Agent fleet & daily rhythm
Agents 01–08

Intake to high-value detection

Lead intake, investor scoring, dossier research, personalised outreach drafting, follow-up sequencing and high-value detection — each an isolated function with its own prompt contract and JSON parse, writing structured records rather than prose.

agent.py · agent_01_intake … agent_08_whale
Agent 09

Pipeline manager with SLA breach detection

Every lead carries the timestamp it entered its current stage. Per-stage service levels — four hours for a new lead, one day for research, seven for contacted, fourteen for engaged — turn a static pipeline into a list of records that are actually stuck, named and counted.

agent_09_pipeline()
Agent 10

Morning briefing, delivered as a card

At 8am the flow queries the pipeline excluding declined and do-not-contact records, computes metrics, has the model write a full briefing, stores it as a document, records the snapshot, and posts an interactive summary card to the executive chat — priority alerts, hot leads, total pipeline, messages pending and stuck records, with buttons through to the full briefing and the CRM.

n8n · daily-briefing-flow.json
Resilience

A typed error taxonomy

CRM failures are classified into permanent, retryable and rate-limited rather than caught as one blanket exception, so transient faults back off and retry while genuine validation errors surface immediately with the failing operation and code — and no payload.

LarkError · LarkTransientError · LarkRateLimitError
Telegram Bot APITelethonLark Suite Base + IM Supabase / PostgresAnthropic APIFlask + Gunicorn n8nAES-CBC webhook decryption
Architecture decisions
Why deterministic scoring rather than a model?Qualification decides who owns a lead and what reaches an executive. It has to be repeatable and auditable, so the engine is a pure module — no network, no model calls, unit-testable.
Why split identity credibility from capital potential?Version one coupled them, so a gibberish $1M submission scored as a credible whale. Separating the dimensions makes "large money, unconvincing identity" its own outcome: manual review, never escalation.
Why move the system of record to Postgres?The CRM API was capped at 10,000 calls a month and offered no durable deduplication. Postgres enforces one dedup key per lead, so re-importing months of history is a no-op.
Why claim each inbound update atomically?Overlapping workers and retries would otherwise process the same message twice. A unique-constrained insert makes first-writer-wins explicit rather than incidental.
Case Study 02 · REIDE · Jidoka Group, 2026

REIDE

Real Estate Investment Decision Engine — institutional underwriting infrastructure.

Deal intake Property & document intelligence Evidence registry Deterministic underwriting Capital stack Scenarios & stress Risk & diligence IC decision Institutional memo
Key decision
Financial calculation stays deterministic; the model is bounded to interpretation, synthesis and explanation.
Proof
16stage workflow4independent scenarios13data providers7tested packages
Why it mattered
The model can explain an investment case without becoming the source of truth for the numbers in it.
Address / propertyparcel · zoningcomps · permitsflood dataDocument uploadsOM · T-12rent roll · leasesappraisal · PCAManual inputsassumptionsrenovation · financinghold strategyPublic data & APIscounty · assessorzoning datamarket providersThird-party systemsCRM · drivespreadsheetsproperty databasesIngestion & normalizationOCR · parsing · extraction · standardization · entity resolutionIntelligence & reconciliationcross-source reconciliation · discrepancy detection · confidence scoringUnderwriting & modeling enginescenarios · financial modeling · valuation · metrics · risk & stress testingAI analysis & insightsnarrative · risk identification · market context · recommendationsDecision dashboardexecutive summary · scenario comparison · sensitivity · source citationsOutputs & integrationsPDF reports · Excel models · data room · CRM sync · API · webhooksFoundation layersecurity · roles & permissions · audit logs · encryption · complianceData quality & validationcompleteness · accuracyanomaly detectionEvidence storeevery source and decision, versioned and timestampedAssumptions managerglobal and scenario assumptions, version-controlledAI guardrailsno fabricated numbers · citationsconfidence · policy
The model sits fourth in the chain, not first. Evidence is reconciled and the numbers are calculated deterministically before any narrative is generated — and the guardrail on that narrative is that it may not introduce a figure of its own.

How a document conflict is resolved — worked example

Two source documents disagree about the same figure. Neither is silently trusted: the disagreement becomes an evidence record in its own right, weighted against source type, recency and completeness, and surfaced for review. Figures below are from the product's demonstration deal.

Seller OM · p.1196.0%stated occupancy
vs
Rent roll · p.291.7%22 of 24 units occupied
vs
Market7.2%submarket vacancy
Underwriting assumption92%reconciled · conflict logged · reviewable

AI commentary is narrative support only, and must not introduce financial figures. The web layer maps inputs into package contracts and performs no independent financial math.

The trust layer

Every material number has to say where it came from

The Evidence Registry is what separates this from a spreadsheet with opinions in it. Each significant value traces to one of five origins — user input, public record, document extraction, deterministic calculation, or reviewer approval — and carries source, source type, source date, confidence, verification status, conflict status, override status with a written reason, reviewer and review date. Confidence is tracked at the value level rather than the model level, which lets the system state something most tools blur: a financial output can be a high-confidence calculation while still resting on low-confidence inputs. The memo then classifies every line it emits as fact, source-derived data, user input, assumption, calculation or AI commentary, so a committee reading the recommendation can see exactly which parts are arithmetic and which are narrative.

packages/schemas · packages/memo · traceability.ts
Deterministic core

The underwriting math is inspectable

The calc engine produces NOI, going-in cap rate, yield on cost, DSCR, debt yield, levered and unlevered IRR, equity multiple, cash-on-cash, break-even occupancy, total equity requirement, total project cost, exit value, loan payoff, net sale proceeds and maximum allowable offer — all reproducible, none of it generated. The IC snapshot names the binding constraint: which test is actually capping the price you can pay.

@redie/calc-engine
Scenarios

Four cases, no cross-contamination

Seller, base, downside and upside cases each run independently through the pro forma engine, and switching between them never mutates the base underwriting input. It sounds like a small discipline; it is the difference between a stress test you can trust and one that has quietly drifted from the deal you started with.

packages/calc-engine · scenario model
Integrity

A missing data provider says so

Thirteen provider categories feed the model — parcel, tax, zoning, sale and rent comps, flood, environmental, permits, demographics, interest rates and more — and every response is normalised into evidence before it can touch underwriting. Providers that aren't wired up are represented explicitly as not_connected, needs_key or mock rather than silently returning something plausible, and demo figures are labelled as not actual investment information. In a tool that outputs a price you should pay, a confident-looking fabricated number is the worst possible failure.

apps/web/lib/providers
Risk

Rules that argue with the underwriter

The risk engine exists to challenge aggressive assumptions rather than confirm them: weak DSCR, stress-test failure counts, exit cap sensitivity, occupancy conflicts, CapEx and PCA gaps, financing structure gaps, zoning and entitlement risk, and low-confidence evidence that is materially affecting returns. Each finding carries category, severity, rationale, mitigation, owner and status. The IC readiness score is computed from document completeness, unresolved conflicts, source confidence, stress survivability and diligence severity — so "are we ready to decide?" is answered with evidence rather than instinct.

packages/ic · score.ts · risk.ts · diligence.ts
Structure

Seven packages, each independently tested

A monorepo split by domain rather than by layer — calc-engine, schemas, ic, memo, zoning, construction, condition — each carrying its own tests and a runnable demo. The web app orchestrates; it does not own the domain logic, which is why the underwriting can be verified without booting a browser.

packages/* · apps/web · TypeScript
Architecture decisions
Why can the model not emit financial figures?The output is a price someone may pay. It must be reproducible and inspectable, so the calc engine owns every number and the model owns only the prose around them.
Why track confidence per value rather than per document?A high-confidence calculation can rest on low-confidence inputs. Collapsing the two hides exactly the risk a committee needs to see.
Why represent an unconfigured provider explicitly?In a tool that outputs a price, a confident-looking fabricated number is the worst available failure. An absent provider says it is absent.
Case Study 03 · Jidoka Core · Jidoka Group, 2026

Jidoka Core

Orchestration layer for reusable organisational capabilities.

Key decision
Agents run through a governed orchestration layer rather than as isolated autonomous assistants.
Proof
200capability specs4+1coordinators16business systems11functions
Why it mattered
Capabilities coordinate across systems while permissions, human oversight and audit trails hold.
Request / trigger human · system · schedule · data event Master orchestrator classify · route · coordinate · govern Growthrevenue ·research · pipeline · outreachOperationsinternal process ·workflow routing · adminSuccess & intelligenceanalysis ·monitoring · synthesisClient deliveryonboarding ·coordination · deliverables Agent & workflow registry 200 reusable capability specifications · 11 business functions SHARED LAYER Memory & contextStructured dataGovernance & permissionsLogging & observabilityKPIs & metricsIntegration layer Low-risk action executes within policy and permissions Approval required exceeds policy threshold Human review approve · edit · reject · escalate EXISTING SYSTEMS CRMFinanceMarketingEmailCalendarDocsProject mgmtAnalyticsDatabases Outcome / measurement performance · results · business impact Feedback loop — outcomes return to the orchestrator
Work enters once, is classified and routed by the orchestrator, and draws on capabilities and shared services that exist once rather than per system. Nothing above a policy threshold reaches a business system without a human approving it.

A representative workflow — full pipeline operating review

Requestfull pipeline operating review
ContextCRM, goals, activity, account notes
Orchestratorclassify, route, assess approval needs
Agentsgrowth, operations, success & intelligence
Actionsextract signals, summarise gaps, recommend next steps
Approvalreview escalations and external actions
Resultreview packet, action list, KPI log

Stage 1 — Win customers

01Lead generationAttract ideal prospects
02Lead nurtureStay in front until they're ready
03Sales & closingConvert to paying clients
04Client intakeQualify before you say yes

Stage 2 — Serve clients

05OnboardingThe first 90 days
06Service deliveryThe core work you're paid for
07Quality controlConsistent output, every time
08Client supportResolve issues, keep clients

Stage 3 — Retain & grow

09RetentionRepeat business and win-backs
10Data & reportingKPIs and owner visibility
11Knowledge & SOPsProcesses documented, not in heads
12Plan & improveReview, refine, build judgment in

Stage 4 — Run the business

13Finance & cashMoney in and money out
14People & HRHire, train, and retain
15Admin & legalA compliant back office
16Inventory & supplyStock, procurement, vendors

Not the same thing

Jidoka Core — the shared operating layer beneath the 16 systems, described here.

The six-stage factory (classify → route → assemble → govern → learn → deliver) — Jidoka Group's delivery framework for client engagements. It is how the work is run, not a feature of Core. The two are easy to conflate; they are separate things.

Runtime

A catalog that reads the library

The catalog indexes the specification library from disk at runtime rather than duplicating it in code, keying on the three headers every specification carries. A specification that cannot be parsed is left out so the rest of the library still serves — the catalog degrades rather than failing.

lib/jidoka-core/agent-catalog.ts
Public surface

Safe to expose

The demo is publicly reachable, so the public payload is a deliberately separate shape from the internal one, and the endpoint is rate-limited. What a visitor can see is defined by what the public type exposes, not by what the engine happens to hold.

demo-public.ts · rate-limit.ts · revision.ts
The 200-specification library
FunctionSpecsFunctionSpecs
Executive management15Operations & process25
Meetings & communication15Finance & accounting20
Sales & revenue operations25People & HR20
Marketing & growth20Legal, compliance & risk15
Customer success & service20Knowledge & document intelligence15
Enterprise control layer10Total200

Each specification is bounded rather than open-ended. A re-engagement agent, for example, is defined to work only from supplied interaction timestamps and a silence threshold — it determines eligibility, and it is explicitly not permitted to invent context it was not given. Writing two hundred of these is where the design work actually sits: deciding what each agent may assume, what it must refuse, and where one ends and the next begins.

Design rules

System design principles

  1. Deterministic where correctness matters. Scoring, eligibility, calculations, permissions and state transitions do not depend on probabilistic output.
  2. AI where ambiguity adds value. Interpretation, synthesis, extraction, classification and narrative — the work where judgment helps.
  3. Human approval where risk warrants it. High-impact or sensitive actions stay reviewable before they execute.
  4. Every important output traceable. Source, state, confidence, reasoning basis and timestamp, recorded where it matters.
  5. Fail visibly rather than fabricate. Surface uncertainty, missing data and degraded states instead of inventing confidence.
Reference architecture

The shape these systems share

Abstracted from the three builds below. The two things that make it work are the split between deterministic logic and the model, and the risk gate before anything touches a real system.

Request / trigger
form submissioninbound messageschedulewebhook
Context retrieval
organisational knowledgedatapermissionshistorical stateexternal systems
Orchestrator / decision layer
classifyrouteassemblegovern
Deterministic logic
scoringeligibilitycalculationstate transitions
AI / model layer
interpretationextractionsynthesisnarrative
Proposed actions
Low risk
execute
High risk
human approvalthen execute
Existing systems
CRMemailfinancedocumentsAPIsdatabases
Logging · provenance · KPIs · audit trail
Reference

How I work

  • Run engagements through one framework. Client work at Jidoka Group moves through six stages — classify, route, assemble, govern, learn, deliver — so a new engagement starts from a known shape rather than a blank page, and governance is a stage rather than an afterthought. It is how the work is run; it is separate from Jidoka Core, which is the layer the delivered systems sit on.
  • Audit my own work honestly. Version two of this system began by cataloguing where version one — which I had built — was wrong. It would have escalated a gibberish million-dollar lead to the CEO. So I rebuilt the decision core, kept the fourteen tables and the bot that were working, and added a layer rather than a replacement: minimal new fields, no new tables, nothing rebuilt for the sake of it.
  • Move the risky decisions out of the model. This is the one rule all three systems share. Conversation, narrative and explanation are good uses of a language model; routing capital, classifying an investor and computing a price you should pay are not. In the capital-relations engine the model proposes a classification and deterministic code decides it. In REIDE the model writes commentary and is explicitly forbidden from introducing a financial figure. Anything that must never be wrong lives in tested, inspectable code.
  • Fail closed, and never silently. Unauthenticated webhooks are rejected rather than tolerated, missing secrets refuse the whole route, and a failure that can't be handled is recorded and retried rather than checkpointed away.
  • Design for the quota and the ban. Real constraints — a 10,000-call monthly cap, an account ban for mass-DMing, a rate limit on a public endpoint — shaped the architecture from the start rather than being patched around later.
  • Privacy as a code property. Wallets masked before storage, PII kept out of logs and dead letters, correlation ids instead of identifiers, and a knowledge layer that escalates rather than inventing.
  • Prompt contracts treated as interfaces. Model output is specified as an exact schema, parsed defensively, and fields the model may return but was never asked for are handled gracefully instead of trusted.
Reference

Stack

LayerFintech AI BrainJidoka CoreREIDE
LanguagePython 3.11TypeScriptTypeScript
ApplicationFlask · GunicornNext.js · ReactNext.js monorepo · 7 domain packages
DataSupabase Postgres · Lark BaseFilesystem-indexed spec catalogSupabase · 13 provider adapters
Deterministic corelead_intelligence · ir_routingSpec catalog + shared operating layer@redie/calc-engine
Model's roleConverses; proposes a classificationAssembles from written specsNarrative only — no financial figures
ChannelsTelegram · Telethon · Lark IM · web widgetPublic rate-limited demoWeb app · memo export API
Tests28 modulesPlatform suitesPer-package suites + runnable demos
Reference

Evidence & claim provenance

Quantitative claims here are tied to system records, repositories or implementation artifacts. I do not present unsupported conversion, revenue or performance numbers as fact — every figure below names what it can be checked against.

ClaimWhere it comes from
2,225 leads capturedThe platform's sequential lead counter, shown in the redacted exhibit above at Lead ID #2225 (August 2026). The deduplicated CRM row count is available on request.
~400 of 2,225 filtered as bot or disqualifiedSegment counts in the Aurumverse lead table
200 agent specificationsJidoka Core's specification library — counted by the catalog's own file pattern across 11 category directories
16 business systems across 4 stagesJidoka Group's system taxonomy, enumerated in the Jidoka Core section above. The four stage names are the delivery lanes used throughout the platform codebase.
10 autonomous agentsagent.py — agents 01–10, each a named function
28 test modulesTest files in the Aurumverse engine
~7,500 API calls → under 10Documented in the bulk import path against the 500-record page limit
16 underwriting stages · 7 packagesREIDE workflow and monorepo layout, both enumerated in its README
13 provider categoriesProvider adapters under apps/web/lib/providers, each normalised into evidence

Not claimed here: conversion rates, closed revenue or deal values. The systems above produced and qualified the pipeline; what closed at the end of it was recorded outside them, so no figure is asserted that this work can't evidence.

Closing

From individual automations to organisational capabilities

My earliest automation work optimised for speed of deployment and outcome per task. That was useful for validating whether a workflow created value at all — but once I saw how automation systems become interconnected, the design space expanded, and with it a clearer responsibility. Maintainability, security and governance had to become part of the architecture rather than afterthoughts.

It is why I build complex systems around deterministic agent specifications instead of one general-purpose agent. Defined responsibilities, context requirements, approval rules, outputs and KPIs reduce ambiguity, and they lower the risk of hallucinated output and procedural error.

Building Jidoka Core changed how I think about applied AI. The most important part of an agentic system is the human intention behind it. Connecting a model to APIs is comparatively straightforward; the harder work is understanding where AI belongs inside an organisation — what context it needs, what it should and should not be allowed to do, who owns each process, and how repeatable modules can be governed, secured, adapted and scaled.

My goal has shifted from building individual automations to building reliable organisational capabilities, with feedback loops that continuously teach both the AI systems and the people using them.

Reference

Areas of focus

AI systems architecture Applied AI engineering Agentic systems AI infrastructure AI solutions architecture AI platform engineering AI-enabled operational systems