ruvnet--ruflo
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
162 行
6.4 KiB
JavaScript
162 行
6.4 KiB
JavaScript
// _similarity.mjs — ADR-152 production similarity module.
|
|
//
|
|
// Graduated from `_spike-similarity.mjs` (iter 35) after both invariants
|
|
// passed on the LEGAL/SUPPORT/DEVOPS fixtures. The spike file STAYS as
|
|
// the regression-suite anchor; this file is what production callers
|
|
// (`similarity.mjs` skill, `metaharness_similarity` MCP tool) import.
|
|
//
|
|
// ADR-150 ARCHITECTURAL CONSTRAINTS PRESERVED
|
|
// Removable ✓ pure-TS — no `@metaharness/*` import path
|
|
// Optional ✓ no new dep on `@metaharness/*`
|
|
// Graceful ✓ malformed input → low-confidence output, never throws
|
|
// CI-gate ✓ standalone unit-importable; no `npx` needed
|
|
//
|
|
// CONTRACT (PUBLIC)
|
|
// projectToVec(input) → 9-dim numerical feature vector
|
|
// cosine(a, b) → [0,1]
|
|
// categoricalAgreement(a, b) → [0,1] over 4 enum fields
|
|
// jaccard(a, b) → [0,1] over agent_topology[]
|
|
// similarity(a, b, opts?) → { overall, components, perDimension? }
|
|
//
|
|
// WEIGHT DEFAULTS (from ADR-152 §Decision)
|
|
// overall = 0.60·cosine + 0.25·categorical + 0.15·jaccard
|
|
//
|
|
// ADR-152 reserves a future per-org weight override; for §3.1 the defaults
|
|
// are global. The opts.weights hook is here so consumers can experiment
|
|
// without forking the module — it is NOT a stable public API.
|
|
|
|
const DEFAULT_WEIGHTS = Object.freeze({ cosine: 0.6, categorical: 0.25, jaccard: 0.15 });
|
|
|
|
const CATEGORICAL_FIELDS = Object.freeze(['repo_type', 'archetype', 'template', 'recommendedMode']);
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
// 9-dim feature vector. The mapping mirrors ADR-152 §Decision Table 1.
|
|
// Missing fields default to 0 — that's the graceful-degradation path.
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
export function projectToVec(input) {
|
|
const s = input?.score ?? {};
|
|
const g = input?.genome ?? {};
|
|
return [
|
|
(s.harnessFit ?? 0) / 100,
|
|
(s.compileConfidence ?? 0) / 100,
|
|
(s.taskCoverage ?? 0) / 100,
|
|
(s.toolSafety ?? 0) / 100,
|
|
(s.memoryUsefulness ?? 0) / 100,
|
|
g.risk_score ?? 0,
|
|
g.test_confidence ?? 0,
|
|
g.publish_readiness ?? 0,
|
|
Math.max(0, Math.min(1, Math.log10((s.estCostPerRunUsd ?? 0) + 0.001) / Math.log10(10))),
|
|
];
|
|
}
|
|
|
|
export function cosine(a, b) {
|
|
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return 0;
|
|
let dot = 0, na = 0, nb = 0;
|
|
for (let i = 0; i < a.length; i++) {
|
|
dot += a[i] * b[i];
|
|
na += a[i] * a[i];
|
|
nb += b[i] * b[i];
|
|
}
|
|
const denom = Math.sqrt(na) * Math.sqrt(nb);
|
|
if (denom === 0) return 0;
|
|
return Math.max(0, Math.min(1, dot / denom));
|
|
}
|
|
|
|
export function categoricalAgreement(a, b) {
|
|
let matches = 0;
|
|
for (const f of CATEGORICAL_FIELDS) {
|
|
const av = a?.genome?.[f] ?? a?.score?.[f];
|
|
const bv = b?.genome?.[f] ?? b?.score?.[f];
|
|
if (av && bv && av === bv) matches++;
|
|
}
|
|
return matches / CATEGORICAL_FIELDS.length;
|
|
}
|
|
|
|
export function jaccard(a, b) {
|
|
const A = new Set(a?.genome?.agent_topology ?? []);
|
|
const B = new Set(b?.genome?.agent_topology ?? []);
|
|
if (A.size === 0 && B.size === 0) return 1;
|
|
const intersection = [...A].filter((x) => B.has(x)).length;
|
|
const union = new Set([...A, ...B]).size;
|
|
return union === 0 ? 0 : intersection / union;
|
|
}
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
// Composite similarity with optional per-dimension breakdown.
|
|
// Returns the ADR-152 §"return shape": overall + components + per-dim.
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
export function similarity(a, b, opts = {}) {
|
|
const weights = { ...DEFAULT_WEIGHTS, ...(opts.weights ?? {}) };
|
|
const va = projectToVec(a);
|
|
const vb = projectToVec(b);
|
|
const cos = cosine(va, vb);
|
|
const cat = categoricalAgreement(a, b);
|
|
const jac = jaccard(a, b);
|
|
|
|
const overall = weights.cosine * cos + weights.categorical * cat + weights.jaccard * jac;
|
|
|
|
const result = {
|
|
overall: round4(overall),
|
|
components: {
|
|
cosine: round4(cos),
|
|
categorical: round4(cat),
|
|
jaccard: round4(jac),
|
|
},
|
|
weights,
|
|
};
|
|
|
|
if (opts.perDimension) {
|
|
result.perDimension = perDimensionBreakdown(a, b, va, vb, weights);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function round4(x) {
|
|
return Math.round(x * 10000) / 10000;
|
|
}
|
|
|
|
function perDimensionBreakdown(a, b, va, vb, weights) {
|
|
// Per-dimension contribution = squared-error-normalized cosine slice + categorical/jaccard direct.
|
|
// We surface raw a/b values + a contribution sign so callers can explain
|
|
// why two harnesses scored as they did (used by Recommendation Engine
|
|
// §3.2 confidence calc + Drift Detection §3.3 alert reason).
|
|
const out = {};
|
|
|
|
const numericKeys = [
|
|
['harnessFit', 'score', 100], ['compileConfidence', 'score', 100],
|
|
['taskCoverage', 'score', 100], ['toolSafety', 'score', 100],
|
|
['memoryUsefulness', 'score', 100],
|
|
['risk_score', 'genome', 1], ['test_confidence', 'genome', 1],
|
|
['publish_readiness', 'genome', 1],
|
|
['estCostPerRunUsd', 'score', 1],
|
|
];
|
|
for (let i = 0; i < numericKeys.length; i++) {
|
|
const [k, src] = numericKeys[i];
|
|
const av = a?.[src]?.[k];
|
|
const bv = b?.[src]?.[k];
|
|
out[`numeric.${k}`] = {
|
|
a: av ?? null, b: bv ?? null,
|
|
contribution: round4(va[i] * vb[i] * weights.cosine / 9),
|
|
};
|
|
}
|
|
for (const f of CATEGORICAL_FIELDS) {
|
|
const av = a?.genome?.[f] ?? a?.score?.[f];
|
|
const bv = b?.genome?.[f] ?? b?.score?.[f];
|
|
out[`categorical.${f}`] = {
|
|
a: av ?? null, b: bv ?? null,
|
|
contribution: av && bv && av === bv ? round4(weights.categorical / 4) : 0,
|
|
};
|
|
}
|
|
const A = new Set(a?.genome?.agent_topology ?? []);
|
|
const B = new Set(b?.genome?.agent_topology ?? []);
|
|
const overlap = [...A].filter((x) => B.has(x));
|
|
const union = new Set([...A, ...B]);
|
|
out['set.agent_topology'] = {
|
|
a: [...A], b: [...B],
|
|
contribution: union.size === 0 ? 0 : round4((overlap.length / union.size) * weights.jaccard),
|
|
};
|
|
return out;
|
|
}
|