Files
ruvnet--ruflo/scripts/probe-nested-spawn-depth.mjs
wehub-resource-sync 23f7624596
🔄 Automated Rollback Manager / 🔄 Execute Rollback (push) Blocked by required conditions
🔄 Automated Rollback Manager / ✅ Post-Rollback Verification (push) Blocked by required conditions
🔄 Automated Rollback Manager / 📊 Rollback Monitoring (push) Blocked by required conditions
🔄 Automated Rollback Manager / ⏳ Manual Rollback Approval (push) Blocked by required conditions
V3 CI/CD Pipeline / MCP protocol smoke / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Memory import smoke / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / windows-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / windows-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / windows-latest (push) Waiting to run
V3 CI/CD Pipeline / Witness verify (signed manifest) / macos-latest (push) Blocked by required conditions
V3 CI/CD Pipeline / Witness verify (signed manifest) / ubuntu-latest (push) Blocked by required conditions
V3 CI/CD Pipeline / Witness verify (signed manifest) / windows-latest (push) Blocked by required conditions
V3 CI/CD Pipeline / Publish to npm (alpha) (push) Blocked by required conditions
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / macos-latest / Node 22 (push) Waiting to run
V3 CI/CD Pipeline / Plugin hooks smoke / macos-latest / Node 22 (push) Waiting to run
ADR-166 MCP Bridge Security Lock / Static-source security lock (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / Compose default binds loopback + Mongo has auth (push) Failing after 2s
CodeQL Advanced / Analyze (rust) (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / plugin-agent-federation bindHost default (push) Failing after 1s
ADR-166 MCP Bridge Security Lock / Runtime behavior — 401 + terminal gate + fail-closed (push) Failing after 4s
business-pods-smoke / smoke (push) Failing after 1s
all-plugins-smoke / smoke-all (push) Failing after 2s
CI/CD Pipeline / Security & Code Quality (push) Failing after 1s
CI/CD Pipeline / Test Suite (ubuntu-latest) (push) Failing after 1s
CI/CD Pipeline / Build & Package (macos-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (ubuntu-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (windows-latest) (push) Has been skipped
CI/CD Pipeline / Deploy & Release (push) Waiting to run
CI/CD Pipeline / CI Status (push) Waiting to run
CI/CD Pipeline / Documentation & Examples (push) Failing after 1s
Clone Tracker (14-day rolling) / Snapshot clones for ruflo ecosystem (push) Failing after 1s
CodeQL Advanced / Analyze (actions) (push) Failing after 1s
CodeQL Advanced / Analyze (javascript-typescript) (push) Failing after 1s
federation-peer-rust / stable-noop (push) Failing after 1s
metaharness-ci / score (push) Failing after 1s
metaharness-ci / router-compat (push) Failing after 0s
metaharness-ci / similarity-tests (push) Failing after 0s
no-agentbbs-smoke / smoke-without-agentbbs (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (windows-latest) (push) Has been skipped
codex-integration-audit / Codex integration audit (push) Failing after 1s
helpers-manifest-guard / guard (push) Failing after 1s
🔗 Cross-Agent Integration Tests / 🤝 Agent Coordination Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🧠 Memory Sharing Integration (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🛡️ Fault Tolerance Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / ⚡ Performance Integration Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / 📊 Integration Test Report (push) Waiting to run
metaharness-ci / mcp-scan (push) Failing after 1s
metaharness-ci / eject-dryrun (push) Failing after 1s
metaharness-ci / metaharness-real-data (push) Failing after 0s
no-cli-optdep-bloat-2561 / guard (push) Failing after 1s
no-metaharness-smoke / smoke-without-metaharness (push) Failing after 1s
no-phantom-agentic-flow-subpath / guard (push) Failing after 1s
🔄 Automated Rollback Manager / 🚨 Failure Detection (push) Failing after 1s
V3 CI/CD Pipeline / Plugin hooks smoke / ubuntu-latest / Node 22 (push) Failing after 1s
V3 CI/CD Pipeline / ruflo-graph-intelligence build + test smoke (#2044, ADR-123) (push) Failing after 1s
CVE Audit Gate / Audit root (critical-blocking) (push) Failing after 2s
cost-tracker-smoke / smoke (push) Failing after 3s
oia-audit-weekly / audit (push) Failing after 2s
ruflo-agent-smoke / ruflo-agent structural smoke (push) Failing after 1s
📊 Status Badges Update / 📊 Update Status Badges (push) Failing after 1s
V3 CI/CD Pipeline / Static regression guards (#2267 YAML + (push) Failing after 1s
V3 CI/CD Pipeline / Test V3 Packages (push) Failing after 0s
V3 CI/CD Pipeline / agent_execute provider routing smoke (#2042) (push) Failing after 0s
CVE Audit Gate / Audit v3 (critical-blocking) (push) Failing after 1s
federation-peer-rust / stable-native (push) Failing after 2s
🔗 Cross-Agent Integration Tests / 🚀 Integration Test Setup (push) Failing after 2s
neural-trader-smoke / runtime-smoke (push) Failing after 1s
🔄 Automated Rollback Manager / 🔍 Pre-Rollback Validation (push) Waiting to run
V3 CI/CD Pipeline / Build V3 (macos-latest) (push) Has been skipped
V3 CI/CD Pipeline / Build V3 (ubuntu-latest) (push) Has been skipped
V3 CI/CD Pipeline / Type Check V3 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 24 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 22 (push) Failing after 2s
V3 CI/CD Pipeline / browser rvf create flag smoke (#2015) (push) Failing after 0s
V3 CI/CD Pipeline / Dependency review (#2046) (push) Has been skipped
V3 CI/CD Pipeline / Supply-chain audit (#2046) (push) Failing after 0s
V3 CI/CD Pipeline / witness marker drift smoke (#2021) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader portfolio CG smoke (#2068, ADR-126 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader backtest signing smoke (#2068, ADR-126 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / kg-extract type-import classification smoke (#2049) (push) Failing after 0s
V3 CI/CD Pipeline / witness verify precondition smoke (#1880) (push) Failing after 2s
V3 CI/CD Pipeline / neural-trader pipeline risk-gate smoke (#2068, ADR-126 Phase 5) (push) Failing after 0s
V3 CI/CD Pipeline / neural-trader feature attribution smoke (#2068, ADR-126 Phase 6) (push) Failing after 0s
V3 CI/CD Pipeline / plugin-registry signature verification smoke (#1922, CWE-347) (push) Failing after 4s
V3 CI/CD Pipeline / memory stats legacy-DB smoke (#2120) (push) Failing after 4s
V3 CI/CD Pipeline / github deprecated actions smoke (#2089, ADR-127 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / graph query + pathfinder smoke (ADR-130 P2+P5) (push) Has been skipped
V3 CI/CD Pipeline / graph trajectory hooks smoke (ADR-130 P3) (push) Has been skipped
V3 CI/CD Pipeline / graph plugin adapter smoke (ADR-130 P4) (push) Has been skipped
V3 CI/CD Pipeline / graph benchmark (ADR-130 P6) (push) Has been skipped
V3 CI/CD Pipeline / statusline generator delegation smoke (#2195) (push) Failing after 1s
V3 CI/CD Pipeline / wizard init regression guard (#2206 (push) Failing after 1s
V3 CI/CD Pipeline / memory no-stray-db smoke (ADR-125 P7) (push) Failing after 1s
V3 CI/CD Pipeline / github-safe injection smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github actions pin smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github attribution opt-in smoke (#2089, ADR-127 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / pre-bash hook safety smoke (#2017) (push) Failing after 1s
V3 CI/CD Pipeline / Memory import smoke / ubuntu-latest (push) Failing after 0s
V3 CI/CD Pipeline / MCP protocol smoke / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / ruvllm WASM auto-init smoke (#2086) (push) Failing after 4s
V3 CI/CD Pipeline / MCP paired-tool round-trip smoke (#1889) (push) Failing after 1s
V3 CI/CD Pipeline / Plugin package install-safety (#1902/#1903/#1904) (push) Failing after 1s
V3 CI/CD Pipeline / Tool description discoverability (ADR-112) (push) Failing after 3s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (22) (push) Failing after 1s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (24) (push) Failing after 1s
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Vector-index dimension audit (#1947) (push) Failing after 0s
V3 CI/CD Pipeline / Hook-command install safety (#1921) (push) Failing after 1s
V3 CI/CD Pipeline / ToolOutputGuardrail smoke (ADR-131, (push) Failing after 1s
V3 CI/CD Pipeline / init-bundle invariants smoke (#2095, ADR-128 Phase 5) (push) Failing after 1s
V3 CI/CD Pipeline / wasm provider bridge smoke (ADR-129 P1) (push) Failing after 2s
V3 CI/CD Pipeline / wasm gallery CRUD smoke (ADR-129 P3) (push) Failing after 1s
V3 CI/CD Pipeline / wasm plugin bridge smoke (ADR-129 P4) (push) Failing after 0s
V3 CI/CD Pipeline / wasm compose smoke (ADR-129 P2) (push) Failing after 4s
V3 CI/CD Pipeline / graph schema smoke (ADR-130 P1) (push) Failing after 0s
Validate Marketplace / validate (push) Failing after 1s
🔍 Verification Pipeline / 🚀 Setup Verification (push) Failing after 1s
🔍 Verification Pipeline / 🛡️ Security Verification (push) Has been skipped
🔍 Verification Pipeline / 📝 Code Quality (push) Has been skipped
🔍 Verification Pipeline / 🧪 Test Verification (${{ matrix.os }}, Node ${{ matrix.node }}) (push) Has been skipped
🔍 Verification Pipeline / 🏗️ Build Verification (push) Has been skipped
🔍 Verification Pipeline / 📚 Documentation Verification (push) Has been skipped
🔍 Verification Pipeline / ⚡ Performance Verification (push) Waiting to run
🔍 Verification Pipeline / 📊 Verification Report (push) Waiting to run
CVE Audit Gate / High-severity report (warn only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:02:19 +08:00

165 lines
6.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
// scripts/probe-nested-spawn-depth.mjs
//
// Empirical probe of Claude Code's nested-subagent depth cap (announced 2026-06-09
// by Boris Cherny: "Capped at depth=5 to start"). Runs a fresh `claude -p` session,
// spawns ruflo-agent:nested-coordinator at L1, and that coordinator recursively
// spawns more nested-coordinators (L2, L3, ...) until either (a) some level's
// Agent-tool call returns an error, or (b) we reach L7 (one past the announced
// cap) and stop voluntarily.
//
// Output:
// - prints the verbatim chain to stdout
// - writes results to docs/probes/nested-spawn-depth-<ISO timestamp>.txt
// - exits 0 on completion (regardless of observed cap); 1 only on infra failure
//
// Required state: ruflo-agent plugin cache must contain the nested-* agents
// (run `claude plugin details ruflo-agent` first — expect Agents (9) listed).
import { spawn } from 'node:child_process';
import { writeFileSync, mkdirSync } from 'node:fs';
import { join, resolve } from 'node:path';
const REPO_ROOT = resolve(import.meta.dirname, '..');
const OUT_DIR = join(REPO_ROOT, 'docs', 'probes');
const TEST_LIMIT = 7; // stop voluntarily one past the announced cap of 5
const BUDGET_USD = '3.00';
const RECURSIVE_PROCEDURE = `You are participating in an empirical test of Claude Code's nested-subagent depth cap.
YOU ARE AT LEVEL N (a number passed to you in this prompt; see "CURRENT LEVEL" below).
PROCEDURE — follow exactly, no narration:
1. If you do NOT have the Agent tool in your tool list, output ONLY one line:
"level=N status=NO_AGENT_TOOL"
and stop.
2. If N >= ${TEST_LIMIT}, output ONLY one line:
"level=N status=TEST_LIMIT_HIT"
and stop.
3. Otherwise, call the Agent tool ONCE with these exact parameters:
- subagent_type: "nested-coordinator"
- name: "L<N+1>"
- description: "Depth probe L<N+1>"
- prompt: THIS ENTIRE PROCEDURE, but with the line "CURRENT LEVEL: <N>" rewritten as "CURRENT LEVEL: <N+1>"
Do NOT set isolation or run_in_background.
4. When the child returns, output ONE LINE only:
"level=N spawn=ok child={ <verbatim child output> }"
or, if the Agent tool itself returned an error:
"level=N spawn=FAILED error={ <verbatim error message> }"
No prose, no markdown, no headers. Exactly one line. The verbatim child output may contain its own
"level=" lines — that is expected and desired (it's how we measure depth).
CURRENT LEVEL: 1`;
const ROOT_PROMPT = `Empirical probe: nested-subagent depth cap. Spawn ONE sub-agent and report its result verbatim.
Use the Agent tool with EXACTLY these parameters:
subagent_type: "nested-coordinator"
name: "L1"
description: "Depth probe L1"
prompt: (the procedure shown below — pass it verbatim)
When the L1 agent returns, output its result prefixed with "FINAL: " on its own line. No other prose.
--- PROCEDURE TO PASS TO L1 ---
${RECURSIVE_PROCEDURE}
--- END PROCEDURE ---`;
console.log('=== Nested-subagent depth probe ===');
console.log(`Test limit: ${TEST_LIMIT} (one past announced cap of 5)`);
console.log(`Budget cap: $${BUDGET_USD}`);
console.log('Running `claude -p` ... (13 minutes typical)\n');
const startedAt = new Date();
const args = [
'-p',
'--max-budget-usd', BUDGET_USD,
'--model', 'claude-haiku-4-5',
'--output-format', 'text',
ROOT_PROMPT,
];
const stdoutChunks = [];
const stderrChunks = [];
const child = spawn('claude', args, { stdio: ['ignore', 'pipe', 'pipe'] });
child.stdout.on('data', (b) => {
stdoutChunks.push(b);
process.stdout.write(b);
});
child.stderr.on('data', (b) => stderrChunks.push(b));
const exitCode = await new Promise((res) => {
child.on('close', res);
child.on('error', () => res(-1));
});
const stdout = Buffer.concat(stdoutChunks).toString('utf-8');
const stderr = Buffer.concat(stderrChunks).toString('utf-8');
const finishedAt = new Date();
// Parse the chain. Count nested "level=N spawn=ok" → depth+1 successes.
const okMatches = [...stdout.matchAll(/level=(\d+)\s+spawn=ok/g)].map((m) => Number(m[1]));
const failMatches = [...stdout.matchAll(/level=(\d+)\s+spawn=FAILED\s+error=\{\s*([^\n}]+)\s*\}/g)];
const noToolMatches = [...stdout.matchAll(/level=(\d+)\s+status=NO_AGENT_TOOL/g)].map((m) => Number(m[1]));
const limitHitMatches = [...stdout.matchAll(/level=(\d+)\s+status=TEST_LIMIT_HIT/g)].map((m) => Number(m[1]));
const deepestOk = okMatches.length ? Math.max(...okMatches) : null;
const firstFailure = failMatches.length
? { level: Number(failMatches[0][1]), error: failMatches[0][2] }
: null;
const noTool = noToolMatches.length ? Math.min(...noToolMatches) : null;
const testLimitHit = limitHitMatches.length ? Math.max(...limitHitMatches) : null;
let verdict;
if (noTool !== null) {
verdict = `INCONCLUSIVE — Agent tool was missing at level=${noTool}. Likely the tools: [Task] frontmatter is not being honored by this CLI build, or the cache stage didn't include the agent file at that level.`;
} else if (testLimitHit !== null) {
verdict = `CAP NOT REACHED — chain ran to test limit (level=${testLimitHit}); the runtime cap is at least ${testLimitHit}. Re-run with a higher TEST_LIMIT to find it.`;
} else if (firstFailure) {
// deepest_ok + 1 == first failing spawn. The failing level tried to spawn and failed,
// so the runtime allowed spawning UP TO firstFailure.level, but not BEYOND.
verdict = `CAP OBSERVED at depth=${firstFailure.level} (level ${firstFailure.level} could not spawn level ${firstFailure.level + 1}). Error: ${firstFailure.error}`;
} else if (deepestOk !== null) {
verdict = `Chain partially completed — deepest successful spawn reported at level=${deepestOk}. No explicit refusal seen; child may have hallucinated success or output was truncated.`;
} else {
verdict = `NO RECURSIVE OUTPUT detected. The root spawn likely never returned a structured chain. Inspect raw output below.`;
}
mkdirSync(OUT_DIR, { recursive: true });
const stamp = startedAt.toISOString().replace(/[:.]/g, '-');
const outFile = join(OUT_DIR, `nested-spawn-depth-${stamp}.txt`);
const report = [
'=== Nested-subagent depth probe — empirical result ===',
`started: ${startedAt.toISOString()}`,
`finished: ${finishedAt.toISOString()}`,
`duration_ms: ${finishedAt - startedAt}`,
`exit_code: ${exitCode}`,
`cli_command: claude ${args.slice(0, -1).join(' ')} <prompt>`,
'',
'--- VERDICT ---',
verdict,
'',
`okMatches (levels that successfully spawned): ${JSON.stringify(okMatches)}`,
`failMatches: ${JSON.stringify(failMatches.map((m) => ({ level: Number(m[1]), error: m[2] })))}`,
`noToolMatches: ${JSON.stringify(noToolMatches)}`,
`testLimitHit: ${JSON.stringify(limitHitMatches)}`,
'',
'--- RAW STDOUT ---',
stdout,
'',
'--- RAW STDERR ---',
stderr,
].join('\n');
writeFileSync(outFile, report, 'utf-8');
console.log('\n=== VERDICT ===');
console.log(verdict);
console.log(`\nFull report: ${outFile}`);
process.exit(0);