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.
James Booth21 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.
| Layer | Failures | Share | What it is |
|---|---|---|---|
| Verification | 117 | 32.7% | Tests, CI gates, health checks, dry runs, monitors |
| Application | 81 | 22.6% | Product code around the agent |
| Infrastructure | 66 | 18.4% | Host, build, queue, package manager, network |
| Data | 33 | 9.2% | Schema, migration, corpus, index |
| Third party | 32 | 8.9% | A vendor behaved unlike its contract |
| Orchestration | 26 | 7.3% | Planning, tool selection, delegation, memory |
| Model | 3 | 0.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.
| Layer | n | Loud | Quiet | Silent | Wrong | Not loud |
|---|---|---|---|---|---|---|
| Verification | 117 | 23 | 2 | 44 | 48 | 80.3% |
| Application | 81 | 18 | 2 | 56 | 5 | 77.8% |
| Orchestration | 26 | 7 | 2 | 15 | 2 | 73.1% |
| Model | 3 | 1 | 0 | 2 | 0 | 66.7% |
| Infrastructure | 66 | 25 | 1 | 34 | 6 | 62.1% |
| Data | 33 | 16 | 1 | 15 | 1 | 51.5% |
| Third party | 32 | 17 | 0 | 10 | 5 | 46.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.
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.
| Stage | Count | Of 359 |
|---|---|---|
| Failure recorded | 359 | 100% |
| Root cause written | 349 | 97.2% |
| Prevention rule written | 339 | 94.4% |
| Resolution written | 71 | 19.8% |
| Fix recorded | 11 | 3.1% |
| Closed in the database | 6 | 1.7% |
| Prevention rule promoted to an enforced check | 0 | 0% |
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 E | 358 | 100% |
|---|---|---|
| OWASP Agentic Top 10 | 21 | 5.9% |
| MAST 14 modes | 14 | 3.9% |
Silent failure class
| B Design assumption mismatch | 175 | 48.9% |
|---|---|---|
| A Environment and platform quirk | 107 | 29.9% |
| C Error swallowing and dilution | 39 | 10.9% |
| E Operational omission | 26 | 7.3% |
| D Chained fabrication | 11 | 3.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>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.
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