23f7624596
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 / 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
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
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
CVE Audit Gate / High-severity report (warn only) (push) Has been cancelled
🔄 Automated Rollback Manager / 🔄 Execute Rollback (push) Has been cancelled
🔄 Automated Rollback Manager / ✅ Post-Rollback Verification (push) Has been cancelled
🔄 Automated Rollback Manager / 📊 Rollback Monitoring (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / windows-latest (push) Has been cancelled
🔄 Automated Rollback Manager / ⏳ Manual Rollback Approval (push) Has been cancelled
V3 CI/CD Pipeline / MCP protocol smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Memory import smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / ubuntu-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Publish to npm (alpha) (push) Has been cancelled
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / macos-latest / Node 22 (push) Has been cancelled
V3 CI/CD Pipeline / Plugin hooks smoke / macos-latest / Node 22 (push) Has been cancelled
CI/CD Pipeline / Deploy & Release (push) Has been cancelled
CI/CD Pipeline / CI Status (push) Has been cancelled
🔗 Cross-Agent Integration Tests / 📊 Integration Test Report (push) Has been cancelled
🔄 Automated Rollback Manager / 🔍 Pre-Rollback Validation (push) Has been cancelled
🔍 Verification Pipeline / ⚡ Performance Verification (push) Has been cancelled
🔍 Verification Pipeline / 📊 Verification Report (push) Has been cancelled
216 lines
9.4 KiB
TypeScript
216 lines
9.4 KiB
TypeScript
/**
|
|
* Regression tests for the 2026-05-29 bug cluster (issues #2215, #2221, #2222, #2226).
|
|
*
|
|
* Each test reproduces a reported defect and asserts the fix holds:
|
|
* #2215 — system_info and hooks_intelligence must agree on flashAttention state.
|
|
* #2221 — the generated statusline probes the global npm install for its version.
|
|
* #2222 — `route feedback` persists the Q-table update to disk (no longer a no-op).
|
|
* #2226 — agentdb_pattern-store and agentdb_pattern-search share a backend
|
|
* (a stored pattern is findable by search).
|
|
*
|
|
* Backend-dependent tests degrade gracefully (skip the assertion) when the
|
|
* runtime backend cannot initialize in isolation, matching the existing
|
|
* statusline drift-guard convention.
|
|
*/
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import { mkdtempSync, existsSync, readFileSync, rmSync } from 'fs';
|
|
import { tmpdir } from 'os';
|
|
import path from 'path';
|
|
|
|
import { generateStatuslineScript } from '../src/init/statusline-generator.js';
|
|
import { DEFAULT_INIT_OPTIONS } from '../src/init/types.js';
|
|
import { systemTools } from '../src/mcp-tools/system-tools.js';
|
|
import { hooksTools } from '../src/mcp-tools/hooks-tools.js';
|
|
import { agentdbPatternStore, agentdbPatternSearch } from '../src/mcp-tools/agentdb-tools.js';
|
|
import { createQLearningRouter } from '../src/ruvector/q-learning-router.js';
|
|
import { CommandParser } from '../src/parser.js';
|
|
import { routeCommand } from '../src/commands/route.js';
|
|
|
|
function findTool(tools: any[], name: string) {
|
|
const t = tools.find((x) => x.name === name);
|
|
if (!t) throw new Error(`tool ${name} not found`);
|
|
return t;
|
|
}
|
|
|
|
describe('#2221 — statusline version probe covers global npm installs', () => {
|
|
const SCRIPT = generateStatuslineScript(DEFAULT_INIT_OPTIONS);
|
|
|
|
it('derives the global node_modules dir from process.execPath (no npm spawn)', () => {
|
|
expect(SCRIPT).toContain('process.execPath');
|
|
expect(SCRIPT).toContain("'lib', 'node_modules'");
|
|
});
|
|
|
|
it('still keeps the project-local and plugin-marketplace probes', () => {
|
|
expect(SCRIPT).toContain("'marketplaces', 'ruflo', 'package.json'");
|
|
expect(SCRIPT).toContain("'node_modules', 'ruflo', 'package.json'");
|
|
});
|
|
});
|
|
|
|
describe('#2215 — system_info and hooks_intelligence agree on flashAttention', () => {
|
|
it('reports the SAME boolean for flashAttention', async () => {
|
|
const sysInfo = await findTool(systemTools, 'system_info').handler({});
|
|
const intel = await findTool(hooksTools, 'hooks_intelligence').handler({ showStatus: true });
|
|
|
|
const sysFlash = sysInfo.features.flashAttention;
|
|
expect(typeof sysFlash).toBe('boolean');
|
|
|
|
// hooks_intelligence exposes the authoritative runtime status; both must match.
|
|
const comp = intel?.components?.flashAttention;
|
|
if (!comp) return; // intelligence registry unavailable in isolation — skip
|
|
const intelFlash = comp.status === 'active';
|
|
expect(sysFlash).toBe(intelFlash);
|
|
});
|
|
});
|
|
|
|
describe('#2222 — route feedback persists the Q-table to disk', () => {
|
|
it('writes the model after a single update + explicit save', async () => {
|
|
const dir = mkdtempSync(path.join(tmpdir(), 'ruflo-qlearn-'));
|
|
const modelPath = path.join(dir, 'q-learning-model.json');
|
|
try {
|
|
const router = createQLearningRouter({ modelPath, autoSaveInterval: 100 });
|
|
await router.initialize();
|
|
expect(existsSync(modelPath)).toBe(false); // nothing saved yet
|
|
|
|
// Mirror the FIXED feedback handler: one update, then explicit awaited save.
|
|
router.update('implement auth', 'coder', -1);
|
|
const persisted = await router.saveModel();
|
|
|
|
expect(persisted).toBe(true);
|
|
expect(existsSync(modelPath)).toBe(true);
|
|
const model = JSON.parse(readFileSync(modelPath, 'utf-8'));
|
|
expect(model.stats.updateCount).toBeGreaterThanOrEqual(1);
|
|
expect(Object.keys(model.qTable).length).toBeGreaterThan(0);
|
|
} finally {
|
|
rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('audit #1 — negative reward keeps its sign across all flag syntaxes', () => {
|
|
// Repro: `route feedback -r -1.0` and `--reward -1.0` used to parse as reward=true
|
|
// (→ +1.0 after numeric coercion), so NEGATIVE feedback REINFORCED the bad agent.
|
|
// Only the `--reward=-1.0` equals-form preserved the sign. Fix lives in the shared
|
|
// parser (isFlagValue), so all three forms must now yield reward = -1.0.
|
|
function parseFeedback(args: string[]) {
|
|
const parser = new CommandParser({ allowUnknownFlags: true });
|
|
parser.registerCommand(routeCommand);
|
|
return parser.parse(['route', 'feedback', ...args]);
|
|
}
|
|
|
|
const baseArgs = ['-t', 'write tests', '-a', 'tester'];
|
|
|
|
it('-r -1.0 (short flag, space form) → reward = -1.0', () => {
|
|
const { flags } = parseFeedback([...baseArgs, '-r', '-1.0']);
|
|
expect(flags.reward).toBe(-1.0);
|
|
});
|
|
|
|
it('--reward -1.0 (long flag, space form) → reward = -1.0', () => {
|
|
const { flags } = parseFeedback([...baseArgs, '--reward', '-1.0']);
|
|
expect(flags.reward).toBe(-1.0);
|
|
});
|
|
|
|
it('--reward=-1.0 (equals form) → reward = -1.0', () => {
|
|
const { flags } = parseFeedback([...baseArgs, '--reward=-1.0']);
|
|
expect(flags.reward).toBe(-1.0);
|
|
});
|
|
|
|
it('all three syntaxes agree (no sign-flip regression)', () => {
|
|
const a = parseFeedback([...baseArgs, '-r', '-1.0']).flags.reward;
|
|
const b = parseFeedback([...baseArgs, '--reward', '-1.0']).flags.reward;
|
|
const c = parseFeedback([...baseArgs, '--reward=-1.0']).flags.reward;
|
|
expect(a).toBe(b);
|
|
expect(b).toBe(c);
|
|
expect(c).toBe(-1.0);
|
|
});
|
|
|
|
it('positive and fractional negative values are preserved', () => {
|
|
expect(parseFeedback([...baseArgs, '-r', '0.9']).flags.reward).toBe(0.9);
|
|
expect(parseFeedback([...baseArgs, '-r', '-0.5']).flags.reward).toBe(-0.5);
|
|
expect(parseFeedback([...baseArgs, '--reward', '-3.14']).flags.reward).toBe(-3.14);
|
|
});
|
|
|
|
it('real flags after a value-flag are still parsed as flags, not values', () => {
|
|
// `-a tester` then `-t ...`: the -t must NOT be swallowed as the value of -a.
|
|
const { flags } = parseFeedback(['-a', 'tester', '-t', 'write tests', '-r', '-1.0']);
|
|
expect(flags.agent).toBe('tester');
|
|
expect(flags.task).toBe('write tests');
|
|
expect(flags.reward).toBe(-1.0);
|
|
});
|
|
});
|
|
|
|
describe('#2226 — pattern store and search share a backend', () => {
|
|
it('stores a pattern and finds it via search', async () => {
|
|
const marker = `oauth-refresh-token-rotation-${process.pid}-${process.hrtime.bigint()}`;
|
|
// Backend init (registry + ONNX embeddings) can be slow on first load.
|
|
|
|
const stored = await agentdbPatternStore.handler({
|
|
pattern: `Use ${marker} for secure session renewal`,
|
|
type: 'auth-pattern',
|
|
confidence: 0.9,
|
|
});
|
|
if (!stored || stored.success !== true) return; // backend unavailable in isolation — skip
|
|
|
|
const found = await agentdbPatternSearch.handler({
|
|
query: marker,
|
|
topK: 5,
|
|
minConfidence: 0.1,
|
|
});
|
|
|
|
expect(Array.isArray(found.results)).toBe(true);
|
|
// Result text lives in `content` (reasoningBank path) or `pattern` (fallback path).
|
|
const hit = found.results.find((r: any) => {
|
|
const text = typeof r.content === 'string' ? r.content
|
|
: typeof r.pattern === 'string' ? r.pattern : '';
|
|
return text.includes(marker);
|
|
});
|
|
expect(hit).toBeDefined();
|
|
}, 60_000);
|
|
});
|
|
|
|
/**
|
|
* 3.10.8 routing-learning fixes (follow-ups to the intelligence audit):
|
|
* Bug B — Q-router cached a stale route decision and only invalidated the
|
|
* whole cache every 50 updates, so a freshly-learned Q-update was
|
|
* hidden in-process until 50 updates accumulated. Now the updated
|
|
* state's cache entry is invalidated immediately.
|
|
* Bug C — boolean flags ignored an explicit space-form value, so
|
|
* `route task --explore false` still explored (could not disable a
|
|
* default-true boolean). The parser now consumes `true`/`false`.
|
|
*/
|
|
describe('3.10.8 #bugB — Q-router reflects a learned update immediately (no 50-update cache lag)', () => {
|
|
it('changes the exploited route within a handful of updates', async () => {
|
|
const dir = mkdtempSync(path.join(tmpdir(), 'ruflo-qcache-'));
|
|
try {
|
|
const r = createQLearningRouter({ modelPath: path.join(dir, 'q.json') });
|
|
await r.initialize();
|
|
const task = 'deep research and investigation task';
|
|
r.route(task, false); // prime the cache with the cold (all-zero) decision
|
|
for (let i = 0; i < 5; i++) r.update(task, 'researcher', 1.0);
|
|
for (let i = 0; i < 5; i++) r.update(task, 'architect', -1.0);
|
|
// Only 10 updates — well under the old 50-update invalidation threshold.
|
|
expect(r.route(task, false).route).toBe('researcher');
|
|
} finally {
|
|
rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('3.10.8 #bugC — boolean flags accept an explicit space-form value', () => {
|
|
const parse = (argv: string[]) =>
|
|
new CommandParser({ booleanFlags: ['explore'], allowUnknownFlags: true })
|
|
.parse(['route', 'task', 'x', ...argv]).flags.explore;
|
|
|
|
it('parses --explore false as false (was forced true)', () => {
|
|
expect(parse(['--explore', 'false'])).toBe(false);
|
|
});
|
|
it('parses --explore true as true', () => {
|
|
expect(parse(['--explore', 'true'])).toBe(true);
|
|
});
|
|
it('still honors --explore=false and bare --explore', () => {
|
|
expect(parse(['--explore=false'])).toBe(false);
|
|
expect(parse(['--explore'])).toBe(true);
|
|
expect(parse(['--no-explore'])).toBe(false);
|
|
});
|
|
});
|