Senior Software Engineer · AI Systems

Angel Mauricio Marcos Montes

Product-first fullstack engineer. Lately that means production LLM agent systems: a platform-wide voice and chat assistant, a conversational workflow builder, and the evaluation, cost, and review tooling that keeps them honest. Earlier years took me through payments, insurance platforms, and financial research tools.

MindCloud · private B2B platform

Cloudy

A platform-wide voice and chat assistant, and a workflow builder you talk to. I architected it end to end.

Speak

Hands-free over WebRTC, from anywhere in the product. The model decides when to take its turn.

Or type

Same question, typed

Same thread, same tools, same answer

The typed lens is not a fallback. It is the same assistant, reached a different way.

One conversation

Speaking and typing are two ways into one thread, not two products. Switching between them mid-conversation continues it, and the same result comes back either way, rendered for whichever surface you are on.

After you stop talkingOne spoken turn, end to end.
01The key never reaches the browser

The browser makes the WebRTC offer; the product's own server relays it, attaches the provider key in process, and hands back only the answer. The model, the voice and the system prompt are chosen server-side.

02Two ways to finish a sentence

One session hosts both a push-to-talk commit and hands-free semantic detection, switched mid-session without renegotiating the connection, and the always-on microphone is acquired only after the server echoes the new mode back.

03Push to talk, and it will not answer silence

Releasing the button commits the captured audio but does not ask for a reply. The client waits for the server to confirm the buffer actually held something, and an empty buffer disarms the pending request, so a silent press gets no answer. Hands-free works the other way round: there the turn boundary is the server's to detect.

04The wait is covered without filler

Vague acknowledgements are banned in the prompt. A small state machine drives the orb, a working line and busy dots instead, and it ranks "the answer is still being spoken" above "a tool is running", because the transcript finishes before the audio does.

05Interrupting does not throw away the work

Cutting in mirrors locally and the delegated read keeps going, because interrupting to refine a question should not discard the answer to it.

06A late answer cannot land in the wrong conversation

Tearing a session down advances one counter, and each asynchronous read captures it before its first await and checks it again before it renders or replies, so an answer arriving after you started a new conversation is dropped instead of spoken into it. Work that already committed on the far side, a confirmed build or a completed account switch, is deliberately allowed to finish; only its reply is suppressed.

Voice orchestratorLow latency. Decides, delegates, speaks.
Read-only insights agentThe conversational model never queries anything itself and never sees raw rows. It delegates to a read-only agent whose whole data surface is a frozen, hand-written list of named reads, with no general query tool and no fetch-a-URL tool. Every read runs as the caller and is scoped to their own company.
Workflow builderTwo tiers. You describe the automation and it gets built, instead of dragging nodes onto a canvas.
Intent navigationNamed entities resolved over a permission-filtered route manifest, where every route group carries an explicit decision about whether it can be reached at all.
What comes back is not the data

The model gets a small object assembled field by field on the server, with model-authored text length-capped and unrecognized fields dropped. The rendered answer goes to the browser and never re-enters the model's context.

What the model is allowed to knowContext is assembled per user and per turn, not written once into a prompt.
The reachable set is built at handshake

The list of places the assistant may send you is composed server-side from the signed-in user's permissions, and it is fixed for the session on purpose, because that list is exactly where an injected instruction would try to land.

Freshness rides as data, not as prompt edits

Instead of rewriting the prompt, each turn carries a small note about where you are, deduplicated against the last one, and the model is told the newest one supersedes the rest.

One set of checks, used twice

Candidate destinations are filtered by the same validators that run when you actually click, rather than a second copy of the access rules, and anything the model emits is checked again on the way out and dropped if you cannot reach it.

01It asks before it writes

A build or edit request never runs on arrival. The browser mints its own random approval token, snapshots the exact request, and sends nothing back to the model until you approve or decline, by tap or by voice. The approval is checked against that snapshot, outside the model, and can be spent once, so a model that says it already has the go-ahead changes nothing.

02All or nothing

One invalid field rejects the whole batch with no writes applied, and the model has to re-emit the corrected set in a single call.

03Success is not assumed

A step configuration whose reference to an earlier step could not be resolved is reported as a failure, not a success, and the half-broken configuration is never applied. An agent loop treats success as terminal: calling it done would leave the orchestrator convinced the field was set, with the broken reference quietly dropped.

04Values it cannot invent

Where a field draws from a live list, a channel or a folder or a mailbox, a value is accepted only if it appears in options actually loaded for that field, through the step's own connected account. Anything else is rejected with the real values quoted back, so the model corrects itself in one turn instead of writing a plausible id that fails at run time. Free-text fields are not constrained this way.

