@productbrain/cli 0.1.0-beta.26 → 0.1.0-beta.28
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/__tests__/capture.test.js +11 -3
- package/dist/__tests__/capture.test.js.map +1 -1
- package/dist/__tests__/relate.test.js +15 -0
- package/dist/__tests__/relate.test.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +42 -2
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/collections.d.ts +16 -0
- package/dist/commands/collections.d.ts.map +1 -0
- package/dist/commands/collections.js +59 -0
- package/dist/commands/collections.js.map +1 -0
- package/dist/commands/handshake.d.ts +2 -0
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +37 -1
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/orient.d.ts +1 -0
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +10 -1
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +10 -3
- package/dist/commands/relate.js.map +1 -1
- package/dist/formatters/collections.d.ts +40 -0
- package/dist/formatters/collections.d.ts.map +1 -0
- package/dist/formatters/collections.js +93 -0
- package/dist/formatters/collections.js.map +1 -0
- package/dist/formatters/handshake.d.ts +5 -0
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +9 -0
- package/dist/formatters/handshake.js.map +1 -1
- package/dist/formatters/relate.d.ts +2 -0
- package/dist/formatters/relate.d.ts.map +1 -1
- package/dist/formatters/relate.js +3 -0
- package/dist/formatters/relate.js.map +1 -1
- package/dist/generators/archetypes.d.ts +52 -0
- package/dist/generators/archetypes.d.ts.map +1 -0
- package/dist/generators/archetypes.js +153 -0
- package/dist/generators/archetypes.js.map +1 -0
- package/dist/generators/archetypes.test.d.ts +2 -0
- package/dist/generators/archetypes.test.d.ts.map +1 -0
- package/dist/generators/archetypes.test.js +237 -0
- package/dist/generators/archetypes.test.js.map +1 -0
- package/dist/generators/chain-classifier.d.ts +49 -0
- package/dist/generators/chain-classifier.d.ts.map +1 -0
- package/dist/generators/chain-classifier.js +180 -0
- package/dist/generators/chain-classifier.js.map +1 -0
- package/dist/generators/chain-classifier.test.d.ts +2 -0
- package/dist/generators/chain-classifier.test.d.ts.map +1 -0
- package/dist/generators/chain-classifier.test.js +257 -0
- package/dist/generators/chain-classifier.test.js.map +1 -0
- package/dist/generators/chain-rules.d.ts +42 -0
- package/dist/generators/chain-rules.d.ts.map +1 -0
- package/dist/generators/chain-rules.js +144 -0
- package/dist/generators/chain-rules.js.map +1 -0
- package/dist/generators/chain-rules.test.d.ts +2 -0
- package/dist/generators/chain-rules.test.d.ts.map +1 -0
- package/dist/generators/chain-rules.test.js +179 -0
- package/dist/generators/chain-rules.test.js.map +1 -0
- package/dist/generators/handshake-diff.d.ts +67 -0
- package/dist/generators/handshake-diff.d.ts.map +1 -0
- package/dist/generators/handshake-diff.js +183 -0
- package/dist/generators/handshake-diff.js.map +1 -0
- package/dist/generators/handshake-diff.test.d.ts +2 -0
- package/dist/generators/handshake-diff.test.d.ts.map +1 -0
- package/dist/generators/handshake-diff.test.js +265 -0
- package/dist/generators/handshake-diff.test.js.map +1 -0
- package/dist/index.js +50 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/templates/archetypes/boundary.md +23 -0
- package/templates/archetypes/constraint.md +23 -0
- package/templates/archetypes/convention.md +23 -0
- package/templates/archetypes/policy.md +23 -0
- package/templates/archetypes/quality-gate.md +23 -0
- package/templates/archetypes/workflow.md +23 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts +0 -2
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.js +0 -89
- package/dist/generators/__tests__/surface-profiles.test.js.map +0 -1
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* archetypes — unit tests.
|
|
3
|
+
* BET-286 Slice 2: archetype template loader and slot resolver.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { loadArchetype, resolveArchetype, } from './archetypes.js';
|
|
7
|
+
/** Helper to extract a resolved archetype, failing the test if skipped. */
|
|
8
|
+
function expectResolved(result) {
|
|
9
|
+
expect('resolved' in result).toBe(true);
|
|
10
|
+
return result.resolved;
|
|
11
|
+
}
|
|
12
|
+
/** Helper to extract a skip reason, failing the test if resolved. */
|
|
13
|
+
function expectSkipped(result) {
|
|
14
|
+
expect('skipped' in result).toBe(true);
|
|
15
|
+
return result.skipped;
|
|
16
|
+
}
|
|
17
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
18
|
+
function makeClassified(overrides) {
|
|
19
|
+
return {
|
|
20
|
+
collectionSlug: 'standards',
|
|
21
|
+
confidence: 0.65,
|
|
22
|
+
matchedSignals: ['collection standards → constraint'],
|
|
23
|
+
data: null,
|
|
24
|
+
relations: [],
|
|
25
|
+
...overrides,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// ── loadArchetype ──────────────────────────────────────────────────────
|
|
29
|
+
describe('loadArchetype', () => {
|
|
30
|
+
it('loads the constraint template and returns an ArchetypeTemplate', () => {
|
|
31
|
+
const template = loadArchetype('constraint');
|
|
32
|
+
expect(template).not.toBeNull();
|
|
33
|
+
expect(template.functionKey).toBe('constraint');
|
|
34
|
+
expect(template.name).toBe('chain-constraints');
|
|
35
|
+
expect(template.autoApply).toBe(true);
|
|
36
|
+
expect(template.level).toBe('core');
|
|
37
|
+
expect(template.body.length).toBeGreaterThan(0);
|
|
38
|
+
});
|
|
39
|
+
it('loads the boundary template', () => {
|
|
40
|
+
const template = loadArchetype('boundary');
|
|
41
|
+
expect(template).not.toBeNull();
|
|
42
|
+
expect(template.name).toBe('chain-boundaries');
|
|
43
|
+
});
|
|
44
|
+
it('loads the convention template', () => {
|
|
45
|
+
const template = loadArchetype('convention');
|
|
46
|
+
expect(template).not.toBeNull();
|
|
47
|
+
expect(template.name).toBe('chain-conventions');
|
|
48
|
+
});
|
|
49
|
+
it('loads the policy template', () => {
|
|
50
|
+
const template = loadArchetype('policy');
|
|
51
|
+
expect(template).not.toBeNull();
|
|
52
|
+
expect(template.name).toBe('chain-policies');
|
|
53
|
+
});
|
|
54
|
+
it('loads the workflow template', () => {
|
|
55
|
+
const template = loadArchetype('workflow');
|
|
56
|
+
expect(template).not.toBeNull();
|
|
57
|
+
expect(template.name).toBe('chain-workflows');
|
|
58
|
+
});
|
|
59
|
+
it('loads the quality-gate template', () => {
|
|
60
|
+
const template = loadArchetype('quality-gate');
|
|
61
|
+
expect(template).not.toBeNull();
|
|
62
|
+
expect(template.name).toBe('chain-quality-gates');
|
|
63
|
+
});
|
|
64
|
+
it('returns null for unclassified', () => {
|
|
65
|
+
const template = loadArchetype('unclassified');
|
|
66
|
+
expect(template).toBeNull();
|
|
67
|
+
});
|
|
68
|
+
// GovernanceFunction is a union — cast to test unknown-like behavior
|
|
69
|
+
it('returns null for a function key with no template file', () => {
|
|
70
|
+
// Cast to bypass type check — simulates a future unknown function key
|
|
71
|
+
const template = loadArchetype('unknown-function');
|
|
72
|
+
expect(template).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// ── resolveArchetype ───────────────────────────────────────────────────
|
|
76
|
+
describe('resolveArchetype — returns valid CanonicalRule', () => {
|
|
77
|
+
it('returns a ResolvedArchetype when matching entries exist', () => {
|
|
78
|
+
const classified = [
|
|
79
|
+
makeClassified({ entryId: 'STD-7', name: 'Trunk-based development', governanceFunction: 'constraint' }),
|
|
80
|
+
makeClassified({ entryId: 'STD-22', name: 'Session equals slice', governanceFunction: 'constraint' }),
|
|
81
|
+
];
|
|
82
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
83
|
+
expect(resolved.functionKey).toBe('constraint');
|
|
84
|
+
expect(resolved.resolvedEntryIds).toEqual(['STD-7', 'STD-22']);
|
|
85
|
+
expect(resolved.rule).toBeDefined();
|
|
86
|
+
});
|
|
87
|
+
it('the resolved rule has name, description, body, autoApply, level, sourcePath', () => {
|
|
88
|
+
const classified = [
|
|
89
|
+
makeClassified({ entryId: 'ARCH-26', name: 'Seven system domains', governanceFunction: 'boundary' }),
|
|
90
|
+
];
|
|
91
|
+
const resolved = expectResolved(resolveArchetype('boundary', classified, new Set()));
|
|
92
|
+
const rule = resolved.rule;
|
|
93
|
+
expect(rule.name).toBe('chain-boundaries');
|
|
94
|
+
expect(rule.description).toBeTruthy();
|
|
95
|
+
expect(rule.body).toBeTruthy();
|
|
96
|
+
expect(rule.autoApply).toBe(true);
|
|
97
|
+
expect(rule.level).toBe('core');
|
|
98
|
+
expect(rule.sourcePath).toBe('chain://boundary');
|
|
99
|
+
});
|
|
100
|
+
it('scope is undefined (global rule)', () => {
|
|
101
|
+
const classified = [
|
|
102
|
+
makeClassified({ entryId: 'DEC-1', name: 'Deploy ordering', governanceFunction: 'convention' }),
|
|
103
|
+
];
|
|
104
|
+
const resolved = expectResolved(resolveArchetype('convention', classified, new Set()));
|
|
105
|
+
expect(resolved.rule.scope).toBeUndefined();
|
|
106
|
+
});
|
|
107
|
+
it('targets is undefined (emit to all targets)', () => {
|
|
108
|
+
const classified = [
|
|
109
|
+
makeClassified({ entryId: 'POL-1', name: 'Access control', governanceFunction: 'policy' }),
|
|
110
|
+
];
|
|
111
|
+
const resolved = expectResolved(resolveArchetype('policy', classified, new Set()));
|
|
112
|
+
expect(resolved.rule.targets).toBeUndefined();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('resolveArchetype — skip cases (suppression)', () => {
|
|
116
|
+
it('returns skipped:zero-entries when zero entries match the function key', () => {
|
|
117
|
+
const classified = [
|
|
118
|
+
makeClassified({ entryId: 'STD-7', name: 'Some standard', governanceFunction: 'constraint' }),
|
|
119
|
+
];
|
|
120
|
+
// No 'boundary' entries
|
|
121
|
+
expect(expectSkipped(resolveArchetype('boundary', classified, new Set()))).toBe('zero-entries');
|
|
122
|
+
});
|
|
123
|
+
it('returns skipped:manual-suppression when manualRuleNames contains the archetype name', () => {
|
|
124
|
+
const classified = [
|
|
125
|
+
makeClassified({ entryId: 'STD-7', name: 'Some standard', governanceFunction: 'constraint' }),
|
|
126
|
+
];
|
|
127
|
+
const manualRuleNames = new Set(['chain-constraints']);
|
|
128
|
+
expect(expectSkipped(resolveArchetype('constraint', classified, manualRuleNames))).toBe('manual-suppression');
|
|
129
|
+
});
|
|
130
|
+
it('returns skipped:no-template for unclassified function key', () => {
|
|
131
|
+
const classified = [
|
|
132
|
+
makeClassified({ entryId: 'GLO-1', name: 'Some glossary entry', governanceFunction: 'unclassified' }),
|
|
133
|
+
];
|
|
134
|
+
expect(expectSkipped(resolveArchetype('unclassified', classified, new Set()))).toBe('no-template');
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('resolveArchetype — slot resolution', () => {
|
|
138
|
+
it('replaces {{entry_ids}} with comma-separated human IDs', () => {
|
|
139
|
+
const classified = [
|
|
140
|
+
makeClassified({ entryId: 'STD-7', name: 'Standard A', governanceFunction: 'constraint' }),
|
|
141
|
+
makeClassified({ entryId: 'BR-64', name: 'Business Rule B', governanceFunction: 'constraint' }),
|
|
142
|
+
];
|
|
143
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
144
|
+
expect(resolved.rule.body).toContain('STD-7, BR-64');
|
|
145
|
+
});
|
|
146
|
+
it('replaces {{entry_names}} with comma-separated names', () => {
|
|
147
|
+
const classified = [
|
|
148
|
+
makeClassified({ entryId: 'STD-7', name: 'Trunk-based dev', governanceFunction: 'constraint' }),
|
|
149
|
+
makeClassified({ entryId: 'STD-22', name: 'Session is a slice', governanceFunction: 'constraint' }),
|
|
150
|
+
];
|
|
151
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
152
|
+
expect(resolved.rule.body).toContain('Trunk-based dev');
|
|
153
|
+
expect(resolved.rule.body).toContain('Session is a slice');
|
|
154
|
+
});
|
|
155
|
+
it('replaces {{entry_count}} with the number of matching entries', () => {
|
|
156
|
+
const classified = [
|
|
157
|
+
makeClassified({ entryId: 'STD-7', name: 'A', governanceFunction: 'constraint' }),
|
|
158
|
+
makeClassified({ entryId: 'STD-8', name: 'B', governanceFunction: 'constraint' }),
|
|
159
|
+
makeClassified({ entryId: 'STD-9', name: 'C', governanceFunction: 'constraint' }),
|
|
160
|
+
];
|
|
161
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
162
|
+
expect(resolved.rule.body).toContain('3');
|
|
163
|
+
expect(resolved.rule.description).toContain('3');
|
|
164
|
+
});
|
|
165
|
+
it('no unresolved {{slot}} placeholders remain in body', () => {
|
|
166
|
+
const classified = [
|
|
167
|
+
makeClassified({ entryId: 'STD-7', name: 'Some constraint', governanceFunction: 'constraint' }),
|
|
168
|
+
];
|
|
169
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
170
|
+
// No raw {{...}} placeholders should remain
|
|
171
|
+
expect(resolved.rule.body).not.toMatch(/\{\{\w+\}\}/);
|
|
172
|
+
});
|
|
173
|
+
it('no unresolved {{slot}} placeholders remain in description', () => {
|
|
174
|
+
const classified = [
|
|
175
|
+
makeClassified({ entryId: 'STD-7', name: 'Some constraint', governanceFunction: 'constraint' }),
|
|
176
|
+
];
|
|
177
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
178
|
+
expect(resolved.rule.description).not.toMatch(/\{\{\w+\}\}/);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe('resolveArchetype — sourcePath convention', () => {
|
|
182
|
+
it('sourcePath follows chain:// convention with function key', () => {
|
|
183
|
+
const classified = [
|
|
184
|
+
makeClassified({ entryId: 'FLOW-1', name: 'Feature flag lifecycle', governanceFunction: 'workflow' }),
|
|
185
|
+
];
|
|
186
|
+
const resolved = expectResolved(resolveArchetype('workflow', classified, new Set()));
|
|
187
|
+
expect(resolved.rule.sourcePath).toBe('chain://workflow');
|
|
188
|
+
});
|
|
189
|
+
it('quality-gate sourcePath uses chain://quality-gate', () => {
|
|
190
|
+
const classified = [
|
|
191
|
+
makeClassified({ entryId: 'STD-2', name: 'Test coverage gate', governanceFunction: 'quality-gate', collectionSlug: 'standards' }),
|
|
192
|
+
];
|
|
193
|
+
const resolved = expectResolved(resolveArchetype('quality-gate', classified, new Set()));
|
|
194
|
+
expect(resolved.rule.sourcePath).toBe('chain://quality-gate');
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe('resolveArchetype — CanonicalRule type compatibility', () => {
|
|
198
|
+
it('the resolved rule satisfies the CanonicalRule interface', () => {
|
|
199
|
+
const classified = [
|
|
200
|
+
makeClassified({ entryId: 'DEC-100', name: 'Some decision', governanceFunction: 'convention' }),
|
|
201
|
+
];
|
|
202
|
+
const resolved = expectResolved(resolveArchetype('convention', classified, new Set()));
|
|
203
|
+
// TypeScript structural check: assign to CanonicalRule
|
|
204
|
+
const rule = resolved.rule;
|
|
205
|
+
expect(rule.name).toBeTruthy();
|
|
206
|
+
expect(typeof rule.autoApply).toBe('boolean');
|
|
207
|
+
expect(typeof rule.body).toBe('string');
|
|
208
|
+
expect(typeof rule.sourcePath).toBe('string');
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
describe('resolveArchetype — summary truncation', () => {
|
|
212
|
+
it('lists up to 5 entries then "and N more"', () => {
|
|
213
|
+
const classified = Array.from({ length: 8 }, (_, i) => makeClassified({ entryId: `STD-${i + 1}`, name: `Standard ${i + 1}`, governanceFunction: 'constraint' }));
|
|
214
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
215
|
+
expect(resolved.rule.body).toContain('and 3 more');
|
|
216
|
+
});
|
|
217
|
+
it('does not add "and N more" when 5 or fewer entries', () => {
|
|
218
|
+
const classified = Array.from({ length: 5 }, (_, i) => makeClassified({ entryId: `STD-${i + 1}`, name: `Standard ${i + 1}`, governanceFunction: 'constraint' }));
|
|
219
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
220
|
+
expect(resolved.rule.body).not.toMatch(/\.\.\.and \d+ more/);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe('resolveArchetype — only matching entries contribute', () => {
|
|
224
|
+
it('entries of other function types are excluded from resolution', () => {
|
|
225
|
+
const classified = [
|
|
226
|
+
makeClassified({ entryId: 'STD-7', name: 'Constraint entry', governanceFunction: 'constraint' }),
|
|
227
|
+
makeClassified({ entryId: 'ARCH-1', name: 'Boundary entry', governanceFunction: 'boundary' }),
|
|
228
|
+
makeClassified({ entryId: 'FLOW-1', name: 'Workflow entry', governanceFunction: 'workflow' }),
|
|
229
|
+
];
|
|
230
|
+
const resolved = expectResolved(resolveArchetype('constraint', classified, new Set()));
|
|
231
|
+
expect(resolved.resolvedEntryIds).toEqual(['STD-7']);
|
|
232
|
+
expect(resolved.rule.body).toContain('STD-7');
|
|
233
|
+
expect(resolved.rule.body).not.toContain('ARCH-1');
|
|
234
|
+
expect(resolved.rule.body).not.toContain('FLOW-1');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
//# sourceMappingURL=archetypes.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archetypes.test.js","sourceRoot":"","sources":["../../src/generators/archetypes.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,aAAa,EACb,gBAAgB,GAGjB,MAAM,iBAAiB,CAAC;AAIzB,2EAA2E;AAC3E,SAAS,cAAc,CAAC,MAA0E;IAChG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,OAAQ,MAA0C,CAAC,QAAQ,CAAC;AAC9D,CAAC;AAED,qEAAqE;AACrE,SAAS,aAAa,CAAC,MAA0E;IAC/F,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,OAAQ,MAA2C,CAAC,OAAO,CAAC;AAC9D,CAAC;AAED,0EAA0E;AAE1E,SAAS,cAAc,CAAC,SAA4I;IAClK,OAAO;QACL,cAAc,EAAE,WAAW;QAC3B,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,CAAC,mCAAmC,CAAC;QACrD,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,EAAE;QACb,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,0EAA0E;AAE1E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjD,MAAM,CAAC,QAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,QAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,sEAAsE;QACtE,MAAM,QAAQ,GAAG,aAAa,CAAC,kBAA2B,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,0EAA0E;AAE1E,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;YACvG,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SACtG,CAAC;QAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC;SACrG,CAAC;QAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;SAC3F,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAC9F,CAAC;QACF,wBAAwB;QACxB,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAC9F,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC;SACtG,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;YAC1F,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;YAC/F,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SACpG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;YACjF,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;YACjF,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAClF,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,4CAA4C;QAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC;SACtG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;SAClI,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,uDAAuD;QACvD,MAAM,IAAI,GAAkB,QAAQ,CAAC,IAAI,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpD,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC,CACzG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpD,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC,CACzG,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG;YACjB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;YAChG,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC;YAC7F,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC;SAC9F,CAAC;QAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Classifier — BET-286 Slice 1
|
|
3
|
+
*
|
|
4
|
+
* Pure function that maps governance entries (from getGovernanceWithRelations)
|
|
5
|
+
* to the governance function each entry serves. No LLM, no network calls.
|
|
6
|
+
* Deterministic: same input always produces same output.
|
|
7
|
+
*
|
|
8
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
9
|
+
*/
|
|
10
|
+
/** The governance functions that archetypes exist for. */
|
|
11
|
+
export type GovernanceFunction = 'constraint' | 'boundary' | 'convention' | 'policy' | 'workflow' | 'quality-gate' | 'unclassified';
|
|
12
|
+
/** Typed relation edge — mirrors GovernanceRelationEdge from convex/mcpKnowledge/governanceQuery.ts */
|
|
13
|
+
export interface GovernanceRelationEdge {
|
|
14
|
+
type: string;
|
|
15
|
+
direction: 'outgoing' | 'incoming';
|
|
16
|
+
otherEntryId: string | null;
|
|
17
|
+
otherName: string;
|
|
18
|
+
otherCollectionSlug: string | null;
|
|
19
|
+
}
|
|
20
|
+
/** Input shape — matches GovernanceEntry from the Convex query. */
|
|
21
|
+
export interface GovernanceEntryInput {
|
|
22
|
+
entryId: string | null;
|
|
23
|
+
name: string;
|
|
24
|
+
collectionSlug: string;
|
|
25
|
+
status: string;
|
|
26
|
+
verificationStatus: 'verified' | 'unverified' | null;
|
|
27
|
+
data: Record<string, unknown> | null;
|
|
28
|
+
relations: GovernanceRelationEdge[];
|
|
29
|
+
}
|
|
30
|
+
/** Result of classifying a single governance entry. */
|
|
31
|
+
export interface ClassifiedGovernance {
|
|
32
|
+
entryId: string;
|
|
33
|
+
name: string;
|
|
34
|
+
collectionSlug: string;
|
|
35
|
+
governanceFunction: GovernanceFunction;
|
|
36
|
+
confidence: number;
|
|
37
|
+
matchedSignals: string[];
|
|
38
|
+
/** Original entry data passed through for archetype slot resolution */
|
|
39
|
+
data: Record<string, unknown> | null;
|
|
40
|
+
/** Original relations passed through */
|
|
41
|
+
relations: GovernanceRelationEdge[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Classify a batch of governance entries, returning one ClassifiedGovernance
|
|
45
|
+
* per entry that has a non-null entryId. Entries with null entryId are silently
|
|
46
|
+
* excluded (safety guard — entries without IDs cannot be referenced by archetypes).
|
|
47
|
+
*/
|
|
48
|
+
export declare function classifyGovernance(entries: GovernanceEntryInput[]): ClassifiedGovernance[];
|
|
49
|
+
//# sourceMappingURL=chain-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-classifier.d.ts","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,cAAc,GACd,cAAc,CAAC;AAEnB,uGAAuG;AACvG,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,mEAAmE;AACnE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,sBAAsB,EAAE,CAAC;CACrC;AAED,uDAAuD;AACvD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,wCAAwC;IACxC,SAAS,EAAE,sBAAsB,EAAE,CAAC;CACrC;AAuGD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA4F1F"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Classifier — BET-286 Slice 1
|
|
3
|
+
*
|
|
4
|
+
* Pure function that maps governance entries (from getGovernanceWithRelations)
|
|
5
|
+
* to the governance function each entry serves. No LLM, no network calls.
|
|
6
|
+
* Deterministic: same input always produces same output.
|
|
7
|
+
*
|
|
8
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
9
|
+
*/
|
|
10
|
+
/** Base score awarded for a collection-type match. */
|
|
11
|
+
const COLLECTION_BASE_SCORE = 0.45;
|
|
12
|
+
/** Score boost for a supporting relation type match. */
|
|
13
|
+
const RELATION_BOOST = 0.2;
|
|
14
|
+
/** Score boost for a supporting name pattern match. */
|
|
15
|
+
const NAME_BOOST = 0.15;
|
|
16
|
+
/** Map collection slug → primary governance function. */
|
|
17
|
+
const COLLECTION_TO_FUNCTION = {
|
|
18
|
+
'standards': 'constraint',
|
|
19
|
+
'business-rules': 'constraint',
|
|
20
|
+
'architecture': 'boundary',
|
|
21
|
+
'decisions': 'convention',
|
|
22
|
+
'patterns': 'convention',
|
|
23
|
+
'policies': 'policy',
|
|
24
|
+
'flows': 'workflow',
|
|
25
|
+
'glossary': 'unclassified',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Relation-type signals that boost a governance function.
|
|
29
|
+
* Key: relation type string (lowercased).
|
|
30
|
+
* Value: [governanceFunction, boost].
|
|
31
|
+
*/
|
|
32
|
+
const RELATION_SIGNALS = [
|
|
33
|
+
{ type: 'constrains', fn: 'constraint', boost: RELATION_BOOST },
|
|
34
|
+
{ type: 'governs', fn: 'policy', boost: RELATION_BOOST },
|
|
35
|
+
{ type: 'part_of', fn: 'workflow', boost: RELATION_BOOST },
|
|
36
|
+
];
|
|
37
|
+
/** Relation signals based on the collection of the *other* entry. */
|
|
38
|
+
const RELATION_COLLECTION_SIGNALS = [
|
|
39
|
+
// informed_by an architecture entry → boost boundary
|
|
40
|
+
{ otherCollectionSlug: 'architecture', relationType: 'informed_by', fn: 'boundary', boost: RELATION_BOOST },
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* Name keyword signals — applied against the lowercased entry name.
|
|
44
|
+
* Matched signals are applied once per matching keyword group.
|
|
45
|
+
*/
|
|
46
|
+
const NAME_SIGNALS = [
|
|
47
|
+
{
|
|
48
|
+
keywords: ['auth', 'security', 'permission'],
|
|
49
|
+
fn: 'policy',
|
|
50
|
+
boost: NAME_BOOST,
|
|
51
|
+
label: 'name contains security/auth/permission keyword',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
keywords: ['test', 'quality', 'check', 'gate'],
|
|
55
|
+
fn: 'quality-gate',
|
|
56
|
+
boost: NAME_BOOST,
|
|
57
|
+
label: 'name contains test/quality/check/gate keyword',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
keywords: ['deploy', 'release', 'rollback'],
|
|
61
|
+
fn: 'convention',
|
|
62
|
+
boost: NAME_BOOST,
|
|
63
|
+
label: 'name contains deploy/release/rollback keyword',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
keywords: ['domain', 'boundary', 'layer', 'architecture'],
|
|
67
|
+
fn: 'boundary',
|
|
68
|
+
boost: NAME_BOOST,
|
|
69
|
+
label: 'name contains domain/boundary/layer/architecture keyword',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
keywords: ['flag', 'feature flag'],
|
|
73
|
+
fn: 'convention',
|
|
74
|
+
boost: NAME_BOOST,
|
|
75
|
+
label: 'name contains flag/feature flag keyword',
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
/**
|
|
79
|
+
* Secondary collection overrides — for collections that can produce multiple
|
|
80
|
+
* governance functions depending on relation/name context. When a secondary
|
|
81
|
+
* function score exceeds this threshold, it may win over the primary collection
|
|
82
|
+
* signal if its total score is higher.
|
|
83
|
+
*
|
|
84
|
+
* `standards` can produce `quality-gate` in addition to `constraint`.
|
|
85
|
+
* `business-rules` can produce `policy` in addition to `constraint`.
|
|
86
|
+
* `decisions` can produce `boundary` in addition to `convention`.
|
|
87
|
+
*/
|
|
88
|
+
const SECONDARY_COLLECTION_SIGNALS = {
|
|
89
|
+
'standards': 'quality-gate',
|
|
90
|
+
'business-rules': 'policy',
|
|
91
|
+
'decisions': 'boundary',
|
|
92
|
+
};
|
|
93
|
+
// ── Classifier ────────────────────────────────────────────────────────
|
|
94
|
+
/**
|
|
95
|
+
* Classify a batch of governance entries, returning one ClassifiedGovernance
|
|
96
|
+
* per entry that has a non-null entryId. Entries with null entryId are silently
|
|
97
|
+
* excluded (safety guard — entries without IDs cannot be referenced by archetypes).
|
|
98
|
+
*/
|
|
99
|
+
export function classifyGovernance(entries) {
|
|
100
|
+
const results = [];
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
// Safety: skip entries without a human-readable ID
|
|
103
|
+
if (entry.entryId === null)
|
|
104
|
+
continue;
|
|
105
|
+
const scores = new Map();
|
|
106
|
+
const signals = [];
|
|
107
|
+
const nameLower = entry.name.toLowerCase();
|
|
108
|
+
const slug = entry.collectionSlug;
|
|
109
|
+
// ── Signal 1: Collection type (strongest) ──────────────────────
|
|
110
|
+
const primaryFn = COLLECTION_TO_FUNCTION[slug];
|
|
111
|
+
if (primaryFn && primaryFn !== 'unclassified') {
|
|
112
|
+
addScore(scores, primaryFn, COLLECTION_BASE_SCORE);
|
|
113
|
+
signals.push(`collection '${slug}' → ${primaryFn}`);
|
|
114
|
+
}
|
|
115
|
+
// Secondary collection function — seed with a lower base so it can win
|
|
116
|
+
// only when relation/name signals push it above the primary.
|
|
117
|
+
const secondaryFn = SECONDARY_COLLECTION_SIGNALS[slug];
|
|
118
|
+
if (secondaryFn) {
|
|
119
|
+
addScore(scores, secondaryFn, COLLECTION_BASE_SCORE - 0.1);
|
|
120
|
+
signals.push(`collection '${slug}' secondary → ${secondaryFn}`);
|
|
121
|
+
}
|
|
122
|
+
// ── Signal 2: Relation types (refining) ───────────────────────
|
|
123
|
+
for (const rel of entry.relations) {
|
|
124
|
+
const relTypeLower = rel.type.toLowerCase();
|
|
125
|
+
for (const sig of RELATION_SIGNALS) {
|
|
126
|
+
if (relTypeLower === sig.type) {
|
|
127
|
+
addScore(scores, sig.fn, sig.boost);
|
|
128
|
+
signals.push(`relation '${rel.type}' → boost ${sig.fn}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
for (const sig of RELATION_COLLECTION_SIGNALS) {
|
|
132
|
+
if (relTypeLower === sig.relationType &&
|
|
133
|
+
rel.otherCollectionSlug === sig.otherCollectionSlug) {
|
|
134
|
+
addScore(scores, sig.fn, sig.boost);
|
|
135
|
+
signals.push(`relation '${rel.type}' to ${sig.otherCollectionSlug} → boost ${sig.fn}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ── Signal 3: Name patterns (weakest) ─────────────────────────
|
|
140
|
+
for (const sig of NAME_SIGNALS) {
|
|
141
|
+
const matched = sig.keywords.some((kw) => nameLower.includes(kw));
|
|
142
|
+
if (matched) {
|
|
143
|
+
addScore(scores, sig.fn, sig.boost);
|
|
144
|
+
signals.push(sig.label);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ── Pick winner ───────────────────────────────────────────────
|
|
148
|
+
let bestFn = 'unclassified';
|
|
149
|
+
let bestScore = 0;
|
|
150
|
+
for (const [fn, score] of scores) {
|
|
151
|
+
if (score > bestScore) {
|
|
152
|
+
bestScore = score;
|
|
153
|
+
bestFn = fn;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Glossary is always unclassified regardless of score
|
|
157
|
+
if (slug === 'glossary') {
|
|
158
|
+
bestFn = 'unclassified';
|
|
159
|
+
bestScore = 0;
|
|
160
|
+
}
|
|
161
|
+
// Confidence: clamp to [0, 1]
|
|
162
|
+
const confidence = Math.min(1, Math.max(0, bestScore));
|
|
163
|
+
results.push({
|
|
164
|
+
entryId: entry.entryId,
|
|
165
|
+
name: entry.name,
|
|
166
|
+
collectionSlug: entry.collectionSlug,
|
|
167
|
+
governanceFunction: bestFn,
|
|
168
|
+
confidence,
|
|
169
|
+
matchedSignals: signals,
|
|
170
|
+
data: entry.data,
|
|
171
|
+
relations: entry.relations,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
177
|
+
function addScore(scores, fn, delta) {
|
|
178
|
+
scores.set(fn, (scores.get(fn) ?? 0) + delta);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=chain-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-classifier.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-classifier.test.d.ts","sourceRoot":"","sources":["../../src/generators/chain-classifier.test.ts"],"names":[],"mappings":""}
|