Research

The Agent Failure Index

Every published dataset on how AI agents fail is a benchmark trace, a scraped complaint thread, or one team's own runtime. This is 359 failures recorded while building and running production AI systems for paying clients, with what broke, what it told us at the time, and whether it was ever closed.

21 August 2026

Version 1.0 · 359 failures · 5 systems · 68 days to 2026-08-21 · snapshot d152f8a · CC BY 4.0

359

failures recorded in 68 days

336

carry a root cause and a prevention rule

71

carry a written resolution

6

are marked closed in the database

The last two numbers count the same thing and disagree. Closure is recorded by an endpoint that has been returning a parse error for weeks, so the people closing failures wrote the resolution into the note by hand and the structured field never moved. Both are printed because the gap between them is the finding, and because anyone reading only the field would conclude this team fixes almost nothing.

Finding one

The model broke 3 times out of 358.

3 failures were the model itself producing a wrong output. That is 0.8 percent. The public argument about why enterprise AI fails is almost entirely an argument about models, and in 68 days of running these systems the model was the thing that broke less than once a fortnight.

What broke instead was everything around it. The largest single category is the layer that decides whether something worked: tests, gates, health checks, dry runs, verifiers. That layer produced 117 of 358 failures, more than the product code, the platform and the agent loop put together.

LayerFailuresShareWhat it is
Verification11732.7%Tests, CI gates, health checks, dry runs, monitors
Application8122.6%Product code around the agent
Infrastructure6618.4%Host, build, queue, package manager, network
Data339.2%Schema, migration, corpus, index
Third party328.9%A vendor behaved unlike its contract
Orchestration267.3%Planning, tool selection, delegation, memory
Model30.8%The model produced a wrong output

n = 358 classified failures. 1 note was filed empty and cannot be classified.

Finding two

Half of them reported success.

176 failures of 358 reported success at the moment they happened. Exit zero, HTTP 200, a green check, a completion message. A further 67 raised an error that described a different problem, so the signal actively pointed away from the fault. 107 failed loudly and honestly, which is 29.9 percent.

A deploy returned exit zero and deployed nothing. A protected preview served its login page with HTTP 200 on every path, so a status check passed on routes that did not exist. An authentication verifier reached a branch that returns true when no key is configured. A migration dry run queried a ledger no client has, so its refusal to proceed read as a guard working. Twelve green checks sat on a service that no workflow builds or runs.

The pattern concentrates where it hurts most. Of the 117 failures in the verification layer, 92 were themselves silent or misdirecting. The things built to catch failure fail quietly at a higher rate than the things they watch.

LayernLoudQuietSilentWrongNot loud
Verification117232444880.3%
Application8118256577.8%
Orchestration267215273.1%
Model3102066.7%
Infrastructure6625134662.1%
Data3316115151.5%
Third party3217010546.9%

The worse it was, the quieter it was.

Share of failures at each severity that reported success. Severity was assigned when the failure was filed, long before any of this classification existed.

S3 lowest39.5%
S2 middle54.1%
S1 highest66.7%

n = 147, 181, 30. The most severe band is the smallest, so treat the top figure as a direction rather than a rate. The direction is the part worth having: the failures that cost the most were the ones that announced themselves least.

Who found them

Automated checks caught 33.5 percent. A person going looking with no triggering symptom caught 34.9 percent, and a person reading the output caught another 27.1 percent. Clients reported 3.1 percent. Just over three fifths of these failures were found by somebody looking, not by anything built to look.

Finding three

We wrote 339 prevention rules and enforced none of them.

336 of these failures carry both a written root cause and a written prevention rule. That is the part the process is good at. 11 record what the fix actually was. 71 carry a written resolution. The folder where an enforced prevention rule is supposed to land holds nothing but the file that keeps it in version control.

Recording why a system broke turns out to be the easy half. Diagnosis rate is 97.2 percent, closure rate is 19.8 percent, and the machine readable closure rate is 1.7 percent. On 2 August 2026 the high risk provisions of the EU AI Act became enforceable, including Article 12, which requires automatic event logging across a system's lifetime. Article 12 requires the log. Nothing requires the loop to close.

This dataset is what a team that genuinely tries looks like when it does not close the loop. We built the ledger, wrote the rule on 94.4 percent of entries, and shipped an enforcement mechanism for none. If that is the shape of a deliberate effort, the shape of a compliance exercise will be worse.

StageCountOf 359
Failure recorded359100%
Root cause written34997.2%
Prevention rule written33994.4%
Resolution written7119.8%
Fix recorded113.1%
Closed in the database61.7%
Prevention rule promoted to an enforced check00%

Crosswalk

The published taxonomies cover four percent of this.

Every row carries a mapping to four external frameworks, or a null with a reason. The nulls are the result worth publishing.

MAST, the multi agent failure taxonomy from Berkeley built on 1,600 traces across seven frameworks, classifies 14 of these 358 failures, which is 3.9 percent. The OWASP Top 10 for Agentic Applications classifies 21, which is 5.9 percent. Neither is a weak taxonomy. MAST classifies conversation traces between agents, and a package manager picking the wrong lockfile is not a conversation. The gap is not a flaw in the taxonomies, it is a measure of how much of production failure sits outside what anyone has been classifying.

One framework covers all 358. The five class silent failure taxonomy published in June 2026, from a longitudinal study of a single production agent runtime, maps every row, because it classifies mechanisms rather than conversations. That study had 22 incidents over eight weeks in one system. This is 359 over 68 days across 5, and the shape holds.

Coverage of this corpus

Silent failure classes A to E358100%
OWASP Agentic Top 10215.9%
MAST 14 modes143.9%

Silent failure class

B Design assumption mismatch17548.9%
A Environment and platform quirk10729.9%
C Error swallowing and dilution3910.9%
E Operational omission267.3%
D Chained fabrication113.1%

The Article 12 column

None of these systems are high risk under Annex III, so no obligation arises. The column asks a counterfactual instead, applied consistently to all 358: had this been a high risk system, would Article 12 logging as specified have captured the event at all? For 144 of them, 40.2 percent, the answer is no. A log records what a system reports. Half of these failures reported success, and a log of a success is not evidence that anything worked.

What this predicts

The failure mass is moving down, not away.

Model capability improved continuously through this collection window and the model layer still accounts for 0.8 percent of what broke. Capability improvements do not reach the verification layer, because that layer is not made of model output. It is made of exit codes, status codes, dashboard fields and green ticks, and every one of those can be right about the wrong thing.

The practical consequence is a spending question. An organisation that treats agent reliability as a model selection problem is buying against 0.8 percent of its recorded failures. The three cheapest controls implied by this data cost nothing and are not model related: never read a status code where you can read the body, never let a pipeline replace a command's exit code with a filter's, and run a negative control before trusting any check that has never failed.

The second consequence is slower and larger. Three preprints in June 2026 alone tried to price agentic risk for insurers, and each is blocked on the same thing, which is that nobody has published loss data. Ledgers like this one are the missing input. Within eighteen months a failure ledger stops being a compliance artifact and becomes an underwriting and procurement input, which means the organisations keeping one honestly will be the ones able to prove anything at all.

The index

