Erick Manrique
Build record · append-only

Every system, with its status stated plainly.

Three sections: the projects, the operating system that builds them, and the automations that keep them honest. One load-bearing number per record, and the caveat that goes with it.

Records
7
Evidence
Narrative first
Numbers
Sourced or absent
One page · every flagship opens its own dossier
01

What I built.

Two flagships and five supporting systems. Each carries an honest status chip, one load-bearing number or a statement in its place, and the stack it actually runs on.

REC-01Flagship

Ambito

A permission-aware context layer that turns an organization’s communications into structured, persistent memory — served to both the people and the agents doing the work.

  • Postgres + pgvector
  • MCP server
  • Haiku · Sonnet · Opus
  • Gmail · GCal · Zoom
Deployed prototype · staging · no external users

No external users, no revenue. Production promotion has not been run.

FIG 1.11,145

backend tests passing, plus 120 end-to-end

Three-model pipeline; agents read only what the requesting person can read.

REC-02Flagship

Agentic build system

A custom TypeScript MCP orchestrator. The agents are stateless — they coordinate only through a shared handoff file, so the build moves from spec to commit without me pasting between tools.

  • TypeScript
  • Claude Agent SDK
  • MCP
  • Swift
  • Self-hosted CI
Paused

No shipped app, no users — the engineering process is the artifact, not traction.

FIG 1.2Commit-on-green gate

A commit lands only if the test run exits 0 — a rule I added after a build-only gate let three failing-test commits reach main.

Supporting systems5 records

REC-03Supporting

CoBrain

A minimal-loader context runtime for AI sessions: a two-file boot, a generated corpus map, and a fetch router keyed on trigger vocabulary. It runs under every project on this page.

  • Claude plugin
  • Manifest builder
  • Write-leases
Personal runtime · 3 repos onboarded
−52%resident context on the Portfolio onboarding — nothing lost, everything one trigger away

A personal system, not a product — no external users.

See section 02

REC-04Supporting

StudyAgent

A Slack-only spaced-repetition tutor: SM-2 mastery tracking, Claude-generated questions, and a confidence rating collected before the answer is revealed.

  • Node
  • Slack Bolt
  • BullMQ + Redis
  • MCP
  • Railway
Deployed · single-user · dormant since May 2026
204smoke-test assertions across five harnesses

Single-user by design — no public URL, no usage metrics.

Content updates ship with zero redeploys — a desktop session pushes concepts into the running bot.

REC-05Supporting

career-ops

A multi-stage application pipeline — discover, score, draft, adversarially verify, digest — with the submit decision kept human.

  • Multi-agent
  • Draft ⇄ verify
  • Deny-list
Personal-use system
103machine-checked integrity guardrails across five suites

Built for one user — me. Nothing auto-applies and nothing auto-publishes.

Red-teamed against a deny-list of claims I am not allowed to make about myself.

REC-06Supporting

This site

The site as its own case study: RED-first TDD with hook-enforced agent boundaries, an append-only decision log, and an accessibility gate with veto power over the design system.

  • Next.js
  • CSS Modules
  • RED-first TDD
  • axe WCAG 2.2 AA
Live
Two design decisionswere written by a failing accessibility check — a recoloured brand token and a scrapped opacity fade.

A portfolio site, not a product — the only thing it sells is the record.

The automations behind it are in section 03.

REC-07Supporting

Bootcampr

A platform that paired bootcamp graduates into cross-functional teams to ship real apps from PRDs over one-week sprints. Three and a half years, four iterations, the Antler accelerator.

  • React/TS
  • MERN
  • Webhooks
  • Google Calendar API
Closed October 2025
First industry rolesseveral team members landed them using the work as direct experience.

Closed publicly, with accountability, when the unit economics didn’t converge.

02

Two roles. Two files. One memory.

Every project on this page is built by the same system: a planning session that owns product thinking, specs and decisions, and a coding agent with exclusive write access to the code. They never share a workspace. They communicate through exactly two files.

FIG 2.1 — the two-role loop

Planning session

Product thinking · no write access to code

  • Scope & tradeoffswhat is worth building
  • Specsthe contract the code is held to
  • Decision logappend-only · one-line index

Two files · the only channel

Handoff brief →planning → code
← Return channelcode → planning

Coding agent

Exclusive write access · no product calls

  • Implementationthe only seat that edits code
  • Tests firstRED before green
  • Commit + gatered suite, no merge
No shared workspace. If it isn’t in one of the two files, it didn’t happen.
Material decision protocol

Any decision that changes a spec updates that spec in the same operation. The memory cannot drift from the decisions.

FIG 2.2 — a repo’s memory layer, split by load cost

