@llm-dev-ops/agentics-cli 2.4.0 → 2.5.0
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/agents/repo-agent-runner.d.ts +2 -0
- package/dist/agents/repo-agent-runner.d.ts.map +1 -1
- package/dist/agents/repo-agent-runner.js +4 -2
- package/dist/agents/repo-agent-runner.js.map +1 -1
- package/dist/agents/system-prompts.d.ts.map +1 -1
- package/dist/agents/system-prompts.js +19 -0
- package/dist/agents/system-prompts.js.map +1 -1
- package/dist/commands/agents.d.ts +7 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +115 -3
- package/dist/commands/agents.js.map +1 -1
- package/dist/config/qe-gating.d.ts +81 -0
- package/dist/config/qe-gating.d.ts.map +1 -0
- package/dist/config/qe-gating.js +138 -0
- package/dist/config/qe-gating.js.map +1 -0
- package/dist/pipeline/phase5-build/qe-gating-executor.d.ts +73 -0
- package/dist/pipeline/phase5-build/qe-gating-executor.d.ts.map +1 -0
- package/dist/pipeline/phase5-build/qe-gating-executor.js +134 -0
- package/dist/pipeline/phase5-build/qe-gating-executor.js.map +1 -0
- package/dist/promotion/graph-diff.d.ts +39 -0
- package/dist/promotion/graph-diff.d.ts.map +1 -0
- package/dist/promotion/graph-diff.js +60 -0
- package/dist/promotion/graph-diff.js.map +1 -0
- package/dist/promotion/sampler-lib.d.ts +45 -0
- package/dist/promotion/sampler-lib.d.ts.map +1 -0
- package/dist/promotion/sampler-lib.js +96 -0
- package/dist/promotion/sampler-lib.js.map +1 -0
- package/dist/routing/domain-boundary.d.ts +92 -0
- package/dist/routing/domain-boundary.d.ts.map +1 -0
- package/dist/routing/domain-boundary.js +208 -0
- package/dist/routing/domain-boundary.js.map +1 -0
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -0
- package/dist/routing/index.js.map +1 -1
- package/docs/ecosystem.graph.json +87 -14
- package/package.json +1 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure logic for the promotion sampler (ADR-PIPELINE-084 §2.1).
|
|
3
|
+
*
|
|
4
|
+
* Parses, filters, and samples domain agent findings for human FP-rate review.
|
|
5
|
+
* The CLI wrapper lives in tools/promotion-sampler.ts and handles I/O + args;
|
|
6
|
+
* all deterministic logic is here and independently testable.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parse a blob that is either JSON array of findings or newline-delimited
|
|
10
|
+
* JSON (JSONL). Returns [] for empty input.
|
|
11
|
+
*/
|
|
12
|
+
export function parseFindings(raw) {
|
|
13
|
+
const trimmed = raw.trim();
|
|
14
|
+
if (!trimmed)
|
|
15
|
+
return [];
|
|
16
|
+
if (trimmed.startsWith('[')) {
|
|
17
|
+
const arr = JSON.parse(trimmed);
|
|
18
|
+
return Array.isArray(arr) ? arr : [];
|
|
19
|
+
}
|
|
20
|
+
return trimmed
|
|
21
|
+
.split('\n')
|
|
22
|
+
.map(l => l.trim())
|
|
23
|
+
.filter(l => l.length > 0)
|
|
24
|
+
.map(l => JSON.parse(l));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Keep findings from the specified domain whose timestamps fall within
|
|
28
|
+
* [now - windowDays, now].
|
|
29
|
+
*/
|
|
30
|
+
export function filterInWindow(findings, domain, windowDays, now = new Date()) {
|
|
31
|
+
const cutoff = new Date(now.getTime() - windowDays * 24 * 60 * 60 * 1000);
|
|
32
|
+
return findings.filter(f => {
|
|
33
|
+
if (f.domain !== domain)
|
|
34
|
+
return false;
|
|
35
|
+
const ts = new Date(f.timestamp);
|
|
36
|
+
return ts >= cutoff && ts <= now;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Keep only blocking findings (ADR-084 §2 — FP rate is computed against
|
|
41
|
+
* findings the agent marked blocking).
|
|
42
|
+
*/
|
|
43
|
+
export function filterBlocking(findings) {
|
|
44
|
+
return findings.filter(f => f.blocking === true);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Draw a random sample. Size = max(floor(0.1 * N), 30), capped at 200.
|
|
48
|
+
* If N ≤ 30, returns everything.
|
|
49
|
+
*/
|
|
50
|
+
export function drawSample(findings, options = {}) {
|
|
51
|
+
const n = findings.length;
|
|
52
|
+
if (n === 0)
|
|
53
|
+
return [];
|
|
54
|
+
if (n <= 30)
|
|
55
|
+
return [...findings];
|
|
56
|
+
const tenPercent = Math.floor(n * 0.1);
|
|
57
|
+
const targetSize = Math.min(Math.max(tenPercent, 30), 200);
|
|
58
|
+
const rng = makeRng(options.seed ?? Date.now());
|
|
59
|
+
const copy = [...findings];
|
|
60
|
+
for (let i = 0; i < targetSize; i++) {
|
|
61
|
+
const j = i + Math.floor(rng() * (copy.length - i));
|
|
62
|
+
const tmp = copy[i];
|
|
63
|
+
copy[i] = copy[j];
|
|
64
|
+
copy[j] = tmp;
|
|
65
|
+
}
|
|
66
|
+
return copy.slice(0, targetSize);
|
|
67
|
+
}
|
|
68
|
+
function makeRng(seed) {
|
|
69
|
+
// Mulberry32 — deterministic, seedable PRNG for reproducible tests.
|
|
70
|
+
let a = seed >>> 0;
|
|
71
|
+
return () => {
|
|
72
|
+
a = (a + 0x6d2b79f5) >>> 0;
|
|
73
|
+
let t = a;
|
|
74
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
75
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
76
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Emit a CSV with a blank fp_label column for the reviewer.
|
|
81
|
+
*/
|
|
82
|
+
export function toCsv(sample) {
|
|
83
|
+
const header = 'id,timestamp,domain,agent,severity,blocking,summary,fp_label';
|
|
84
|
+
const rows = sample.map(f => {
|
|
85
|
+
const summary = escapeCsv(f.summary ?? '');
|
|
86
|
+
return [f.id, f.timestamp, f.domain, f.agent, f.severity, f.blocking, summary, ''].join(',');
|
|
87
|
+
});
|
|
88
|
+
return [header, ...rows].join('\n') + '\n';
|
|
89
|
+
}
|
|
90
|
+
function escapeCsv(value) {
|
|
91
|
+
if (/[,"\n]/.test(value)) {
|
|
92
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
93
|
+
}
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=sampler-lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler-lib.js","sourceRoot":"","sources":["../../src/promotion/sampler-lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain Boundary Resolution (ADR-PIPELINE-082)
|
|
3
|
+
*
|
|
4
|
+
* Disambiguation rules for overlapping capability keywords and tie-break rules
|
|
5
|
+
* for domain ownership. Used to resolve which domain should handle a query
|
|
6
|
+
* when multiple domains could legitimately claim the same tag.
|
|
7
|
+
*
|
|
8
|
+
* Two rule types:
|
|
9
|
+
* 1. DISAMBIGUATION_RULES — modifier-based routing (ADR-082 §3).
|
|
10
|
+
* "regression" alone → test_bench; "regression test" → quality_engineering.
|
|
11
|
+
* 2. TIE_BREAK_RULES — priority resolution (ADR-082 §4).
|
|
12
|
+
* "security" always goes to safety (shield), never quality_engineering.
|
|
13
|
+
*
|
|
14
|
+
* This module is declarative; callers (capability classifier, agentics ask)
|
|
15
|
+
* consult it to refine routing decisions. It performs no I/O and is safe to
|
|
16
|
+
* import anywhere.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* A disambiguation rule for a keyword that could route to multiple domains
|
|
20
|
+
* depending on nearby modifiers in the prompt.
|
|
21
|
+
*/
|
|
22
|
+
export interface DisambiguationRule {
|
|
23
|
+
/** Trigger keyword that activates this rule (lowercase). */
|
|
24
|
+
readonly trigger: string;
|
|
25
|
+
/** Ordered modifier patterns. First match wins. */
|
|
26
|
+
readonly modifiers: readonly {
|
|
27
|
+
pattern: RegExp;
|
|
28
|
+
domain: string;
|
|
29
|
+
}[];
|
|
30
|
+
/** Domain used when no modifier matches. */
|
|
31
|
+
readonly defaultDomain: string;
|
|
32
|
+
/** Human-readable rationale tied to ADR-082. */
|
|
33
|
+
readonly note: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A tie-break rule declaring that one domain always wins a keyword over
|
|
37
|
+
* another. Used to enforce the capability ownership boundary from ADR-082 §1.
|
|
38
|
+
*/
|
|
39
|
+
export interface TieBreakRule {
|
|
40
|
+
/** Keyword that triggers this rule (lowercase). */
|
|
41
|
+
readonly keyword: string;
|
|
42
|
+
/** The domain that wins — its capabilities stay. */
|
|
43
|
+
readonly winner: string;
|
|
44
|
+
/**
|
|
45
|
+
* Domains whose capabilities are suppressed when this keyword is present
|
|
46
|
+
* AND they would otherwise match. Empty means "both stay" (complementary).
|
|
47
|
+
*/
|
|
48
|
+
readonly suppress: readonly string[];
|
|
49
|
+
/** Human-readable rationale. */
|
|
50
|
+
readonly note: string;
|
|
51
|
+
}
|
|
52
|
+
/** Result of resolving a prompt against the boundary rules. */
|
|
53
|
+
export interface BoundaryResolution {
|
|
54
|
+
/** Disambiguation resolutions: keyword → winning domain. */
|
|
55
|
+
readonly disambiguations: ReadonlyMap<string, string>;
|
|
56
|
+
/** Suppressed domains — their capabilities should be filtered from routing. */
|
|
57
|
+
readonly suppressedDomains: ReadonlySet<string>;
|
|
58
|
+
/** Applied rules for explain/debug. */
|
|
59
|
+
readonly appliedRules: readonly string[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Modifier-based disambiguation rules. Order within modifiers[] matters:
|
|
63
|
+
* the first matching modifier wins, so more specific patterns come first.
|
|
64
|
+
*/
|
|
65
|
+
export declare const DISAMBIGUATION_RULES: readonly DisambiguationRule[];
|
|
66
|
+
/**
|
|
67
|
+
* Priority resolution: certain keywords always belong to one domain regardless
|
|
68
|
+
* of what other domains might tag. Enforces the capability ownership boundary
|
|
69
|
+
* declared in ADR-082 §1 (Shield owns security, Latency-Lens owns perf, etc.).
|
|
70
|
+
*
|
|
71
|
+
* Note on domain names: ecosystem.graph.json uses underscores
|
|
72
|
+
* ("quality_engineering"), the CLI runner uses hyphens ("quality-engineering").
|
|
73
|
+
* These rules use the graph names (underscored) to match what the classifier
|
|
74
|
+
* emits.
|
|
75
|
+
*/
|
|
76
|
+
export declare const TIE_BREAK_RULES: readonly TieBreakRule[];
|
|
77
|
+
/**
|
|
78
|
+
* Apply ADR-082 boundary rules to a user prompt.
|
|
79
|
+
* Returns disambiguation decisions and suppressed domains.
|
|
80
|
+
*/
|
|
81
|
+
export declare function resolveDomainBoundary(prompt: string): BoundaryResolution;
|
|
82
|
+
/**
|
|
83
|
+
* Check whether a domain should be filtered from routing given the prompt.
|
|
84
|
+
* Convenience wrapper over resolveDomainBoundary.
|
|
85
|
+
*/
|
|
86
|
+
export declare function isDomainSuppressed(domain: string, prompt: string): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Resolve a single keyword to its routing domain, applying both disambiguation
|
|
89
|
+
* and tie-break rules. Returns null if the keyword is not governed by any rule.
|
|
90
|
+
*/
|
|
91
|
+
export declare function routeKeyword(keyword: string, prompt: string): string | null;
|
|
92
|
+
//# sourceMappingURL=domain-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-boundary.d.ts","sourceRoot":"","sources":["../../src/routing/domain-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnE,4CAA4C;IAC5C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,+EAA+E;IAC/E,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,uCAAuC;IACvC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAMD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EAqC7D,CAAC;AAMF;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EA0BlD,CAAC;AAMF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA2CxE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB3E"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain Boundary Resolution (ADR-PIPELINE-082)
|
|
3
|
+
*
|
|
4
|
+
* Disambiguation rules for overlapping capability keywords and tie-break rules
|
|
5
|
+
* for domain ownership. Used to resolve which domain should handle a query
|
|
6
|
+
* when multiple domains could legitimately claim the same tag.
|
|
7
|
+
*
|
|
8
|
+
* Two rule types:
|
|
9
|
+
* 1. DISAMBIGUATION_RULES — modifier-based routing (ADR-082 §3).
|
|
10
|
+
* "regression" alone → test_bench; "regression test" → quality_engineering.
|
|
11
|
+
* 2. TIE_BREAK_RULES — priority resolution (ADR-082 §4).
|
|
12
|
+
* "security" always goes to safety (shield), never quality_engineering.
|
|
13
|
+
*
|
|
14
|
+
* This module is declarative; callers (capability classifier, agentics ask)
|
|
15
|
+
* consult it to refine routing decisions. It performs no I/O and is safe to
|
|
16
|
+
* import anywhere.
|
|
17
|
+
*/
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Rules — ADR-082 §3
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Modifier-based disambiguation rules. Order within modifiers[] matters:
|
|
23
|
+
* the first matching modifier wins, so more specific patterns come first.
|
|
24
|
+
*/
|
|
25
|
+
export const DISAMBIGUATION_RULES = [
|
|
26
|
+
{
|
|
27
|
+
trigger: 'regression',
|
|
28
|
+
modifiers: [
|
|
29
|
+
{ pattern: /\btests?\b/i, domain: 'quality_engineering' },
|
|
30
|
+
{ pattern: /\b(models?|qualit(?:y|ies))\b/i, domain: 'test_bench' },
|
|
31
|
+
],
|
|
32
|
+
defaultDomain: 'test_bench',
|
|
33
|
+
note: 'ADR-082 §3: "regression test" → QE; "model regression" → test_bench',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
trigger: 'quality',
|
|
37
|
+
modifiers: [
|
|
38
|
+
{ pattern: /\b(code|tests?)\s+qualit(?:y|ies)\b/i, domain: 'quality_engineering' },
|
|
39
|
+
{ pattern: /\b(models?|outputs?)\s+qualit(?:y|ies)\b/i, domain: 'test_bench' },
|
|
40
|
+
],
|
|
41
|
+
defaultDomain: 'quality_engineering',
|
|
42
|
+
note: 'ADR-082 §3: code/test quality → QE; model/output quality → test_bench',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
trigger: 'evaluation',
|
|
46
|
+
modifiers: [
|
|
47
|
+
{ pattern: /\b(code|tests?|coverage|defects?)\b/i, domain: 'quality_engineering' },
|
|
48
|
+
{ pattern: /\b(models?|prompts?|llms?)\b/i, domain: 'test_bench' },
|
|
49
|
+
],
|
|
50
|
+
defaultDomain: 'test_bench',
|
|
51
|
+
note: 'ADR-082 §3: code/test evaluation → QE; model/prompt evaluation → test_bench',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
trigger: 'synthetic',
|
|
55
|
+
modifiers: [
|
|
56
|
+
{ pattern: /\b(tests?|fixtures?|mocks?)\b/i, domain: 'quality_engineering' },
|
|
57
|
+
{ pattern: /\b(benchmarks?|datasets?|training)\b/i, domain: 'test_bench' },
|
|
58
|
+
],
|
|
59
|
+
defaultDomain: 'test_bench',
|
|
60
|
+
note: 'ADR-082 §3: synthetic test data → QE; synthetic benchmark data → test_bench',
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Rules — ADR-082 §4
|
|
65
|
+
// ============================================================================
|
|
66
|
+
/**
|
|
67
|
+
* Priority resolution: certain keywords always belong to one domain regardless
|
|
68
|
+
* of what other domains might tag. Enforces the capability ownership boundary
|
|
69
|
+
* declared in ADR-082 §1 (Shield owns security, Latency-Lens owns perf, etc.).
|
|
70
|
+
*
|
|
71
|
+
* Note on domain names: ecosystem.graph.json uses underscores
|
|
72
|
+
* ("quality_engineering"), the CLI runner uses hyphens ("quality-engineering").
|
|
73
|
+
* These rules use the graph names (underscored) to match what the classifier
|
|
74
|
+
* emits.
|
|
75
|
+
*/
|
|
76
|
+
export const TIE_BREAK_RULES = [
|
|
77
|
+
// Safety (Shield) owns security (ADR-082 §1 + §4)
|
|
78
|
+
{ keyword: 'security', winner: 'safety', suppress: ['quality_engineering'], note: 'Shield owns security per ADR-082 §1' },
|
|
79
|
+
{ keyword: 'sast', winner: 'safety', suppress: ['quality_engineering'], note: 'Shield owns SAST per ADR-082 §1' },
|
|
80
|
+
{ keyword: 'dast', winner: 'safety', suppress: ['quality_engineering'], note: 'Shield owns DAST per ADR-082 §1' },
|
|
81
|
+
{ keyword: 'vulnerability', winner: 'safety', suppress: ['quality_engineering'], note: 'Shield owns vulnerability scanning per ADR-082 §1' },
|
|
82
|
+
{ keyword: 'penetration', winner: 'safety', suppress: ['quality_engineering'], note: 'Shield owns pentest per ADR-082 §1' },
|
|
83
|
+
// Performance Profiling (Latency-Lens) owns perf measurement, QE complements with chaos stressing
|
|
84
|
+
{ keyword: 'latency', winner: 'performance_profiling', suppress: [], note: 'Latency-Lens owns perf measurement; QE complements via chaos. Both stay.' },
|
|
85
|
+
{ keyword: 'cold-start', winner: 'performance_profiling', suppress: [], note: 'Latency-Lens owns cold-start; ADR-082 §4' },
|
|
86
|
+
// Data Privacy (Data-Vault) owns anonymization
|
|
87
|
+
{ keyword: 'anonymize', winner: 'data_security', suppress: ['quality_engineering'], note: 'Data-Vault owns anonymization per ADR-082 §1' },
|
|
88
|
+
{ keyword: 'pii', winner: 'safety', suppress: ['quality_engineering'], note: 'Shield owns PII detection per ADR-082 §1' },
|
|
89
|
+
{ keyword: 'redaction', winner: 'safety', suppress: ['quality_engineering'], note: 'Shield owns redaction per ADR-082 §1' },
|
|
90
|
+
// ERP boundary (connector-hub + ERP-Surface, ADR-074)
|
|
91
|
+
{ keyword: 'sap', winner: 'connector_hub', suppress: ['quality_engineering'], note: 'ERP surface boundary — connector-hub owns SAP integration per ADR-082 §1 + ADR-074' },
|
|
92
|
+
{ keyword: 'oracle', winner: 'connector_hub', suppress: ['quality_engineering'], note: 'ERP surface boundary per ADR-074' },
|
|
93
|
+
{ keyword: 'workday', winner: 'connector_hub', suppress: ['quality_engineering'], note: 'ERP surface boundary per ADR-074' },
|
|
94
|
+
{ keyword: 'soap', winner: 'connector_hub', suppress: ['quality_engineering'], note: 'Enterprise integration surface per ADR-082 §1' },
|
|
95
|
+
{ keyword: 'odata', winner: 'connector_hub', suppress: ['quality_engineering'], note: 'Enterprise integration surface per ADR-082 §1' },
|
|
96
|
+
// Memory/learning (Memory-Graph)
|
|
97
|
+
{ keyword: 'learning', winner: 'memory_context', suppress: ['quality_engineering'], note: 'Memory-Graph owns cross-session learning per ADR-082 §1' },
|
|
98
|
+
];
|
|
99
|
+
// ============================================================================
|
|
100
|
+
// Resolvers
|
|
101
|
+
// ============================================================================
|
|
102
|
+
/**
|
|
103
|
+
* Apply ADR-082 boundary rules to a user prompt.
|
|
104
|
+
* Returns disambiguation decisions and suppressed domains.
|
|
105
|
+
*/
|
|
106
|
+
export function resolveDomainBoundary(prompt) {
|
|
107
|
+
const promptLower = prompt.toLowerCase();
|
|
108
|
+
const disambiguations = new Map();
|
|
109
|
+
const suppressedDomains = new Set();
|
|
110
|
+
const appliedRules = [];
|
|
111
|
+
// Disambiguation rules
|
|
112
|
+
for (const rule of DISAMBIGUATION_RULES) {
|
|
113
|
+
if (!wordPresent(promptLower, rule.trigger))
|
|
114
|
+
continue;
|
|
115
|
+
let matched = false;
|
|
116
|
+
for (const mod of rule.modifiers) {
|
|
117
|
+
if (mod.pattern.test(prompt)) {
|
|
118
|
+
disambiguations.set(rule.trigger, mod.domain);
|
|
119
|
+
appliedRules.push(`disambiguation:${rule.trigger}→${mod.domain} (${rule.note})`);
|
|
120
|
+
matched = true;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!matched) {
|
|
125
|
+
disambiguations.set(rule.trigger, rule.defaultDomain);
|
|
126
|
+
appliedRules.push(`disambiguation:${rule.trigger}→${rule.defaultDomain} (default, ${rule.note})`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Tie-break rules
|
|
130
|
+
for (const rule of TIE_BREAK_RULES) {
|
|
131
|
+
if (!wordPresent(promptLower, rule.keyword))
|
|
132
|
+
continue;
|
|
133
|
+
for (const loser of rule.suppress) {
|
|
134
|
+
suppressedDomains.add(loser);
|
|
135
|
+
}
|
|
136
|
+
if (rule.suppress.length > 0) {
|
|
137
|
+
appliedRules.push(`tie-break:${rule.keyword}→${rule.winner} (suppress: ${rule.suppress.join(', ')})`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
appliedRules.push(`tie-break:${rule.keyword}→${rule.winner} (complementary, no suppression)`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
disambiguations,
|
|
145
|
+
suppressedDomains,
|
|
146
|
+
appliedRules,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check whether a domain should be filtered from routing given the prompt.
|
|
151
|
+
* Convenience wrapper over resolveDomainBoundary.
|
|
152
|
+
*/
|
|
153
|
+
export function isDomainSuppressed(domain, prompt) {
|
|
154
|
+
return resolveDomainBoundary(prompt).suppressedDomains.has(domain);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Resolve a single keyword to its routing domain, applying both disambiguation
|
|
158
|
+
* and tie-break rules. Returns null if the keyword is not governed by any rule.
|
|
159
|
+
*/
|
|
160
|
+
export function routeKeyword(keyword, prompt) {
|
|
161
|
+
const keywordLower = keyword.toLowerCase();
|
|
162
|
+
// Disambiguation takes precedence when a modifier matches
|
|
163
|
+
for (const rule of DISAMBIGUATION_RULES) {
|
|
164
|
+
if (rule.trigger !== keywordLower)
|
|
165
|
+
continue;
|
|
166
|
+
for (const mod of rule.modifiers) {
|
|
167
|
+
if (mod.pattern.test(prompt))
|
|
168
|
+
return mod.domain;
|
|
169
|
+
}
|
|
170
|
+
return rule.defaultDomain;
|
|
171
|
+
}
|
|
172
|
+
// Fall through to tie-break rules
|
|
173
|
+
for (const rule of TIE_BREAK_RULES) {
|
|
174
|
+
if (rule.keyword === keywordLower)
|
|
175
|
+
return rule.winner;
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Internals
|
|
181
|
+
// ============================================================================
|
|
182
|
+
/**
|
|
183
|
+
* Test whether a keyword appears in the prompt as a whole word, allowing
|
|
184
|
+
* common English inflections at the end (plural -s/-es/-ies, participle
|
|
185
|
+
* -ed/-ing).
|
|
186
|
+
*
|
|
187
|
+
* Matches: "security", "securities", "regression", "regressions"
|
|
188
|
+
* "vulnerability", "vulnerabilities", "cold-start", "cold-started"
|
|
189
|
+
* Does not match: "insecurity" (no preceding word boundary)
|
|
190
|
+
*/
|
|
191
|
+
function wordPresent(promptLower, keyword) {
|
|
192
|
+
const escaped = keyword.replace(/[-\s]/g, '[-\\s]').replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
193
|
+
// Allow up to 4 trailing letters to catch common stems (s, es, ed, ing, ies)
|
|
194
|
+
// without matching unrelated long words. The leading boundary remains strict.
|
|
195
|
+
const re = new RegExp(`(?:^|[^a-z0-9_])${escaped}[a-z]{0,4}(?:$|[^a-z0-9_])`, 'i');
|
|
196
|
+
if (re.test(promptLower))
|
|
197
|
+
return true;
|
|
198
|
+
// Handle -y → -ies plurals explicitly (e.g., "vulnerability" → "vulnerabilities")
|
|
199
|
+
if (keyword.endsWith('y')) {
|
|
200
|
+
const stem = keyword.slice(0, -1);
|
|
201
|
+
const escapedStem = stem.replace(/[-\s]/g, '[-\\s]').replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
202
|
+
const iesRe = new RegExp(`(?:^|[^a-z0-9_])${escapedStem}ies(?:$|[^a-z0-9_])`, 'i');
|
|
203
|
+
if (iesRe.test(promptLower))
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=domain-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-boundary.js","sourceRoot":"","sources":["../../src/routing/domain-boundary.ts"],"names":[],"mappings":"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"}
|
package/dist/routing/index.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ export { isFederatedGraph, loadFragments, federateGraph, fragmentToCapabilityEnt
|
|
|
25
25
|
export type { CapabilityFragment, FederatedRootGraph, FragmentOverride, FederationResult, } from './graph-federation.js';
|
|
26
26
|
export { validateTier1, validateTier3, formatValidationReport, } from './graph-validator.js';
|
|
27
27
|
export type { ValidationTier, ValidationSeverity, ValidationResult, ValidationReport, } from './graph-validator.js';
|
|
28
|
+
export { DISAMBIGUATION_RULES, TIE_BREAK_RULES, resolveDomainBoundary, isDomainSuppressed, routeKeyword, } from './domain-boundary.js';
|
|
29
|
+
export type { DisambiguationRule, TieBreakRule, BoundaryResolution, } from './domain-boundary.js';
|
|
28
30
|
import type { RoutingResult, DomainAgentRef } from './graph-router.js';
|
|
29
31
|
export interface RouteQueryResult {
|
|
30
32
|
/** Full routing result with classification, pipeline, and explanation. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,cAAc,EACd,eAAe,EACf,SAAS,EACT,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,aAAa,EACb,UAAU,EACV,SAAS,EACT,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,aAAa,EACb,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,GACV,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,aAAa,EACb,aAAa,EACb,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAS9B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAW/E"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,cAAc,EACd,eAAe,EACf,SAAS,EACT,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,aAAa,EACb,UAAU,EACV,SAAS,EACT,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,aAAa,EACb,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,GACV,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,aAAa,EACb,aAAa,EACb,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAS9B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAW/E"}
|
package/dist/routing/index.js
CHANGED
|
@@ -35,6 +35,10 @@ export { isFederatedGraph, loadFragments, federateGraph, fragmentToCapabilityEnt
|
|
|
35
35
|
// ============================================================================
|
|
36
36
|
export { validateTier1, validateTier3, formatValidationReport, } from './graph-validator.js';
|
|
37
37
|
// ============================================================================
|
|
38
|
+
// ADR-PIPELINE-082: Domain Boundary Resolution
|
|
39
|
+
// ============================================================================
|
|
40
|
+
export { DISAMBIGUATION_RULES, TIE_BREAK_RULES, resolveDomainBoundary, isDomainSuppressed, routeKeyword, } from './domain-boundary.js';
|
|
41
|
+
// ============================================================================
|
|
38
42
|
// Convenience: one-call routing
|
|
39
43
|
// ============================================================================
|
|
40
44
|
import { loadEcosystemGraph } from './graph-loader.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAU3B,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAShC,+EAA+E;AAC/E,sCAAsC;AACtC,+EAA+E;AAE/E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAO9B,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAWjC,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E;AAE/E,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAS/B,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E,OAAO,EACL,aAAa,EACb,aAAa,EACb,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAS9B,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAYzE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,SAAkB;IAC3D,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE1C,OAAO;QACL,OAAO;QACP,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,WAAW,GAAG,CAAC;KACjC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAU3B,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAShC,+EAA+E;AAC/E,sCAAsC;AACtC,+EAA+E;AAE/E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAO9B,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAWjC,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E;AAE/E,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAS/B,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E,OAAO,EACL,aAAa,EACb,aAAa,EACb,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAS9B,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAQ9B,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAYzE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,SAAkB;IAC3D,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE1C,OAAO;QACL,OAAO;QACP,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,WAAW,GAAG,CAAC;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -193,6 +193,52 @@
|
|
|
193
193
|
],
|
|
194
194
|
"scope": "global",
|
|
195
195
|
"tags": ["data-security", "anonymize", "access-control", "de-identify", "privacy", "data-protection"]
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"name": "quality_engineering",
|
|
199
|
+
"description": "Comprehensive QE fleet — test generation (unit/integration/property/BDD), coverage analysis, defect intelligence, flaky detection, test design, chaos engineering, and root-cause analysis. Wraps AQE upstream via adapter repo.",
|
|
200
|
+
"repos": ["agentic-qe"],
|
|
201
|
+
"agents": [
|
|
202
|
+
"Test Design Agent",
|
|
203
|
+
"Unit Test Generation Agent",
|
|
204
|
+
"Integration Test Generation Agent",
|
|
205
|
+
"Property-Based Test Agent",
|
|
206
|
+
"BDD Test Generation Agent",
|
|
207
|
+
"Coverage Analysis Agent",
|
|
208
|
+
"Coverage Gap Detection Agent",
|
|
209
|
+
"Defect Prediction Agent",
|
|
210
|
+
"Flaky Test Detection Agent",
|
|
211
|
+
"Root Cause Analysis Agent",
|
|
212
|
+
"Requirements Traceability Agent",
|
|
213
|
+
"Chaos Engineering Agent",
|
|
214
|
+
"Test Execution Orchestrator Agent",
|
|
215
|
+
"QE Reporting Agent"
|
|
216
|
+
],
|
|
217
|
+
"scope": "global",
|
|
218
|
+
"tags": ["qe", "testing", "test-generation", "coverage", "defect-intelligence", "flaky-detection", "chaos", "rca", "traceability", "quality"]
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"name": "test_bench",
|
|
222
|
+
"description": "Model and agent evaluation benchmarking — quality scoring, regression detection, hallucination/faithfulness measurement, prompt sensitivity, consistency, bias, stress, red-team, golden-dataset curation, and synthetic-data generation for benchmarks. Complement to quality_engineering per ADR-085: test_bench owns model-level evaluation; QE owns code-level testing.",
|
|
223
|
+
"repos": ["test-bench"],
|
|
224
|
+
"agents": [
|
|
225
|
+
"Benchmark Agent",
|
|
226
|
+
"Compare Agent",
|
|
227
|
+
"Regression Detection Agent",
|
|
228
|
+
"Quality Scoring Agent",
|
|
229
|
+
"Hallucination Detection Agent",
|
|
230
|
+
"Faithfulness Agent",
|
|
231
|
+
"Bias Evaluation Agent",
|
|
232
|
+
"Prompt Sensitivity Agent",
|
|
233
|
+
"Consistency Agent",
|
|
234
|
+
"Stress Test Agent",
|
|
235
|
+
"Red Team Agent",
|
|
236
|
+
"Adversarial Agent",
|
|
237
|
+
"Golden Dataset Agent",
|
|
238
|
+
"Synthetic Data Agent"
|
|
239
|
+
],
|
|
240
|
+
"scope": "global",
|
|
241
|
+
"tags": ["benchmark", "compare", "regression", "quality", "hallucination", "faithfulness", "bias", "prompt-sensitivity", "consistency", "stress", "red-team", "adversarial", "golden-dataset", "synthetic-data"]
|
|
196
242
|
}
|
|
197
243
|
],
|
|
198
244
|
"capabilities": [
|
|
@@ -266,11 +312,13 @@
|
|
|
266
312
|
],
|
|
267
313
|
"optional_agents": [
|
|
268
314
|
"Template Bootstrap Agent",
|
|
269
|
-
"Version Compatibility Agent"
|
|
315
|
+
"Version Compatibility Agent",
|
|
316
|
+
"Test Design Agent",
|
|
317
|
+
"Requirements Traceability Agent"
|
|
270
318
|
],
|
|
271
319
|
"execution": "ruflo_swarm",
|
|
272
320
|
"depends_on": ["research"],
|
|
273
|
-
"tags": ["sparc", "specification", "pseudocode", "architecture", "refinement", "completion"]
|
|
321
|
+
"tags": ["sparc", "specification", "pseudocode", "architecture", "refinement", "completion", "testability", "traceability"]
|
|
274
322
|
},
|
|
275
323
|
{
|
|
276
324
|
"name": "sparc_handoff",
|
|
@@ -300,11 +348,13 @@
|
|
|
300
348
|
"optional_agents": [
|
|
301
349
|
"Architecture Decision Validator Agent",
|
|
302
350
|
"Constraint Solver Agent",
|
|
303
|
-
"Schema Validation Agent"
|
|
351
|
+
"Schema Validation Agent",
|
|
352
|
+
"Defect Prediction Agent",
|
|
353
|
+
"Test Design Agent"
|
|
304
354
|
],
|
|
305
355
|
"execution": "ruflo_swarm",
|
|
306
356
|
"depends_on": ["sparc_handoff"],
|
|
307
|
-
"tags": ["adr", "ddd", "domain-model", "context-map", "architecture"]
|
|
357
|
+
"tags": ["adr", "ddd", "domain-model", "context-map", "architecture", "defect-prediction", "testability"]
|
|
308
358
|
},
|
|
309
359
|
{
|
|
310
360
|
"name": "implementation_planning",
|
|
@@ -319,10 +369,11 @@
|
|
|
319
369
|
],
|
|
320
370
|
"optional_agents": [
|
|
321
371
|
"Meta-Reasoner Agent",
|
|
322
|
-
"Strategic Recommendation Agent"
|
|
372
|
+
"Strategic Recommendation Agent",
|
|
373
|
+
"Coverage Gap Detection Agent"
|
|
323
374
|
],
|
|
324
375
|
"depends_on": ["adr_ddd_architecture"],
|
|
325
|
-
"tags": ["implementation", "planning", "build-prompts"]
|
|
376
|
+
"tags": ["implementation", "planning", "build-prompts", "coverage", "coverage-gap"]
|
|
326
377
|
},
|
|
327
378
|
{
|
|
328
379
|
"name": "build",
|
|
@@ -345,11 +396,16 @@
|
|
|
345
396
|
"Tool Invocation Agent",
|
|
346
397
|
"Execution Guard Agent",
|
|
347
398
|
"Caching Strategy Agent",
|
|
348
|
-
"Inference Routing Agent"
|
|
399
|
+
"Inference Routing Agent",
|
|
400
|
+
"Unit Test Generation Agent",
|
|
401
|
+
"Integration Test Generation Agent",
|
|
402
|
+
"Property-Based Test Agent",
|
|
403
|
+
"BDD Test Generation Agent",
|
|
404
|
+
"Coverage Analysis Agent"
|
|
349
405
|
],
|
|
350
406
|
"execution": "sequential_with_ruflo",
|
|
351
407
|
"depends_on": ["implementation_planning"],
|
|
352
|
-
"tags": ["build", "sdk", "api", "integration", "erp", "connector", "database", "auth", "sap", "s4hana", "hana", "oracle", "netsuite", "dynamics", "infor", "epicor", "sage", "ifs", "workday", "peoplesoft", "bapi", "odata", "rest", "webhook", "batch", "etl", "pipeline", "microservice", "service", "adapter", "middleware"]
|
|
408
|
+
"tags": ["build", "sdk", "api", "integration", "erp", "connector", "database", "auth", "sap", "s4hana", "hana", "oracle", "netsuite", "dynamics", "infor", "epicor", "sage", "ifs", "workday", "peoplesoft", "bapi", "odata", "rest", "webhook", "batch", "etl", "pipeline", "microservice", "service", "adapter", "middleware", "test-generation", "unit-test", "integration-test", "property-test", "bdd", "coverage"]
|
|
353
409
|
},
|
|
354
410
|
{
|
|
355
411
|
"name": "validation",
|
|
@@ -361,7 +417,21 @@
|
|
|
361
417
|
"Quality Scoring Agent",
|
|
362
418
|
"Output Consistency Agent",
|
|
363
419
|
"Hallucination Detection Agent",
|
|
364
|
-
"Faithfulness Verification Agent"
|
|
420
|
+
"Faithfulness Verification Agent",
|
|
421
|
+
"Test Design Agent",
|
|
422
|
+
"Unit Test Generation Agent",
|
|
423
|
+
"Integration Test Generation Agent",
|
|
424
|
+
"Property-Based Test Agent",
|
|
425
|
+
"BDD Test Generation Agent",
|
|
426
|
+
"Coverage Analysis Agent",
|
|
427
|
+
"Coverage Gap Detection Agent",
|
|
428
|
+
"Defect Prediction Agent",
|
|
429
|
+
"Flaky Test Detection Agent",
|
|
430
|
+
"Root Cause Analysis Agent",
|
|
431
|
+
"Requirements Traceability Agent",
|
|
432
|
+
"Chaos Engineering Agent",
|
|
433
|
+
"Test Execution Orchestrator Agent",
|
|
434
|
+
"QE Reporting Agent"
|
|
365
435
|
],
|
|
366
436
|
"optional_agents": [
|
|
367
437
|
"Regression Detection Agent",
|
|
@@ -376,7 +446,7 @@
|
|
|
376
446
|
"Benchmark Runner Agent"
|
|
377
447
|
],
|
|
378
448
|
"depends_on": ["build"],
|
|
379
|
-
"tags": ["validation", "quality", "hallucination", "faithfulness", "consistency"]
|
|
449
|
+
"tags": ["validation", "quality", "hallucination", "faithfulness", "consistency", "qe", "testing", "test", "coverage", "defect", "flaky", "rca", "traceability", "chaos", "quality-engineering"]
|
|
380
450
|
},
|
|
381
451
|
{
|
|
382
452
|
"name": "integration_mapping",
|
|
@@ -394,10 +464,12 @@
|
|
|
394
464
|
"optional_agents": [
|
|
395
465
|
"Schema Validation Agent",
|
|
396
466
|
"Config Validation Agent",
|
|
397
|
-
"API Translation Agent"
|
|
467
|
+
"API Translation Agent",
|
|
468
|
+
"Integration Test Generation Agent",
|
|
469
|
+
"Chaos Engineering Agent"
|
|
398
470
|
],
|
|
399
471
|
"depends_on": ["validation"],
|
|
400
|
-
"tags": ["integration", "mapping", "connector", "webhook", "erp", "database", "auth", "sap", "oracle", "netsuite", "dynamics", "bigquery", "postgresql", "sql", "api", "odata", "bapi"]
|
|
472
|
+
"tags": ["integration", "mapping", "connector", "webhook", "erp", "database", "auth", "sap", "oracle", "netsuite", "dynamics", "bigquery", "postgresql", "sql", "api", "odata", "bapi", "integration-test", "chaos", "fault-injection"]
|
|
401
473
|
},
|
|
402
474
|
{
|
|
403
475
|
"name": "governance_finops",
|
|
@@ -417,10 +489,11 @@
|
|
|
417
489
|
"Constraint Solver Agent",
|
|
418
490
|
"Usage Oversight Agent",
|
|
419
491
|
"Change Impact Agent",
|
|
420
|
-
"Governance Audit Agent"
|
|
492
|
+
"Governance Audit Agent",
|
|
493
|
+
"QE Reporting Agent"
|
|
421
494
|
],
|
|
422
495
|
"depends_on": ["integration_mapping"],
|
|
423
|
-
"tags": ["governance", "finops", "policy", "cost", "roi", "compliance", "regulatory", "csrd", "esg", "sox", "gdpr", "hipaa", "audit", "disclosure", "reporting", "sustainability", "carbon", "emissions", "budget", "forecast"]
|
|
496
|
+
"tags": ["governance", "finops", "policy", "cost", "roi", "compliance", "regulatory", "csrd", "esg", "sox", "gdpr", "hipaa", "audit", "disclosure", "reporting", "sustainability", "carbon", "emissions", "budget", "forecast", "qe-reporting", "test-metrics"]
|
|
424
497
|
},
|
|
425
498
|
{
|
|
426
499
|
"name": "decision_packaging",
|