All 359 records, newest first. Angle brackets mark a redaction rather than a detail that was never recorded.

  • 2026-08-21

    advizr

    fleet admin console

    s1 / Application

    Reported success

    Any validly-signed admin token opens the portal for a user id with no row

    Root cause

    Two compounding defects in <path> getSession(). First, the portal gate tested PORTALROLES.includes(payload.role), the role claim from the JWT, before any database read, so a token minted while someone was staff kept working after their row changed.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Resolution written / prevention rule written

  • 2026-08-21

    advizr

    internal agent platform

    s1 / Data

    A master users.role value the fleet did not understand locked three owners out of eleven client tenants

    Root cause

    master users.role is a SHARED INTERFACE, one column in one database, read by roughly a dozen deployments, and nothing made them agree. A value could be added to the CHECK constraint in <internal-project> and granted to live rows while every consumer repo still had a hardcoded set that omitted it.

    Signal: Loud / found by client / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-21

    advizr

    client agent platform

    s1 / Application

    Reported success

    The client template has the same rowless-session hole as admin, on 11 tenants

    Root cause

    The same two compounding mistakes as the admin instance..single() makes a legitimate miss indistinguishable from a read failure, and if (!error && user) sends both down a permissive else-path instead of an explicit early return.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-08-21

    advizr

    internal agent platform

    s3 / Verification

    Wrong signal

    A focus-ring assertion on <host> reads the pre-transition colour and fails

    Root cause

    Tailwind v4 includes outline-color in the transition-colors property list. Any element carrying transition-colors duration-200 fades its focus ring in over 200ms from the initial value, which is currentColor.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-21

    advizr

    internal agent platform

    s3 / Application

    Reported success

    Tailwind `first:` variant is dead when the parent wraps each item in its own div

    Root cause

    Tailwind's first: variant compiles to:first-child. SectionStage renders each dossier inside its own wrapper <div id={item.id} className="scroll-mt-24">, so every <article> is the first (and only) child of its own wrapper and:first-child matched all of them.

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-21

    artifact

    internal agent platform

    s3 / Application

    A position:fixed header inside an iframe bleeds the parent page into its own band

    Root cause

    position:fixed on an element INSIDE an iframe, where the iframe is itself absolutely positioned inside a position:fixed container with opacity-transitioned sibling iframes. That nesting makes Chromium composite the fixed subtree against the wrong layer and paint stale parent-page content into the fixed element's band.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-21

    artifact

    internal agent platform

    s2 / Application

    An off-screen panel makes overflow:hidden a scroll container, so scrollIntoView drags the whole fixed UI sideways

    Root cause

    Two things combined. (1) The closed drawer is parked with transform:translateX(100%) at right:0, and a transformed element still contributes scrollable overflow to its ancestor, so the shell container had 360px of hidden scroll range.

    Signal: Loud / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-21

    github

    agency infrastructure

    s2 / Verification

    Reported success

    GitHub CI red for 16 days: ci.yml references repo secrets that were never created

    Root cause

    The auth-gate work on <phone> added Supabase env requirements to the build and wrote ci.yml to read them from repo secrets, but the secrets themselves were never created in the GitHub repo settings. The workflow was merged without ever running green on master (the "a new CI gate leaves main already red" pattern).

    Signal: Silent / found by audit / class E / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-21

    next

    agency infrastructure

    s3 / Verification

    Reported success

    A readiness probe on localhost:3000 passed against ANOTHER session's app, so every content check was void

    Root cause

    This box runs many parallel worktrees and other sessions' dev servers. Port 3000 is the default for all of them, so a curl readiness probe cannot tell "my server is up" from "somebody else's server is up". curl -sf only checks the status code, and the squatting app returned 200.

    Signal: Silent / found by audit / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-21

    next

    agency infrastructure

    s3 / Infrastructure

    fresh worktree build fails prerendering: no.env.local, Supabase client throws on /courses/self-healing-systems

    Root cause

    Git worktrees do not inherit untracked env files. <internal-project>'s marketing course pages create a Supabase server client at prerender time, so NEXTPUBLICSUPABASEURL/KEY must exist at build time, not just at runtime. The fresh worktree had no.env.local.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-21

    next

    agency infrastructure

    s3 / Application

    Reported success

    : a colocated opengraph-image.tsx never ships, because buildMetadata always sets openGraph.images

    Root cause

    Next's file-convention opengraph-image only fills in when the page's metadata does not set openGraph.images. <path> buildMetadata ALWAYS sets images: [{ url: ogImage ?? "/og-default.png",... }], so an explicit value is present on every page and the file convention can never win.

    Signal: Silent / found by audit / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-21

    next

    agency infrastructure

    s3 / Application

    Reported success

    next/image emitted a 24px avatar variant, so pixel-art faces rendered upscaled on 2x screens

    Root cause

    next/image sizes its generated variants from the width prop, not from the source file. For a small fixed-size image the 1x variant is what the browser gets, and on a 2x screen that is an upscale. For a pre-sized capture the default quality 75 re-encode throws away detail that was already exactly right.

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-21

    next

    agency infrastructure

    s3 / Application

    Reported success

    stage-fit container query resolved against the viewport, so hero windows overflowed their stage

    Root cause

    Container query length units (cqw) silently fall back to the small viewport when no ancestor declares containment. The scaling rule was authored for StageMount (which has @container) and reused in ProductHero (which did not), so the same class produced a viewport-relative scale in one place and a stage-relative scale i...

    Signal: Silent / found by human / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-21

    next

    agency infrastructure

    s3 / Verification

    Wrong signal

    A tight SVG viewBox shaves a non-scaling stroke, and a clipping test aimed at the wrong layer proves nothing

    Root cause

    MARKVIEWBOX ("<phone>") is drawn tight to the glyph: the path bbox is 876.89 x 859.29 starting at x=101.11, so the window leaves 2.11 user units of margin on the left and 1.0 on the right.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-21

    shell

    agency infrastructure

    s3 / Verification

    Reported success

    Piping a gating command through tail reports the pipe's exit code: a failed next build read as "completed exit 0"

    Root cause

    A shell pipeline's exit status is the LAST command's. Piping a verification/build command through tail, grep or head replaces its exit code with the filter's, so a red build reports green. Background task notifications report that masked code.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-21

    vercel

    agency infrastructure

    s2 / Infrastructure

    Reported success

    Piping a value into `vercel env add` silently creates an EMPTY environment variable

    Root cause

    vercel env add reads the value interactively; piping it does not reliably supply the value, and the command still exits 0 having written an empty string. Nothing downstream complains at write time.

    Signal: Silent / found by audit / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    advizr

    internal agent platform

    s1 / Data

    Reported success

    <host> published three fabricated case studies for 72 days with no gate

    Root cause

    The site build session invented plausible anonymised stories to fill the proof page, and no gate required an anonymised story to cite an engagement record. The <phone> claims surgery only banned specific legacy literals, so numbers that were never on the ban list survived.

    Signal: Silent / found by audit / class D / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    google

    agency infrastructure

    s2 / Third party

    Google Ads modal panels never render under browser automation, blocking campaign settings, brand guidelines and the Google tag data sources

    Root cause

    Not fully diagnosed, but the ad blocker banner Google shows on every page is a RED HERRING and was ruled out. The automation profile at <path> holds exactly two extensions, both Google's own defaults: ghbmnnjooekpmoecnnnilnnbdlolhkhi (Google Docs Offline) and nmmhkkegccagdldgiimedpiccmgmieda (Chrome Web Store Payments)...

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Application

    Reported success

    : articleSchema silently dropped the `about` client Organization on every case-study page

    Root cause

    Excess-property checks do not apply to spread expressions in an object literal, so a key the function does not accept passes tsc and is dropped at runtime. The builder function had no about parameter.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s2 / Application

    Reported success

    : body font computes to ui-sans-serif, Geist Sans never applies

    Root cause

    Hypothesis, not yet proven by a fix: <path> declares --font-sans: var(--font-geist-sans), system-ui, sans-serif inside @theme inline, and body { font-family: var(--font-sans) } reads the runtime custom property.

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Application

    : department titles rendered "| <internal-project> | <internal-project>" because the data carried the suffix the layout template appends

    Root cause

    Two layers both owned the site suffix. The root layout's Metadata.title.template appends "| <internal-project>" to every page title, and the department data was authored with the suffix inline (copying the visible tab title rather than the contract services/shared.ts documents: "<title> without '| <internal-project>' (...

    Signal: Loud / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Application

    Reported success

    : FooterPlate dimension tags render at 8.87px on phones, on every page

    Root cause

    The phone width class on the AMarkBlueprint svg (w-[200px]) shrinks the whole 248-unit drawing, and the fig-tag text inside scales with it because SVG text has no minimum size.

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s2 / Application

    Reported success

    mega-menu By industry column shrank to one link when #78 changed proof tiers

    Root cause

    A navigation list was derived from a data honesty gate (proofStatus) that a different PR was entitled to change. The derivation coupled layout capacity (a four-row column) to editorial proof tiers with no assertion on the result, so an honest data change elsewhere produced a silent UI regression in a file the data PR n...

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s2 / Application

    Reported success

    : SectionStage sticky stage never stuck because the grid used lg:items-start

    Root cause

    position: sticky only travels within its containing block. align-items: start (or align-self: start) on a grid or flex item shrinks that item to content height, which makes the containing block exactly as tall as the sticky element, so it can never stick.

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Application

    Reported success

    : SpineList industry mini figures draw 13px labels at 5.6 to 9.9px from md to 1440

    Root cause

    SpineList.tsx renders a 288-unit (or wider) mini figure into a 3/12 grid column capped at 220px, with no labelScale and no width floor, so the label scale is 0.76 at best and 0.5 at md.

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Application

    Reported success

    : toLowerCase() on a department label flattened acronyms ("The engineering and it day, drawn twice")

    Root cause

    A whole-string toLowerCase() was used to write a proper label mid-sentence. Labels contain acronyms (IT, HR) that must keep their case, so the transform has to touch only the first character, and only when the first word is not itself an acronym.

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Verification

    Wrong signal

    Dense nav panel verification: spec assumed taxonomy v2 data (14 systems / 5 families) that is not in the branch, and column 4 alone pushes panel height to 684px

    Root cause

    Two independent causes. (1) The branch's data layer has only 5 services across 3 families (revenue 2, operations 2, teammates 1); SERVICENAVGROUPS deliberately skips empty families ("no orphaned heading"), so knowledge/governance headings cannot render until their first service lands, the verification spec assumed syst...

    Signal: Wrong signal / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Infrastructure

    Reported success

    Git Bash $! PID of a backgrounded `next start` is not the Windows PID, so taskkill cannot find it

    Root cause

    In Git Bash (MSYS), $! is the MSYS-level PID of the nohup/npx shim, not the Windows PID of the node.exe that ends up owning the port. taskkill and Stop-Process only know Windows PIDs, so the recorded PID is useless and the server survives.

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s2 / Application

    Reported success

    Lightning CSS drops a transform rule that uses tan()/atan2(), so the stage-fit scale never applied

    Root cause

    Lightning CSS, which Tailwind v4 uses to minify, validates transform values and silently removes a declaration it cannot parse; trig functions and the cqw-in-trig unit-stripping trick are not in its grammar. The rule then has no declarations left and is dropped entirely.

    Signal: Silent / found by human / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Application

    Reported success

    Solutions mega-menu panel overflowed the left viewport edge by 22px at 1024 despite a comment calling 720px "the proven fit"

    Root cause

    A centered dropdown's maximum width is bounded by twice the trigger's distance to the nearest viewport edge, and that distance shrinks with the viewport (546 at 1440, 466 at 1280, 338 at 1024). The width was chosen at a wide viewport and the "proven at 1024" claim was written without a measurement at 1024.

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s3 / Application

    Reported success

    Sticky stage never stuck: grid items-start made the sticky's parent exactly its own height

    Root cause

    align-items: start on the grid stops the column from stretching to the row height, so position: sticky has no containing block taller than itself. The first visual QA pass relied on full-page screenshots, which cannot show sticky behaviour.

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    next

    agency infrastructure

    s2 / Application

    Reported success

    <host> renders no Geist at all: next/font variables sit on body, Tailwind theme vars resolve on:root

    Root cause

    <path> applies ${geistSans.variable} ${geistMono.variable} to <body>, so --font-geist-sans and --font-geist-mono exist from body downward. Tailwind v4 emits the @theme tokens --font-sans: var(--font-geist-sans), system-ui, sans-serif and --font-mono: var(--font-geist-mono), ui-monospace, monospace on:root,:host (@layer...

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-20

    npm

    agency infrastructure

    s3 / Infrastructure

    drive-browser skill dead: an npm run in the user home pruned <path>

    Root cause

    The drive-browser skill (and ad-hoc Playwright scripts) resolve playwright by walking up from ~/.claude/skills/... to <path>, an ad-hoc user-level install with no package.json.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    vercel

    internal agent platform

    s3 / Verification

    Reported success

    next.config.ts import of a src module with an @/ alias import fails only on Vercel

    Root cause

    The next.config.ts compiler resolves imports without the tsconfig paths alias, so any file reached from next.config that uses "@/..." breaks at config load time. tsc cannot catch it because tsc does honour the alias.

    Signal: Silent / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-20

    vitest

    agency infrastructure

    s3 / Verification

    : vitest cannot import any component that pulls in next-view-transitions (next/link resolution)

    Root cause

    next-view-transitions imports the extensionless "next/link" specifier, which Next's bundler resolves but Node ESM under vitest does not. Every data-level test that imports a component tree containing the site Link trips over it.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    advizr

    internal agent platform

    s1 / Application

    Reported success

    Deactivating a user in <internal-project> does not revoke their live session

    Root cause

    Authentication is a stateless JWT and the portal gate trusts the role claim inside it rather than the users row it then fetches. Deactivation is a database write, so it cannot reach a token that was already minted.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-08-19

    branded

    agency infrastructure

    s3 / Verification

    Wrong signal

    PDF overflow detector anchored on body text and reported clean pages as spilling

    Root cause

    The detector located the footer by text match alone: any block containing "<internal-project> AI INC.". In the SOW's governance section that string is also a two-word lane heading at y=110, so min(y) picked the heading and every block below it was flagged.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-19

    branded

    agency infrastructure

    s3 / Verification

    Wrong signal

    Placeholder guard fires on inlined content that names the placeholder

    Root cause

    The unsubstituted-placeholder guard runs after inlining. Once content is inlined, an occurrence of the placeholder token inside that content is textually indistinguishable from one the substitution missed.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-19

    branded

    agency infrastructure

    s3 / Verification

    Wrong signal

    Placeholder regex __[A-Z0-9_]+__ matches a run of underscores on a signature line

    Root cause

    The pattern has no anchor requiring an actual identifier between the delimiters. Inherited unchanged from decks/build-acquisition-memo.py, where it never fired because that document is a memo with no signature block. The defect was latent for as long as no document in this style had a form field in it.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-19

    github

    client agent platform

    s2 / Verification

    Wrong signal

    lint-and-typecheck went calendar-red: Bmp3 scope flags exceed the 14-day rolling_out limit

    Root cause

    The declared-levers stale-rollout gate compares each flag's rollingout start date to ROLLINGOUTMAXDAYS=14 at run time, so a rollout that never graduates turns the whole repo red by calendar with no commit involved. The two flags belong to the Bmp3 programme.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    github

    client agent platform

    s2 / Verification

    Wrong signal

    Template CI: a time-based flag-lifecycle gate turns master red with no commit: every open PR fails lint-and-typecheck

    Root cause

    <path> fails a flag left at stage 'rollingout' for more than ROLLINGOUTMAXDAYS (14). The check is a function of the CLOCK, not of the diff, the flag registry entries have not changed, they merely aged.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / no prevention rule

  • 2026-08-19

    google

    agency infrastructure

    s2 / Application

    Reported success

    Google Ads recorded 0.00 conversions on CA$208.30 of Performance Max spend because the conversion label shipped empty

    Root cause

    SITE.adsBookingLabel in <path> shipped as "" when PR #11 landed on <phone>, and trackBookingCompleted() in <path> returns early when the label is empty (if (!SITE.adsBookingLabel) return;).

    Signal: Silent / found by audit / class C / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-19

    google

    agency infrastructure

    s2 / Third party

    Wrong signal

    Google Ads tag data source is registered as <host>, not <host>, so the tag reads NEEDS ATTENTION and no lead-form conversion action can be created

    Root cause

    Not fully diagnosed. The most likely explanation is that when the Google tag was set up, the website given to Google was the <host> booking URL rather than <host>, so Google registered <host> as the tag's data source.

    Signal: Wrong signal / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    next

    client agent platform

    s3 / Verification

    Reported success

    next build fails on Node 20.17 with ERR_REQUIRE_ESM (isomorphic-dompurify → @css<path>), and a piped build masked the failure

    Root cause

    Local machine runs Node v20.17.0 where require() of an ES module is still behind --experimental-require-module (unflagged in Node 20.19+/22.12+). Vercel/CI build on newer Node so master builds there.

    Signal: Silent / found by check / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    next

    internal agent platform

    s3 / Verification

    Reported success

    Local Lighthouse target port was held by a foreign server answering 200 with plausible content

    Root cause

    Multiple parallel worktree sessions on this box run next start on hardcoded ports. A generic content gate ("page title present") cannot distinguish my build from a sibling's, because all worktrees serve the same site.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    next

    agency infrastructure

    s3 / Application

    React keys and component-null indirection leak into the prerendered RSC payload, breaking byte-identity refactors

    Root cause

    The Next.js prerendered HTML embeds the RSC flight payload, which serializes the element tree exactly as constructed: element keys are written into the payload (["$","section","hero",{...}] vs ["$","section",null,{...}]), and a server-component element that resolves to null becomes an outlined lazy row instead of the l...

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-19

    next

    internal agent platform

    s3 / Verification

    Wrong signal

    Section reorder broke the visible heading outline because Reveal hides h2s at audit time

    Root cause

    axe evaluates heading order over visible headings. Reveal-wrapped h2s are hidden below the fold when the audit snapshots the page, so any section order that puts a heading-less band between the hero and an h3-bearing section skips a level.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    next

    internal agent platform

    s3 / Application

    Signed >> in slug-hash seeding produced negative SVG coordinates

    Root cause

    JavaScript >> is a signed shift: a uint32 with the high bit set shifts to a negative number, and % preserves the sign. Only >>> keeps hash-derived values unsigned.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    next

    internal agent platform

    s3 / Verification

    Reported success

    TaskStop left next start holding the port, so Lighthouse audited a stale build

    Root cause

    On Windows, stopping the background bash wrapper does not kill the node child process; the orphan keeps the listening socket. The replacement server exits on EADDRINUSE, invisibly when stdout is redirected.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    next

    agency infrastructure

    s3 / Verification

    Wrong signal

    Wave-1 test invariant "beforeAfter before proof" fails every founding-tier class C industry page

    Root cause

    The gate was written in the wave-1 era when every composed page was proofStatus "anchored" and the proof section always rendered case evidence primed by the before/after band.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    next

    internal agent platform

    s3 / Verification

    Wrong signal

    Wave-1 vitest gate "beforeAfter before proof" fails every offer-forward waves 2-4 industry page

    Root cause

    The wave-1 test encoded that wave's proof-forward section orders (all four shipped pages open hero, logos, pains, beforeAfter, proof) as a universal invariant, and the waves 2-4 set audit verified drafts against its own written contract (beforeAfter in first 6) without running the live vitest suite, so the divergence s...

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    railway

    internal agent platform

    s2 / Third party

    Reported success

    Railway deployments stick in INITIALIZING with no associated build, silently keeping the old container

    Root cause

    Railway-side build scheduling, proven by control experiment: the last-known-good tree fails the same way. Not the image, not the code, not the dependencies. The earlier hypothesis that /v2/run blocking the uvicorn event loop was stalling a graceful drain is NOT supported, because the control deploy stalled with no traf...

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    railway

    internal agent platform

    s2 / Third party

    Reported success

    Railway deployments stick in INITIALIZING with no associated build, silently keeping the old container

    Root cause

    Not fully diagnosed, and it is Railway-side rather than in the image: the same Dockerfile and a 9.4MB upload built and deployed fine hours earlier, the build that did run installed every dependency and pushed the image successfully, and the module imports cleanly under the exact importlib.importmodule call /health make...

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-19

    supabase

    fleet admin console

    s1 / Data

    Owner role flip took 3 staff off all 11 client tenants: a new value written to a shared role column before the fleet's readers shipped

    Root cause

    users.role on master is read by twelve deployments: the admin portal, the router, and every client fork. <internal-project> shipped support for a new value ('owner') and the row was flipped before the client-template change (PR #2199) had merged or rolled to the fleet.

    Signal: Loud / found by client / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-08-19

    vercel

    fleet admin console

    s3 / Application

    Two owner-only admin routes 500 in production: they read tenant audit_events via getClientSupabase(), whose env vars are unset

    Root cause

    Both routes call getClientSupabase() (<path>), which throws unless NEXTPUBLICSUPABASEURL and SUPABASESERVICEROLEKEY are set. Neither is set on the <internal-project> deployment, confirmed by grepping the production env pulled to.env.local (0 matches).

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / no prevention rule

  • 2026-08-18

    advizr

    internal agent platform

    s2 / Verification

    Reported success

    main is red on its own preflight: #26 merged an em dash because the repo had no CI

    Root cause

    <internal-project>/<internal-project> had no CI whatsoever. git ls-tree -r --name-only origin/main | grep -c "^.github" returned 0. <path> existed and encoded real constraints (banned claims, literal prices, retired guarantee wording, wrong-domain email, em dashes) but only ran when a human remembered to run it locally...

    Signal: Silent / found by audit / class E / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-18

    claude

    internal agent platform

    s3 / Verification

    Reported success

    Monitor piping gh output through jq emitted nothing and burned its full 20-minute timeout

    Root cause

    There is no standalone jq binary on this machine. Every pipeline stage that shelled out to jq failed, so cur was always empty, comm -13 diffed empty against empty and printed nothing, and the jq -e break condition never evaluated true, so the loop ran to its full timeout instead of exiting on completion.

    Signal: Silent / found by human / class A / no MAST mode

    Resolution written / no prevention rule

  • 2026-08-18

    composio

    internal agent platform

    s2 / Orchestration

    Reported success

    24k tool-schema ceiling silently dropped connected apps' wide-parameter READS (only the canonical write was protected)

    Root cause

    The ceiling drop policy used token size as a proxy for "reads are cheap". That proxy inverts for wide-parameter reads, so the browse action a customer connected the app to use was dropped every step while its cheap write was protected.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    composio

    internal agent platform

    s2 / Orchestration

    Reported success

    Composio loader failed OPEN to [] on a shared 6s deadline, dropping ALL connectors for a turn (vanish-then-reappear)

    Root cause

    Fail-open-to-[] plus one shared Promise.all deadline meant any transient Composio slowness dropped the entire connected toolset for that turn, and the model narrated the gap as a disconnected app.

    Signal: Silent / found by human / class D / MAST FM-2.6

    Open / prevention rule written

  • 2026-08-18

    drive

    agency infrastructure

    s3 / Verification

    Wrong signal

    drive-browser step reported a false failure: waitForFunction on \\"body text changed\\" resolves on the button's own \\"Sending…\\" label and races the request

    Root cause

    The step used page.waitForFunction((prev) => document.body.innerText !== prev, before) as its post-click settle. That predicate resolves on the FIRST DOM mutation after the click, and the first mutation is the button relabelling itself to "Sending…", not the server's response.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    evals

    agency infrastructure

    s2 / Verification

    Reported success

    Regression cases written from a transcript passed against the broken prompt and proved nothing

    Root cause

    The harness did not reproduce the conditions of the failure. It ran single-turn, at temperature 0, with no retrieved documents and no tools declared, while the incident was 4 turns deep at temperature 0.3 with a knowledge-base hit and a booking tool available.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    next

    client agent platform

    s2 / Orchestration

    Bound-execution path dropped the Composio consumer entity: every approval-gated Composio action failed the moment a human approved it

    Root cause

    executeBoundProposal() (<path>) calls executeSkill() DIRECTLY, bypassing the chat/runner/tool-exec entry points that resolve the Composio entity. It set ctxBase.userId from resolveProposalOwnerUserId() but never set ctxBase.consumerEntityId.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    next

    internal agent platform

    s2 / Infrastructure

    Docs demo-clip recording blocked: template worktree symlinked to a stale hub missing 14 master deps

    Root cause

    The docs-coverage worktree symlinked nodemodules to the interact-plan-inline-wt hub, which is on an older branch and was missing 14 deps that current origin/master needs (cronstrue, js-tiktoken, react-virtuoso, @lobehub/icons-static-svg, @tiptap/, prosemirror-changeset).

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    next

    internal agent platform

    s3 / Verification

    Wrong signal

    Template CI typography gate: moving baselined headings to a new file trips no-raw-heading

    Root cause

    <path> enforces no-raw-heading (raw <h1>-<h6> outside a heading-primitive/owner file) against <path> Pre-existing raw headings are grandfathered in the baseline BY FILE.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    railway

    internal agent platform

    s2 / Infrastructure

    Reported success

    Pipeline stage Slack notifier: hardcoded fallback channel IDs all point at ARCHIVED channels; per-client pipeline services have zero Slack env: stage notifications silently dead ~200 days

    Root cause

    Channel generation was replaced (#<internal-project> channels superseded the unnumbered set, which was archived) but the hardcoded fallbacks were never repointed, env overrides were never provisioned, and postmessage failures are non-fatal and unlogged, triple silent failure.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    railway

    internal agent platform

    s2 / Application

    Reported success

    unified-pipeline /v2/run is publicly callable on Client D and Client H (auth fails open)

    Root cause

    services/unified-pipeline/main.py verifyauth ends with an explicit fail-open branch: "if not pipelinekey and not agentkey: return True # If neither key is configured, allow (matches existing behavior)". It was written to preserve backward compatibility with pre-auth callers.

    Signal: Silent / found by audit / class C / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-08-18

    slack

    internal agent platform

    s2 / Infrastructure

    Reported success

    #<internal-project> carried fleet SEV1/SEV2 digests with ZERO human members: 9 standing SEV1s reported twice daily to nobody

    Root cause

    Channel was bot-created (or created and never staffed); nothing asserts that an alert destination has human members, same "alerting into the void" class as the unset-webhook incidents.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vapi

    agency infrastructure

    s2 / Third party

    Wrong signal

    A single Vapi GET /phone-number returned 1 of 2 numbers, so an imported number read as absent

    Root cause

    A single list read was treated as proof of absence. The endpoint returned an incomplete collection on the first call (stale replica or transient), and nothing in the response distinguishes "this is everything" from "this is some of it", there is no total count and no pagination cursor to check.

    Signal: Wrong signal / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vapi

    agency infrastructure

    s2 / Third party

    Reported success

    Renaming a Vapi assistant defeats the name-match duplicate guard, so provisioning would create a second one

    Root cause

    resolveExistingAssistantId() has three fallbacks: the gitignored <path> file, channels.config.providerassistantid in Supabase, and finally Vapi matched on assistant NAME. In a fresh checkout the first is absent and the second needs Supabase env that was not set, so everything rested on the name match.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vercel

    internal agent platform

    s2 / Third party

    Reported success

    Vercel deploys fail instantly with no build logs: production frozen on a 14-day-old build

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vercel

    internal agent platform

    s2 / Infrastructure

    prod SLACK_BOT_TOKEN stored with trailing newline: every runtime Slack call from that project throws on the Authorization header

    Root cause

    vercel env add preserves whatever bytes it is piped, a paste with a trailing newline stores the newline in the secret; nothing validates the shape of the token at set-time or at use-time.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vercel

    client agent platform

    s2 / Infrastructure

    Reported success

    Blank env levers struck again: COMPUTER_USE_NODE_ENABLED + NEXT_PUBLIC_WF_DEMONSTRATE stored as empty strings on demo prod

    Root cause

    Three stacked causes: (1) env levers stored as empty strings (vercel env add via pipe with a trailing-newline-only value); (2) the computeruse node handler checked only agents.status and never the roster predicate (skills grant + blockedtypes), so it dispatched coworkers that could never be offered the tool; (3) comput...

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vercel

    fleet admin console

    s2 / Third party

    GITHUB_TOKEN blocked by enterprise policy (fine-grained PAT lifetime > 366 days): template updates AND provisioning are down fleet-wide

    Root cause

    The GitHub org ('<internal-project>' enterprise) now enforces a policy forbidding fine-grained PATs whose lifetime exceeds 366 days. The long-lived GITHUBTOKEN baked into the deployed envs was minted before/against that policy and is now rejected on EVERY repo call with 403.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vercel

    internal agent platform

    s2 / Application

    Reported success

    Path-scoped Permissions-Policy is defeated by client-side navigation (mic dead on every client portal)

    Root cause

    Two layers. ROUTER: <internal-project>'s global Permissions-Policy sent microphone=(), an empty allowlist, which is a hard block for every origin including self, overriding any browser grant. PR #<phone>) added a /template/(.) override with microphone=(self) and left the global block in place for every client slug.

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vercel

    internal agent platform

    s1 / Infrastructure

    Reported success

    SLACK_WEBHOOK_URL unset in every Vercel project: all website lead Slack notifications silently dropped

    Root cause

    The notification path was optional-by-code (silent if (env) skip) and the env var was never provisioned; nothing alerted on the missing config, the same silent-skip class as err-<sha> (provisioning cron webhook).

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-18

    vercel

    agency infrastructure

    s2 / Verification

    Reported success

    Vercel Deployment Protection makes every preview URL return HTTP 200, so curl-based verification silently passes

    Root cause

    Vercel Deployment Protection (SSO) is enabled on the <internal-project> project. Protected preview deployments serve Vercel's authentication page for every path with HTTP 200, not 401 or 302.

    Signal: Silent / found by audit / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-18

    vercel

    agency infrastructure

    s2 / Verification

    Wrong signal

    vercel env pull returns sensitive vars as empty strings, so production looks misconfigured

    Root cause

    Variables marked Sensitive in Vercel cannot be read back through the API. vercel env pull does not fail, warn or annotate them: it writes an empty value or omits the line, producing a file that is syntactically valid and semantically wrong.

    Signal: Wrong signal / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-17

    advizr

    client agent platform

    s2 / Data

    Reported success

    Migration 2620 re-enumerated the document_sources provider CHECK against the TEMPLATE tenant, and would have thrown 23514 on Client C mid-release

    Root cause

    2620 DROPs and re-ADDs documentsourcesprovidercheck with a full re-enumeration of the allowed providers. Its header records the 229/464 verification ritual -- live DISTINCT provider checked before shipping -- and that check was really run, but against the TEMPLATE tenant <project-ref> only.

    Signal: Silent / found by audit / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-17

    advizr

    client agent platform

    s2 / Verification

    Reported success

    migrations:dry-run read the Supabase CLI ledger, which no provisioned client has, so the fleet's pre-release safety tool was blind to every client tenant

    Root cause

    There are two migration ledgers on an <internal-project> tenant and they do not overlap. public.schemamigrations(name) stores filenames like '891workspaceendpointpolicy' and is what the fleet update engine reads and writes (<internal-project> <path> seeds it for legacy clients, SELECTs name to decide what to skip, INSE...

    Signal: Silent / found by audit / class C / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-17

    advizr

    agency infrastructure

    s3 / Infrastructure

    A clean git merge-file pre-merge produced a duplicate import and failed the client's preview build

    Root cause

    Unblocking a conflicted client for the r<phone>-<sha> rollout means pre-merging the template's changes into the fork with git merge-file and then resolving that path as 'client'.

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-17

    browser

    internal agent platform

    s2 / Data

    <path> does not exist on master, so CLAUDE.md's standing browser instruction fails on a fresh checkout

    Root cause

    The browser-use tooling and its skill were built on the feat-browser-use worktree and CLAUDE.md was updated to make them a standing agency convention, but the branch was never merged.

    Signal: Loud / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-17

    github

    internal agent platform

    s3 / Verification

    Reported success

    CI 'checks' gate is dark: npm test red since a github.ts extensionless import broke the native-TS runner

    Root cause

    <path> imports classifyWorkflowExecution from '../.<path>'. Node's native TS type-stripping runner (node <file>.ts) requires EXTENSIONFUL relative specifiers, but github.ts line 7 imports { upsertClientRewrites } from './router' (extensionless), so loading github.ts throws ERRMODULENOTFOUND before any test assertion ru...

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-17

    google

    internal agent platform

    s2 / Third party

    Google Ads MCP is unusable: no Application Default Credentials, so agency ad spend cannot be read

    Root cause

    The google-ads MCP server authenticates via Google Application Default Credentials and ADC was never configured on this machine. The tool schemas load fine and the failure only appears at call time, so the server looks healthy in the tool list.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-17

    next

    internal agent platform

    s3 / Application

    Reported success

    Next.js metadata `alternates` merges by replacement, so RSS autodiscovery in the root layout rendered on zero pages

    Root cause

    Next.js merges the metadata export per top-level field by REPLACEMENT, not deep merge. Every route in <internal-project> calls buildMetadata() from <path>, which returns alternates: { canonical: url }. That object wholly replaced the root layout's alternates, discarding types.

    Signal: Silent / found by audit / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-16

    advizr

    agency infrastructure

    s2 / Verification

    Reported success

    Retiring a claim in claims.ts does not retire it from the site: 92% shipped for a week after deletion

    Root cause

    claims.ts is architected as "THE single source of truth for every number that appears on <host>", and the team treated deleting the field as completing the retirement.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-16

    github

    internal agent platform

    s2 / Verification

    Test-loaded lib module with a runtime relative import breaks native-node CI (passes local tsx/tsc)

    Root cause

    The repo's npm test runs test files under native node (strip-types). Type-only imports (import type) are erased so they never resolve, but a runtime relative import needs an explicit extension under native ESM.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-16

    linkedin

    agency infrastructure

    s2 / Orchestration

    Reported success

    LinkedIn outreach sent 25 requests in 6 weeks: the launch throttle was a parked lead pool nobody released

    Root cause

    The platform has no working per-day connection cap: the per-action safety gate is inert, the scheduler's daily gate requires BOTH connections and messages to exceed limits before it trips (which never happens on a connect-only day), and two recovery paths queue work with no cap check.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    advizr

    internal agent platform

    s3 / Verification

    Reported success

    Local e2e drive verified the wrong lens: <path> resolves the role from the profile, not the JWT claim

    Root cause

    <path> computes rbacRole = mapDbRole(session.user.role, clientRole) where both inputs are resolved server-side from the profiles row for that userId (<path> resolveClientRole). The JWT role claim is not authoritative for the UI lens. A cookie can therefore claim 'client' and render the admin tree, silently.

    Signal: Silent / found by audit / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    advizr

    internal agent platform

    s3 / Verification

    New library archetype fails CI: ARCHETYPE_TASK_AREA and model-gauntlet gates not in the obvious local sweep

    Root cause

    Adding a library agent definition requires classifying its archetype in the ARCHETYPETASKAREA map; the library-consistency suite does not check it, so a definition that passes every library- test still reddens task-areas and model-gauntlet, which only surface in the FULL unit suite.

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    advizr

    internal agent platform

    s3 / Verification

    Wrong signal

    starter-packs forced re-run duplicates inbound triggers (18 vs 10): master-inherited red in unit-tests, only reproduces in the full CI run

    Root cause

    Introduced by PR #2134 ([Bros PR-3] Starter packs for the missionless seeded agents), which added <path>, packs/support-desk.ts, registry.ts entries and tests/unit/starter-packs.test.ts. #2134's own unit-tests job passed, so it merged clean.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    claude

    internal agent platform

    s3 / Third party

    Gmail MCP connector is authorized read-only: every mutation fails with "insufficient authentication scopes"

    Root cause

    The <host> Gmail connector's OAuth grant carries only gmail.readonly. The write scope (gmail.modify) was never consented to, so every state-changing tool the connector advertises, markmessagespam, trashmessage, labelmessage, createdraft, reply, sendmessage, updatelabel, is present in the tool list and callable but reje...

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    git

    internal agent platform

    s3 / Infrastructure

    generate-px-avatars.sh hangs on Windows before spawning any job when only a few keys are missing

    Root cause

    Not fully diagnosed. The main loop reads rows from a process-substitution pipe while backgrounded genone subshells inherit the same stdin; on Windows git-bash this combination can wedge (the row-feed python never advances and no generation child launches).

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    git

    client agent platform

    s3 / Infrastructure

    Reported success

    git checkout origin/master -- then checkout HEAD -- destroys uncommitted edits during a fails-without-fix proof

    Root cause

    git checkout <ref> -- <path> overwrites the working tree unconditionally. Before the work is committed, HEAD does not contain it, so "checkout HEAD to undo the temporary master checkout" restores the OLD file, not the edited one.

    Signal: Silent / found by human / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    master CI pre-existing red blocks PRs (recurrence: workflow-page-canvas-first dry=1)

    Root cause

    A master commit changed the workflow run call to drop the dry=1 param (or changed the safe-test default) without updating the canvas-first dom test; every PR branched after it inherits the red on the required unit-tests check.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    github

    internal agent platform

    s3 / Verification

    Reported success

    Copy gate escapes the local sweep: check-copy lives in consumer-simplicity-gate.yml, and flagless runs are report-only

    Root cause

    Two compounding misses. (1) The "reproduce CI locally" sweep enumerated gates from ci.yml's lint-and-typecheck job only; <internal-project> runs additional REQUIRED gates in sibling workflow files (consumer-simplicity-gate.yml, visual, evals, pr-ack).

    Signal: Silent / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    higgsfield

    internal agent platform

    s3 / Orchestration

    Reported success

    Duplicate avatar-generation launches hit the Higgsfield concurrency cap and burned 12 credits

    Root cause

    Backgrounded Bash tool commands on Windows/git-bash can keep running after the harness stops tracking them (parented to init), so "no live background children" does not mean the process died. Launching a replacement created two concurrent generator instances sharing one 4-job account cap.

    Signal: Silent / found by audit / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    next

    internal agent platform

    s3 / Verification

    A clean git rebase can still fail tsc when master tightened a shared component's props

    Root cause

    A no-conflict rebase only guarantees textual mergeability, not type compatibility: when the base branch tightens a shared component/type (here PageShell.children optional -> required), your unchanged call sites can newly fail tsc.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    next

    internal agent platform

    s2 / Verification

    A new workflow node kind leaks into the AI builder prompt, its byte baselines, and node-kind value maps

    Root cause

    Adding a workflow node kind (<path>) widens ALLKINDS/WorkflowNodeKind, which ripples into: (a) the AI workflow-builder system prompt (describeNodeKindsWithRequirements enumerates ALLKINDS), breaking byte-identical baseline fixtures (workflow-builder-prompt-longtail, -connector-context-flagoff); (b) exhaustive node-kind...

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    next

    internal agent platform

    s2 / Verification

    Adding a commit-routed catalog intent silently reddens the trust-page editorial gate

    Root cause

    The trust page view-model (<path>) is DERIVED from COMMITROUTEDBUILTINS, and tests/unit/trust-page-claims.test.ts pins a hardcoded count of gated actions (7 high|critical + 4 medium = 11). Any new commit-routed catalog entry ripples into the trust page's rendered surface AND that canary count.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-15

    next

    internal agent platform

    s2 / Verification

    Reported success

    computer_use workflow node reported green without ever running the browser (two paths)

    Root cause

    Two independent false-success paths. (1) The graph-executor Test pin short-circuit replayed a node's metadata.pinnedoutput as green WITHOUT invoking the handler; a recorded computeruse node carried such a sample.

    Signal: Silent / found by audit / class D / MAST FM-3.3

    Open / prevention rule written

  • 2026-08-15

    next

    internal agent platform

    s2 / Application

    Reported success

    RSC fetch for the bare tenant home 404s at the router: client-side push to '/' hard-navigates fleet-wide

    Root cause

    Two stacked causes. Infra: the router forwards /template/:path documents but 404s the bare-slug RSC request form (?rsc), so soft navigation to '/' is impossible fleet-wide and Next silently downgrades to a full page load.

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    react

    internal agent platform

    s2 / Application

    Reported success

    Tour reveal listener lived in a component the reveal itself mounts: event fired before the listener existed

    Root cause

    A window CustomEvent is a one-shot broadcast. Any component that mounts in response to that same event (here: children of a Radix Collapsible the event expands) cannot subscribe in time. The jsdom test missed it because its fixtures were plain always-mounted buttons, not the real conditionally-mounted sidebar tree.

    Signal: Silent / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    vercel

    internal agent platform

    s2 / Infrastructure

    Reported success

    Boolean env flag set to empty string reads as OFF; a strict === 'true' guard keeps the feature dark while `env ls` shows it "present"

    Root cause

    The flag was earlier enabled by adding the Vercel env var with an empty/blank value instead of true (likely an empty-stdin or blank interactive prompt). The code uses strict equality === 'true', so presence of the var is not enablement, only the exact value true is.

    Signal: Silent / found by audit / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    vercel

    client agent platform

    s1 / Orchestration

    Model routing overlay 400s every routed call: OpenRouter models[] exceeds 3-item cap

    Root cause

    <path> getTierFallbacks appends the STATIC tier fallback floor after the routed chain's tail (dedupe only). A routing row with primary + 2 fallbacks plus the static floor yields an OpenRouter body.models[] of 4-5 entries; OpenRouter hard-rejects anything over 3, so the reliability floor designed to make a bad routing r...

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-15

    vitest

    internal agent platform

    s2 / Verification

    Wrong signal

    workflow-page-canvas-first.dom.test.tsx flakes in the full unit-tests run (passes isolated): blocks auto-merge fleet-wide

    Root cause

    A DOM test (jsdom) that is order/pollution/timing-sensitive in the full unit-tests run (~hundreds of files) but green in isolation. This is the same 'full vitest run fails on cross-test pollution' / flaky-workflow-DOM-test class already seen on this repo.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s3 / Infrastructure

    : bare `npx tsc --noEmit` OOMs (heap 4GB): run with NODE_OPTIONS=--max-old-space-size=8192

    Root cause

    Repo scale: tsc needs >4GB old-space for the full program on Node 22.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    advizr

    internal agent platform

    s3 / Application

    Reported success

    compileLibraryPackage never split the authored combo name, so every marketplace-installed teammate landed with "Sam: CRM Data Steward" on its row and no persona

    Root cause

    The convention is real and documented: agents.name stores the ROLE TITLE alone and the first name lives in config.persona.name (<path> rosterNameOf). The em dash in <path> is an AUTHORING-time encoding, and six consumers decode it via firstNameOf/roleTitleOf (<path>).

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    advizr

    internal agent platform

    s2 / Orchestration

    intent-packs pass template slugs as agents.type, so all five vertical starter agents violate the agents_type_check CHECK and can never be created

    Root cause

    Two different vocabularies share the name "type". <path> keys archetypes by SLUG ('customer-support', 'data-analyst'); the agents table column type is a six-value taxonomy enum guarded by a CHECK.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    claude

    internal agent platform

    s3 / Infrastructure

    Reported success

    Bash tool truncates a very long inline command, ending a heredoc early and writing a truncated file

    Root cause

    Very long inline Bash commands (roughly >4-8KB, e.g. a full PR body inside a quoted heredoc) can be truncated before execution; the heredoc then never terminates and everything after the cut is misparsed. The failure mode surfaces as a shell syntax error pointing at an innocent quote character, not as a length error.

    Signal: Silent / found by human / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    composio

    client agent platform

    s2 / Orchestration

    Reported success

    Composio app with minted auth config but no manifest shows "Connected" with zero agent tools (fireflies)

    Root cause

    Two registries with no cross-check: the auth-config ledger (what is connectable) and APPMANIFESTS (what exposes tools) could disagree silently. A minted config with no manifest is connectable-but-useless, and nothing failed until a user hit the empty toolset.

    Signal: Silent / found by audit / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    git

    client agent platform

    s3 / Infrastructure

    Reported success

    git checkout -- file after a sed mutation probe wiped ALL uncommitted edits, not just the probe

    Root cause

    git checkout -- <file> restores from the index, and during pre-commit work the index still holds the base version, git has no notion of "revert only the last change". A mutation probe layered on top of uncommitted work has no git-level undo that preserves the work underneath.

    Signal: Silent / found by human / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    git

    internal agent platform

    s3 / Infrastructure

    Reflexive git stash on a shared-stash repo: the recorded rule violated and recovered

    Root cause

    Habit: "dirty tree before merge → stash" fired before the repo-specific rule was consulted. The correct flow in these worktrees is commit-then-merge, never stash.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    git

    internal agent platform

    s3 / Infrastructure

    act-bhard-3b worktree shipped without its node_modules junction: preflight tsx gates red

    Root cause

    Worktree provisioning created the branch checkout but not the nodemodules junction; a missing junction and a stale junction present identically as ERRMODULENOTFOUND on the first tsx/vitest gate.

    Signal: Loud / found by check / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    github

    client agent platform

    s3 / Verification

    Wrong signal

    Ack gates on order-matters surfaces need label AND a clean ## Deploy plan section: and stray leading backticks break the section regex

    Root cause

    Two-requirement surfaces (label + section) with sequential failure messages, compounded by an invisible body corruption: writing a PR body through a quoted heredoc with escaped backticks then 'fixing' with sed left line-leading backticks that no plain read shows.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    github

    client agent platform

    s3 / Verification

    env.manifest.json edited by hand: it is GENERATED from <path>, and the staleness gate is not in the local preflight sweep

    Root cause

    Two compounding: (1) edited a generated artifact instead of its source, <path> featureVars is the source of truth and the generator holds the strategy table; (2) the local preflight script predates this gate, so "preflight the WHOLE job" silently no longer covers the whole job (the programme-complete-gate-missing class...

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    github

    client agent platform

    s3 / Verification

    Wrong signal

    pr-ack gate needs labels AND a Deploy plan body section AND a fresh event: three separate misses, three CI round-trips

    Root cause

    <path> gates by path surface: migration-ack for <path>, rollout-ack for docs/dark-levers.md, env-ack for <path> trio, worker-ack for cron/queue/vercel.json. migration-ack and env-ack additionally set deployPlan: true which requires a "Deploy plan" section in the PR body.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    github

    client agent platform

    s3 / Verification

    Workflow supply-chain gate missing from the local preflight: second ci.yml gate discovered by CI round-trip this session

    Root cause

    The preflight script is a hand-maintained mirror of ci.yml's gate list and drifts as gates are added; every drifted gate costs one CI round-trip. Two instances in one day is the pattern, not the incident.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    kb

    internal agent platform

    s2 / Verification

    Wrong signal

    kb_resolve_error returns "Unexpected end of JSON input" on every call: resolutions cannot be filed

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Wrong signal / found by check / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    linkedin

    outbound pipeline

    s1 / Infrastructure

    Reported success

    Every watchdog alert filed to a deleted user id: 1,218 orphaned notifications, nine-day outage unalerted

    Root cause

    The alert recipient was a hardcoded constant pointing at the "Visurae" stub admin, which was deleted on <phone> during tenant cleanup as an orphan with zero attached data. Deleting the user did not break anything loudly, because the only thing referencing it was a string literal in a monitoring module.

    Signal: Silent / found by audit / class C / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    linkedin

    outbound pipeline

    s2 / Third party

    LinkedIn login form field found by the detector then times out in humanize seconds later

    Root cause

    Not established. The selector is correct and was observed visible moments earlier by the same page object, so this is a timing, navigation or frame-context problem between detection and typing rather than a selector problem.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    linkedin

    outbound pipeline

    s1 / Application

    Pasted li_at unusable: session-injection route and worker use two different ciphers that share a name and env var

    Root cause

    Two exported functions named encrypt exist, both keyed off ENCRYPTIONKEY, and they are not interoperable: execution/auth/auth.js hex, "iv:tag:ct" key: base64 first execution/auth/cryptoutils.js base64, "01:iv:tag:ct" key: hex first routes/accounts.js destructures encrypt from utils, which server.js sources from executi...

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    linkedin

    outbound pipeline

    s2 / Third party

    Wrong signal

    Pasted LinkedIn cookie authenticates over API but is rejected in-browser: session minted in Vancouver, replayed through a Montreal proxy

    Root cause

    Geographic mismatch between where the session was minted and where it is replayed, compounded by a spoofed browser fingerprint. The exported jar carries timezone=America/Vancouver, the human logged in from BC. Hudson's dedicated proxy is <phone>, a Montreal IP (~3,700km away).

    Signal: Wrong signal / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s2 / Application

    Reported success

    Recorder narration lost silently: acquireMic() bound OS default with no deviceId and swallowed failures to null

    Root cause

    Two coupled defects: (1) acquireMic hard-bound the OS default input with no device selection and no enumeration, so a wrong or muted default recorded silently; (2) the failure path collapsed every reason (denied / no-device / unavailable) to a bare null, so the UI had nothing to warn with and fell through to a video-on...

    Signal: Silent / found by human / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s1 / Verification

    Reported success

    act worktree briefed as "node_modules provisioned" had none: npx fell back to a stale npm-cache vitest

    Root cause

    Fleet worktrees share one real nodemodules store via NTFS junctions (act-bhard-3 -> act-bonb-w7\nodemodules); a freshly added worktree simply has no junction yet. npx masks the absence by falling back to the npm cache copy, which errors inside vitest.config.ts instead of saying vitest is not installed.

    Signal: Silent / found by audit / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s2 / Verification

    master typecheck broken: #2044 deleted <path> while #2045's tour-asks route still imports it

    Root cause

    Two programmes crossed in the merge window: #2045 ([Bonb] W4, merged first) added <path> importing deriveHomeExampleAsks from @<path> #2044 (feat(home): drop the openers block), authored before #2045 landed, deleted <path> as "the only consumer's pipeline", its reachability claim was stale by merge time.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s2 / Verification

    master red: #2044 deleted <path> but two importers survive

    Root cause

    PR #2044 (feat(home): drop the openers block) deleted <path> while <path> and tests/unit/tour-asks-route.test.ts still import it. lint-and-typecheck red is inherited by every branch rebased onto <sha>. Fix already in flight: PR #2097 restores the module.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s2 / Orchestration

    Reported success

    ask_user parks a chat turn with zero text, so the agent's question renders as dead air and the run closes 'completed'

    Root cause

    The askuser built-in ends the agent loop on purpose and produces no prose, because the question IS the output. <path> has stopWhen: [stepCountIs(maxSteps), () => pause.paused], so the moment askuser requests a pause the loop stops with zero text parts.

    Signal: Silent / found by human / class D / MAST FM-3.1

    Open / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s3 / Verification

    Reported success

    Bare local tsc V8-crashed and masked two tuple-typing errors that CI then caught: vi.fn(async () => []) types params as the empty tuple

    Root cause

    Two causes stacked. (1) vi.fn(async () => []) infers its parameter list as the empty tuple [], so a wrapper spreading unknown[] into it is TS2556 and mock.calls[i][0] is TS2493, a vi.fn double that will be called with args must declare a rest signature.

    Signal: Silent / found by check / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s2 / Application

    Guided-tour welcome resurfaces for a done user on a fresh device: auto-show races the server prefs fetch

    Root cause

    The auto-show condition read the union-merged per-user state before the server half of the union had arrived. isLoading means "localStorage read", not "the answer is known", the exact distinction the onboarding-welcome-flash test docblock records for the legacy modal ("don't know must not render as hasn't"), applied on...

    Signal: Loud / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s3 / Infrastructure

    Junctioned worktree cannot dev-serve or build /interact: React-Refresh injects import.meta into realpathed CJS deps; local build ENOENTs on jsdom asset

    Root cause

    Webpack resolves modules through the junction to their REAL paths (resolve.symlinks), and a real path under <internal-project> no longer contains "nodemodules", so Next's dev loader chain treats the dep as project source and the React-Refresh loader appends import.meta.webpackHot.accept() into a CommonJS file, which ca...

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s3 / Verification

    Reported success

    Parallel subagents share one scratchpad: a sibling clobbered preflight.sh and the gate sweep silently ran against the wrong worktree

    Root cause

    Subagent scratchpad directories are per parent session, not per subagent. Parallel PR implementers all write the retargeted preflight to the identical path ($SCRATCH/preflight.sh), and last-writer-wins. The sweep gives no indication which worktree it ran against unless a gate happens to print an absolute path.

    Signal: Silent / found by audit / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s2 / Application

    Radix dropdown verbs that open outside UI leave the menu's modal layer blocking it

    Root cause

    MessageActions renders its actions as plain shadcn Buttons inside DropdownMenuContent. Radix only auto-closes a dropdown when a DropdownMenuItem fires onSelect; a plain button click keeps the menu (and its page-wide modal pointer-events layer) mounted.

    Signal: Loud / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s3 / Verification

    Reported success

    Retiring the welcome modal unmasked vacuous axe passes: error boundaries had no h1

    Root cause

    headings.spec and calendar-ics never call suppressOnboardingOverlays, so pre-retirement the WelcomeModal opened over every audited page for the fresh hermetic consumer, and the Radix dialog aria-hid the entire page.

    Signal: Silent / found by audit / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s3 / Application

    Wrong signal

    steps.first_run is a workspace signal: it killed the tour nudge everywhere and fired the celebration unearned

    Root cause

    A workspace-level auto-detected signal (steps.firstrun, sourced from the workspace runs list) was treated as a per-user fact by two first-run surfaces. No organic per-user run-completion milestone exists (firstrunsuccess is Genesis-only vocabulary with no runtime writer), so there was no correct level to gate on.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s3 / Verification

    Reported success

    Template typecheck OOM'd and the pipeline reported exit 0: the recorded tsc-OOM trap recurred in a fresh worktree

    Root cause

    Two compounding causes: the template's tsc needs ~8GB heap and a default-heap run OOMs; and piping tsc output makes $? report the pipe tail's status, so the crash reads as success.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s2 / Application

    Tour popover controls overflow the box from step 2: behavioral drives never measured geometry

    Root cause

    A fixed-width popover's single-row flex controls with a long text label and a conditionally-appearing button (Back from step 2) exceeded the content measure; no flex-wrap, and no geometry assertion existed anywhere in the verification stack.

    Signal: Loud / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s3 / Application

    Tour terminal popover pushed off-screen on chat-home tenants, taking its chips with it

    Root cause

    popoverStyle placed the ask-step popover "above the target". Two anchors share that step: the small dock pill (placement correct) and the chat-home composer wrapper, a large region whose top sits near the viewport top.

    Signal: Loud / found by human / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    internal agent platform

    s3 / Verification

    TourNudge required the onboarding provider and killed every standalone home render in CI

    Root cause

    A decorative component (an inline nudge) used the THROWING context hook. The repo already distinguishes the two classes: useOnboardingContext throws by design for surfaces whose job is onboarding; useOptionalOnboardingContext exists (Bagent C2, the Coachmark/PlanCard precedent) for teaching wrappers that must never tak...

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    next

    client agent platform

    s3 / Verification

    Reported success

    tsc piped through tail with `echo $?` reads tail's exit: a failing typecheck reported as pass, caught only by CI

    Root cause

    $? after a pipeline is the LAST command's exit code (tail's), not tsc's. Combined with tsc producing little/no output when it dies or is truncated, the pipeline shape converts any tsc failure into "exit=0". Same failure family as <internal-project>: the reader trusted a signal that was not tsc's own.

    Signal: Silent / found by check / class C / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    node

    client agent platform

    s3 / Infrastructure

    Junctioned nm-store breaks vitest ESM resolution until each package gets a node_modules self-junction

    Root cause

    Node's ESM loader resolves the junction to its real path, so imports execute from inside <internal-project>, a directory not named nodemodules. Package resolution walks up looking for nodemodules directories and never finds the store's own siblings.

    Signal: Loud / found by check / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    node

    client agent platform

    s2 / Infrastructure

    Shared <internal-project> mutated mid-session:.bin emptied + ~27 scoped packages deleted, breaking every junctioned worktree

    Root cause

    Unidentified process deleted entries from the shared store while multiple worktree sessions were active. The store is a single mutable directory that every act- worktree junctions to, so any npm operation (install/prune/dedupe) run in ANY junctioned worktree operates through the junction on the shared target, one sessi...

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    openrouter

    client agent platform

    s3 / Data

    provision-seed autofill fallback used an OpenRouter id that does not exist (dash vs dot)

    Root cause

    A hand-written model id literal drifted from the registry: repo-internal slugs use dashes (claude-haiku-4-5) while OpenRouter ids use dots (claude-haiku-4.5), and the fallback was written in the slug spelling with a vendor prefix bolted on. The try/catch around the fetch made the failure invisible.

    Signal: Loud / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    railway

    internal agent platform

    s2 / Third party

    Stock Twenty image + Railway volume breaks workspace bootstrap with EACCES and leaves an orphaned user

    Root cause

    Railway attaches volumes owned by root; the stock Twenty image has no boot-time chown (the <internal-project> twenty-branded overlay image added one for exactly this reason) and STORAGETYPE=local writes into the mount at workspace creation time.

    Signal: Loud / found by check / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    shell

    internal agent platform

    s3 / Infrastructure

    Wrong signal

    Bash tool on Windows mangles git show branch:path: colon becomes semicolon, slashes flip, revision unresolvable

    Root cause

    MSYS/Git-Bash path conversion on Windows rewrites arguments that look like POSIX paths with colons: branch:path triggers path-list translation (colon → semicolon, / → \), so git never sees the real revision:path token. Single-quoting suppresses one rewrite but the argument still came through empty in the tool context.

    Signal: Wrong signal / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    stripe

    agency infrastructure

    s3 / Third party

    Reported success

    Deleting a Stripe draft invoice also deletes its invoice items: it does not release them back to pending

    Root cause

    I assumed deleting a draft invoice would return its line items to the pending pool, the way voiding or removing a line does. It does not. Once pending invoice items are pulled onto a draft invoice they belong to that invoice, and deleting the invoice deletes them with it. The deeper mistake was the test design.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    stripe

    agency infrastructure

    s2 / Application

    Reported success

    Client A billed USD 7,000/mo for two months against a CAD 7,000 agreement: the USD checkout bug was fixed forward but the already-subscribed client was never migrated

    Root cause

    The known <internal-project> checkout bug that hardcoded USD (err-<sha>-stripe-<internal-project>). a client director's subscription was created on <phone> by that checkout; the fix (<internal-project> PR #1, <path> currency map) merged <phone>, ten days AFTER his subscription existed.

    Signal: Silent / found by client / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    supabase

    client agent platform

    s2 / Third party

    Template tenant Supabase realtime websocket answers 500: presence and live wires degrade to absence fleet-wide on the tenant

    Root cause

    Supabase realtime service failure on project <project-ref> (websocket handshake 500), infrastructure, not policies, not app code. Presence + broadcast delivery worked when Bmp2 verified it live <phone>, so this is a fresh service-side degradation.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    twenty

    internal agent platform

    s3 / Third party

    twenty-sdk apply fails on Windows: front-component resource paths built with backslashes

    Root cause

    path.relative() returns platform-separator paths; the SDK never normalizes to POSIX before writing manifest resource paths, and the Twenty server hard-rejects backslashes.

    Signal: Loud / found by check / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    vercel

    internal agent platform

    s2 / Application

    Reported success

    Router Permissions-Policy microphone=() hard-blocks getUserMedia fleet-wide (no popup)

    Root cause

    The <internal-project> sets a global Permissions-Policy camera=(), microphone=(), geolocation=(). microphone=() is an EMPTY allowlist = mic disabled for every origin including self. A Permissions-Policy block overrides any browser grant, so getUserMedia always throws NotAllowedError with no prompt.

    Signal: Silent / found by human / class B / no MAST mode

    Open / fix recorded / prevention rule written

  • 2026-08-14

    vitest

    fleet admin console

    s3 / Verification

    : case-studies.test.ts fails to parse on Windows: full vitest run is red on untouched master

    Root cause

    The test file's header comment contains byte(s) that do not survive the Windows read path (encoding artifact); esbuild's parser rejects the token during transform. Present on master; unrelated to any branch under test.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    vitest

    fleet admin console

    s3 / Verification

    Wrong signal

    : Windows-local vitest/tsc red where CI is green (case-studies.test.ts + NextRequest RequestInit)

    Root cause

    Windows-local <path> resolution divergence from CI: the DOM-lib RequestInit (signal: AbortSignal | null) wins locally over the shape Next's spec-extension RequestInit expects, and the case-studies suite trips on a UTF-8/CRLF transform quirk in the local vitest pipeline.

    Signal: Wrong signal / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    vitest

    internal agent platform

    s3 / Verification

    Wrong signal

    Sync getByTestId on an async-mounted element flakes under full-suite load

    Root cause

    The recording-evidence-chip mounts on its own async session-context fetch (installFetch({recordingid})). Two tests awaited an UNRELATED element first (findByTestId('mock-chat') / 'mock-conversation') and then asserted the chip SYNCHRONOUSLY with getByTestId.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-14

    vitest

    client agent platform

    s2 / Verification

    Wrong signal

    Vitest: CI fails on an unhandled render error while all 29,583 tests pass

    Root cause

    A catch-all fetch mock in a DOM test answered every unlisted endpoint with a generic truthy body. A component in the mounted tree (TrustTab) consumed that body as if it were its real payload and crashed in render after the test's assertions passed.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    vitest

    client agent platform

    s3 / Verification

    Reported success

    Vitest importOriginal-factory mock: a spy on an exported wrapper sees 0 calls from some import edges while a full-replacement mock intercepts them all

    Root cause

    vi.mock with an async importOriginal factory instantiates the real module while the mock is still being constructed; module-graph timing/cycle fallback can hand SOME importers (here a module two hops deep that imports the mocked module relatively) the real export instead of the factory's wrapped export.

    Signal: Silent / found by check / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-14

    worktree

    internal agent platform

    s3 / Infrastructure

    Prepared worktree act-bint-5 arrived without its node_modules junction: npx fetched a remote vitest that could not load vitest.config

    Root cause

    The junction is per-worktree state that git does not carry: a freshly added worktree starts with no nodemodules, and nothing verifies the promised junction actually exists before tooling runs.

    Signal: Loud / found by check / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-13

    advizr

    internal agent platform

    s3 / Application

    check-copy dup: authored the same retry sentence in two settings files instead of importing MESSAGES

    Root cause

    Two error states authored minutes apart reused the natural phrasing. The repo rule (agent-os-contracts §12.2, import-never-re-string) puts any sentence rendered in two or more files into <path>, which is registered in COPYREGISTRY so it stays linted.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    advizr

    internal agent platform

    s2 / Application

    Reported success

    Evidence panel mounted only in the legacy builder dock: unreachable on every default canvas-first tenant

    Root cause

    The builder has TWO hosts sharing use-builder-session: the legacy dock (flag-off rollback) and the canvas-first WorkflowBuilderSurface (default). A feature mounted in the host the brief names, not the host the default flags render. Green tests over the wrong host are the green-ci-hides-unreachable-features class.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    advizr

    internal agent platform

    s3 / Application

    Hydration mismatch on /settings: sidebar Radix aria-controls ids diverge server/client via the page's Suspense boundary

    Root cause

    React useId allocation differs between the server pass and client hydration when the settings page's Suspense boundary (required by useSearchParams) resolves differently, shifting Radix-generated ids for sidebar collapsibles rendered in the same tree.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    advizr

    internal agent platform

    s3 / Verification

    status-tokens gate (no-raw-tabular-nums) reddens a new consumer-surface component: not in the common local gate battery

    Root cause

    no-raw-tabular-nums and no-raw-status-palette are GRADUATED rules held at zero on the consumer surface by check-status-tokens.mjs --gate. Any NEW file that enters the consumer surface (a component reached by a route) and uses raw tabular-nums/raw status colours is a +1 over baseline and fails.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    ci

    client agent platform

    s3 / Verification

    Shared programme-manifest: second-to-merge flagship PR fails check-programme-complete with evidence-removed until rebased

    Root cause

    Two concurrent flagship PRs (W12 #2021 and W22 #2023) both add rows to the same <path> The first to merge lands its row on master; the second's branch, cut from an older master, is missing that row, and check-programme-complete's evidence-removed fence (lintManifest) treats a claiming row present at the base but absent...

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    client

    internal agent platform

    s2 / Data

    Writing "minimum 420 hours" as a co-op term definition fails UBC's cumulative 12-16 week and 35 hrs/week rules

    Root cause

    The 420-hour figure was taken from the student verbatim and treated as the whole requirement. It is one of four constraints UBC applies together, and it is a floor for credit rather than a description of the schedule.

    Signal: Loud / found by audit / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-13

    git

    internal agent platform

    s3 / Infrastructure

    Removed a merged PR's worktree before harvesting its evidence artifacts: drive-browser receipt deleted

    Root cause

    Worktree cleanup treated the worktree as fully disposable; evidence artifacts written by agents (drive-runs, screenshots, receipts) default to the run's CWD, which for delegated builds IS the worktree.

    Signal: Loud / found by human / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    pr-ack gate is two-stage: label AND a '## Deploy plan' PR-body section, re-evaluated only on a fresh event

    Root cause

    The pr-ack gate validates two independent inputs (risk label + a named PR-body section) but subscribes only to label/synchronize events, not to PR body edits, so a body-only fix leaves the check frozen at its last verdict.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    github

    client agent platform

    s3 / Verification

    pr-ack gate needs one ack label PER surface class: a dark-lever PR needs rollout-ack on top of migration-ack

    Root cause

    docs/pr-acknowledgement-gates.md defines four independent ack surfaces; a PR that both carries a migration AND adds a dark lever trips two of them. Briefs and habit only mention migration-ack, so the rollout-ack requirement surfaces as a red check after creation.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    github

    internal agent platform

    s3 / Verification

    Reported success

    Re-running workflow runs does not attach required checks to a bot-pushed head: push an empty commit instead

    Root cause

    Required status contexts bind per-SHA. Workflow re-runs rerun the original commit's runs; they cannot migrate to a newer head. A workflow-token push generates no workflow-triggering event, so the bot head starts with no runs and can never gain the required contexts by re-running.

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    Stale-response gate rejects a requestSeq-ref guard: the scanner only credits the cancelled-flag cleanup shape

    Root cause

    check-stale-response.mjs recognizes the let cancelled = false + cleanup(cancelled = true) idiom; a useRef sequence guard is invisible to it. The ref guard also does not cancel on unmount, so the scanner's rejection is substantively right, not just pedantic.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    handbook

    internal agent platform

    s2 / Data

    handbook/19 invented a non-existent "exempt floor" under ESR s.37.8, conflating it with minimum wage

    Root cause

    Two unrelated numbers were merged during the July 2026 drafting of the founding-engineer comp model: the BC general minimum wage ($18.25) and a supposed qualification threshold for the ESR s.37.8 high technology professional exemption.

    Signal: Loud / found by audit / class D / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-13

    kb

    internal agent platform

    s2 / Verification

    Wrong signal

    kb_resolve_error fails on every payload: bridge JSON.parse masks a 405 from an undeployed PATCH /errors route

    Root cause

    Two layers. (1) Deploy gap: the PATCH <path> resolve handler exists only on the local unpushed feat/claude-mem-error-memory branch; origin/master's <path> exports POST only, and Railway runs master, so Next.js auto-405s PATCH with an empty body before any handler runs, payload shape is irrelevant.

    Signal: Wrong signal / found by check / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    knowledge

    internal agent platform

    s2 / Verification

    Wrong signal

    kb_resolve_error fails with "Unexpected end of JSON input" on every call

    Root cause

    Not fully diagnosed from the client side. The message is a JSON.parse failure on an empty string, which means the resolve endpoint returned a zero-length or truncated body rather than a JSON error object.

    Signal: Wrong signal / found by check / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    next

    client agent platform

    s3 / Verification

    Wrong signal

    dark-levers-registry test flags a backtick ALL-CAPS env var in doc prose as a "fictional lever"

    Root cause

    The test scans docs/dark-levers.md for backtick-quoted ALL-CAPS tokens (regex /([A-Z][A-Z0-9]{4,})/) and asserts each is read via process.env in scanned source. It cannot distinguish a behaviour lever from a secret/key env var.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    next

    client agent platform

    s3 / Verification

    Wrong signal

    Dev-server smoke leaves.next/types behind and local tsc goes red on a pre-existing route export

    Root cause

    tsconfig.json includes.next/types//.ts; running next dev generates those files, and <path> exports a non-handler constant that fails Next's generated OmitWithTag route-shape check. Local tsc after any dev-server session therefore diverges from CI's clean-checkout tsc.

    Signal: Wrong signal / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    next

    internal agent platform

    s3 / Verification

    Reported success

    Diff-based migration gates exit 0 vacuously on uncommitted work

    Root cause

    The gates enumerate changed files from committed history (origin/master..HEAD), not the working tree, so uncommitted migrations are invisible to them.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    next

    client agent platform

    s2 / Application

    Reported success

    L3.5 workspace permission rules look silently dead on the commit-routed action path (CLIENT_SLUG vs uuid workspace_id)

    Root cause

    Two things are called workspaceid: SkillContext.workspaceId carries the tenant UUID on chat/runner paths but CLIENTSLUG on commit-routed paths (commit.ts keys actionreceipts by slug), and loadPermissionRules passes it raw into a uuid-typed column filter.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-08-13

    next

    internal agent platform

    s3 / Verification

    Wrong signal

    programme-complete `absent` assertion matches a column literal in a route's doc comment

    Root cause

    check-programme-complete's absent assertion (like the other design/no-leak gates) is a text scan over the raw file, not an AST/code scan. A no-leak assertion that forbids a column name from appearing in a file also matches that name written in a doc comment, so documenting the very thing you are asserting the absence o...

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    next

    internal agent platform

    s3 / Infrastructure

    Reported success

    Backgrounded next dev piped through head: server listens but never answers, and the log is blind

    Root cause

    Piping a long-running server's output through head in a backgrounded command: head exits after N lines, later stdout writes get EPIPE, and the server stalls mid-boot while still holding the port. The truncated pipe also hides the boot log, so the failure is indistinguishable from the known lockfile-wedge symptom.

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    next

    internal agent platform

    s3 / Infrastructure

    Reported success

    Fresh-worktree next dev wedged: listens, never answers, event loop pegged: NOT the home-lockfile cause

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    next

    internal agent platform

    s3 / Infrastructure

    Reported success

    next dev piped through head in a background shell wedges: listens, never answers

    Root cause

    head -40 exits after consuming 40 lines, which closes the pipe. The env-warning banner alone is 30+ lines, so head exited during boot. Next dev's next write to stdout (the request-triggered "Compiling /middleware" line) hit the closed pipe (EPIPE) and wedged the process before any request handling ran.

    Signal: Silent / found by human / class A / no MAST mode

    Resolution written / prevention rule written

  • 2026-08-13

    openrouter

    fleet admin console

    s2 / Third party

    OpenRouter accepts Anthropic tool search on request 1, rejects its own result blocks on request 2

    Root cause

    The Anthropic server-side tool-search tool (toolsearchtoolbm2520251119, the mechanism behind deferloading) is only partially supported by OpenRouter's Anthropic-compatible endpoint.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    openrouter

    client agent platform

    s2 / Third party

    OpenRouter fleet key at $0 credits: 402 blocks every live model verification

    Root cause

    The shared OpenRouter account balance is exhausted (limitsource: openroutercredits). No code defect: the request that was refused carried the correct body (jsonschema responseformat, no temperature for gemini-3-6-flash, multimodal parts).

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    playwright

    client agent platform

    s2 / Verification

    Wrong signal

    @smoke e2e asserted HTTP auth statuses (401/404) the DB-less placeholder-Supabase tier cannot provide

    Root cause

    The @smoke e2e tier boots against SUPABASEURL=<url> (e2e.yml), there is no auth backend. getSession resolves degenerately, so an 'anonymous' request is not 401 and a signed-in-behind-off-flag request is not the 404 the real auth+dark-gate ordering would produce.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    playwright

    client agent platform

    s3 / Verification

    Wrong signal

    Playwright dev-walk clicked before hydration: flag-gated dialog entry read as missing with the flag on

    Root cause

    Under next dev, a server-rendered button is visible long before React hydration attaches its onClick. domcontentloaded + "element visible, enabled and stable" does not mean handlers exist; the click lands on dead markup and simply does nothing.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    scripts

    internal agent platform

    s3 / Application

    Reported success

    make-eml.py over-reports recipients by one when there is no Cc

    Root cause

    The verification block does cc = getaddresses([back["Cc"] or ""]). When the Cc header is absent, back["Cc"] is None, so it falls back to the empty string, and email.utils.getaddresses([""]) returns [('', '')] rather than [] on this Python.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    shell

    internal agent platform

    s3 / Verification

    Reported success

    next dev piped through head wedges once head exits; piped tail masks every exit code

    Root cause

    A pipeline's consumer defines both lifetime and status: when head exits, the producer blocks forever on the full pipe (no SIGPIPE kill on Windows); and $? after a pipeline is the LAST command's exit, so | tail; echo $? always reports the filter, not the command.

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    shell

    client agent platform

    s2 / Verification

    Reported success

    Pipeline exit-code masking read a red strict gate as green (STS=0 over STRICT FAIL)

    Root cause

    In POSIX sh/bash, $? after cmd | tail -N is tail's exit code. Piping a gate's output to tail/head/grep for brevity destroys the only machine-readable signal the gate produces. Same class as the recorded grep -c short-circuit trap, in a new costume.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    supabase

    client agent platform

    s2 / Data

    Reported success

    Mig 2720 still unapplied on template tenant: blocked W19 analyzer live walk (recurrence of W18's block)

    Root cause

    Migration 2720 (workflowrecordings + bucket, merged in #2010) was never applied to the template tenant's live Supabase. The template DB migration ledger has been dark since 176, so nothing surfaces the gap; each wave rediscovers it at verification time.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-13

    supabase

    client agent platform

    s3 / Data

    workflow_recordings (mig 2720) merged on master but never applied to the template tenant: recording API 500s at first insert

    Root cause

    Merging a migration file to master does not apply it anywhere. The fleet update engine applies template migrations to client tenants on its own schedule, and the template dev tenant is not in that loop; nothing applied 2720 after #2010 merged.

    Signal: Loud / found by check / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-12

    github

    internal agent platform

    s2 / Verification

    Reported success

    Twelve green checks on a PR changing services/browser-sandbox, which no workflow builds or runs

    Root cause

    The service has a committed lockfile but no CI job; its Dockerfile documents that it is deployed by hand with railway up and has no CI. Compounding it, typescript sits in dependencies rather than devDependencies while the image builds with npm ci --omit=dev, so the package ships into the production container, and the s...

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-08-12

    github

    internal agent platform

    s2 / Infrastructure

    Backticks inside a Bash-tool double-quoted string run as command substitution even when backslash-escaped

    Root cause

    In a double-quoted shell string, backticks are command substitution. Backslash-escaping them survives one level of quoting but not the layers the Bash tool applies, so the escape is consumed and the backtick becomes active. Markdown bodies are exactly the payload most likely to contain backticks.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-12

    next

    internal agent platform

    s2 / Infrastructure

    Wrong signal

    Stray package-lock.json in %USERPROFILE% wedges every Next dev server (root inference crawls the whole home dir)

    Root cause

    Next.js infers outputFileTracingRoot from the outermost directory containing a lockfile. A stray package-lock.json in <path> made every repo under Documents resolve its workspace root to the whole home directory; dev-server watching/tracing over that tree starves request handling indefinitely.

    Signal: Wrong signal / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-12

    npm

    internal agent platform

    s3 / Verification

    Wrong signal

    npx typescript exits 1 with \\"could not determine executable to run\\", which reads as a typecheck failure

    Root cause

    The typescript package ships two bins (tsc and tsserver) and neither is named typescript, so npx --yes <email> tsc gives npx no way to pick one and it aborts before running anything. The trailing tsc is read as an argument to the resolved executable, not as the executable to resolve.

    Signal: Wrong signal / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-08-07

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    Template lint-and-typecheck bundles ~30 gates: new consumer component / model slug / egress fetch each trip a separate one

    Root cause

    The template's "lint-and-typecheck" required check is not just tsc+eslint, it bundles ~30 code-anchored gates (model-identity, consumer-surface, typography --strict, status-tokens, egress-inventory, vendor-headers, gen-env/migrations-manifest, rule-ids, etc.) listed in.github/workflows/ci.yml.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-08-07

    openrouter

    internal agent platform

    s2 / Model

    Hire "03 Role" dead: Anthropic structured-output rejects minItems&gt;1 / number bounds on the wire

    Root cause

    <path> stripUnsupportedSchemaKeywords stripped ONLY array maxItems. blueprintCoreSchema (<path>) emits array minItems>1 (.min(2)/.min(5)) and number minimum/maximum on the wire, which Anthropic structured-output (direct/Bedrock/Azure via OpenRouter) rejects.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-23

    next

    internal agent platform

    s2 / Application

    Brain /learn map: hidden mobile-twin SchematicGraph ran full-atlas dagre = 77s main-thread block

    Root cause

    A CSS-hidden (md:hidden) React subtree still MOUNTS and executes: the mobile BrainShapePreview twin ran an expensive synchronous dagre layout over the entire atlas on every /learn desktop load, blocking the main thread before the real force-graph map could mount.

    Signal: Quiet / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-23

    supabase

    internal agent platform

    s2 / Data

    Reported success

    Client-template Brain rendered empty: ingest stamped whole corpus note_properties.visibility='private'

    Root cause

    Two ingest stamping bugs, both overriding the healthy DB default (noteproperties.visibility DEFAULT 'workspace', mig 197): (1) <path> hardcoded fm.visibility='private' on every WS8 auto-summary note (one per ingested source doc via enrich-job.ts), owned by the source's uploader = the service account; (2) brain-ingest r...

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-23

    supabase

    internal agent platform

    s2 / Data

    graph_intel_nodes insert fails: tiny float (1e-55) out of range for Postgres 'real': intel cache never persists

    Root cause

    eigenvector power-iteration (graphology) assigns peripheral nodes denormal-tiny positive values (~1e-55) that underflow Postgres float4 (real min-normal ~1.18e-38), aborting the graphintelnodes bulk INSERT. writeIntel threw → getOrComputeIntel swallowed it → graphintelruns never got a row → cache never persisted.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-23

    supabase

    internal agent platform

    s3 / Data

    graph_intel_nodes insert fails: tiny float (1e-55) out of range for Postgres 'real': intel cache never persists

    Root cause

    A computed graph-intel node field (likely an x/y coordinate, size, or normalized degree/centrality) can be a denormalized float ~1e-55, below Postgres float4 (real) minimum normal ~1.18e-38, so the INSERT into graphintelnodes rejects it. Not yet fixed.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    advizr

    internal agent platform

    s3 / Orchestration

    Reported success

    Reaper reap-write silently failed on weeks-stranded runs: duration_ms INT4 overflow

    Root cause

    Recovery-path write computed durationms = now - startedat without bounding it to the INT4 column range; stranded-state cleanup code by definition meets pathological timestamps (weeks/months), which no test fixture exercised.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    advizr

    agency infrastructure

    s2 / Infrastructure

    Wrong signal

    Template-update engine detects conflicts by blob-SHA equality, NOT git hunk-merge: a union pre-merge does NOT drop a file from the conflict set

    Root cause

    The "3-way hunk merge / overlapping hunks" mental model does not match the deployed template-update engine, which is a pure tree-diff (path->blobSHA equality) with a converged/rescued escape and whole-file conflictresolutions ('template'|'client').

    Signal: Wrong signal / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    git

    internal agent platform

    s2 / Infrastructure

    Reported success

    git reset --soft origin/master in a long-lived worktree swept a day of other lanes' merges into one "squash" commit (near-miss revert)

    Root cause

    reset --soft to a moving ref (origin/master) diffs the worktree against wherever that ref points NOW, not the base the work was written on. In multi-lane periods master moves constantly; any soft-reset squash silently converts "not rebased yet" into "reverts everything merged since".

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    github

    internal agent platform

    s2 / Verification

    Reported success

    Stale-merge race: PR CI green against old master, merged red: branch protection lacks require-up-to-date

    Root cause

    GitHub branch protection on <internal-project> does not require branches to be up to date before merging, so a PR whose CI ran against an older master can merge a logically-conflicting change with green checks. rbac's member-role derivation being a load-time mutation makes the conflict invisible to textual review.

    Signal: Silent / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    railway

    internal agent platform

    s1 / Infrastructure

    Reported success

    LinkedIn-Automation API/worker died on transient pg drop and stayed dead (pool had no error listener → exit 0 → Railway ON_FAILURE won't restart)

    Root cause

    The primary pg Pool (execution/db/connection.js:87 new Pool(config)) had NO pool.on('error') listener (the read replica databasereadreplica.js:50 DID). Supabase/Supavisor idle-kills a pooled backend connection → node-postgres emits 'error' on the Pool → with no listener Node promotes it to an uncaughtException → shutdo...

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    supabase

    internal agent platform

    s1 / Data

    Reported success

    Estate-wide Supabase RLS disabled: 333 public tables anon-readable/writable across 15 projects (incl. PHI, password hashes, secrets)

    Root cause

    Tables added by later migrations (eval, policy, retrieval, agent infra, users, jobqueue in the client-template line; plus whole standalone projects that never enabled RLS) were created without ENABLE ROW LEVEL SECURITY.

    Signal: Silent / found by audit / class E / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-22

    supabase

    internal agent platform

    s3 / Data

    Reported success

    LinkedIn-Automation health-scorer silently dead: account_health INSERT column/schema drift + missing NOT-NULL id

    Root cause

    Schema drift between migration 019 (accounthealth defined with id TEXT PRIMARY KEY no default, columns score/risklevel/captchacount24h/...) and the code (execution/observability/healthscorer.js:180) which INSERTs a DIFFERENT column set (accountid/healthscore/limitmultiplier/confidence/lasteventtype/lasteventat/events24...

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    vercel

    client agent platform

    s1 / Third party

    Reported success

    Daily AI-news recap died silently on 3 tenants: OpenRouter account out of credits; provisioning worker was seeding the dead key into every new client

    Root cause

    Two compounding causes. (1) OpenRouter keys pass /auth/key as "valid" even when their account has $0 credit, key rotation on 07-08 covered only 3 of 6 tenants and skipped the provisioning worker's env, so the worker kept copying the dead key into new clients.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    vercel

    client agent platform

    s1 / Application

    Wrong signal

    Invite recovery loop re-sent the same doomed long-token link: Outlook dropped it every time (round 4); fix = short invite code

    Root cause

    A long URL as the SOLE acceptance credential is fundamentally incompatible with mail clients that mangle/truncate URLs (Outlook/SafeLinks). Recovery that RE-ISSUES THE SAME ARTIFACT cannot converge against a deterministic mangler.

    Signal: Wrong signal / found by client / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    vercel

    agency infrastructure

    s1 / Third party

    Wrong signal

    Outlook dropped the entire invite-token segment: bare /Client A/invite 307'd to the login wall (invite round 3, backfill)

    Root cause

    A long URL as the SOLE credential is incompatible with Outlook's wrap/truncation behavior. #778 handled GARBLED tokens (SafeLinks %-encoding, whitespace) but not ABSENT ones: when the mail client drops the whole token segment, the bare /invite path wasn't public, so the middleware login-redirect fired before any recove...

    Signal: Wrong signal / found by client / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    vercel

    fleet admin console

    s3 / Infrastructure

    Reported success

    vercel env add fed via heredoc <<< stores a trailing newline: exact-match env flags silently read as off

    Root cause

    bash <<< (herestring) appends a newline to the string it feeds stdin; vercel env add stores stdin verbatim including that newline. Any consumer doing an exact string comparison then fails.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-22

    workflow

    client agent platform

    s3 / Orchestration

    Wrong signal

    Workflow instant-apply: refine-vs-create must be captured at TURN START, not from live doc length

    Root cause

    The empty-canvas CREATE flow legitimately has a non-empty doc mid-stream (user can hand-add a node while a proposal streams). So the live doc length is NOT a valid create-vs-refine signal.

    Signal: Wrong signal / found by human / class B / MAST FM-1.1

    Open / prevention rule written

  • 2026-07-21

    github

    client agent platform

    s2 / Verification

    Wrong signal

    Release channel BLOCKED: gate's connectors leg fails because the smoke user has zero Connected apps (connections are per-user; Gmail belongs to James's user)

    Root cause

    The gate test assumes the smoke user sees a Connected app, but connector connections are per-user-scoped and the demo/smoke account holds none (its state was likely purged in the <phone> real-data-posture cleanup, or per-user scoping tightened after the Jul 18 release).

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    github

    client agent platform

    s2 / Verification

    Template Release Gate dead: VERCEL_TOKEN repo secret invalid (403 invalidToken): no release could be cut

    Root cause

    The <internal-project> repo secret VERCELTOKEN (used by.github/workflows/release.yml to poll deployment state) expired or was rotated without the repo secret being updated. Vercel tokens created with an expiry die silently; the gate is the only consumer so nothing noticed until the next release cut.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    Two same-night migration-number races (570, 572): parallel sessions + unpushed branches make registry claims invisible

    Root cause

    The registry gate can only see PUBLIC claims (master files + open-PR §2 rows). An unpushed branch's claim protects nobody, and two active sessions merging to the same repo overnight make the window minutes wide, not days.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    github

    client agent platform

    s3 / Third party

    VERCEL_TOKEN from the local CLI auth.json dies within hours: the CLI rotates its own token

    Root cause

    Vercel CLI v50 session tokens rotate; auth.json holds a session credential, not a durable API token. The CLI offers no tokens create, long-lived tokens are minted only in the Vercel dashboard (Account Settings → Tokens).

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    github

    client agent platform

    s3 / Verification

    Reported success

    visual.yml update-baselines dispatch leaves the PR head with NO required checks (GITHUB_TOKEN push can't trigger workflows)

    Root cause

    GitHub intentionally suppresses workflow triggers for commits pushed with the default GITHUBTOKEN. The update-baselines dispatch in.github/workflows/visual.yml commits back to the branch with that token, so the resulting PR head has no Actions check runs at all, which blocks merge if required checks are enforced and, w...

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    github

    client agent platform

    s3 / Verification

    Reported success

    Migration 570 cross-PR collision: unpushed branch's registry claim is invisible to sibling lanes

    Root cause

    The migration-registry gate's cross-PR scan (gh pr list --json files) can only see OPEN PRs. A number claimed on a local-only branch is invisible to every sibling lane until that branch is pushed, so two lanes that each verify "zero open-PR claims" can both be truthful and still collide.

    Signal: Silent / found by downstream / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    google

    internal agent platform

    s2 / Third party

    Wrong signal

    Google OAuth client for Calendar/Gmail deleted: all machine-level Google API access dead (invalid_client)

    Root cause

    The Google Cloud OAuth client (<internal-project> / <phone>-...) was deleted, invalidating every refresh token minted against it, Vercel envs still carry the dead credentials, which makes the failure look like token expiry when it is client deletion.

    Signal: Wrong signal / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    next

    internal agent platform

    s2 / Application

    Wrong signal

    Radix Popover with raw autoFocus never opens inside a modal Dialog (budget-chip); CI flake was the symptom

    Root cause

    Raw autoFocus attribute inside Radix PopoverContent races the parent Dialog FocusScope registration; focus restoration closes the popover before it ever paints.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    next

    internal agent platform

    s3 / Application

    Reported success

    twMerge drops font-mono when font-tabular rides the same cn() call

    Root cause

    tailwind-merge's default config pattern-matches font- arbitrary names into the font-family conflict group; the repo's custom font-tabular utility (font-variant-numeric) collides with font-mono inside cn()/twMerge.

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    supabase

    internal agent platform

    s3 / Data

    backfill-source-registry --apply aborts on uq_documents_source_external; collision class = duplicate orphan docs (80 found on template)

    Root cause

    Historical double-import created orphan duplicates of linked docs (same sourceexternalid). The linker assumed orphans were always linkable.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    supabase

    internal agent platform

    s2 / Third party

    supautils safeupdate guard broke WHERE-less DELETE inside compute_doc_similarity_edges_v2 (mig 573 fix)

    Root cause

    Platform-side change: supautils safeupdate now enforces WHERE on DELETE for RPC-executed SQL. The RPC's temp-table DELETE (defensive, table is fresh ON COMMIT DROP anyway) was the only WHERE-less statement.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    vercel

    agency infrastructure

    s1 / Verification

    Reported success

    "Fixed" claimed to client while the fix never reached their deployment: template-merge ≠ fork delivery

    Root cause

    Two-layer gap: (1) a fix merged to the template repo is not delivered until it is in a cut release AND the client fork has taken that release and its Vercel prod is READY on the resulting commit; (2) the "fixed" claim was verified against the wrong surface (template code, invite-row state) instead of the client's live...

    Signal: Silent / found by client / class D / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    vercel

    agency infrastructure

    s2 / Infrastructure

    Client C tenant launched with an exhausted OpenRouter key: live brain-ask 402'd until key swap

    Root cause

    The tenant's Vercel env carried an OpenRouter key from an account that was already at its credit ceiling. $40.22 had been consumed before the client ever logged in, the key/account predates the tenant and arrived exhausted (or was drained by provisioning-era enrichment).

    Signal: Loud / found by client / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-21

    vercel

    internal agent platform

    s1 / Application

    Wrong signal

    Token-less /invite (mail-client truncation drops the token segment) 307'd to router login: the URL shape #778 couldn't catch

    Root cause

    Defense-in-depth gap: every #778 defense (normalizeInviteToken, recover form on terminal states, inviteviewed audit) lives AT OR AFTER the /invite/[token] route, a URL missing the token segment never reaches any of it, and the middleware default for unmatched paths is a login redirect that renders nothing and writes no...

    Signal: Wrong signal / found by client / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-07-20

    advizr

    internal agent platform

    s2 / Orchestration

    Wrong signal

    CORRECTED: bound send_reply proposals DO execute (via executeBoundProposal): the only block was Resend outbound-domain verification

    Root cause

    run-job's proposalexecute handler routes by operandshash: isBound ? executeBoundProposal(id): executeProposal(id), "a bound proposal must NEVER fall back to prose." executeBoundProposal (<path>) is the GENERIC bound executor for ANY operand-bound proposal: it re-resolves (TOCTOU), CAS approved→executing, then runs the...

    Signal: Wrong signal / found by audit / class B / no MAST mode

    Open / fix recorded / prevention rule written

  • 2026-07-20

    advizr

    internal agent platform

    s2 / Application

    Reported success

    Client-merged metadata became an authority hole: forged event-trigger binding could run workflows against another user's OAuth accounts

    Root cause

    The binding was deliberately placed in metadata rather than config BECAUSE reconcileWorkflowCanvas merges metadata by key, so a server-written value survives an autosave that doesn't know about it. That reasoning was about DURABILITY and never asked who is permitted to WRITE the field.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-20

    advizr

    internal agent platform

    s3 / Verification

    Reported success

    <path> has never run: outside the vitest __tests__ include

    Root cause

    vitest's include pattern requires a tests directory segment, but nothing enforces placement. A co-located.test.ts looks correct in an editor, passes review, is committed, and is never run. Zero signal: no error, no skip notice, no coverage complaint.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    advizr

    internal agent platform

    s2 / Orchestration

    Reported success

    runner ADOPT path silently drops options.origin: fire-and-forget dispatches lose their origin label (caught by P12 live exit-check)

    Root cause

    Two metadata-stamping paths in runner.ts (INSERT vs ADOPT) drifted: the adopt merge enumerates its keys explicitly and origin was never added when Bdst-18 introduced it on the INSERT path. Same #622 class: per-run facts that live only in options die at the first metadata merge that doesn't re-write them.

    Signal: Silent / found by check / class B / MAST FM-1.4

    Open / prevention rule written

  • 2026-07-20

    composio

    internal agent platform

    s2 / Application

    Reported success

    composio_trigger workflow node was palette-only: shipped UI over dead wiring, could never fire

    Root cause

    The connectors-as-nodes work (PR #752) delivered the node kind, catalogue, form generation and executor handling as one unit, but the trigger SUBSCRIPTION lifecycle and the webhook ROUTING leg were never built.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    github

    client agent platform

    s2 / Verification

    Wrong signal

    brain-nightly red 10 consecutive nights on OpenRouter 402; migs 222/331 never applied: the retrieval harness has never produced a number

    Root cause

    Two independent failures compounding. (1) The OpenRouter account ran out of credits; every embed in the nightly eval 402'd, so the workflow failed on the recall floor with a number produced by a broken pipeline rather than by retrieval.

    Signal: Wrong signal / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    macos

    client agent platform

    s2 / Verification

    Reported success

    macOS has no `timeout`: `timeout N npx tsc` exits 127 with empty output and reads exactly like a clean typecheck

    Root cause

    GNU coreutils timeout is not present on stock macOS (it ships as gtimeout only if coreutils is brew-installed). The shell returns 127 command-not-found and prints nothing to stdout. Piping that into grep -c "error TS" yields 0, indistinguishable from a passing typecheck, so the verification silently never ran.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    next

    internal agent platform

    s1 / Application

    Streaming tool-input partials crashed the /workflows segment; the e2e mock hid it by sending one delta

    Root cause

    projectStagedGraph mapped staged.edges unguarded from a render-time useMemo, on a payload guaranteed to arrive WITHOUT edges. Chain: proposedGraphSchema declares keys nodes,edges,summary → ai@6/@ai-sdk/react@3 stream tool INPUT by default, so the proposegraph part is readable while its JSON is only partially parsed, i....

    Signal: Loud / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    next

    client agent platform

    s3 / Verification

    worktree-npm-guard hook blocks even --package-lock-only installs (lockfile-only assumption false)

    Root cause

    The guard hook matches install commands textually and resolves nodemodules from the session working directory, not from the command's effective target directory or npm mode; --package-lock-only genuinely writes zero files into nodemodules but the hook cannot see that.

    Signal: Loud / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    openrouter

    outbound pipeline

    s2 / Application

    Reported success

    $465 OpenRouter credit burn: Perplexity research phase auto-enabled by key presence, billing every lead on every regen run

    Root cause

    Spend-bearing features gated on KEY PRESENCE instead of explicit opt-in: the research phase treated "a key exists" as "the operator wants to pay for research". Compounded by: failed runs billing partial work, and a cron spending on a feature (optimizer) that could not produce value yet (empty allowlist).

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    openrouter

    internal agent platform

    s2 / Model

    Reported success

    Anthropic structured outputs 400 on zod value bounds: every coach synthesis silently died

    Root cause

    Wire schemas for generateObject/structured outputs must be SHAPE ONLY: types + strict/additionalProperties. Value-constraint keywords (minimum/maximum/minLength/maxLength/minItems/maxItems) are not in Anthropic's supported structured-output subset and 400 the whole request.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    openrouter

    internal agent platform

    s2 / Third party

    OpenRouter transient "402 Insufficient credits" fails connector ingest embeds with no auto-recovery (template tenant)

    Root cause

    Embeddings route exclusively through OpenRouter (<path> → <path>, model openai/text-embedding-3-small); no direct-OpenAI fallback for the embed leg even though OPENAIAPIKEY is set. When OpenRouter returns a transient 402 (momentary balance/spend-rate dip), the ingest embed step fails.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    supabase

    internal agent platform

    s2 / Data

    Reported success

    agent_observations/agent_sessions/error_events key on project_slug (text), not project_id (uuid)

    Root cause

    agency-kb has TWO different tenant-key conventions and they are not interchangeable. The chunk-family tables (projectchunks, domains, retrievalconfig, indexmetadata) use projectid uuid FK. The memory/error family (agentsessions, agentobservations, agentsummaries, errorevents) uses projectslug TEXT.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    supabase

    internal agent platform

    s2 / Orchestration

    Approved delegate_to_subagent proposals can never execute: bound path inserts agent_sessions.user_id NULL (23502)

    Root cause

    The proposal executor does not thread the proposal's stored actor (metadata.triggeredby / reviewedby) into the bound SkillContext, so the delegate executor dispatches the child with no userId; agentsessions.userid is NOT NULL, so session creation for the child run fails before execution starts.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    supabase

    internal agent platform

    s2 / Orchestration

    extract_data derivative persist dead in headless runs: documents.uploaded_by_user_id + uploaded_by_email are NOT NULL

    Root cause

    A headless agent run carries no ctx.userId/ctx.userEmail, but documents.uploadedbyuserid AND uploadedbyemail are NOT NULL with no default. The skill passed ctx.userId ?? null → constraint violation → the derivative was never created (so querytables + undo had nothing), and because the error path did not log the DB erro...

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    supabase

    client agent platform

    s2 / Data

    Reported success

    Migration 464 silently revoked the gmail/google_calendar providers added by 229: native Google sources uncreatable for months

    Root cause

    Migration 229 widened documentsourcesprovidercheck to add the native Google providers ('gmail', 'googlecalendar'). Migration 464 later did its own DROP + re-ADD of the SAME constraint to append ('crawl','feed','corpus'), but rebuilt the allowed list from the mig-202 base rather than from 229's, dropping both Google pro...

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    supabase

    client agent platform

    s2 / Data

    tasks.tags is JSONB: text[]-style contains literal 22P02s and can 500 an endpoint that treats a new bucket's error as fatal

    Root cause

    Column type assumption: tasks.tags looks like text[] in TS (string[]) but is stored as JSONB; PostgREST cs-operator literals differ by type ({a,b} for arrays, ["a"] / {"k":v} for jsonb). Also new attention buckets defaulted into the fatal error branch instead of degrading.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    supabase

    internal agent platform

    s2 / Data

    Reported success

    UNIQUE(project_id, name) silently allows duplicate global domains because NULL != NULL

    Root cause

    domains has UNIQUE(projectid, name), but tier-1/global domains store projectid AS NULL. In a Postgres unique index NULL is never equal to NULL, so two rows with (NULL, 'engineering') do not conflict.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    vercel

    internal agent platform

    s2 / Application

    Reported success

    Docs demo videos invisible on live template: media components emitted /public asset URLs without the client-slug prefix (posters 404, DEMUXER_ERROR)

    Root cause

    components/docs/mdx/local-video.tsx and screenshot.tsx rendered manifest/author paths (/videos/…, /images/…) raw into media attributes. Local dev has no <host> router (public/ serves at root), so the recorder, dev verification, and unit tests all passed; the only environments that expose the bug are router-fronted depl...

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    vercel

    agency infrastructure

    s2 / Application

    Wrong signal

    Client A team-invite acceptance dead-ended a valid invitee (mangled link → terminal state with only "Sign in")

    Root cause

    The team-invite accept flow had no tolerance for mangled tokens and no recovery affordance: (1) token lookup was exact-match with no normalization, so any Outlook/SafeLinks percent-encoding or hard-wrap whitespace produced a not-found → terminal state; (2) every terminal state's only action was a bare "Sign in" link, a...

    Signal: Wrong signal / found by client / class B / no MAST mode

    Resolution written / prevention rule written

  • 2026-07-20

    vercel

    internal agent platform

    s2 / Infrastructure

    Reported success

    Share-page view counter + external audit dead: void record_share_view/logAuditEvent dropped on Vercel serverless freeze

    Root cause

    Fire-and-forget (void promise) DB writes in a Next Server Component are dropped when Vercel freezes the function the moment the response streams. The artifactshares row insert is awaited (reliable), but the view counter + external audit were not.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-20

    video

    client agent platform

    s3 / Infrastructure

    video-lens skill scripts crash on system python 3.9: run them via uv --python 3.12

    Root cause

    macOS system python3 is 3.9 (LibreSSL build); the skill's compatibility line says "Requires Python 3" without a minor version, and its scripts use 3.10+ typing syntax.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    advizr

    internal agent platform

    s2 / Application

    Reported success

    Chat thumbs 100% dead in prod for months: entity_type='chat' violated the agent_feedback CHECK, swallowed by catch {}

    Root cause

    The client sent an entitytype value that was never a member of the DB CHECK set nor of the TS union FeedbackEntityType ('session'|'run'|'proposal'). It compiled only because the fetch body was an untyped object literal, so TypeScript never checked it against the union that mirrors the constraint.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    advizr

    internal agent platform

    s2 / Infrastructure

    Template update fails at build_branch: git rm refuses paths the bulk checkout staged

    Root cause

    buildbranch in <path> bulk-adopts the template with git checkout targetSha --., which STAGES the entire target tree into the index. It then removes rmPaths, which includes client-deleted files the bulk checkout just resurrected (keepsClient(d) && treeClient[d.path] === undefined).

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    claude

    outbound pipeline

    s3 / Orchestration

    Reported success

    Background agents/workflows die silently on Claude Code session restarts and credit exhaustion: long fan-outs must checkpoint to disk

    Root cause

    Background subagents and workflows are children of the Claude Code process, a session restart orphans them mid-write, and per-model credit pools (Fable subagent credits separate from session) can cut them off mid-task. Parallel Opus relaunches also trip server-side rate limits.

    Signal: Silent / found by human / class A / MAST FM-3.1

    Open / prevention rule written

  • 2026-07-19

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    Migration-registry gate failed against the WRONG programme: a master merge silently overwrote.b-prompt (Bdst→Bdp03), so the gate checked my migration against another lane's reservations

    Root cause

    The gate resolves the PR's programme identity from the root.b-prompt file (preferred) before consulting §2..b-prompt is a single-line file every programme rewrites, so it conflicts on essentially every branch, but when a git merge origin/master resolves it WITHOUT a conflict (because my branch hadn't touched it since t...

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    github

    client agent platform

    s3 / Verification

    Never dispatch visual update_baselines on master in <internal-project>: master's own merge velocity guarantees the bot's push is rejected

    Root cause

    The regeneration job takes ~30 minutes (full next build + Playwright over every surface x 3 viewports x 2 themes) and the workflow's commit step does a bare git push with no pull/rebase/retry.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    Racing the Bdst fleet: manifest, registry last-wins,.b-prompt and module-name collisions each block a merge

    Root cause

    1. <path> is GENERATED and unit-tested. Adding a migration, or merging master and inheriting sibling migrations, leaves it stale. Initially misdiagnosed as the known-flaky connections-request-cta DOM test because the real failing line hides among hundreds of passing ones.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    github

    internal agent platform

    s2 / Verification

    Reported success

    Shared migration-registry row drifts THREE ways in a fast-moving programme: two are silent (no conflict raised)

    Root cause

    Every sibling PR in a programme edits the SAME §2 "last-wins consolidated" registry row, plus the root.b-prompt, plus the GENERATED <path>. That produces three distinct drift modes, and only the first announces itself: 1. MERGE CONFLICT on docs/migration-registry.md, visible, git stops you. 2.

    Signal: Silent / found by downstream / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    github

    client agent platform

    s3 / Verification

    Visual baseline regeneration (update_baselines) silently loses its work when anything else pushes to the branch: "failed to push some refs"

    Root cause

    The workflow's commit step does a plain git push with no pull/rebase and no retry. Regeneration is slow (full build + Playwright across every surface x 3 viewports x 2 themes, ~30 min), so ANY other push to the branch during that window makes the runner's push a non-fast-forward and it is rejected.

    Signal: Quiet / found by human / class C / no MAST mode

    Open / no prevention rule

  • 2026-07-19

    next

    internal agent platform

    s3 / Verification

    Adding a supabase migration fails unit-tests unless <path> is regenerated

    Root cause

    The repo keeps a committed manifest <path> that must list every file in <path> A unit test runs node <path> --check and fails if the manifest is stale/missing. Adding mig 498 without regenerating the manifest left it stale.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    next

    client agent platform

    s3 / Verification

    Adding a supabase migration without regenerating <path> fails unit-tests (probes-manifest) ~10 min into CI

    Root cause

    <path> is a GENERATED, committed artifact that must be regenerated whenever <path> gains a file. Nothing in the local iterate loop surfaces this: targeted vitest runs and even a broad regression subset never touch probes-manifest.test.ts, and tsc/eslint/jargon/migration-registry gates all pass with a stale manifest.

    Signal: Loud / found by check / class B / no MAST mode

    Open / no prevention rule

  • 2026-07-19

    next

    internal agent platform

    s2 / Application

    Reported success

    cmdk forceMount on items alone hides server results: group hidden + CommandEmpty overlays "No matches"

    Root cause

    Two cmdk semantics around forceMount, both missed because no test rendered a query that matched zero STATIC rows: (1) cmdk hides a Command.Group whose children do not match the query, the live rows were forceMounted but their PARENT CommandGroup was not, so cmdk hid the group (headings survived in the DOM, rows did not...

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    next

    internal agent platform

    s2 / Application

    Config-as-code apply blocked on every already-active agent: unchanged status re-triggers the publish gate

    Root cause

    applyAgentPatch (<path>) runs the publish gate validatePublishable whenever patch.status === 'active'. That gate requires an active 'identity' prompt block and exists for genuine draft->active transitions.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    next

    client agent platform

    s2 / Application

    Reported success

    Meeting-transcript retention promised 90 days but NEVER ran: sweepExpiredTranscripts had zero callers

    Root cause

    A retention FUNCTION was written and unit-tested, but the SCHEDULER wiring (cron entry + queue + handler) was never added. Nothing in CI asserts that an exported side-effecting job has a caller, so a "green" test suite coexisted with a dead feature.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    next

    internal agent platform

    s3 / Verification

    operator-untouched CI gate freezes the shared citation kit: a consumer lane must not edit it

    Root cause

    Bdst PR2 added a citation ancestry breadcrumb by editing the shared citation primitives, which are on the operator-untouched frozen manifest (PHASE-B-PACK §7b): components/citations/{citation.tsx,citation-href.ts,index.ts}, components/graph/, components/agents/agent-persona.tsx, components/sections/run-trace.tsx, compo...

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    openrouter

    outbound pipeline

    s2 / Model

    Reported success

    Claude Haiku via OpenRouter fences JSON in ```json blocks: first-chance json.loads fails and the fallback parser silently zeroes every lead

    Root cause

    Model-specific response formatting: Claude models without responseformat={"type":"jsonobject"} (which they reject via OpenAI-compatible gateways) often fence JSON in markdown. The parse pipeline only stripped fences in the fallback path, after the unwrap step that extracts the "results" array had already been skipped.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    railway

    internal agent platform

    s3 / Infrastructure

    Caddy validate fails at Docker build when a header-matcher value comes from an unset env placeholder

    Root cause

    Caddy env placeholders {$VAR} are expanded at Caddyfile parse time from the process env. During docker build, runtime Railway service variables are NOT present, so any Caddyfile construct that becomes syntactically invalid with an empty value (here, a header matcher header <field> <value> with an empty value) breaks ca...

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    railway

    client agent platform

    s2 / Infrastructure

    Reported success

    Railway agent-worker is NOT git-connected: worker.py queue changes do not deploy, so new queues are born dead in prod

    Root cause

    The standing programme belief, recorded in the bdst-dust-surpass-programme memory and the Bdst satellite protocol as "Railway agent-worker is GIT-CONNECTED (auto-deploys on merge; NEVER railway up)", is false in current reality.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    supabase

    internal agent platform

    s3 / Data

    backfill:sources --apply collides on uq_documents_source_external where docs already partly belong to a source

    Root cause

    The backfill groups un-registered documents (connectorsourceid NULL) by an inferred sourcekey and stamps a sourceexternal mapping. But some of those category docs already partially belong to an existing registry source (e.g.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    supabase

    internal agent platform

    s3 / Application

    Reported success

    Gallery hire shipped without its promised v1 config snapshot: comment claimed the wiring, code never landed

    Root cause

    Cross-PR wiring promised in a comment: PR-1 documented where PR-2 would add a call, PR-2 added the substrate but not the call at that site, and no test asserted "a fresh hire has version 1" (the backfill made all EXISTING agents v1, masking the gap for new hires).

    Signal: Silent / found by audit / class D / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    supabase

    client agent platform

    s2 / Application

    Reported success

    Live-check scripts left ACTIVE API keys on the production tenant: cleanup silently skipped because the key id is at body.key.id, not body.id

    Root cause

    Two compounding mistakes. (1) I guessed the response shape of POST <path> instead of reading the route: it returns the row under key and the one-shot plaintext under generatedkey, NOT id/rawKey/plaintext.

    Signal: Silent / found by audit / class C / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-19

    supabase

    client agent platform

    s2 / Data

    Reported success

    Migration 300 (agent_run_side_effects + reserve_run_side_effect) was NEVER applied to the template tenant: every per-run side-effect cap silently fail-closed

    Root cause

    Migration 300 was authored and committed but never applied to the template tenant. The estate applies migrations through the Management API rather than the CLI, so nothing forces a repo migration to actually land on a given tenant; the schemamigrations ledger is separately known to be unreliable, so its silence was not...

    Signal: Silent / found by audit / class E / no MAST mode

    Open / no prevention rule

  • 2026-07-19

    supabase

    internal agent platform

    s2 / Verification

    Wrong signal

    Migration-registry §2 is last-wins PER B-PROMPT TOKEN: sharing one token across concurrent lanes causes an unwinnable merge treadmill

    Root cause

    <path> parses §2 with reserved.set(bprompt, nums), each row REPLACES the prior set for that token. With ~17 concurrent Bdst PRs all keyed Bdst, only the LAST Bdst row counts, so every lane must place its row last to stay reserved.

    Signal: Wrong signal / found by downstream / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    supabase

    internal agent platform

    s2 / Data

    Reported success

    Spreadsheet table extraction silently dead in prod: JSONL blob mime 'text/plain; charset=utf-8' rejected 415 by bucket allowlist

    Root cause

    The agent-documents bucket's allowedmimetypes (mig 029) is matched against the FULL content-type string, so the parameterized form 'text/plain; charset=utf-8' does NOT match the allowlisted bare 'text/plain'.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    supabase

    internal agent platform

    s2 / Verification

    Reported success

    Supabase safe-env denylist uses startsWith: direct-Postgres host db.<ref> bypasses it

    Root cause

    Leading-prefix match (startsWith) instead of a host-substring/segment match. A Supabase project ref appears in multiple host forms, <ref>.supabase.co (REST) and db.<ref>.supabase.co (direct Postgres), plus custom domains, and startsWith only catches the first.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-19

    vercel

    internal agent platform

    s2 / Application

    Reported success

    <path> Vercel cron is 307'd to /login: middleware PUBLIC_ROUTES allows <path> but not <path>, so budget alerts never fire automatically

    Root cause

    middleware.ts PUBLICROUTES lists '<path>' (prefix match) but NOT '<path>'. vercel.json registers the budget check as {"path": "<path>", "schedule": "/30 "}, the only cron NOT under <path> Middleware runs on /api paths (proven: <path> passes, <path> does not), so every scheduled invocation is redirected to /login bef...

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    vercel

    internal agent platform

    s2 / Infrastructure

    Client template updates fail at preview_deploy with build OOM unless the Vercel project has buildMachineType=enhanced

    Root cause

    The template's Next build no longer fits the DEFAULT Vercel build container. <internal-project>, Client A and Client B already had resourceConfig.buildMachineType = "enhanced"; Client C, Client F, Client E, Client H and Client I did not.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    vercel

    internal agent platform

    s2 / Infrastructure

    Reported success

    Fire-and-forget (void) DB writes are silently dropped on Vercel serverless: trust-loop receipts vanished 1-in-3

    Root cause

    The receipt writers were invoked fire-and-forget (void writeCanvasReceipt(...) / void writeShareMintReceipt(...)). On Vercel, the serverless function freezes as soon as the HTTP response is returned; any promise still in flight is dropped.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    vercel

    internal agent platform

    s2 / Application

    Reported success

    New inbound channel route 307-redirected to /login: middleware PUBLIC_ROUTES enumerates each inbound route by exact path

    Root cause

    middleware.ts PUBLICROUTES is a prefix-match list (strippedPath === route || strippedPath.startsWith(route + '/')) that enumerates EACH public inbound route by exact path (<path>,email,sms,webchat}). A new inbound route is auth-gated (307 → /login) until explicitly added.

    Signal: Silent / found by audit / class C / no MAST mode

    Resolution written / prevention rule written

  • 2026-07-19

    vercel

    internal agent platform

    s3 / Third party

    PDF ingest fails with "DOMMatrix is not defined" on Vercel prod for some PDFs (pdfjs needs DOM globals)

    Root cause

    pdfjs-dist reaches for browser DOM globals (DOMMatrix, and typically Path2D/ImageData) that do not exist in the Node serverless runtime. Whether it hits that path depends on the PDF's internal structure, so it is NOT all-PDFs: this tenant has one completed PDF and one failed.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-19

    vercel

    internal agent platform

    s3 / Infrastructure

    Reported success

    Share-page view counter dead: record_share_view + external audit dropped (fire-and-forget, no waitUntil) in Vercel serverless

    Root cause

    The share page fires the view counter + external audit as void supabase.rpc('recordshareview',...) / void logAuditEvent(...), not awaited, no waitUntil. On Vercel serverless the function returns as soon as the Server Component finishes streaming, so the pending RPC is frozen/dropped before it lands.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / no prevention rule

  • 2026-07-18

    vercel

    internal agent platform

    s2 / Third party

    Reported success

    : merges to master no longer trigger Vercel git deploys: merge "deployed" nothing

    Root cause

    DIAGNOSED (same evening): a platform-wide Vercel incident, "GitHub-linked deployments and authentication affected" (<host>, unresolved as of <phone>:20 UTC), concurrent with a GitHub "Partially Degraded Service" incident.

    Signal: Silent / found by human / class A / no MAST mode

    Open / fix recorded / prevention rule written

  • 2026-07-18

    advizr

    client agent platform

    s2 / Orchestration

    Reported success

    A dynamically-discovered tool can never satisfy a statically-computed allow-list (connectors invisible in Interact)

    Root cause

    Two independent defects in ONE filter in <path> (A) /interact defaults to PLAN mode, which passes allowedSkillSlugs to buildToolSet. <path> computed that allow-list from STATICALLY configured slugs only (frozen skill snapshot, or core ∪ configured).

    Signal: Silent / found by human / class B / MAST FM-1.1

    Open / prevention rule written

  • 2026-07-18

    advizr

    client agent platform

    s2 / Third party

    Composio tools.execute requires an explicit dated toolkit version: disableVersionCheck does NOT prevent it, and there is no 'latest'

    Root cause

    <path> constructed the SDK with disableVersionCheck: true and a comment asserting that this prevented ComposioToolVersionRequiredError. THE COMMENT WAS WRONG. Verified against the live API (@composio/core 0.10.0): disableVersionCheck: true + no version → ComposioToolVersionRequiredError version: 'latest' → ComposioTool...

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    advizr

    client agent platform

    s2 / Orchestration

    Reported success

    Three Composio app manifests shipped with 100% invented action slugs: connected apps exposed zero tools

    Root cause

    Every action slug in <path>,microsoftteams,quickbooks}.ts was derived from Composio's naming conventions offline and never checked against the live catalogue. None existed. Actual naming, verified live: - Outlook DOUBLES its prefix: OUTLOOKOUTLOOKLISTMESSAGES (not OUTLOOKLISTMESSAGES). Looks like a typo; is not.

    Signal: Silent / found by audit / class D / MAST FM-1.1

    Open / prevention rule written

  • 2026-07-18

    advizr

    internal agent platform

    s2 / Infrastructure

    Reported success

    Connectors dead on EVERY provisioned client: Composio env hand-set on the template, never propagated by provisioning

    Root cause

    The 21 vars were set BY HAND on the template Vercel project when the Composio streams shipped, and were never added to the provisioning env block in <path> (createProject envVars). grep -rl COMPOSIO across <internal-project> / <internal-project> / <internal-project> returned zero hits.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    claude

    internal agent platform

    s2 / Orchestration

    Usage limits killed 11 parallel subagents mid-implementation twice in one session: WIP-commit+push immediately on any agent-fleet kill

    Root cause

    Parallel subagent fleets multiply token burn; usage ceilings (session and monthly) terminate agents on a hard API error mid-write with no flush. Uncommitted worktree changes survive only because the filesystem does; nothing else about agent state is recoverable.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    composio

    client agent platform

    s2 / Third party

    Reported success

    Composio SDK verifyWebhook: JSDoc example param names contradict the Zod schema: every webhook silently 401s (and the wrapper-vs-normalized payload trap)

    Root cause

    Trusting a vendor SDK's JSDoc example over its runtime schema, and unit-testing an integration boundary entirely through mocks. The module under test (<path> wrapper) was mocked in every route test, so the param-name mismatch and the wrapper-vs-normalized-payload mistake had no test that could observe them.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    github

    client agent platform

    s2 / Verification

    Template release channel froze for 2 days: two independent gate breaks (invalid VERCEL_TOKEN + release-smoke spec orphaned by a testMatch change)

    Root cause

    Two unrelated breaks stacked: (1) The VERCELTOKEN repo secret on <internal-project> went invalid (403 invalidToken), it last worked <phone>, matching that weekend's secret-rotation churn. The gate's first step polls the Vercel deployments API, so nothing downstream ever ran.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    github

    client agent platform

    s2 / Verification

    Template release gate fails with Vercel API 403 invalidToken: the VERCEL_TOKEN repo secret expires and silently blocks all fleet rollouts

    Root cause

    The VERCELTOKEN secret on <internal-project>/<internal-project> had expired/been revoked. Confirmed by comparison, not assumption: the same API call with the LOCAL Vercel CLI token returned HTTP 200 while CI got 403.

    Signal: Quiet / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    github

    client agent platform

    s2 / Verification

    Reported success

    Unresolved.b-prompt merge conflict silently blocks ALL GitHub Actions dispatch on a PR branch (no CI runs, mergeable=UNKNOWN)

    Root cause

    The branch had an unresolved merge conflict with the CURRENT master (the root.b-prompt file: branch held Bdst, master had moved to Bhrd). GitHub cannot build refs/pull/<n>/merge while a PR conflicts, and pullrequest-triggered workflows run against that merge ref, so no merge ref means no dispatch at all, and mergeabili...

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    next

    internal agent platform

    s2 / Orchestration

    Colon-namespaced tool slugs are illegal model-provider tool names: one Composio connection 400s every execute-mode turn

    Root cause

    Anthropic and OpenAI both constrain tool names to ^[a-zA-Z0-9-]{1,64}$. Composio tool bindings are keyed by their colon-namespaced slug (composio:gmail:GMAILSENDEMAIL, built in <path>), and in <path> the tool-set RECORD KEY is exactly what the AI SDK sends as the tool name.

    Signal: Loud / found by check / class B / MAST FM-1.1

    Open / prevention rule written

  • 2026-07-18

    playwright

    internal agent platform

    s2 / Verification

    Wrong signal

    @live-exec nightly has no green baseline: beat 3 asked for a plan in execute mode (Go flips the toggle) and `.last()` masked it

    Root cause

    The spec predates #618's shipped behavior (approving a plan with Go flips the thread's mode to execute). A serial live suite that reuses one thread across beats inherits that mode change..last() locators over an accumulating transcript silently bind to stale artifacts, converting a precise failure ("no plan drafted") i...

    Signal: Wrong signal / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    qa

    client agent platform

    s2 / Verification

    Wrong signal

    G3 QA flake: INFRA_JUDGE_RE belt demoted rendered fallback judge verdicts, handing class-G refusal calls to the crude regex

    Root cause

    Grader success detail strings carry provider-error text from earlier failed attempts; a substring belt regex cannot distinguish "verdict rendered via fallback" from "no verdict". Plus a category error in the scenario: refusal phrasing was used as a proxy for injection non-compliance.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    supabase

    internal agent platform

    s2 / Application

    Reported success

    MCP external surface silently dead in prod: 4 independent bugs (phantom columns, no executor, 1-req/min cap)

    Root cause

    Code written against assumed/stale schema (migration files diverged from live DB via the Management-API apply path), plus hand-rolled inserts instead of the canonical seams (dispatchAgentRun, recordOutcome), plus zero end-to-end tests hitting the deployed surface, unit/CI stayed green while every call path was dead.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    vercel

    internal agent platform

    s2 / Application

    OAuth callback host escape: deriving callbackUrl from request.url behind the <host> router strands every Composio connection

    Root cause

    TWO defects sharing one dependency (Composio). (1) HOST ESCAPE. <internal-project>/vercel.json EXTERNAL-rewrites /<slug>/:match to <url>, a reverse proxy. So inside a route handler new URL(request.url).origin resolves to the.vercel.app UPSTREAM, not <host>.

    Signal: Loud / found by check / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-18

    vercel

    internal agent platform

    s1 / Infrastructure

    Reported success

    Prod alias regressed to PRE-MERGE-TRAIN code: env-only `vercel redeploy` chains rebuild stale source and re-take the alias by completion time

    Root cause

    vercel redeploy pins SOURCE to the target deployment while refreshing env, used for flag flips, it mints deployments of whatever commit the chain started from (and drops VERCELGITCOMMITSHA, so <path> says "unknown").

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    vercel

    internal agent platform

    s2 / Verification

    Wrong signal

    Rotated prod JWT_SECRET silently invalidates every local probe/harness minting from stale.env.local: reads as a fake outage (307s)

    Root cause

    Two facts compose: (1) JWT-based staff-session minting (check-exec.mjs / perf-interact recipe) trusts whatever JWTSECRET the local.env.local carries; (2) env rotations land on the NEXT deployment, so a probe that passed against an older build fails against a newer one with zero code change.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-18

    vercel

    internal agent platform

    s3 / Infrastructure

    Reported success

    vercel link silently overwrites.env.local in the linked directory (JWT_SECRET and all local env lost)

    Root cause

    Newer Vercel CLI link/deploy flows pull the project's development env into.env.local without prompting when --yes is passed.

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    advizr

    client agent platform

    s2 / Data

    Reported success

    Demo-workspace brain (RAG) leaks real <internal-project> internals on camera: seed:vault ingests the actual handbook, and grounded answers surface sales tactics, names, and retired claims

    Root cause

    <path> seeds the template workspace's brain with notes derived from <internal-project>'s real vault/handbook content, and the ask path does live RAG over them. Anything in those notes can appear verbatim in an answer.

    Signal: Silent / found by human / class B / no MAST mode / ASI06

    Open / prevention rule written

  • 2026-07-17

    github

    internal agent platform

    s3 / Infrastructure

    : force-push lease fails with "stale info": fetch refspec is narrowed to master, so no remote-tracking refs exist for feature branches

    Root cause

    Narrowed fetch refspec (+refs/heads/master:refs/remotes/origin/master) means fetch writes FETCHHEAD only; the default --force-with-lease has no remote-tracking ref to compare, so it refuses with "stale info".

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    next

    internal agent platform

    s2 / Application

    Reported success

    Agent IP (system_prompt) leaked to CLIENT_CONSUMER/VIEWER via GET <path>: dead-code strip gated on wrong permission

    Root cause

    A permission variable named for management (canManageAgents) actually checked a read permission (view:agents) held by low-privilege roles; the field-strip and the read-gate were conflated onto one boolean.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-17

    next

    internal agent platform

    s2 / Application

    Reported success

    Intl-throw-based timezone validation silently regresses on Node 22+ (ECMA-402 offset time zones): normalizeIana passed "-04:00" through

    Root cause

    Runtime-version-dependent validation: the code treated "Intl throws" as the definition of "not an IANA zone". That definition changed under the code between Node 20 and Node 22 (ECMA-402 offset-time-zone support).

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    next

    internal agent platform

    s3 / Verification

    Wrong signal

    Live-walk Playwright specs: serial 16-min runs flake on 90s waitForURL + fresh operator account hits WelcomeModal: the product path was fine

    Root cause

    Live e2e that (a) runs many heavy legs serially in one worker, (b) authenticates as a brand-new account that trips first-run onboarding overlays, and (c) waits on real-LLM output, will flake in ways indistinguishable from product bugs. The flows product path itself is correct, verified by isolated probe.

    Signal: Wrong signal / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    next

    client agent platform

    s2 / Application

    Partial <internal-project> localStorage blob crashed every dashboard page to the global error screen (4 e2e smoke tests born red)

    Root cause

    Two roots. (1) Product: use-onboarding's loadLocal() trusted localStorage shape, any partial/legacy <internal-project> blob (missing steps/coachmarks) crashed the hook during render inside the dashboard layout, whitescreening every page for that browser profile.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    next

    internal agent platform

    s3 / Application

    Reported success

    React Flow 12: two hit-test traps for handle-adjacent chrome and connection-drop pickers

    Root cause

    (1) CSS transform scale participates in hit testing; center-origin scaling of chrome positioned flush against a React Flow handle overlaps the handle at zoom < 1 (compensation factor > 1).

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    next

    internal agent platform

    s3 / Infrastructure

    Wrong signal

    Two Next dev servers sharing one worktree.next wedge both (health 404 on valid routes)

    Root cause

    next dev keys its build cache to the project directory, not the port, two dev processes in one checkout race on.next route manifests. The wedge presents as 404 (route not matched), not 500, so it looks like an app regression.

    Signal: Wrong signal / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    npm

    internal agent platform

    s3 / Infrastructure

    Reported success

    npm install --no-save into a shared worktree hub re-resolved the whole tree and removed 134 packages

    Root cause

    npm install with --no-package-lock does not do a minimal additive install: it ignores the lockfile and reconciles the full nodemodules tree against package.json ranges, adding/removing/upgrading anything that differs.

    Signal: Silent / found by downstream / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    railway

    agency infrastructure

    s3 / Orchestration

    Client A worker drain: 72 capture_triage/vault_ingest_enrich follow-on jobs died ("agent run reported failure (no error)") on curator MOC notes

    Root cause

    Not fully diagnosed. The enrichment agents run against freshly ingested agentless curator notes; the run reports failure without an error payload, likely a missing agent/workspace precondition for enrichment on agentid-NULL curator output, or an enrichment path that predates agentless ingest.

    Signal: Quiet / found by audit / class C / MAST FM-3.2

    Open / prevention rule written

  • 2026-07-17

    railway

    agency infrastructure

    s2 / Infrastructure

    Reported success

    Template-stack tenants ship without an agent-worker: job_queue accumulates silently (Client A: 132 jobs, 51 stuck docs)

    Root cause

    Provisioning deliberately ships FEATUREINLINEDISPATCH=true + a WORKERQUEUES env pin "until a per-client Railway agent-worker is deployed", but inline dispatch only covers crondispatch, every other queue (ingestdocument, curatorjobs, backfillshadowdocs, graphintelrefresh, connectorsync) requires the worker that was neve...

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    supabase

    internal agent platform

    s2 / Third party

    Fresh Supabase project: ACTIVE_HEALTHY precedes storage schema: provisioning migration 029_storage_bucket fails 42P01

    Root cause

    ACTIVEHEALTHY on GET /v1/projects/{ref} covers the project/database only; the storage service creates storage.buckets/storage.objects asynchronously, up to minutes after.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    supabase

    internal agent platform

    s2 / Verification

    Reported success

    Interact QA sweep + plan forensics silently invalidated by demo-mode-ON tenant

    Root cause

    demomodeenabled=true makes the agent short-circuit to canned previews; a demo-on sweep is meaningless. Provisioning can flip the flag back, and nothing asserted it before a sweep.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    supabase

    internal agent platform

    s2 / Data

    Reported success

    Live template DB migration ledger DARK since 176: everything after applied ledger-less; registered migrations silently unapplied (244, 445, 460-462)

    Root cause

    Two apply paths with different bookkeeping: the provisioning/update engine writes schemamigrations, but day-to-day DDL goes through the Supabase Management API (the CLI hangs backgrounded, so the estate standard is raw Management API queries) and nobody inserts the ledger row.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    supabase

    client agent platform

    s3 / Data

    mig 304 compute_doc_similarity_edges_v2 fails under pg-safeupdate: unqualified DELETE on its temp table

    Root cause

    The v2 RPC assumes safeupdate is off. Tenants where it ran before (Client A/Client B) evidently didn't enforce it; the template project does.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    supabase

    client agent platform

    s2 / Data

    resetDemoData permanently strands demo agent_proposals once agent_trust_events reference them (append-only trigger blocks the FK SET NULL)

    Root cause

    Trust-Loop's append-only trigger (BEFORE DELETE OR UPDATE... RAISE) composes badly with the ON DELETE SET NULL FK from agenttrustevents.proposalid: the FK's nulling UPDATE is indistinguishable from a mutation, so proposal deletion is impossible while any trust event links to it.

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    supabase

    client agent platform

    s2 / Orchestration

    Reported success

    Runner adoption rebuilt agent_runs.metadata from scratch: every dispatch-stamped fact (plan_approved, plan_consent) silently dropped on adopt

    Root cause

    Two writers of one JSONB column with no merge discipline: dispatch stamps facts, adoption re-derives operational keys and treated the column as its own. Unit tests mocked the runner, so the clobber was invisible to CI; only a live end-to-end check (dispatch → adopt → read back the row) exposed it.

    Signal: Silent / found by audit / class B / MAST FM-1.4

    Open / prevention rule written

  • 2026-07-17

    supabase

    client agent platform

    s3 / Data

    Reported success

    Stale memory claimed the fictional Acme/Globex brain pack was purged from the template tenant: live probe found all 12 docs still serving

    Root cause

    The purge was evidently planned/partial when the memory was written (only the 5 EXTRAFICTIONALIDS dev-era notes were actually gone). Memory recorded intent as outcome; nothing re-verified against the live DB.

    Signal: Silent / found by audit / class D / no MAST mode / ASI06

    Open / prevention rule written

  • 2026-07-17

    supabase

    internal agent platform

    s3 / Data

    Reported success

    Template demo DB schema drift blocks feature verification: workspace_settings.share_links_enabled (mig 445) absent, improvement_suggestions (mig 462) absent

    Root cause

    Migration files land on master, but application to the live template/demo DB is a separate Management-API ops step that has been skipped repeatedly; schemamigrations does not reflect reality.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    supabase

    internal agent platform

    s2 / Verification

    Wrong signal

    Template-update engine: a NON-EMPTY but incomplete schema_migrations ledger replays old migrations and hard-fails (updatetest canary)

    Root cause

    The seeding guard equates "ledger has any rows" with "ledger is truthful". A drill/recovery run that inserted a single ledger row (000recoverybasetables) defeated the guard while the schema was a partial 000-009 provision.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    vercel

    internal agent platform

    s1 / Infrastructure

    <host> ERR_TOO_MANY_REDIRECTS: JWT_SECRET on <internal-project>/Client I overwritten with a foreign value, admin↔router login loop

    Root cause

    JWTSECRET is a shared fleet secret (router signs at login; admin + every client app verify), but nothing enforces or documents that invariant at the point of edit: a human with team access replaced it on two projects with a freshly generated value.

    Signal: Loud / found by client / class A / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-17

    vercel

    internal agent platform

    s2 / Infrastructure

    Automatic provisioning was broken by a SECOND independent cause: INTERNAL_API_SECRET never set on <internal-project> Vercel: every kick 401'd

    Root cause

    Cross-app shared secret existed only on the sender (<internal-project>) and was never provisioned on the receiver (<internal-project>); no startup/env completeness check and the kick's failure write (provisionkickfailed) was only scanned by a cron whose Slack webhook was ALSO unset, so the 401s were invisible.

    Signal: Quiet / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-17

    vercel

    internal agent platform

    s2 / Infrastructure

    Template build OOM extends to EVERY client project: fleet updates blocked until enhanced build machines enabled per client

    Root cause

    The template's build outgrew the standard Vercel build container as of the Interact-era releases; client repos build the same codebase, but the <phone> Enhanced Builds fix was applied only to <internal-project>'s project, not the fleet.

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    next

    agency infrastructure

    s3 / Application

    Reported success

    Tailwind v4 tokens dead on first consumption: plain @theme froze world re-scoping and cascade-layer order let legacy CSS beat utilities

    Root cause

    (1) @theme { --color-card: hsl(var(--card)) } (non-inline) computes the var() substitution at:root, so descendants inherit the RESOLVED dark value and a.light re-scope of --card never propagates, utilities must be generated with @theme inline so var(--card) resolves at the element.

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    next

    internal agent platform

    s2 / Orchestration

    Reported success

    tool-builder silently dropped unknown skill slugs: the model then narrated completions of work it never had tools for

    Root cause

    Fail-closed tool filtering (correct) with zero observability (incorrect): the drop was invisible to operators and to the model's own trace, so absence of capability degraded into hallucinated success instead of an honest "I can't do that here".

    Signal: Silent / found by human / class D / MAST FM-2.6

    Open / prevention rule written

  • 2026-07-16

    railway

    internal agent platform

    s1 / Infrastructure

    Reported success

    Dual provisioning-worker hijack: re-armed stale local launchd poller claimed cloud jobs

    Root cause

    Queue design allows any number of competing consumers: claims are a bare status CAS with no worker identity/lease, and the local worker installer (<path> with KeepAlive+RunAtLoad) could silently re-arm a poller running whatever code that checkout had.

    Signal: Silent / found by audit / class A / no MAST mode / ASI10

    Open / prevention rule written

  • 2026-07-16

    railway

    internal agent platform

    s2 / Infrastructure

    Reported success

    Railway worker WORKER_QUEUES env pin rotted while code grew queues: jobs sat unclaimed silently

    Root cause

    Config pinned in a dashboard env var duplicates release-managed code state; the two drift apart with every release and nothing compares them. "Operators can pin a narrower set" was documented as a feature with no guard.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    railway

    internal agent platform

    s2 / Verification

    Update-engine post_verify battery hard-fails every real update: check-live.mjs run from bare /tmp can't resolve its 'jose' import

    Root cause

    <internal-project> <path> copies the client repo's <path> alone into a mkdtemp dir and runs node check-live.mjs there. check-live.mjs bare-imports 'jose' (staff-JWT mint for authed probes), and has since before Client A's base <sha>, so this was latent in EVERY update; the Release Gate never caught it because GitHub Ac...

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    stripe

    internal agent platform

    s2 / Application

    Reported success

    checkout hardcoded USD: live CAD client would have been subscribed at USD $6,000/mo

    Root cause

    The mint side (<internal-project>) and the pay side (<internal-project>) are separate repos sharing a DB contract, and the pay side was written when only USD deals existed.

    Signal: Silent / found by audit / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    supabase

    internal agent platform

    s2 / Orchestration

    agent_runs stuck forever in status='cancelling': waiting-leg guard shields a stop-all'd parked run from the reaper

    Root cause

    The reaper has no pass that finalizes a 'cancelling' run once no live runner will observe the cancel. Only a runner actively polling writes the terminal 'cancelled'; a parked or never-adopted run has no such runner, and Pass A's waiting-leg guard (correct for genuinely-waiting runs) plus its lastheartbeatat IS NOT NULL...

    Signal: Quiet / found by audit / class B / MAST FM-1.5

    Open / prevention rule written

  • 2026-07-16

    supabase

    internal agent platform

    s1 / Verification

    Reported success

    Built-in prompt-injection + toxicity guardrails fail open: PCRE (?i) invalid in JS RegExp, loader silently skips

    Root cause

    PCRE inline-flag syntax (?i) is invalid in JavaScript RegExp, and the policy loader's per-row try/catch treats a built-in parse failure identically to a benign custom-rule skip, swallowing the throw with only a console.error, so a dead built-in guardrail is indistinguishable from normal operation.

    Signal: Silent / found by audit / class C / no MAST mode / ASI01

    Resolution written / prevention rule written

  • 2026-07-16

    supabase

    internal agent platform

    s2 / Data

    Wrong signal

    Canary client updatetest has a half-provisioned husk DB: fresh-DB probe misfires, update engine full-replays and fails at 001

    Root cause

    updatetest was left half-provisioned by an earlier aborted provision run (profiles + 12 other tables, no workspacesettings, empty ledger). The fresh-DB heuristic is single-table and treats any partial schema missing workspacesettings as fresh, guaranteeing a 001 collision on such DBs.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    supabase

    internal agent platform

    s2 / Data

    Curator FK-orphan dead-letter storm surfaced raw SQL on the operator run feed

    Root cause

    curatorreviews.subjectrunid was a HARD FK (ON DELETE SET NULL) where the repo's own convention for a run reference written ASYNCHRONOUSLY (subject may be purged before the review lands) is a SOFT link with NO FK (actionreceipts.runid mig 191:49 'no FK; runs may be purged'; captureitems.sourcerunid mig 214).

    Signal: Loud / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    supabase

    client agent platform

    s3 / Data

    seed:demo on template master fails engagement/SKU/playbook FKs: demo user only seeded into master DB, not the client DB users table

    Root cause

    <path> seedDemoUser() upserts the demo user (uuidv5 'user:demo@<host>', namespace <id>) ONLY into the MASTER auth DB, but acme-fixtures.ts sets engagements.assignedfdeuserid = demoUserId(), and that FK references the CLIENT DB's own users table (<project-ref>).

    Signal: Loud / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    vercel

    agency infrastructure

    s2 / Third party

    Reported success

    merges to main produce NO Vercel deployment (same silent no-deploy class as <internal-project>/<internal-project>)

    Root cause

    GitHub-to-Vercel integration is not firing for this repo's merges (third repo showing this pattern this week, after <internal-project> and <internal-project>). Not diagnosed at the integration level; likely the org-wide GitHub app connection.

    Signal: Silent / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    vercel

    agency infrastructure

    s2 / Third party

    Reported success

    docs.<host> production silently 36 days stale: bot-authored merges never deployed

    Root cause

    Vercel maps the git commit AUTHOR email to a team identity and silently blocks auto-deploys from unlinked authors. The docs content bots committed with an unlinked author email, so every bot merge to master produced no production deployment, and nothing alerts on "merge without deploy".

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    vercel

    internal agent platform

    s2 / Infrastructure

    Reported success

    Every <host>/onboarding link 404'd in prod: router's committed vercel.json never had the onboarding rewrites

    Root cause

    The known generator drift in <internal-project>: <path> emits the onboarding rewrites (ONBOARDINGTARGET) from config/routes.json, but the committed vercel.json on origin/master never picked them up, and Vercel routing comes from the committed vercel.json at upload time, the prebuild regenerate during remote build does...

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-16

    vercel

    internal agent platform

    s1 / Orchestration

    Reported success

    Interact Execute Plan executed nothing in prod: run-identity split + fire-and-forget death + unclaimed resume queue

    Root cause

    The dispatch/runner contract was never real: a code comment claimed "the runner's own INSERT path overwrites status+treeroot once it picks the work up" but no adoption mechanism existed (RunAgentOptions had no run-id field; finalizePendingRun was Hermes-only and Hermes headless is disabled).

    Signal: Silent / found by human / class D / MAST FM-3.2

    Open / prevention rule written

  • 2026-07-16

    vercel

    internal agent platform

    s2 / Infrastructure

    Reported success

    vercel env add via echo-pipe stores a literal \n: AUTO_ROLLOUT flag silently off

    Root cause

    Piping via echo includes the trailing newline, and the Vercel CLI stores it as part of the secret value (the known read-side "env values carry a literal \n" trap also exists on the WRITE side).

    Signal: Silent / found by audit / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    advizr

    internal agent platform

    s3 / Application

    Reported success

    ai_runs.cost_usd always null for summarize/enrich_contact: enrich.ts never computed cost

    Root cause

    Missing function call, not missing data: <path> already had full model coverage (including the default aiModel() slug) plus a DEFAULTPRICING fallback for any unknown slug, so calculateCost() would never have returned null/undefined.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    agency

    agency infrastructure

    s2 / Infrastructure

    Reported success

    KB write path was never deployed - routes existed only as untracked local code

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / no prevention rule

  • 2026-07-15

    agency

    agency infrastructure

    s1 / Application

    Reported success

    Never-reviewed KB write-path code carried a path traversal that reached every org repo

    Root cause

    Prefix-anchored allowlist regexes plus URL dot-segment normalization: the validation layer and the transport layer disagreed about what a path 'is'. The cross-repo escape hatch ('non-vault repos are exempt from the allowlist') compounded it.

    Signal: Silent / found by audit / class E / no MAST mode / ASI03

    Open / prevention rule written

  • 2026-07-15

    github

    internal agent platform

    s3 / Verification

    Wrong signal

    master CI pre-existing red: unit-tests fails (workspace-auth 400s in loops/objectives route tests) → PRs need --admin merge

    Root cause

    Pre-existing broken test harness/auth-context on <internal-project> master (a shared workspace/auth fixture returns 400 "No workspace found for user" across loops/objectives route tests). NOT caused by feature branches.

    Signal: Wrong signal / found by human / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    next

    internal agent platform

    s3 / Verification

    Wrong signal

    master unit-tests suite has ~8 chronically-red files (required check): every PR merges via admin override

    Root cause

    Not fully diagnosed, smells like a shared CI test fixture / supabase-mock seam that drifted (the loops/objectives/setup-provision cluster all touch workspace lookup + provisioning mocks). Pre-dates the brain-10x work (present on the Bmail #562 and docs #563 commits). Unrelated to any one feature PR.

    Signal: Wrong signal / found by human / class E / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    next

    internal agent platform

    s3 / Infrastructure

    worktree hub missing culori → contrast-gate + dev-server + e2e fail locally (declared dep, not installed)

    Root cause

    The shared nodemodules hub was installed before culori was added to package.json; the hub lagged the manifest, so a declared+locked dependency is simply not on disk. CI (npm ci) installs it, so CI is green; only local worktrees are affected.

    Signal: Loud / found by human / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    next

    internal agent platform

    s3 / Application

    Consumer server page blocked its whole render on an awaited DB read (unreachable DB → stuck on loading.tsx)

    Root cause

    A top-level awaited DB read in an async server component blocks the entire page render; slow/unreachable DB leaves the whole page on loading.tsx.

    Signal: Quiet / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    next

    client agent platform

    s2 / Verification

    Reported success

    Local typecheck via the shared worktree node_modules hub misses type errors clean-install CI catches

    Root cause

    The worktree's nodemodules is a symlink to a SHARED hub (interact-plan-inline-wt), which is a few commits divergent from the branch's origin/master. The hub resolved a different transitive number-flow type tree than a clean npm ci at the branch commit, so @number-flow/react's Format (which is Omit<Intl.NumberFormatOpti...

    Signal: Silent / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    next

    internal agent platform

    s2 / Application

    Reported success

    lucide-react icon components misclassified as ReactNode (forwardRef typeof is 'object', not 'function')

    Root cause

    lucide-react icons are React.forwardRef exotic components, so typeof SomeIcon === 'object' at runtime (not 'function'). A type guard written as typeof icon === 'function' silently fails for every lucide icon reference passed as a prop typed LucideIcon | ReactNode, routing it into the ReactNode branch, which then render...

    Signal: Silent / found by human / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    openai

    agency infrastructure

    s2 / Third party

    OpenAI fine-tuning API rejects new job creation for orgs that never fine-tuned before (<internal-project> OPENAI_API_KEY confirmed blocked)

    Root cause

    OpenAI announced a self-serve fine-tuning platform wind-down (developers.<host><path>): orgs that had NEVER run a fine-tuning job before <phone> lost the ability to create new ones as of that date; orgs with prior fine-tune history but no inference on a fine-tuned model in the last 60 days lose access as of <phone>; AL...

    Signal: Loud / found by check / class A / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    supabase

    internal agent platform

    s3 / Verification

    Wrong signal

    migration PR: tracked.b-prompt hijack + open-PR number collision

    Root cause

    Two independent traps in <path> (1) resolveBPrompt() prefers the tracked root.b-prompt FILE over the PR-title [Btag]; each migration PR is expected to overwrite it, so it carries the PREVIOUS programme's tag (Bmail from the last migration PR #440) until you flip it.

    Signal: Wrong signal / found by check / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    supabase

    client agent platform

    s2 / Verification

    Reported success

    Migration number chosen at branch time collided on rebase: registry-gate can't see band reservations on open PRs

    Root cause

    A migration number verified free at branch time can be claimed by another in-flight B-prompt PR before merge. check-migration-registry.mjs validates only that your number is in YOUR registry row's reservation and (best-effort) not in another OPEN PR's migration FILES; it does not detect band reservations documented in...

    Signal: Silent / found by downstream / class B / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    vercel

    agency infrastructure

    s2 / Application

    Reported success

    : cron routes silently redirected to login instead of running (missing middleware.ts PUBLIC_ROUTES entry)

    Root cause

    middleware.ts's PUBLICROUTES set must be kept in sync by hand with every new/existing self-authenticating (CRONSECRET or shared-secret) route; health-sweep's route file was added without a matching middleware.ts entry, and nothing enforces the pairing, the route compiles, typechecks, and works under manual testing (wit...

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-15

    vercel

    internal agent platform

    s2 / Application

    Reported success

    health-sweep cron silently 307'd to /login: missing PUBLIC_ROUTES entry

    Root cause

    A new self-authenticating cron route (bearer-token, no session cookie) must be added to middleware.ts's PUBLICROUTES or the session-auth middleware intercepts it before the route's own auth check ever runs.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / prevention rule written

  • 2026-07-14

    advizr

    internal agent platform

    s2 / Infrastructure

    Wrong signal

    Vercel builds fail intermittently: an empty pnpm-lock.yaml stub makes cold-cache builds pick pnpm and die with exit 236

    Root cause

    A 92-byte pnpm-lock.yaml stub (from the original v0.dev scaffold, lockfileVersion: '9.0', zero packages) sat next to the real package-lock.json (npm, lockfileVersion 3, 545 packages). Vercel detects the package manager from whichever lockfile it finds.

    Signal: Wrong signal / found by check / class A / no MAST mode

    Open / fix recorded / no prevention rule

  • 2026-07-14

    url

    agency infrastructure

    s2 / Infrastructure

    Reported success

    Global Claude config pointed at dead KB URL (<host>)

    Root cause

    URL drift after the KB API redeploy from <host> to <host>: workspace configs were updated, the two global config files were missed. No probe checks the URL, and the pulse script swallows failures, so the breakage was invisible.

    Signal: Silent / found by audit / class C / no MAST mode

    Open / fix recorded / prevention rule written

  • 2026-07-14

    advizr

    client agent platform

    s1 / Infrastructure

    Reported success

    is not a GitHub account, so its commits make Vercel BLOCK every client deploy

    Root cause

    <internal-project> is not a GitHub account, GET /users/<internal-project> returns 404. Two workflows in the client template merely set git config user.name "<internal-project>" / user.email "bot@<host>" and push.

    Signal: Silent / found by audit / class A / no MAST mode

    Open / fix recorded / no prevention rule

  • 2026-07-14

    client

    client agent platform

    s1 / Application

    Reported success

    Client email notifications have never been delivered: three stacked causes, all silent

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Silent / found by client / class C / no MAST mode

    Open / no prevention rule

  • 2026-07-14

    instantly

    outbound pipeline

    s1 / Application

    Three US campaigns paused at 17.9% bounce: the leads were never email-verified

    Root cause

    <internal-project> defaults to EMAILVERIFYPROVIDER=free, which does syntax + MX only. The pipeline's own docstring admits this "cannot detect a nonexistent mailbox on a live domain." No provider was ever set in.env.

    Signal: Loud / found by check / class B / no MAST mode

    Open / no prevention rule

  • 2026-07-12

    commitaction

    client agent platform

    s1 / Orchestration

    Reported success

    Prompt-injected commitAction payloads are proposed to a human, not blocked

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Silent / found by audit / class B / no MAST mode / ASI01

    Open / no prevention rule

  • 2026-07-12

    next

    client agent platform

    s2 / Infrastructure

    Wrong signal

    Vercel build on the feature umbrella is OOM-killed, not a compile error, and it blocks the merge gate

    Root cause

    next build exceeded the RAM of Vercel's default build container and was SIGKILLed. The umbrella branch has grown large because many additive feature streams merged into it, no single stream is "the" culprit; the repo simply outgrew the build machine. Truncation with no error line IS the OOM signature.

    Signal: Wrong signal / found by check / class A / no MAST mode

    Open / no prevention rule

  • 2026-07-12

    no

    client agent platform

    s2 / Application

    Reported success

    Dashboard middleware never calls hasPermission: every route is URL-loadable by any authenticated user

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Silent / found by audit / class B / no MAST mode / ASI03

    Open / no prevention rule

  • 2026-07-12

    policy

    client agent platform

    s1 / Verification

    Reported success

    Built-in prompt-injection and toxicity guardrails are silently dead: PCRE (?i) is invalid in JS RegExp

    Root cause

    The seeded patterns embed (?i), a PCRE / Python inline flag. JavaScript's RegExp has no inline-flag syntax; the constructor throws Invalid group. <path> catches the parse error and skips the rule.

    Signal: Silent / found by audit / class C / no MAST mode / ASI01

    Resolution written / fix recorded / no prevention rule

  • 2026-07-12

    reindexfile

    client agent platform

    s3 / Data

    reindexFile() delete-then-insert is not atomic: concurrent writes to one file log dup-key warnings

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Quiet / found by audit / class C / no MAST mode

    Open / fix recorded / no prevention rule

  • 2026-07-12

    vault

    client agent platform

    s2 / Verification

    Reported success

    Vault curator has detected zero contradictions in production: contradictions.ts still carries a rejected zod bound

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: Silent / found by audit / class E / no MAST mode

    Open / fix recorded / no prevention rule

  • 2026-07-11

    kb

    agency infrastructure

    s2 / Infrastructure

    KB write path broken: kb_log_error returns HTML, memory_save schema mismatch

    Root cause

    Not fully diagnosed. Two distinct failure modes: (1) kblogerror / vaultwrite hit an endpoint that serves HTML (missing route or auth redirect on <host>); (2) memorysave bridge (test/agency-kb-master/bridge<path>) does not send sessionid / projectslug / observationtype in the shape the API requires, schema drift between...

    Signal: Loud / found by human / class A / no MAST mode

    Open / fix recorded / prevention rule written

  • 2026-06-14

    jwt

    internal agent platform

    s2 / Infrastructure

    Reported success

    Clients provisioned before the JWT_SECRET alignment still carry the old secret, so agency SSO does not verify on them

    Root cause

    Cross-app SSO depends entirely on every app signing and verifying with the same JWTSECRET. The provisioning worker used to hand new clients a different secret from the one the router's central login signs with (the worker's was a 46-char base64 value; the canonical router/admin secret is a 31-char value ending...set-ke...

    Signal: Silent / found by audit / class B / no MAST mode

    Open / fix recorded / no prevention rule

  • supabase

    agency infrastructure

    / unclassified

    No root cause recorded

    This note was filed without a diagnosis. It is counted in the total and excluded from every figure that requires one, rather than quietly dropped.

    Signal: not classified / no MAST mode

    Open / no prevention rule

Method

The corpus is every failure note filed to the agency's error memory between 2026-06-14 and 2026-08-21. Notes are filed under a written contract with a fixed shape: severity, system, what happened, root cause, detection, fix, prevention rule. Most were filed by the automatic capture path, which means the root cause was written at diagnosis time by the same party that caused the failure.

The corpus is live and it grew while this was being written. Version 1.0 is pinned to one commit, d152f8a, which holds 359 notes. Re-running the pipeline two days later returned 361. Any figure here quoted without that pin is quoting a moving number, so the analysis refuses to run when the classification and the corpus disagree on row count rather than silently joining what it can.

Anonymisation runs before anything else and fails the extract rather than warning. Client slugs map to stable pseudonyms, named people to role descriptions, and paths, hostnames, keys, Stripe object ids, project references and session ids are removed. The gate then runs every pattern on the agency do not name list plus every tenant slug over the whole serialised output, and it runs again on the generated data module, because a gate that runs once at the start of a pipeline is not protecting the end of it. Third party vendor names are kept, because they are not clients and a mechanism nobody can act on is not worth publishing.

Classification is two passes. The first assigned layer, signal, detection channel, prevention class and the four crosswalk columns. The second existed only to attack the first on the signal axis, which carries the study's central claim. The rule was asymmetric on purpose: a row coded silent had to produce explicit evidence in its own prose that the system reported success or reported nothing, while a row coded loud was never challenged, because coding a failure as loud can only understate the finding.

Of 250 rows coded silent or misdirecting, 47 could not produce explicit evidence and were re read by hand. Seven did not survive and were downgraded to loud: two were authoring errors in a document rather than a system reporting anything, three were an operator action, a hang and a missing file that were all observable, and two were cases where the CI gate fired correctly and only the local mirror of it had drifted. The figures on this page are after those downgrades, and the first pass file is kept so the change is auditable.

Every figure on this page is computed from the dataset at build time. None is typed into the prose. The column order is the contract, so changing it is a version bump rather than an edit.

Advizr sells AI systems. That is a commercial interest in this subject, and it is why the most prominent number on this page is the one about our own closure rate. The finding that the model is rarely the problem is also convenient for a company that sells architecture rather than models, and a reader should weigh it accordingly. The data is published so that weighing can be done rather than taken on trust.

What this cannot tell you

This is a ledger of failures encountered by one agency building and operating production AI systems. The unit of analysis is one recorded failure that cost engineering time, so the count is of records rather than of distinct faults: 2 pairs are the same failure filed twice, which makes 357 distinct faults across 359 records. It is not a sample of agent runtime failures and it is not representative of anything.

5 systems, one operator, 68 days. Selection is whatever got written down, and what gets written down is biased toward what the filing hook could catch.

Recurrence has almost no signal and the reason is now known. 351 of 359 fired exactly once, which would suggest these failures do not recur. They do. The corpus contains 2 pairs of records with identical titles describing the same failure filed twice, and the deduplication fingerprint marked all four as first occurrences. A fingerprint that misses an exact title match is not measuring recurrence, so no recurrence rate is computed here and the 8 records that do carry a count above one should be read as a floor.

Detection latency is not published. Only ten notes carry an occurrence date that differs from their filing date, so the corpus resolves latency at one day at best. A distribution built on ten points would be decoration.

The classification is one reader's judgment, refuted by the same reader under an asymmetric rule. It is not an inter annotator agreement study, and only the signal axis was challenged. The codebook and the raw rows are published so anyone can recode them and disagree.

The corpus skews to the agency's own engineering rather than to client agent runtimes. That bounds what the layer distribution says about anyone else's deployment, and it is also why the finding is worth having: these are the failures of the people building the systems, which is the population the survey literature never reaches.

How to cite this

The data is CC BY 4.0. The prose is not. Corrections are versioned rather than silently edited, and a correction to any row bumps the version and is listed on the page.

Booth, James. The Agent Failure Index, version 1.0. Advizr, 2026.
359 production failures, 2026-06-14 to 2026-08-21. Snapshot d152f8a. CC BY 4.0.
advizr.ca/research/the-agent-failure-index

Dataset: CSV and JSON, 359 rows, 21 columns

5x ROI in 30 days. Or we work for free.