05Different truths for different costs

The cheap grounding checks read the editor's own snapshot and deliberately let a thin one through, because inventing rejections would block legitimate work on a fresh draft. The one path that actually persists re-reads the draft and rebuilds the field schema from the live catalog, so the write is grounded even when the snapshot has drifted.

AI agent tooling · open source

the-foreman

Governance tooling for autonomous coding agents, shipped as a Claude Code plugin. It answers one question: what does a coding agent have to do before its work counts as done.

Angel45604/the-foreman
How a change gets throughFive stops, declared as data in a lifecycle contract rather than described in prose. The agent cannot advance itself past any of them, and the five are a closed set: a test derives them from the transition data and checks that against a separately written list, so one edit cannot quietly widen what runs unsupervised.
01Plan

The agent writes what it intends to do and stops there. Nothing is scoped until you approve it.

You sign Scope
02Design

Approach and boundary, including the files it expects to touch, agreed before implementation starts.

You sign Approach
03Build

Implementation stays inside the boundary you approved. Going outside it is a new sign-off, not a judgement call.

You sign Diff
04Review

A model from another vendor reads the diff and rules on it. Coverage is checked file by file.

You sign Verdict
05Ship

The last approval is a human one. The contract does not let the agent sign for you.

You sign Release
Lane A · author Claude writes

Write access to the repository, and a boundary it agreed to at stop 02. It is the only side of this diagram that can change the code.

Lane B · reviewer An OpenAI model reads

A different vendor, configuration-isolated, sandboxed, with zero write access. It cannot fix what it finds, which is the point: it can only report and rule.

The reviewer's own verdict is not the decisionIllustration, not real output
router allowlist session tools/index deploy
Approval refused

The outcome is recomputed locally: findings present means do not approve, whatever the model said, and one file in the diff that the reviewer never read is enough on its own. The change goes back, not through.

MindCloudSenior Software EngineerAug 2025 – Aug 2026

Cloudy: the platform voice and chat assistant, and the conversational workflow builder described above. Also the foundations under it, including SSE streaming, a tool-approval system with a three-tier priority chain, conversation persistence, and a bulk AI-summary and PDF export pipeline running on Redis background jobs.

OowlishSenior Software EngineerMar 2025 – Aug 2025

Built and maintained an end-to-end insurance platform used by agents and agencies nationwide, then migrated it onto an internal UI library, cutting code complexity and accelerating feature delivery by about 20%. Brought Claude Code and Cursor into the team's workflow, halving development time for new features.

EPAM SystemsSenior Software EngineerSep 2023 – Mar 2025

For a hospitality client with millions of active users, owned the Apple Pay integration from design through launch, reducing checkout time and improving conversion across platforms. For a software and high-tech client, built a surface-mock prototyping experience that let designers test new formats in days instead of weeks, backed by a flexible mock-data content service, plus reusable web components that other teams adopted.

Ernst & Young GDSSenior Software EngineerSep 2022 – Sep 2023

Led a frontend team on a global financial research platform tightly integrated with Azure, used by thousands of analysts worldwide. CI/CD pipelines in Azure DevOps reduced release times by 40%, and integrating internal and external data services through Azure APIM opened up scalable ingestion of high-value financial datasets.

Independent Technical ConsultantSolo product owner2018 – 2022

Custom web applications for SMB clients, from requirements through deployment, replacing manual operations and cutting administrative workload by 30–50%. For DGETI in 2020, a full-stack app digitizing institutional procedures with role-based access control and multi-step auditing; an ETL consolidating spreadsheet and database sources cut manual work by 70%, with on-demand reporting and full audit trails.

AI & agents

LLM agent architecture, multi-agent orchestration, OpenAI Realtime API, Anthropic Claude, MCP, RAG, tool-calling, agent evaluation, prompt caching, LLM cost and observability, WebRTC voice, semantic VAD.

Engineering

JavaScript, Node.js, Python, Swift, SwiftUI, React, Angular, RESTful APIs, SSE, ETL, role-based access control.

Cloud & infra

AWS, Azure (DevOps, APIM), GCP, Firebase, Redis, CI/CD.

Angel Marcos Montes

Open to senior and staff AI engineering work.

Mexico City, working remote. Write in English or Spanish, whichever you prefer.

B.Eng. studies at Instituto Politécnico Nacional (Bionic Engineering) and Universidad Autónoma Metropolitana (Computer Systems Engineering), not completed. Web development at Platzi since 2017. English (advanced), Spanish (native).

Built by hand. Angel Mauricio Marcos Montes.