@agent-beam/beam 0.2.28 → 0.2.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sdk.js CHANGED
@@ -1,4 +1,7 @@
1
- import { MonitorPipeline } from "./monitor-pipeline.js";
1
+ import { CpuBudget, MonitorPipeline } from "./monitor-pipeline.js";
2
+ import { matchLine } from "./monitor-rules.js";
3
+ import { containsCanary } from "./prompt-attacks.js";
4
+ import { judgeWithOwnLlm, ownLlmConfig } from "./monitor-llm.js";
2
5
  const TOKEN = /^beam_app_[\w-]{40,}$/;
3
6
  const CONFIG_EVERY_MS = 5 * 60 * 1000;
4
7
  const CONFIG_RETRY_MS = 60 * 1000;
@@ -9,18 +12,103 @@ function env(name) {
9
12
  function withTimeout(ms) {
10
13
  const controller = new AbortController();
11
14
  const timer = setTimeout(() => controller.abort(), ms);
15
+ // Never keep the app's process alive for a report (Node returns a Timeout with unref; edge runtimes a number).
16
+ timer.unref?.();
12
17
  return { signal: controller.signal, done: () => clearTimeout(timer) };
13
18
  }
14
- const noop = { request() { }, log() { }, flush: async () => { }, enabled: false };
19
+ const REQUEST_TIMEOUT_MS = 5_000;
20
+ const MAX_BACKOFF_MS = 5 * 60_000;
21
+ const REVOKED_RECHECK_MS = 15 * 60_000;
22
+ const MAX_PAUSE_MS = 24 * 60 * 60_000;
23
+ /** Doubling delays with jitter, so many app instances don't retry an outage in lockstep. */
24
+ const backoff = (base, failures) => Math.min(MAX_BACKOFF_MS, base * 2 ** Math.min(failures, 10)) * (0.5 + Math.random() / 2);
25
+ /** A server-provided resume time, sanity-checked: never in the past, never more than a day away. */
26
+ function pauseUntil(resetAt) {
27
+ const at = typeof resetAt === "string" ? Date.parse(resetAt) : Number.NaN;
28
+ const now = Date.now();
29
+ return Number.isFinite(at) && at > now ? Math.min(at, now + MAX_PAUSE_MS) : now + 60_000;
30
+ }
31
+ const SEVERITY_RANK = { critical: 3, high: 2, medium: 1, low: 0 };
32
+ const clean = () => ({ flagged: false, severity: null, matches: [] });
33
+ function canaryRule(canaries) {
34
+ const usable = canaries.filter(c => typeof c === "string" && c.replace(/[^a-z0-9]/gi, "").length >= 8);
35
+ return usable.length
36
+ ? [{ id: "llm.system_prompt_leak", title: "System prompt leaked in model output", severity: "critical", category: "llm", sources: ["output"],
37
+ match: (_s, raw) => containsCanary(raw, usable) }]
38
+ : [];
39
+ }
40
+ // Rules read 16 KB at a time; a long retrieved document is read in overlapping windows, up to 256 KB.
41
+ const WINDOW = 16_384;
42
+ const OVERLAP = 512;
43
+ const MAX_TEXT = 262_144;
44
+ /** The check, and the window that matched (what gets reported). */
45
+ function scan(text, source, extra = []) {
46
+ try {
47
+ if (typeof text !== "string" || !text.trim())
48
+ return { result: clean(), window: "" };
49
+ const all = text.slice(0, MAX_TEXT);
50
+ let window = all.slice(0, WINDOW);
51
+ let rules = [];
52
+ for (let at = 0; at < all.length && !rules.length; at += WINDOW - OVERLAP) {
53
+ window = all.slice(at, at + WINDOW);
54
+ rules = matchLine(window, source, extra);
55
+ }
56
+ if (!rules.length)
57
+ return { result: clean(), window: all.slice(0, WINDOW) };
58
+ const matches = rules.map(r => ({ ruleId: r.id, title: r.title, severity: r.severity }))
59
+ .filter((m, i, list) => list.findIndex(o => o.ruleId === m.ruleId) === i);
60
+ const severity = matches.reduce((worst, m) => (SEVERITY_RANK[m.severity] > SEVERITY_RANK[worst] ? m.severity : worst), matches[0].severity);
61
+ return { result: { flagged: true, severity, matches }, window };
62
+ }
63
+ catch {
64
+ return { result: clean(), window: "" };
65
+ }
66
+ }
67
+ const check = (text, source, extra) => scan(text, source, extra).result;
68
+ /** Checks text bound for an LLM, locally, without reporting it anywhere. Never throws. */
69
+ export function checkPrompt(text) {
70
+ return check(text, "prompt");
71
+ }
72
+ /** Checks model output, locally, without reporting it anywhere. Pass your system prompt's canaries to catch leaks. */
73
+ export function checkOutput(text, options = {}) {
74
+ return check(text, "output", canaryRule(options.canaries ?? []));
75
+ }
76
+ // Without a token the checks still work locally; nothing is reported.
77
+ const noop = {
78
+ request() { }, log() { }, flush: async () => { }, enabled: false,
79
+ prompt: text => checkPrompt(text),
80
+ output: text => checkOutput(text),
81
+ };
15
82
  export function createAppMonitor(options = {}) {
83
+ try {
84
+ return start(options ?? {});
85
+ }
86
+ catch {
87
+ // A bad option or an unusual runtime: monitoring is off, and the app carries on.
88
+ return noop;
89
+ }
90
+ }
91
+ function start(options) {
16
92
  const report = (message) => { try {
17
93
  options.onError?.(message);
18
94
  }
19
95
  catch { /* never throw */ } };
20
- const token = options.token?.trim() || env("BEAM_APP_TOKEN");
96
+ const token = (typeof options.token === "string" ? options.token.trim() : "") || env("BEAM_APP_TOKEN");
97
+ const canaries = canaryRule(Array.isArray(options.canaries) ? options.canaries : []);
98
+ const percent = Math.min(50, Math.max(0.1, Number(options.maxCpuPercent) || 2));
99
+ // 1% of a core = 600 ms per minute. Traffic and logs get one budget; prompt() and output() get
100
+ // their own, so a flood of requests can't switch off the checks an app may block on.
101
+ const budget = new CpuBudget(600 * percent);
102
+ const localBudget = new CpuBudget(600 * percent);
103
+ const budgeted = (text, source, extra = []) => localBudget.run(() => scan(text, source, extra)) ?? { result: { ...clean(), skipped: true }, window: "" };
104
+ const local = { ...noop, prompt: text => budgeted(text, "prompt").result, output: text => budgeted(text, "output", canaries).result };
21
105
  if (!token || !TOKEN.test(token)) {
22
106
  report("AgentBeam App monitoring is off: set BEAM_APP_TOKEN to the app's token (beam_app_…) from the dashboard.");
23
- return noop;
107
+ return local;
108
+ }
109
+ if (typeof fetch !== "function" || typeof AbortController !== "function") {
110
+ report("AgentBeam App monitoring is off: this runtime has no fetch.");
111
+ return local;
24
112
  }
25
113
  const base = (options.dashboardUrl || env("BEAM_DASHBOARD_URL") || "https://app.agentbeam.com").replace(/\/+$/, "");
26
114
  let url;
@@ -29,43 +117,64 @@ export function createAppMonitor(options = {}) {
29
117
  }
30
118
  catch {
31
119
  report(`AgentBeam App monitoring is off: ${base} isn't a valid URL.`);
32
- return noop;
120
+ return local;
33
121
  }
34
122
  if (url.protocol !== "https:" && !["localhost", "127.0.0.1", "[::1]"].includes(url.hostname)) {
35
123
  report("AgentBeam App monitoring is off: refusing to send the app token over plain HTTP.");
36
- return noop;
124
+ return local;
125
+ }
126
+ const flushEvery = Math.max(1000, Number(options.flushIntervalMs) || 5000);
127
+ let ownLlm = null;
128
+ try {
129
+ const processEnv = globalThis.process?.env ?? {};
130
+ const llm = ownLlmConfig(processEnv, typeof options.llm === "string" ? options.llm : undefined, null);
131
+ // Short timeouts: this runs inside the app's background work (event.waitUntil on serverless).
132
+ ownLlm = llm ? { ...llm, timeoutMs: 8_000 } : null;
133
+ }
134
+ catch (error) {
135
+ report(`AgentBeam App monitoring: your own LLM check is off: ${error.message}`);
37
136
  }
38
- const flushEvery = Math.max(1000, options.flushIntervalMs ?? 5000);
39
137
  const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
40
138
  let level = null;
41
- let revoked = false;
139
+ // A 401 pauses reporting and is checked again later: during an AgentBeam incident a working token
140
+ // can be rejected for a while, and the app shouldn't need a restart to resume.
141
+ let revokedUntil = 0;
42
142
  let pausedUntil = 0;
43
143
  let configAt = 0;
144
+ let configFailures = 0;
44
145
  let configInFlight = false;
45
146
  let lastFlush = 0;
147
+ let sendFailures = 0;
148
+ let nextSendAt = 0;
46
149
  let flushing = null;
47
- const pipeline = new MonitorPipeline({ level: () => (!revoked && Date.now() >= pausedUntil ? level : null) });
150
+ let budgetReportedAt = 0;
151
+ const revoked = () => Date.now() < revokedUntil;
152
+ const pipeline = new MonitorPipeline({ level: () => (!revoked() && Date.now() >= pausedUntil ? level : null), budget });
48
153
  const refreshConfig = async () => {
49
154
  configInFlight = true;
50
- const t = withTimeout(10_000);
155
+ const t = withTimeout(REQUEST_TIMEOUT_MS);
51
156
  try {
52
157
  const response = await fetch(`${base}/v1/monitor/config`, { headers, signal: t.signal });
53
158
  const body = (await response.json().catch(() => ({})));
54
- if (response.ok)
159
+ configFailures = response.status >= 500 ? configFailures + 1 : 0;
160
+ if (response.ok) {
55
161
  level = body.level ?? "standard";
162
+ revokedUntil = 0;
163
+ }
56
164
  else if (response.status === 401) {
57
- revoked = true;
58
- report("AgentBeam App monitoring stopped: this app token was rotated or removed.");
165
+ if (!revoked())
166
+ report("AgentBeam App monitoring paused: this app token was rejected (rotated or removed). Checking again in 15 minutes.");
167
+ revokedUntil = Date.now() + REVOKED_RECHECK_MS;
59
168
  }
60
169
  else if (response.status === 403) {
61
170
  level = null;
62
- report(body.error ?? "AgentBeam App monitoring is turned off for this workspace.");
171
+ report(typeof body.error === "string" ? body.error : "AgentBeam App monitoring is turned off for this workspace.");
63
172
  }
64
173
  else if (response.status === 429)
65
- pausedUntil = body.resetAt ? Date.parse(body.resetAt) : Date.now() + 60_000;
174
+ pausedUntil = pauseUntil(body.resetAt);
66
175
  }
67
176
  catch {
68
- /* unreachable: keep the last known level and try again later */
177
+ configFailures++; // unreachable or slow: keep the last known level and back off
69
178
  }
70
179
  finally {
71
180
  t.done();
@@ -74,58 +183,79 @@ export function createAppMonitor(options = {}) {
74
183
  }
75
184
  };
76
185
  const ensureConfig = () => {
77
- if (revoked || configInFlight)
186
+ if (configInFlight || revoked())
78
187
  return;
79
- const every = level ? CONFIG_EVERY_MS : CONFIG_RETRY_MS;
188
+ const every = level && !configFailures ? CONFIG_EVERY_MS : backoff(CONFIG_RETRY_MS, configFailures);
80
189
  if (!configAt || Date.now() - configAt >= every)
81
190
  void refreshConfig();
82
191
  };
83
192
  const send = async (batch) => {
84
- const t = withTimeout(10_000);
85
- try {
86
- const response = await fetch(`${base}/v1/monitor/findings`, { method: "POST", headers, body: JSON.stringify({ findings: batch }), signal: t.signal });
87
- if (response.ok)
88
- return "sent";
89
- const body = (await response.json().catch(() => ({})));
90
- if (response.status === 401) {
91
- revoked = true;
92
- report("AgentBeam App monitoring stopped: this app token was rotated or removed.");
93
- return "drop";
193
+ // The app's own model, with the app's own key: only the verdict travels with the finding.
194
+ if (ownLlm && level)
195
+ await judgeWithOwnLlm(batch, level, ownLlm).catch(() => 0);
196
+ const t = withTimeout(REQUEST_TIMEOUT_MS);
197
+ const outcome = await (async () => {
198
+ try {
199
+ const response = await fetch(`${base}/v1/monitor/findings`, { method: "POST", headers, body: JSON.stringify({ findings: batch }), signal: t.signal });
200
+ if (response.ok)
201
+ return "sent";
202
+ const body = (await response.json().catch(() => ({})));
203
+ if (response.status === 401) {
204
+ if (!revoked())
205
+ report("AgentBeam App monitoring paused: this app token was rejected (rotated or removed). Checking again in 15 minutes.");
206
+ revokedUntil = Date.now() + REVOKED_RECHECK_MS;
207
+ return "drop";
208
+ }
209
+ if (response.status === 403) {
210
+ level = null;
211
+ return "drop";
212
+ }
213
+ if (response.status === 429) {
214
+ pausedUntil = pauseUntil(body.resetAt);
215
+ return "drop";
216
+ }
217
+ return response.status >= 500 ? "retry" : "drop";
94
218
  }
95
- if (response.status === 403) {
96
- level = null;
97
- return "drop";
219
+ catch {
220
+ return "retry";
98
221
  }
99
- if (response.status === 429) {
100
- pausedUntil = body.resetAt ? Date.parse(body.resetAt) : Date.now() + 60_000;
101
- return "drop";
222
+ finally {
223
+ t.done();
102
224
  }
103
- return response.status >= 500 ? "retry" : "drop";
104
- }
105
- catch {
106
- return "retry";
107
- }
108
- finally {
109
- t.done();
110
- }
225
+ })();
226
+ if (outcome === "retry")
227
+ nextSendAt = Date.now() + backoff(flushEvery, ++sendFailures);
228
+ else
229
+ sendFailures = 0;
230
+ return outcome;
111
231
  };
112
232
  const flush = (force = false) => {
113
233
  if (flushing)
114
234
  return flushing;
115
235
  if (!pipeline.pending.length)
116
236
  return Promise.resolve();
117
- if (!force && Date.now() - lastFlush < flushEvery)
237
+ const now = Date.now();
238
+ if (!force && (now - lastFlush < flushEvery || now < nextSendAt))
118
239
  return Promise.resolve();
119
- lastFlush = Date.now();
240
+ lastFlush = now;
120
241
  flushing = pipeline.flush(send).catch(() => { }).finally(() => { flushing = null; });
121
242
  return flushing;
122
243
  };
123
- const ingest = (line, file) => {
244
+ const noteBudget = () => {
245
+ if (Date.now() - budgetReportedAt < 60_000)
246
+ return;
247
+ const skipped = budget.takeSkipped() + localBudget.takeSkipped();
248
+ budgetReportedAt = Date.now();
249
+ if (skipped)
250
+ report(`AgentBeam App monitoring skipped ${skipped} checks in the last minute to stay under ${percent}% of a CPU (maxCpuPercent).`);
251
+ };
252
+ const ingest = (line, file, ingestOptions) => {
124
253
  try {
125
254
  ensureConfig();
126
- if (!level || revoked)
255
+ noteBudget();
256
+ if (!level || revoked())
127
257
  return;
128
- pipeline.ingestLine(line, file);
258
+ pipeline.ingestLine(line, file, ingestOptions);
129
259
  if (Date.now() - lastFlush >= flushEvery)
130
260
  void flush();
131
261
  }
@@ -133,26 +263,50 @@ export function createAppMonitor(options = {}) {
133
263
  /* never let monitoring affect the app */
134
264
  }
135
265
  };
266
+ const llmText = (text, source, info) => {
267
+ const { result, window } = budgeted(text, source, source === "output" ? canaries : []);
268
+ try {
269
+ if (!window.trim())
270
+ return result;
271
+ const client = String(info?.ip ?? info?.user ?? "").trim().slice(0, 80) || undefined;
272
+ const label = typeof info?.label === "string" && info.label.trim() ? info.label.trim().slice(0, 60) : source === "prompt" ? "prompts" : "model output";
273
+ // Clean prompts are still counted per sender, to spot floods.
274
+ if (result.flagged || (source === "prompt" && client))
275
+ ingest(window, label, { source, client, rules: source === "output" ? canaries : undefined, excerpt: options.excerpts !== false });
276
+ }
277
+ catch {
278
+ /* never let monitoring affect the app */
279
+ }
280
+ return result;
281
+ };
136
282
  void refreshConfig();
137
283
  return {
138
284
  enabled: true,
139
285
  request(info) {
140
- if (!info || typeof info.url !== "string")
141
- return;
142
- // Same JSON shape as an access-log line, so the rules see method, path+query, client and agent.
143
- ingest(JSON.stringify({
144
- method: String(info.method || "GET").toUpperCase().slice(0, 16),
145
- path: info.url.slice(0, 8192),
146
- httpStatus: info.status ?? undefined,
147
- srcIp: info.ip ?? undefined,
148
- clientUa: info.userAgent?.slice(0, 512) ?? undefined,
149
- }), "requests");
286
+ try {
287
+ if (!info || typeof info.url !== "string")
288
+ return;
289
+ const text = (v, max) => (v === null || v === undefined ? undefined : String(v).slice(0, max));
290
+ // Same JSON shape as an access-log line, so the rules see method, path+query, client and agent.
291
+ ingest(JSON.stringify({
292
+ method: String(info.method || "GET").toUpperCase().slice(0, 16),
293
+ path: info.url.slice(0, 8192),
294
+ httpStatus: typeof info.status === "number" ? info.status : undefined,
295
+ srcIp: text(info.ip, 64),
296
+ clientUa: text(info.userAgent, 512),
297
+ }), "requests");
298
+ }
299
+ catch {
300
+ /* never let monitoring affect the app */
301
+ }
150
302
  },
151
303
  log(line) {
152
304
  if (typeof line === "string" && line.trim())
153
305
  ingest(line.slice(0, 16_384), "app log");
154
306
  },
155
- flush: (options) => flush(Boolean(options?.force)).catch(() => { }),
307
+ prompt: (text, info) => llmText(text, "prompt", info),
308
+ output: (text, info) => llmText(text, "output", info),
309
+ flush: (opts) => flush(Boolean(opts?.force)).catch(() => { }),
156
310
  };
157
311
  }
158
312
  //# sourceMappingURL=sdk.js.map
package/dist/sdk.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-beam/beam",
3
- "version": "0.2.28",
3
+ "version": "0.2.30",
4
4
  "description": "Local-first observation and heuristic risk scanning for AI coding agents (Claude Code, Codex, Cursor, Copilot CLI, Gemini). Redacts secrets, flags risky tool calls, scans skills and MCP configs offline.",
5
5
  "keywords": [
6
6
  "ai agent security",
@@ -44,7 +44,8 @@
44
44
  },
45
45
  "files": [
46
46
  "dist",
47
- "Skills"
47
+ "Skills",
48
+ "stress-report.json"
48
49
  ],
49
50
  "pkg": {
50
51
  "assets": [
@@ -59,10 +60,11 @@
59
60
  "test": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js --runInBand",
60
61
  "test:watch": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
61
62
  "typecheck": "tsc -p tsconfig.json --noEmit",
62
- "prepublishOnly": "npm run validate:skills && npm run typecheck && npm test && npm run build",
63
+ "prepublishOnly": "npm run validate:skills && npm run typecheck && npm test && npm run build && node --expose-gc scripts/stress-report.mjs --out stress-report.json",
63
64
  "setup": "npm run build && node dist/cli.js setup",
64
65
  "setup:global": "bash scripts/setup-global.sh",
65
- "validate:skills": "node Skills/scripts/validate-skills.mjs"
66
+ "validate:skills": "node Skills/scripts/validate-skills.mjs",
67
+ "stress": "npm run build && node --expose-gc scripts/stress-report.mjs"
66
68
  },
67
69
  "publishConfig": {
68
70
  "access": "public"
@@ -71,6 +73,7 @@
71
73
  "node": ">=20.17.0"
72
74
  },
73
75
  "dependencies": {
76
+ "@anthropic-ai/sdk": "^1.2.0",
74
77
  "commander": "^13.0.0"
75
78
  },
76
79
  "devDependencies": {
@@ -0,0 +1,140 @@
1
+ {
2
+ "schema": 1,
3
+ "package": "@agent-beam/beam",
4
+ "version": "0.2.30",
5
+ "generatedAt": "2026-10-23T15:36:41.507Z",
6
+ "passed": true,
7
+ "environment": {
8
+ "node": "v24.5.0",
9
+ "platform": "darwin arm64",
10
+ "cpu": "Apple M3 Pro",
11
+ "cores": 11,
12
+ "ci": false
13
+ },
14
+ "checks": [
15
+ {
16
+ "id": "hostile-input",
17
+ "title": "Hostile input",
18
+ "passed": true,
19
+ "summary": "41 attack shapes at 16 KB; the slowest took 13.9 ms (unicode tags)",
20
+ "measured": {
21
+ "worstMs": 13.9,
22
+ "cases": 41,
23
+ "slowest": [
24
+ {
25
+ "input": "unicode tags",
26
+ "ms": 13.9
27
+ },
28
+ {
29
+ "input": "curl|",
30
+ "ms": 10.79
31
+ },
32
+ {
33
+ "input": "![a](https://e/?",
34
+ "ms": 6.38
35
+ },
36
+ {
37
+ "input": "nc ",
38
+ "ms": 5.41
39
+ },
40
+ {
41
+ "input": "full-width",
42
+ "ms": 3.43
43
+ }
44
+ ]
45
+ },
46
+ "limit": "under 250 ms for any single 16 KB input"
47
+ },
48
+ {
49
+ "id": "throughput",
50
+ "title": "Log throughput",
51
+ "passed": true,
52
+ "summary": "51,922 log lines per second on one core, attacks included",
53
+ "measured": {
54
+ "linesPerSecond": 51922,
55
+ "lines": 300000
56
+ },
57
+ "limit": "over 10,000 lines per second"
58
+ },
59
+ {
60
+ "id": "per-call",
61
+ "title": "Cost per call in your app",
62
+ "passed": true,
63
+ "summary": "request() 16.1 µs, prompt() 11 µs on a short message",
64
+ "measured": {
65
+ "requestMicros": 16.1,
66
+ "promptMicros": 11
67
+ },
68
+ "limit": "request() under 100 µs and prompt() under 200 µs"
69
+ },
70
+ {
71
+ "id": "memory-cli",
72
+ "title": "Memory under load (beam monitor)",
73
+ "passed": true,
74
+ "summary": "8.5 MB at start; 9.9, 10.1, 10, 10, 10, 10 MB after each 500,000 lines; -0.1 MB from 1M to 3M lines",
75
+ "measured": {
76
+ "heapMb": [
77
+ 9.9,
78
+ 10.1,
79
+ 10,
80
+ 10,
81
+ 10,
82
+ 10
83
+ ],
84
+ "startMb": 8.5,
85
+ "growthMb": -0.1,
86
+ "footprint": {
87
+ "seen": 200,
88
+ "queue": 1000,
89
+ "queued": 0,
90
+ "authFailures": 0,
91
+ "llmCalls": 2550
92
+ }
93
+ },
94
+ "limit": "under 20 MB growth from 1M to 3M lines"
95
+ },
96
+ {
97
+ "id": "memory-sdk",
98
+ "title": "Memory in your app while AgentBeam is down",
99
+ "passed": true,
100
+ "summary": "8.4, 8.4, 8.4, 8.4 MB after each 250,000 requests and prompts",
101
+ "measured": {
102
+ "heapMb": [
103
+ 8.4,
104
+ 8.4,
105
+ 8.4,
106
+ 8.4
107
+ ],
108
+ "growthMb": 0
109
+ },
110
+ "limit": "under 10 MB growth over 1M requests"
111
+ },
112
+ {
113
+ "id": "outage",
114
+ "title": "AgentBeam down or slow",
115
+ "passed": true,
116
+ "summary": "request() stayed at 13.4 µs; 1 send attempt, then none while backing off; a hung connection was dropped after 5.0 s, off the request path",
117
+ "measured": {
118
+ "requestMicros": 13.4,
119
+ "attemptsBeforeBackoff": 1,
120
+ "attemptsDuringBackoff": 0,
121
+ "hungFlushMs": 5001
122
+ },
123
+ "limit": "no slowdown, no retries during backoff, hung sends dropped within 7 s"
124
+ },
125
+ {
126
+ "id": "cpu-budget",
127
+ "title": "CPU cap",
128
+ "passed": true,
129
+ "summary": "with a 1% cap (600 ms a minute), a flood of 200 KB documents got 642 ms of checking (59 documents); the rest were skipped, flagged as skipped, at 0.13 µs each",
130
+ "measured": {
131
+ "capMs": 600,
132
+ "spentMs": 642,
133
+ "checked": 59,
134
+ "skipped": 100000,
135
+ "skippedCallMicros": 0.13
136
+ },
137
+ "limit": "under twice the cap (one check can finish after the cap is reached)"
138
+ }
139
+ ]
140
+ }