Resident at boot · 2 files

Loaded before any work begins
Rulebook

How this repo works, and what a session is allowed to touch.

Manifest

A generated map of the whole corpus, described in a fraction of its size.

Fetch on demand · trigger-routed

Pulled only when named
Context

Current state; where the last session stopped.

Decisions

Append-only log under a one-line index.

Tracker

What is open and what is next.

Specs

The contract, updated in the same operation as its decision.

Handoff

Planning → code brief for the current unit of work.

Return channel

Code → planning report on what shipped.

Research dossiers

Sibling-project findings, refreshed on demand.

Scratch

Session notes, folded in at close.

FIG 2.3 — fetch router
Trigger vocabularyRoutes toTarget
decision, DEC-, locked, rationaledecisions/INDEX.md
handoff, coding task, shipHANDOFF.md
rule, ritual, wrap up, cross-syncMAINTENANCE.md
brand, palette, type, monogramspecs/brand-identity.md
research, case study, evidenceresearch/*

Routes resolve by trigger vocabularyRegenerated at wrap-up

FIG 2.4 — session ritual
  1. BootLoad two files

    The rulebook and the manifest. Nothing else.

  2. AttestAttestation line

    The session states what it loaded and what it may touch.

  3. WorkFetch on trigger

    Specs and decisions pulled only when named.

  4. CloseWrap-up

    Scratch folded in, decisions appended, manifest regenerated.

REC-03 · Flagship of section 02

CoBrain

Personal runtime · 3 repos onboarded

My cross-project context runtime, packaged as a Claude plugin — init, start, wrap, coord — and onboarded across the Portfolio, Ambito and OneLook repos.

Problem

Every session paid an always-on context floor: six-plus files loaded before any work began, most of them never used.

Mechanism

Boot loads a resident rulebook plus a generated manifest that maps the whole corpus in a fraction of its size. A fetch router keyed on trigger vocabulary pulls files on demand; wrap-up regenerates the manifest.

Heartbeats and advisory write-leases keep parallel sessions on one repo from colliding.

Result · portfolio onboarding−52%resident context

Nothing lost. Everything demoted to fetch-on-demand stays one trigger away.

Before
Six-file always-on context floor
After
Two-file boot plus a fetch-on-demand router

A personal system, not a product — no external users.

FIG 2.5 — cross-sync

Sibling-repo dossiers refresh on demand

Each project’s findings live as a dossier in the others’ memory layers, pulled forward when a session names them. That is what keeps this record current instead of annual.

The page you are reading is maintained by the system it describes.

FIG 2.6 — decision log · reversals
ReversalDecisionVerdict
DEC-022 → DEC-031TDD cadence reversed — the impl-first premise was refuted in practice, and RED-first restored by moving the blocking gate off pre-commit.Reversed · locked
DEC-109 → DEC-115Direct branch-merge-to-main reversed — a PR-based fleet workflow behind required CI.Reversed · locked

Reversals sit next to what they replacedNothing is edited out

03

Most of these exist because something went wrong.

Grouped by the system each one serves. Where there is an incident behind a guardrail, the incident is on the record — the correction is the evidence, not the automation.

Portfolio site pipeline

Goal · no unverified code or claim ships

test-author subagent

Writes exactly one failing test, then hands back. Two PreToolUse hooks hard-block it from touching non-test files and from running git.

Origin on record
  1. 01Incident

    It branched and committed on its own initiative, mid-build.

  2. 02Guardrail

    The role was stripped to author-only, and the ban was enforced in hooks rather than a prompt: no non-test files, no git.

  3. 03Now prevents

    A test author reaching implementation or version control. The hook carries its own regression test.

Gate-split TDD

Pre-commit stays fast and green while failing tests can still be committed first; the blocking test gate lives at pre-push and CI.

Origin on record · reversal
  1. 01Incident

    An impl-first cadence was tried and its premise was refuted in practice.

  2. 02Guardrail

    The reversal was locked as DEC-022 → DEC-031: commit RED first, block later.

  3. 03Now prevents

    A pre-commit hook that punishes the RED step it is supposed to protect.

Accessibility gate

axe WCAG 2.2 AA runs on every PR across the core pages. This one has no incident behind it — it runs in reverse, and it has redesigned the design system twice.

Origin in reverse
  1. 01Verdict

    It failed a brand colour’s contrast. Steel was recoloured — DEC-037.

  2. 02Verdict

    It killed an opacity-fade entrance, replaced with a transform-only rise — DEC-038.

  3. 03Standing

    The robot has taste veto. Two design decisions on the record were written by a failing check.

PR quality gate

Lint, types, tests and build all required behind a branch ruleset. A gitleaks secret scan runs alongside, an AI code review comments on every PR without blocking it, and Dependabot keeps the SHA-pinned actions fresh.

Blocking · review advisory
Session guardrail hooks

Write, bash, config and mutation guards, plus a format-on-stop pass — they police the coding agent’s session itself, not just its output.

PreToolUse · Stop
Slash commands
  • /go
  • /affected
  • /verify-app
  • /scaffold-route
  • /scaffold-component
Operator shortcuts

CoBrain runtime

Goal · memory that maintains itself
Manifest builder

Regenerates the corpus map, so the one file every session boots from is never stale.

On wrap-up
Coordination script

Heartbeats plus a generated recent-changes block, so two sessions on one repo can see each other.

Heartbeat · write-lease
Footprint check

Lints the resident-context budget. The two-file boot is enforced, not remembered.

Budget lint
Trigger evaluation

Tests the fetch router’s vocabulary against the corpus — a route that stops resolving is a failing test.

Router regression

career-ops pipeline

Goal · no application ships an overclaim

An automation whose job is to limit its owner’s claims.

A second agent attacks each draft, up to three iterations, and the whole pipeline is red-teamed against a deny-list of claims I am not allowed to make about myself. The interesting part isn’t the drafting — it’s that the verifier is adversarial by design: a draft that fails verification goes back for another iteration, not out the door.

  1. Discover
  2. Score
  3. Draft
  4. Adversarial verify
  5. Digest
FIG 3.1103

checks a draft has to survive before it can leave the pipeline

Personal-use system

OneLook orchestrator

Goal · the build reaches a commit without a copy-paste step

Fire-and-forget agent dispatch

Agents are dispatched without a human waiting on them; an auto-commit chain and a file-based handoff state machine carry the work to a commit.

Origin on record
  1. 01Incident

    An audit of the orchestrator’s own RCE exposure — it was auditing itself, and the finding was real.

  2. 02Guardrail

    A cwd-jailed command tool with a deny-list, written from that audit.

  3. 03Now prevents

    Commands reaching outside the repo, and handoffs that skip the commit gate.

FIG 3.2 — handoff state machine
  1. Idle
  2. Awaiting agent
  3. In progress
  4. Awaiting commit
  5. Completed
FIG 3.3 — war story

The stdio-inheritance hang

The dispatched build agent hung at zero percent CPU, no error, nothing in the logs. The spawn had passed a working directory and nothing else — so the subprocess inherited the orchestrator’s stdin, which was a live MCP JSON-RPC protocol stream. The agent was sitting there reading protocol frames as its own input. The fix was three tokens of stdio config: stdin nulled, stdout and stderr piped for notifications and error detection.

DocumentedFixed

FIG 3.4 — war story

Sixty-second MCP timeouts

The MCP client enforces a sixty-second connection timeout; an agent build task takes two to five minutes. Every blocking dispatch died at the one-minute mark — the agent itself survived, but the caller had no way to confirm it had ever started. The fix inverted the contract: fire-and-forget dispatch that returns in about a second, with completion signalled through the handoff file and a macOS notification, and a watchdog timer that kills any agent that never exits.

DocumentedFixed

StudyAgent

Goal · content updates with zero redeploys
MCP content interface

A desktop AI session extracts concepts from course PDFs by vision and pushes them into the running bot. No redeploy, no migration.

Live content push
Job queue

Self-rescheduling — quiz pings land inside the study windows and re-queue themselves.

Self-rescheduling

Skills

Loaded before acting, not recalled mid-flight

Codified conventions the agents must load before they act — the difference between hoping an agent remembers the rules and making the rules part of its boot.

git

Branching, commit shape, PR hygiene.

Loads before any commit or PR
testing

Carries the TDD loop and the test-type matrix, so the cadence isn’t re-argued each session.

Loads before writing tests
nextjs-ui

Route, component and MDX conventions for this site.

Loads before touching routes
worktree

Parallel-branch setup, paired with the runtime’s write-leases.

Loads for parallel branches

Status chips are mandatory on every record. Ember marks live or deployed; steel marks paused, dormant, or personal-use. Numbers appear once per record and are sourced — a record with nothing to count carries a statement instead.

Also on the record

  • NextStepA cross-platform Expo/React Native daily-dashboard app: real Google OAuth, EAS builds, third-party API integration across two SDK iterations. Not shipped, no users, and no AI — it predates the AI-native work. Here as mobile breadth, not a flagship.
  • Old bootcamp projects (2021–22)Archive only. The old erickmanrique.com is my first portfolio; it’s stale and this rebuild replaces it. Not linked.