@productbrain/cli 0.1.0-beta.2293 → 0.1.0-beta.2309
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/generators/chain-classifier.d.ts +13 -12
- package/dist/generators/chain-classifier.d.ts.map +1 -1
- package/dist/generators/chain-classifier.js +13 -126
- package/dist/generators/chain-classifier.js.map +1 -1
- package/dist/generators/chain-rules.d.ts.map +1 -1
- package/dist/generators/chain-rules.js +107 -3
- package/dist/generators/chain-rules.js.map +1 -1
- package/dist/generators/chain-rules.test.js +237 -0
- package/dist/generators/chain-rules.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/generators/chain-classifier.test.d.ts +0 -2
- package/dist/generators/chain-classifier.test.d.ts.map +0 -1
- package/dist/generators/chain-classifier.test.js +0 -371
- package/dist/generators/chain-classifier.test.js.map +0 -1
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Chain Classifier —
|
|
2
|
+
* Chain Classifier — types only.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* WP-488 Slice 4 (FEAT-1378, TEN-2733): the classifier IMPLEMENTATION moved to
|
|
5
|
+
* kernel/governance/classifyGovernance.ts, served over the gateway as
|
|
6
|
+
* `chain.classifyGovernance` — no connector-local scorer (see chain-rules.ts, which
|
|
7
|
+
* calls the served verdict). These type/interface declarations stay here because
|
|
8
|
+
* `handshake-diff.ts` / `archetypes.ts` / `chain-rules.ts` need the SHAPES, and
|
|
9
|
+
* `packages/cli` cannot import `kernel/` directly (`kernel/` is a private, unpublished
|
|
10
|
+
* workspace package; CLI compiles with plain `tsc`, no bundler — a `kernel` import
|
|
11
|
+
* would emit an unresolvable specifier into the published `dist/`, verified in WP-488
|
|
12
|
+
* Slice 3 for the identical class of failure). Duplicated as TYPES only — zero logic,
|
|
13
|
+
* zero drift risk (a type either matches the server's real shape or the build fails).
|
|
7
14
|
*
|
|
8
|
-
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
15
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration), TEN-2733, TEN-2705
|
|
9
16
|
*/
|
|
10
17
|
/** The governance functions that archetypes exist for. */
|
|
11
18
|
export type GovernanceFunction = 'constraint' | 'boundary' | 'convention' | 'policy' | 'workflow' | 'quality-gate' | 'unclassified';
|
|
@@ -41,7 +48,7 @@ export interface GovernanceCollectionInput {
|
|
|
41
48
|
thinkingLayer?: string;
|
|
42
49
|
governanceFunction?: GovernanceFunction;
|
|
43
50
|
}
|
|
44
|
-
/** Result of classifying a single governance entry. */
|
|
51
|
+
/** Result of classifying a single governance entry (as returned by chain.classifyGovernance). */
|
|
45
52
|
export interface ClassifiedGovernance {
|
|
46
53
|
entryId: string;
|
|
47
54
|
name: string;
|
|
@@ -54,10 +61,4 @@ export interface ClassifiedGovernance {
|
|
|
54
61
|
/** Original relations passed through */
|
|
55
62
|
relations: GovernanceRelationEdge[];
|
|
56
63
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Classify a batch of governance entries, returning one ClassifiedGovernance
|
|
59
|
-
* per entry that has a non-null entryId. Entries with null entryId are silently
|
|
60
|
-
* excluded (safety guard — entries without IDs cannot be referenced by archetypes).
|
|
61
|
-
*/
|
|
62
|
-
export declare function classifyGovernance(entries: GovernanceEntryInput[], collections?: GovernanceCollectionInput[]): ClassifiedGovernance[];
|
|
63
64
|
//# sourceMappingURL=chain-classifier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-classifier.d.ts","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"chain-classifier.d.ts","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,cAAc,GACd,cAAc,CAAC;AAEnB,yGAAyG;AACzG,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,gEAAgE;AAChE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAED,iGAAiG;AACjG,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"}
|
|
@@ -1,131 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Chain Classifier —
|
|
2
|
+
* Chain Classifier — types only.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* WP-488 Slice 4 (FEAT-1378, TEN-2733): the classifier IMPLEMENTATION moved to
|
|
5
|
+
* kernel/governance/classifyGovernance.ts, served over the gateway as
|
|
6
|
+
* `chain.classifyGovernance` — no connector-local scorer (see chain-rules.ts, which
|
|
7
|
+
* calls the served verdict). These type/interface declarations stay here because
|
|
8
|
+
* `handshake-diff.ts` / `archetypes.ts` / `chain-rules.ts` need the SHAPES, and
|
|
9
|
+
* `packages/cli` cannot import `kernel/` directly (`kernel/` is a private, unpublished
|
|
10
|
+
* workspace package; CLI compiles with plain `tsc`, no bundler — a `kernel` import
|
|
11
|
+
* would emit an unresolvable specifier into the published `dist/`, verified in WP-488
|
|
12
|
+
* Slice 3 for the identical class of failure). Duplicated as TYPES only — zero logic,
|
|
13
|
+
* zero drift risk (a type either matches the server's real shape or the build fails).
|
|
7
14
|
*
|
|
8
|
-
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
15
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration), TEN-2733, TEN-2705
|
|
9
16
|
*/
|
|
10
|
-
|
|
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
|
-
/**
|
|
17
|
-
* Relation-type signals that boost a governance function.
|
|
18
|
-
* Key: relation type string (lowercased).
|
|
19
|
-
* Value: [governanceFunction, boost].
|
|
20
|
-
*/
|
|
21
|
-
const RELATION_SIGNALS = [
|
|
22
|
-
{ type: 'constrains', fn: 'constraint', boost: RELATION_BOOST },
|
|
23
|
-
{ type: 'governs', fn: 'policy', boost: RELATION_BOOST },
|
|
24
|
-
{ type: 'part_of', fn: 'workflow', boost: RELATION_BOOST },
|
|
25
|
-
];
|
|
26
|
-
// ── Classifier ────────────────────────────────────────────────────────
|
|
27
|
-
/**
|
|
28
|
-
* Classify a batch of governance entries, returning one ClassifiedGovernance
|
|
29
|
-
* per entry that has a non-null entryId. Entries with null entryId are silently
|
|
30
|
-
* excluded (safety guard — entries without IDs cannot be referenced by archetypes).
|
|
31
|
-
*/
|
|
32
|
-
export function classifyGovernance(entries, collections = []) {
|
|
33
|
-
const results = [];
|
|
34
|
-
const collectionBySlug = new Map(collections.map((c) => [c.slug, c]));
|
|
35
|
-
for (const entry of entries) {
|
|
36
|
-
// Safety: skip entries without a human-readable ID
|
|
37
|
-
if (entry.entryId === null)
|
|
38
|
-
continue;
|
|
39
|
-
const scores = new Map();
|
|
40
|
-
const signals = [];
|
|
41
|
-
const slug = entry.collectionSlug;
|
|
42
|
-
const collection = collectionBySlug.get(slug);
|
|
43
|
-
// ── Signal 1: Collection type (strongest) ──────────────────────
|
|
44
|
-
const primaryFn = inferCollectionGovernanceFunction(collection, entry);
|
|
45
|
-
if (primaryFn && primaryFn !== 'unclassified') {
|
|
46
|
-
addScore(scores, primaryFn, COLLECTION_BASE_SCORE);
|
|
47
|
-
signals.push(`collection metadata '${slug}' → ${primaryFn}`);
|
|
48
|
-
}
|
|
49
|
-
// ── Signal 2: Relation types (refining) ───────────────────────
|
|
50
|
-
for (const rel of entry.relations) {
|
|
51
|
-
const relTypeLower = rel.type.toLowerCase();
|
|
52
|
-
for (const sig of RELATION_SIGNALS) {
|
|
53
|
-
if (relTypeLower === sig.type) {
|
|
54
|
-
addScore(scores, sig.fn, sig.boost);
|
|
55
|
-
signals.push(`relation '${rel.type}' → boost ${sig.fn}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (relTypeLower === 'informed_by' && rel.otherCollectionSlug) {
|
|
59
|
-
const otherFn = inferCollectionGovernanceFunction(collectionBySlug.get(rel.otherCollectionSlug));
|
|
60
|
-
if (otherFn === 'boundary') {
|
|
61
|
-
// Boost only (matches Signal-2 convention above): an informed_by edge
|
|
62
|
-
// REFINES the score, it must not contribute a full collection base —
|
|
63
|
-
// otherwise a single edge outscores the entry's own collection signal.
|
|
64
|
-
addScore(scores, 'boundary', RELATION_BOOST);
|
|
65
|
-
signals.push(`relation '${rel.type}' to boundary collection '${rel.otherCollectionSlug}' → boost boundary`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// ── Signal 3: Workspace collection name signals (weakest) ────
|
|
70
|
-
if (primaryFn && collection?.classificationSignals?.length) {
|
|
71
|
-
const entryText = entry.name.toLowerCase();
|
|
72
|
-
const matchedSignal = collection.classificationSignals.find((signal) => entryText.includes(signal.toLowerCase()));
|
|
73
|
-
if (matchedSignal) {
|
|
74
|
-
addScore(scores, primaryFn, NAME_BOOST);
|
|
75
|
-
signals.push(`collection signal '${matchedSignal}' → boost ${primaryFn}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
// ── Pick winner ───────────────────────────────────────────────
|
|
79
|
-
let bestFn = 'unclassified';
|
|
80
|
-
let bestScore = 0;
|
|
81
|
-
for (const [fn, score] of scores) {
|
|
82
|
-
if (score > bestScore) {
|
|
83
|
-
bestScore = score;
|
|
84
|
-
bestFn = fn;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (collection?.governanceFunction === 'unclassified') {
|
|
88
|
-
bestFn = 'unclassified';
|
|
89
|
-
bestScore = 0;
|
|
90
|
-
}
|
|
91
|
-
// Confidence: clamp to [0, 1]
|
|
92
|
-
const confidence = Math.min(1, Math.max(0, bestScore));
|
|
93
|
-
results.push({
|
|
94
|
-
entryId: entry.entryId,
|
|
95
|
-
name: entry.name,
|
|
96
|
-
collectionSlug: entry.collectionSlug,
|
|
97
|
-
governanceFunction: bestFn,
|
|
98
|
-
confidence,
|
|
99
|
-
matchedSignals: signals,
|
|
100
|
-
data: entry.data,
|
|
101
|
-
relations: entry.relations,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
return results;
|
|
105
|
-
}
|
|
106
|
-
// ── Helpers ────────────────────────────────────────────────────────────
|
|
107
|
-
function addScore(scores, fn, delta) {
|
|
108
|
-
scores.set(fn, (scores.get(fn) ?? 0) + delta);
|
|
109
|
-
}
|
|
110
|
-
function inferCollectionGovernanceFunction(collection, entry) {
|
|
111
|
-
const explicit = normalizeGovernanceFunction(collection?.governanceFunction);
|
|
112
|
-
if (explicit)
|
|
113
|
-
return explicit;
|
|
114
|
-
const dataFn = normalizeGovernanceFunction(entry?.data?.governanceFunction);
|
|
115
|
-
if (dataFn)
|
|
116
|
-
return dataFn;
|
|
117
|
-
return 'unclassified';
|
|
118
|
-
}
|
|
119
|
-
function normalizeGovernanceFunction(value) {
|
|
120
|
-
if (value === 'constraint' ||
|
|
121
|
-
value === 'boundary' ||
|
|
122
|
-
value === 'convention' ||
|
|
123
|
-
value === 'policy' ||
|
|
124
|
-
value === 'workflow' ||
|
|
125
|
-
value === 'quality-gate' ||
|
|
126
|
-
value === 'unclassified') {
|
|
127
|
-
return value;
|
|
128
|
-
}
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
17
|
+
export {};
|
|
131
18
|
//# sourceMappingURL=chain-classifier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-classifier.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"chain-classifier.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-rules.d.ts","sourceRoot":"","sources":["../../src/generators/chain-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"chain-rules.d.ts","sourceRoot":"","sources":["../../src/generators/chain-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,KAAK,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIhE,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,yDAAyD;IACzD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+DAA+D;IAC/D,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,sFAAsF;IACtF,UAAU,EAAE,OAAO,uBAAuB,EAAE,oBAAoB,EAAE,CAAC;CACpE;AAkCD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,OAAO,SAAS,EAC9B,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA+M3B"}
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
9
9
|
*/
|
|
10
|
-
import { classifyGovernance } from './chain-classifier.js';
|
|
11
10
|
import { resolveArchetype } from './archetypes.js';
|
|
12
11
|
// ── Sentinel ──────────────────────────────────────────────────────────
|
|
13
12
|
/** Produced when chain.getGovernanceWithRelations is unreachable. */
|
|
@@ -77,8 +76,113 @@ export async function generateChainRules(kernelCallFn, manualRules) {
|
|
|
77
76
|
catch {
|
|
78
77
|
collections = [];
|
|
79
78
|
}
|
|
80
|
-
// Step 2: Classify entries
|
|
81
|
-
|
|
79
|
+
// Step 2: Classify entries — WP-488 Slice 4 (FEAT-1378, TEN-2733): served verdict
|
|
80
|
+
// (chain.classifyGovernance), not a local scorer. `ClassifiedGovernance[]` is a
|
|
81
|
+
// hand-typed local generic, not derived via kernel-client's GatewayRouteReturnByName —
|
|
82
|
+
// verified in WP-488 Slice 3 that reaching kernel-client's type derivation from
|
|
83
|
+
// packages/cli fails (`rootDir: "src"` + `moduleResolution: "NodeNext"`); same
|
|
84
|
+
// documented deviation as promote.ts/orient.ts.
|
|
85
|
+
//
|
|
86
|
+
// Project down to exactly the fields `chain.classifyGovernance`'s
|
|
87
|
+
// `governanceEntryInputValidator` declares (convex/agentKnowledge/governanceQuery.ts)
|
|
88
|
+
// before sending [Codex review, PR #378 P1]: `entries` here is populated from
|
|
89
|
+
// `chain.getGovernanceWithRelations`'s response, whose real runtime shape
|
|
90
|
+
// (`GovernanceEntry`) carries `attestation` + `verifiedBy` — display-only fields the
|
|
91
|
+
// kernel judge never reads. The CLI's `kernelCallFn<T>` generic is a type ASSERTION,
|
|
92
|
+
// not a runtime projection, so `entries: GovernanceEntryInput[]` above is a compile-time
|
|
93
|
+
// convenience, not a guarantee — the underlying objects still carry those extra fields.
|
|
94
|
+
// Convex's `v.object(...)` validators are strict (unknown keys are a validation error,
|
|
95
|
+
// not a silent strip), so forwarding the un-projected objects would fail validation on
|
|
96
|
+
// every real workspace that has governance entries (an empty-entries workspace never hit
|
|
97
|
+
// this, since there's nothing to validate) — the classify call would always throw, and
|
|
98
|
+
// fall into the catch below.
|
|
99
|
+
const classifyEntries = entries.map((e) => ({
|
|
100
|
+
entryId: e.entryId,
|
|
101
|
+
name: e.name,
|
|
102
|
+
collectionSlug: e.collectionSlug,
|
|
103
|
+
status: e.status,
|
|
104
|
+
verificationStatus: e.verificationStatus,
|
|
105
|
+
data: e.data,
|
|
106
|
+
relations: e.relations,
|
|
107
|
+
}));
|
|
108
|
+
// Same class of bug, same fix, for `collections` [Copilot review, PR #378, follow-up to
|
|
109
|
+
// Codex P1 #1]: `chain.listCollections` (convex/agentKnowledge/collections.ts) returns
|
|
110
|
+
// full DB rows via `{ ...c, descriptionFieldKey }` — `_id`, `_creationTime`,
|
|
111
|
+
// `workspaceId`, `descriptionFieldKey`, and every other `collections` table field, none
|
|
112
|
+
// of which `governanceCollectionInputValidator` declares. The CLI's
|
|
113
|
+
// `kernelCallFn<GovernanceCollectionInput[]>` generic is a type assertion, not a runtime
|
|
114
|
+
// projection, so `collections` above carries all of that at runtime despite its narrower
|
|
115
|
+
// compile-time type. Forwarding it un-projected would fail Convex's strict `v.object()`
|
|
116
|
+
// validation in any real workspace with collections (the corpus/unit-test fixtures never
|
|
117
|
+
// carried extra keys, so this was masked there too).
|
|
118
|
+
//
|
|
119
|
+
// [Codex P1, PR #378 follow-up round] Send only the fields the kernel judge actually
|
|
120
|
+
// reads. Checked kernel/governance/classifyGovernance.ts directly: `slug` (map key),
|
|
121
|
+
// `classificationSignals`, and `governanceFunction` are the ONLY collection fields the
|
|
122
|
+
// scorer touches (`inferCollectionGovernanceFunction`, Signal 3's name-boost lookup) —
|
|
123
|
+
// `name`, `description`, `purpose`, `usageGuidance`, `classificationCheck`,
|
|
124
|
+
// `defaultCanonicalKey`, `governanceRole`, `thinkingLayer` are read by nothing in the
|
|
125
|
+
// classifier and were being forwarded as pure dead weight. That matters beyond bytes:
|
|
126
|
+
// the AKI gateway rejects the WHOLE request if any single string argument exceeds 10KB
|
|
127
|
+
// (convex/http.ts:933-935, `validateArgLengths`) — a workspace collection with a long
|
|
128
|
+
// `description`/`usageGuidance` (the MCP tool allows up to 20KB) would have broken every
|
|
129
|
+
// handshake, even though the classifier never looks at that text. No truncation-with-
|
|
130
|
+
// marker is needed here (contrast the entries fix): these fields are unused, not merely
|
|
131
|
+
// long, so the honest fix is to not send them at all, not to send a truncated copy.
|
|
132
|
+
const classifyCollections = collections.map((c) => ({
|
|
133
|
+
slug: c.slug,
|
|
134
|
+
classificationSignals: c.classificationSignals,
|
|
135
|
+
governanceFunction: c.governanceFunction,
|
|
136
|
+
}));
|
|
137
|
+
// A classify failure is NOT equivalent to "zero governance entries" — no rules can be
|
|
138
|
+
// derived without classification, so [Codex review, PR #378 P1] this failure now gets
|
|
139
|
+
// the SAME degraded-sentinel treatment as the two fetch failures above, instead of
|
|
140
|
+
// silently continuing with an empty classified list (which would report success with 0
|
|
141
|
+
// generated rules, indistinguishable from a genuinely empty workspace and masking the
|
|
142
|
+
// real error). The pre-migration local `classifyGovernance()` was a pure synchronous
|
|
143
|
+
// function with no failure mode to preserve — this is a new failure surface introduced
|
|
144
|
+
// by moving classification behind a network call, so there is no prior degraded
|
|
145
|
+
// semantics to match; the fetch steps' existing pattern is the honest precedent to
|
|
146
|
+
// extend rather than a fresh invention.
|
|
147
|
+
// [Codex P1, PR #378 follow-up round] Chunk below Convex's function-argument ceiling.
|
|
148
|
+
// At production scale (SCALE_TIERS.xl, convex/lib/scaleTiers.ts: ~4,000 governance
|
|
149
|
+
// entries × 3 relations each) the full corpus as one `entries` argument — echoed back
|
|
150
|
+
// in the response too, since `data`/`relations` pass through — can exceed the <1MB cap
|
|
151
|
+
// a Convex function argument/value must stay under (convex/http.ts:1816-1819 documents
|
|
152
|
+
// the same platform ceiling for a different route). Batch by an estimated worst-case
|
|
153
|
+
// per-entry byte size with headroom, not a fixed entry count, so the batch size adapts
|
|
154
|
+
// to how large individual entries/relations actually are; merge each batch's results.
|
|
155
|
+
const CLASSIFY_BATCH_BUDGET_BYTES = 400_000; // headroom under the ~1MB ceiling —
|
|
156
|
+
// covers this call's args AND its response echo (roughly 2x the entries payload),
|
|
157
|
+
// plus classifyCollections and JSON/HTTP framing overhead, with margin to spare.
|
|
158
|
+
const collectionsBytes = classifyCollections.length
|
|
159
|
+
? new TextEncoder().encode(JSON.stringify(classifyCollections)).length
|
|
160
|
+
: 0;
|
|
161
|
+
const worstCaseEntryBytes = classifyEntries.reduce((max, e) => Math.max(max, new TextEncoder().encode(JSON.stringify(e)).length), 1);
|
|
162
|
+
const entryBudgetBytes = Math.max(CLASSIFY_BATCH_BUDGET_BYTES - collectionsBytes, worstCaseEntryBytes);
|
|
163
|
+
const batchSize = Math.max(1, Math.floor(entryBudgetBytes / worstCaseEntryBytes));
|
|
164
|
+
const entryBatches = [];
|
|
165
|
+
for (let i = 0; i < classifyEntries.length; i += batchSize) {
|
|
166
|
+
entryBatches.push(classifyEntries.slice(i, i + batchSize));
|
|
167
|
+
}
|
|
168
|
+
if (entryBatches.length === 0)
|
|
169
|
+
entryBatches.push([]); // preserve one call at zero entries
|
|
170
|
+
let classified = [];
|
|
171
|
+
try {
|
|
172
|
+
for (const batch of entryBatches) {
|
|
173
|
+
const classifyResult = await kernelCallFn('chain.classifyGovernance', {
|
|
174
|
+
entries: batch,
|
|
175
|
+
collections: classifyCollections,
|
|
176
|
+
});
|
|
177
|
+
if (!Array.isArray(classifyResult)) {
|
|
178
|
+
return { rules: [], gaps: [], sentinel: CHAIN_DEGRADED_SENTINEL, stats: emptyStats, classified: [] };
|
|
179
|
+
}
|
|
180
|
+
classified = classified.concat(classifyResult);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return { rules: [], gaps: [], sentinel: CHAIN_DEGRADED_SENTINEL, stats: emptyStats, classified: [] };
|
|
185
|
+
}
|
|
82
186
|
// Step 3: Build manual rule name set for suppression check
|
|
83
187
|
const manualRuleNames = new Set(manualRules.map((r) => r.name));
|
|
84
188
|
// Step 4: Resolve an archetype per governance function
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-rules.js","sourceRoot":"","sources":["../../src/generators/chain-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"chain-rules.js","sourceRoot":"","sources":["../../src/generators/chain-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,37 @@ const COLLECTIONS = [
|
|
|
34
34
|
{ slug: 'policies', governanceFunction: 'policy' },
|
|
35
35
|
{ slug: 'flows', governanceFunction: 'workflow' },
|
|
36
36
|
];
|
|
37
|
+
/**
|
|
38
|
+
* Minimal test-double for the served `chain.classifyGovernance` route (WP-488 Slice 4,
|
|
39
|
+
* FEAT-1378, TEN-2733). The real scorer now lives in kernel/governance/classifyGovernance.ts
|
|
40
|
+
* and is exercised by its own parity-snapshot test there — packages/cli cannot import it
|
|
41
|
+
* directly (same `rootDir: "src"` + `moduleResolution: "NodeNext"` failure documented in
|
|
42
|
+
* chain-rules.ts / chain-classifier.ts, verified in WP-488 Slice 3 for the identical class
|
|
43
|
+
* of failure, and this applies to test files too since tsconfig's `include` covers them).
|
|
44
|
+
* This double reproduces only the collection-metadata lookup these tests actually exercise
|
|
45
|
+
* — not the full weighted signal/relation-boost scorer — sufficient for asserting which
|
|
46
|
+
* governanceFunction bucket an entry lands in.
|
|
47
|
+
*/
|
|
48
|
+
function mockClassifyGovernance(entries, collections) {
|
|
49
|
+
return entries
|
|
50
|
+
.filter((e) => e.entryId !== null)
|
|
51
|
+
.map((e) => {
|
|
52
|
+
const collection = collections.find((c) => c.slug === e.collectionSlug);
|
|
53
|
+
const governanceFunction = collection?.governanceFunction ?? 'unclassified';
|
|
54
|
+
return {
|
|
55
|
+
entryId: e.entryId,
|
|
56
|
+
name: e.name,
|
|
57
|
+
collectionSlug: e.collectionSlug,
|
|
58
|
+
governanceFunction,
|
|
59
|
+
confidence: collection?.governanceFunction ? 0.5 : 0,
|
|
60
|
+
matchedSignals: collection?.governanceFunction
|
|
61
|
+
? [`collection metadata '${e.collectionSlug}' → ${governanceFunction}`]
|
|
62
|
+
: [],
|
|
63
|
+
data: e.data,
|
|
64
|
+
relations: e.relations,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
}
|
|
37
68
|
/** Mock kernelCall that returns the given entries wrapped in the Convex response shape. */
|
|
38
69
|
function mockMcpSuccess(entries, collections = COLLECTIONS) {
|
|
39
70
|
return vi.fn((name) => {
|
|
@@ -43,6 +74,9 @@ function mockMcpSuccess(entries, collections = COLLECTIONS) {
|
|
|
43
74
|
if (name === 'chain.listCollections') {
|
|
44
75
|
return Promise.resolve(collections);
|
|
45
76
|
}
|
|
77
|
+
if (name === 'chain.classifyGovernance') {
|
|
78
|
+
return Promise.resolve(mockClassifyGovernance(entries, collections));
|
|
79
|
+
}
|
|
46
80
|
return Promise.resolve(null);
|
|
47
81
|
});
|
|
48
82
|
}
|
|
@@ -71,6 +105,130 @@ describe('generateChainRules', () => {
|
|
|
71
105
|
expect(result.stats.totalEntries).toBe(3);
|
|
72
106
|
expect(result.stats.classifiedEntries).toBe(3);
|
|
73
107
|
});
|
|
108
|
+
it('projects entries before sending to classify — drops fields the served route does not accept (PR #378 P1)', async () => {
|
|
109
|
+
// Simulate the REAL runtime shape of chain.getGovernanceWithRelations's response
|
|
110
|
+
// (GovernanceEntry, convex/agentKnowledge/governanceQuery.ts) which carries
|
|
111
|
+
// `attestation` + `verifiedBy` on top of the narrower GovernanceEntryInput fields.
|
|
112
|
+
// kernelCallFn<T> is a compile-time type assertion, not a runtime projection, so the
|
|
113
|
+
// CLI's own `entries: GovernanceEntryInput[]` annotation does not guarantee these
|
|
114
|
+
// extra fields are absent at runtime — this is exactly the gap the fix closes.
|
|
115
|
+
const wideEntry = {
|
|
116
|
+
...makeEntry({ entryId: 'STD-1', name: 'No direct imports', collectionSlug: 'standards' }),
|
|
117
|
+
attestation: { verified: false, legs: [] },
|
|
118
|
+
verifiedBy: null,
|
|
119
|
+
};
|
|
120
|
+
const mcpFn = vi.fn((name, _args) => {
|
|
121
|
+
if (name === 'chain.getGovernanceWithRelations') {
|
|
122
|
+
return Promise.resolve({ entries: [wideEntry], total: 1 });
|
|
123
|
+
}
|
|
124
|
+
if (name === 'chain.listCollections') {
|
|
125
|
+
return Promise.resolve(COLLECTIONS);
|
|
126
|
+
}
|
|
127
|
+
if (name === 'chain.classifyGovernance') {
|
|
128
|
+
return Promise.resolve([]);
|
|
129
|
+
}
|
|
130
|
+
return Promise.resolve(null);
|
|
131
|
+
});
|
|
132
|
+
await generateChainRules(mcpFn, []);
|
|
133
|
+
const classifyCall = mcpFn.mock.calls.find(([fn]) => fn === 'chain.classifyGovernance');
|
|
134
|
+
expect(classifyCall).toBeDefined();
|
|
135
|
+
const sentEntries = classifyCall[1].entries;
|
|
136
|
+
expect(sentEntries).toHaveLength(1);
|
|
137
|
+
expect(Object.keys(sentEntries[0]).sort()).toEqual(['collectionSlug', 'data', 'entryId', 'name', 'relations', 'status', 'verificationStatus'].sort());
|
|
138
|
+
expect(sentEntries[0]).not.toHaveProperty('attestation');
|
|
139
|
+
expect(sentEntries[0]).not.toHaveProperty('verifiedBy');
|
|
140
|
+
});
|
|
141
|
+
it('projects collections before sending to classify — sends only fields the kernel judge reads (PR #378 Copilot + Codex follow-up)', async () => {
|
|
142
|
+
// Simulate the REAL runtime shape of chain.listCollections's response
|
|
143
|
+
// (convex/agentKnowledge/collections.ts:listCollections returns `{ ...c,
|
|
144
|
+
// descriptionFieldKey }` — the full DB row plus an overlay field), PLUS a long
|
|
145
|
+
// `description` (as a real workspace collection can carry, up to the MCP tool's 20KB
|
|
146
|
+
// allowance) to prove it is dropped rather than truncated — kernel/governance/
|
|
147
|
+
// classifyGovernance.ts never reads `description` at all, so there is nothing to
|
|
148
|
+
// truncate; the honest fix is to not send it.
|
|
149
|
+
const wideCollection = {
|
|
150
|
+
_id: 'col_abc123',
|
|
151
|
+
_creationTime: 1700000000000,
|
|
152
|
+
workspaceId: 'ws_abc123',
|
|
153
|
+
descriptionFieldKey: 'assumptions',
|
|
154
|
+
slug: 'standards',
|
|
155
|
+
name: 'Standards',
|
|
156
|
+
description: 'x'.repeat(15_000), // longer than the AKI gateway's 10KB per-string cap
|
|
157
|
+
purpose: 'Rules and standards',
|
|
158
|
+
usageGuidance: 'Use for binding standards.',
|
|
159
|
+
classificationCheck: 'contains "must" or "shall"',
|
|
160
|
+
defaultCanonicalKey: 'standard',
|
|
161
|
+
governanceRole: 'binding',
|
|
162
|
+
thinkingLayer: 'execution',
|
|
163
|
+
governanceFunction: 'constraint',
|
|
164
|
+
};
|
|
165
|
+
const entries = [makeEntry({ entryId: 'STD-1', name: 'No direct imports', collectionSlug: 'standards' })];
|
|
166
|
+
const mcpFn = vi.fn((name, _args) => {
|
|
167
|
+
if (name === 'chain.getGovernanceWithRelations') {
|
|
168
|
+
return Promise.resolve({ entries, total: entries.length });
|
|
169
|
+
}
|
|
170
|
+
if (name === 'chain.listCollections') {
|
|
171
|
+
return Promise.resolve([wideCollection]);
|
|
172
|
+
}
|
|
173
|
+
if (name === 'chain.classifyGovernance') {
|
|
174
|
+
return Promise.resolve([]);
|
|
175
|
+
}
|
|
176
|
+
return Promise.resolve(null);
|
|
177
|
+
});
|
|
178
|
+
await generateChainRules(mcpFn, []);
|
|
179
|
+
const classifyCall = mcpFn.mock.calls.find(([fn]) => fn === 'chain.classifyGovernance');
|
|
180
|
+
expect(classifyCall).toBeDefined();
|
|
181
|
+
const sentCollections = classifyCall[1].collections;
|
|
182
|
+
expect(sentCollections).toHaveLength(1);
|
|
183
|
+
// Only the 3 fields the kernel judge actually reads survive — everything else,
|
|
184
|
+
// including the 15KB `description`, is dropped entirely (not truncated).
|
|
185
|
+
expect(Object.keys(sentCollections[0]).sort()).toEqual(['classificationSignals', 'governanceFunction', 'slug'].sort());
|
|
186
|
+
for (const key of Object.keys(sentCollections[0])) {
|
|
187
|
+
expect(['slug', 'classificationSignals', 'governanceFunction']).toContain(key);
|
|
188
|
+
}
|
|
189
|
+
expect(sentCollections[0]).not.toHaveProperty('_id');
|
|
190
|
+
expect(sentCollections[0]).not.toHaveProperty('_creationTime');
|
|
191
|
+
expect(sentCollections[0]).not.toHaveProperty('workspaceId');
|
|
192
|
+
expect(sentCollections[0]).not.toHaveProperty('descriptionFieldKey');
|
|
193
|
+
expect(sentCollections[0]).not.toHaveProperty('description');
|
|
194
|
+
expect(sentCollections[0]).not.toHaveProperty('purpose');
|
|
195
|
+
expect(sentCollections[0]).not.toHaveProperty('usageGuidance');
|
|
196
|
+
expect(sentCollections[0]).not.toHaveProperty('classificationCheck');
|
|
197
|
+
expect(sentCollections[0]).not.toHaveProperty('defaultCanonicalKey');
|
|
198
|
+
expect(sentCollections[0]).not.toHaveProperty('governanceRole');
|
|
199
|
+
expect(sentCollections[0]).not.toHaveProperty('thinkingLayer');
|
|
200
|
+
expect(sentCollections[0]).not.toHaveProperty('name');
|
|
201
|
+
expect(sentCollections[0].slug).toBe('standards');
|
|
202
|
+
expect(sentCollections[0].governanceFunction).toBe('constraint');
|
|
203
|
+
// Total payload for this one collection stays far below the gateway's 10KB
|
|
204
|
+
// per-string cap even though the source row carried a 15KB description.
|
|
205
|
+
expect(new TextEncoder().encode(JSON.stringify(sentCollections[0])).length).toBeLessThan(200);
|
|
206
|
+
});
|
|
207
|
+
it('classify failure: returns degraded sentinel, not a silent-empty rules array (PR #378 P1)', async () => {
|
|
208
|
+
// Fetch steps succeed; only the classify call fails. Before this fix, the classify
|
|
209
|
+
// catch block silently produced `classified = []` and let the function continue,
|
|
210
|
+
// reporting success with 0 rules — indistinguishable from a genuinely empty
|
|
211
|
+
// workspace. A classify failure means NO rules can be derived at all, so it must get
|
|
212
|
+
// the same degraded-sentinel treatment as the two fetch failures.
|
|
213
|
+
const entries = [makeEntry({ entryId: 'STD-1', name: 'No direct imports', collectionSlug: 'standards' })];
|
|
214
|
+
const mcpFn = vi.fn((name) => {
|
|
215
|
+
if (name === 'chain.getGovernanceWithRelations') {
|
|
216
|
+
return Promise.resolve({ entries, total: entries.length });
|
|
217
|
+
}
|
|
218
|
+
if (name === 'chain.listCollections') {
|
|
219
|
+
return Promise.resolve(COLLECTIONS);
|
|
220
|
+
}
|
|
221
|
+
if (name === 'chain.classifyGovernance') {
|
|
222
|
+
return Promise.reject(new Error('classify network error'));
|
|
223
|
+
}
|
|
224
|
+
return Promise.resolve(null);
|
|
225
|
+
});
|
|
226
|
+
const result = await generateChainRules(mcpFn, []);
|
|
227
|
+
expect(result.rules).toHaveLength(0);
|
|
228
|
+
expect(result.sentinel).not.toBeNull();
|
|
229
|
+
expect(result.sentinel.name).toBe('_chain_degraded');
|
|
230
|
+
expect(result.classified).toHaveLength(0);
|
|
231
|
+
});
|
|
74
232
|
it('MCP failure: returns sentinel rule and empty rules array', async () => {
|
|
75
233
|
const mcpFn = mockMcpFailure();
|
|
76
234
|
const result = await generateChainRules(mcpFn, []);
|
|
@@ -207,5 +365,84 @@ describe('generateChainRules', () => {
|
|
|
207
365
|
['system-shape', 'boundary'],
|
|
208
366
|
]);
|
|
209
367
|
});
|
|
368
|
+
it('chunks classification below the Convex argument ceiling at SCALE_TIERS.xl (PR #378 Codex follow-up)', async () => {
|
|
369
|
+
// Mirrors convex/lib/scaleTiers.ts's `xl` tier — ~4,000 governance entries, 3
|
|
370
|
+
// relations each — the production-scale shape Codex's finding cited. A single
|
|
371
|
+
// `chain.classifyGovernance` call with the whole corpus as one Convex argument (echoed
|
|
372
|
+
// back in the response too) risks the platform's <1MB function-argument/value ceiling
|
|
373
|
+
// (convex/http.ts:1816-1819). This test proves: (a) more than one batch is actually
|
|
374
|
+
// sent (batching engages, it isn't a no-op at this volume), (b) no single batch's
|
|
375
|
+
// `entries` payload exceeds a generous ceiling well under 1MB, and (c) every entry's
|
|
376
|
+
// classification survives the round trip (merge is lossless).
|
|
377
|
+
const XL_ENTRY_COUNT = 4000;
|
|
378
|
+
const XL_RELATIONS_PER_ENTRY = 3;
|
|
379
|
+
const xlEntries = Array.from({ length: XL_ENTRY_COUNT }, (_, i) => makeEntry({
|
|
380
|
+
entryId: `STD-${i}`,
|
|
381
|
+
name: `Synthetic xl-scale standard #${i} — mirrors production entry name length`,
|
|
382
|
+
collectionSlug: 'standards',
|
|
383
|
+
data: { note: `Synthetic body text for entry ${i}, representative of a real entry's data payload size.` },
|
|
384
|
+
relations: Array.from({ length: XL_RELATIONS_PER_ENTRY }, (_, r) => ({
|
|
385
|
+
type: 'constrains',
|
|
386
|
+
direction: 'outgoing',
|
|
387
|
+
otherEntryId: `BET-${i}-${r}`,
|
|
388
|
+
otherName: `Related bet ${i}-${r}`,
|
|
389
|
+
otherCollectionSlug: 'bets',
|
|
390
|
+
})),
|
|
391
|
+
}));
|
|
392
|
+
const CONVEX_ARG_CEILING_BYTES = 1_000_000; // the platform ceiling the fix stays under
|
|
393
|
+
const batchByteSizes = [];
|
|
394
|
+
let classifyCallCount = 0;
|
|
395
|
+
const mcpFn = vi.fn((name, args) => {
|
|
396
|
+
if (name === 'chain.getGovernanceWithRelations') {
|
|
397
|
+
return Promise.resolve({ entries: xlEntries, total: xlEntries.length });
|
|
398
|
+
}
|
|
399
|
+
if (name === 'chain.listCollections') {
|
|
400
|
+
return Promise.resolve(COLLECTIONS);
|
|
401
|
+
}
|
|
402
|
+
if (name === 'chain.classifyGovernance') {
|
|
403
|
+
classifyCallCount += 1;
|
|
404
|
+
const batchEntries = args.entries;
|
|
405
|
+
batchByteSizes.push(new TextEncoder().encode(JSON.stringify(batchEntries)).length);
|
|
406
|
+
return Promise.resolve(mockClassifyGovernance(batchEntries, COLLECTIONS));
|
|
407
|
+
}
|
|
408
|
+
return Promise.resolve(null);
|
|
409
|
+
});
|
|
410
|
+
const result = await generateChainRules(mcpFn, []);
|
|
411
|
+
expect(classifyCallCount).toBeGreaterThan(1); // batching actually engaged at this volume
|
|
412
|
+
for (const size of batchByteSizes) {
|
|
413
|
+
expect(size).toBeLessThan(CONVEX_ARG_CEILING_BYTES);
|
|
414
|
+
}
|
|
415
|
+
// Merge is lossless: every entry classified exactly once.
|
|
416
|
+
expect(result.classified).toHaveLength(XL_ENTRY_COUNT);
|
|
417
|
+
expect(new Set(result.classified.map((c) => c.entryId)).size).toBe(XL_ENTRY_COUNT);
|
|
418
|
+
expect(result.sentinel).toBeNull();
|
|
419
|
+
});
|
|
420
|
+
it('tolerates a stale governanceFunction on one collection — no degraded sentinel for a single bad row (PR #378 Codex follow-up P2)', async () => {
|
|
421
|
+
// `collections` schema declares governanceFunction as `v.optional(v.string())`
|
|
422
|
+
// (convex/schema.ts:585, :4142) — any string is legal in the DB. Before the fix, the
|
|
423
|
+
// served route's strict 7-literal validator rejected the WHOLE classify call the
|
|
424
|
+
// moment any one collection carried a stale/legacy value (e.g. a value from before a
|
|
425
|
+
// GovernanceFunction taxonomy change), degrading every rule — not just the one
|
|
426
|
+
// affected collection's entries. The kernel's normalizeGovernanceFunction already
|
|
427
|
+
// tolerates this per-item (falls to 'unclassified' for just that collection); this
|
|
428
|
+
// test proves the route no longer blocks it from ever reaching that logic.
|
|
429
|
+
const entries = [
|
|
430
|
+
makeEntry({ entryId: 'STD-1', name: 'Normal standard', collectionSlug: 'standards' }),
|
|
431
|
+
makeEntry({ entryId: 'X-1', name: 'Entry in stale collection', collectionSlug: 'legacy-collection' }),
|
|
432
|
+
];
|
|
433
|
+
const collectionsWithStaleValue = [
|
|
434
|
+
...COLLECTIONS,
|
|
435
|
+
// Not one of the 7 GovernanceFunction literals — simulates a stale/legacy DB value.
|
|
436
|
+
{ slug: 'legacy-collection', governanceFunction: 'deprecated-taxonomy-value' },
|
|
437
|
+
];
|
|
438
|
+
const mcpFn = mockMcpSuccess(entries, collectionsWithStaleValue);
|
|
439
|
+
const result = await generateChainRules(mcpFn, []);
|
|
440
|
+
// The whole call must NOT degrade — STD-1's own collection is perfectly valid.
|
|
441
|
+
expect(result.sentinel).toBeNull();
|
|
442
|
+
expect(result.stats.totalEntries).toBe(2);
|
|
443
|
+
expect(result.stats.classifiedEntries).toBe(2);
|
|
444
|
+
const std1 = result.classified.find((c) => c.entryId === 'STD-1');
|
|
445
|
+
expect(std1?.governanceFunction).toBe('constraint');
|
|
446
|
+
});
|
|
210
447
|
});
|
|
211
448
|
//# sourceMappingURL=chain-rules.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-rules.test.js","sourceRoot":"","sources":["../../src/generators/chain-rules.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chain-rules.test.js","sourceRoot":"","sources":["../../src/generators/chain-rules.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chain-classifier.test.d.ts","sourceRoot":"","sources":["../../src/generators/chain-classifier.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* chain-classifier — unit tests.
|
|
3
|
-
* BET-286 Slice 1: relation-aware governance function classifier.
|
|
4
|
-
*/
|
|
5
|
-
import { describe, expect, it } from 'vitest';
|
|
6
|
-
import { classifyGovernance, } from './chain-classifier.js';
|
|
7
|
-
// ── Helpers ────────────────────────────────────────────────────────────
|
|
8
|
-
function makeEntry(overrides) {
|
|
9
|
-
return {
|
|
10
|
-
status: 'committed',
|
|
11
|
-
verificationStatus: null,
|
|
12
|
-
data: null,
|
|
13
|
-
relations: [],
|
|
14
|
-
...overrides,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function makeRelation(overrides) {
|
|
18
|
-
return {
|
|
19
|
-
direction: 'outgoing',
|
|
20
|
-
otherEntryId: null,
|
|
21
|
-
otherName: 'other entry',
|
|
22
|
-
otherCollectionSlug: null,
|
|
23
|
-
...overrides,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
const COLLECTIONS = [
|
|
27
|
-
{
|
|
28
|
-
slug: 'standards',
|
|
29
|
-
name: 'Standards',
|
|
30
|
-
governanceRole: 'binding',
|
|
31
|
-
defaultCanonicalKey: 'standard',
|
|
32
|
-
governanceFunction: 'constraint',
|
|
33
|
-
classificationSignals: ['quality', 'test', 'gate'],
|
|
34
|
-
usageGuidance: 'Rules and standards that constrain behavior and must be followed.',
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
slug: 'business-rules',
|
|
38
|
-
name: 'Business Rules',
|
|
39
|
-
governanceRole: 'binding',
|
|
40
|
-
defaultCanonicalKey: 'business-rule',
|
|
41
|
-
governanceFunction: 'constraint',
|
|
42
|
-
classificationSignals: ['auth', 'security'],
|
|
43
|
-
usageGuidance: 'Operational rules that constrain product behavior and govern workflows.',
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
slug: 'architecture',
|
|
47
|
-
name: 'Architecture',
|
|
48
|
-
governanceRole: 'binding',
|
|
49
|
-
defaultCanonicalKey: 'architecture_note',
|
|
50
|
-
governanceFunction: 'boundary',
|
|
51
|
-
usageGuidance: 'Architecture notes that define system boundaries, interfaces, domains, and layers.',
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
slug: 'decisions',
|
|
55
|
-
name: 'Decisions',
|
|
56
|
-
governanceRole: 'binding',
|
|
57
|
-
defaultCanonicalKey: 'decision',
|
|
58
|
-
governanceFunction: 'convention',
|
|
59
|
-
classificationSignals: ['deployment'],
|
|
60
|
-
usageGuidance: 'Decisions record choices, practices, and conventions.',
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
slug: 'patterns',
|
|
64
|
-
name: 'Patterns',
|
|
65
|
-
governanceRole: 'binding',
|
|
66
|
-
defaultCanonicalKey: 'pattern',
|
|
67
|
-
governanceFunction: 'convention',
|
|
68
|
-
usageGuidance: 'Reusable patterns and conventions.',
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
slug: 'policies',
|
|
72
|
-
name: 'Policies',
|
|
73
|
-
governanceRole: 'binding',
|
|
74
|
-
defaultCanonicalKey: 'policy',
|
|
75
|
-
governanceFunction: 'policy',
|
|
76
|
-
usageGuidance: 'Policies for access, permissions, auth, and security.',
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
slug: 'flows',
|
|
80
|
-
name: 'Flows',
|
|
81
|
-
governanceRole: 'binding',
|
|
82
|
-
defaultCanonicalKey: 'flow',
|
|
83
|
-
governanceFunction: 'workflow',
|
|
84
|
-
usageGuidance: 'Workflow and process lifecycle definitions.',
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
slug: 'glossary',
|
|
88
|
-
name: 'Glossary',
|
|
89
|
-
governanceRole: 'reference',
|
|
90
|
-
defaultCanonicalKey: 'glossary_term',
|
|
91
|
-
governanceFunction: 'unclassified',
|
|
92
|
-
usageGuidance: 'Reference definitions.',
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
slug: 'compliance-gates',
|
|
96
|
-
name: 'Compliance Gates',
|
|
97
|
-
governanceRole: 'binding',
|
|
98
|
-
defaultCanonicalKey: 'quality_gate',
|
|
99
|
-
governanceFunction: 'quality-gate',
|
|
100
|
-
classificationSignals: ['coverage', 'verification'],
|
|
101
|
-
usageGuidance: 'Quality gates and verification checks.',
|
|
102
|
-
},
|
|
103
|
-
];
|
|
104
|
-
// ── Test cases ─────────────────────────────────────────────────────────
|
|
105
|
-
describe('classifyGovernance — collection signal', () => {
|
|
106
|
-
it('STD entry with constrains relation → constraint with high confidence (>=0.6)', () => {
|
|
107
|
-
const entry = makeEntry({
|
|
108
|
-
entryId: 'STD-1',
|
|
109
|
-
name: 'Trunk-based development standard',
|
|
110
|
-
collectionSlug: 'standards',
|
|
111
|
-
relations: [makeRelation({ type: 'constrains', otherCollectionSlug: 'bets' })],
|
|
112
|
-
});
|
|
113
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
114
|
-
expect(results).toHaveLength(1);
|
|
115
|
-
expect(results[0].governanceFunction).toBe('constraint');
|
|
116
|
-
expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
|
|
117
|
-
});
|
|
118
|
-
it('ARCH entry → boundary with medium confidence (>=0.4)', () => {
|
|
119
|
-
const entry = makeEntry({
|
|
120
|
-
entryId: 'ARCH-1',
|
|
121
|
-
name: 'Seven system domains',
|
|
122
|
-
collectionSlug: 'architecture',
|
|
123
|
-
});
|
|
124
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
125
|
-
expect(results).toHaveLength(1);
|
|
126
|
-
expect(results[0].governanceFunction).toBe('boundary');
|
|
127
|
-
expect(results[0].confidence).toBeGreaterThanOrEqual(0.4);
|
|
128
|
-
});
|
|
129
|
-
it('DEC entry with deployment in name → convention with boosted confidence', () => {
|
|
130
|
-
const entry = makeEntry({
|
|
131
|
-
entryId: 'DEC-1',
|
|
132
|
-
name: 'deployment ordering for Convex and Railway',
|
|
133
|
-
collectionSlug: 'decisions',
|
|
134
|
-
});
|
|
135
|
-
const noNameEntry = makeEntry({
|
|
136
|
-
entryId: 'DEC-2',
|
|
137
|
-
name: 'some decision',
|
|
138
|
-
collectionSlug: 'decisions',
|
|
139
|
-
});
|
|
140
|
-
const withName = classifyGovernance([entry], COLLECTIONS);
|
|
141
|
-
const withoutName = classifyGovernance([noNameEntry], COLLECTIONS);
|
|
142
|
-
expect(withName[0].governanceFunction).toBe('convention');
|
|
143
|
-
expect(withName[0].confidence).toBeGreaterThan(withoutName[0].confidence);
|
|
144
|
-
});
|
|
145
|
-
it('FLOW entry → workflow', () => {
|
|
146
|
-
const entry = makeEntry({
|
|
147
|
-
entryId: 'FLOW-1',
|
|
148
|
-
name: 'Feature flag lifecycle flow',
|
|
149
|
-
collectionSlug: 'flows',
|
|
150
|
-
});
|
|
151
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
152
|
-
expect(results).toHaveLength(1);
|
|
153
|
-
expect(results[0].governanceFunction).toBe('workflow');
|
|
154
|
-
});
|
|
155
|
-
it('POL entry with governs relation → policy with high confidence', () => {
|
|
156
|
-
const entry = makeEntry({
|
|
157
|
-
entryId: 'POL-1',
|
|
158
|
-
name: 'Access control policy',
|
|
159
|
-
collectionSlug: 'policies',
|
|
160
|
-
relations: [makeRelation({ type: 'governs', otherCollectionSlug: 'bets' })],
|
|
161
|
-
});
|
|
162
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
163
|
-
expect(results).toHaveLength(1);
|
|
164
|
-
expect(results[0].governanceFunction).toBe('policy');
|
|
165
|
-
expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
|
|
166
|
-
});
|
|
167
|
-
it('custom quality-gate collection → quality-gate from explicit metadata', () => {
|
|
168
|
-
const entry = makeEntry({
|
|
169
|
-
entryId: 'QG-2',
|
|
170
|
-
name: 'Test coverage quality gate for all slices',
|
|
171
|
-
collectionSlug: 'compliance-gates',
|
|
172
|
-
});
|
|
173
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
174
|
-
expect(results).toHaveLength(1);
|
|
175
|
-
expect(results[0].governanceFunction).toBe('quality-gate');
|
|
176
|
-
expect(results[0].confidence).toBeGreaterThanOrEqual(0.5);
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
describe('classifyGovernance — null entryId safety', () => {
|
|
180
|
-
it('entry with null entryId is excluded from output', () => {
|
|
181
|
-
const entry = makeEntry({
|
|
182
|
-
entryId: null,
|
|
183
|
-
name: 'Draft entry without ID',
|
|
184
|
-
collectionSlug: 'standards',
|
|
185
|
-
});
|
|
186
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
187
|
-
expect(results).toHaveLength(0);
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
describe('classifyGovernance — empty input', () => {
|
|
191
|
-
it('empty input → empty output', () => {
|
|
192
|
-
const results = classifyGovernance([], COLLECTIONS);
|
|
193
|
-
expect(results).toHaveLength(0);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
describe('classifyGovernance — unclassified', () => {
|
|
197
|
-
it('glossary entry → unclassified regardless of signals', () => {
|
|
198
|
-
const entry = makeEntry({
|
|
199
|
-
entryId: 'GLO-1',
|
|
200
|
-
name: 'Trunk-based development',
|
|
201
|
-
collectionSlug: 'glossary',
|
|
202
|
-
relations: [makeRelation({ type: 'constrains' })],
|
|
203
|
-
});
|
|
204
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
205
|
-
expect(results).toHaveLength(1);
|
|
206
|
-
expect(results[0].governanceFunction).toBe('unclassified');
|
|
207
|
-
expect(results[0].confidence).toBe(0);
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
describe('classifyGovernance — multiple signal matches', () => {
|
|
211
|
-
it('entry with multiple signals → highest confidence function wins', () => {
|
|
212
|
-
// BR entry with both constrains AND governs relations.
|
|
213
|
-
// constrains boosts 'constraint', governs boosts 'policy'.
|
|
214
|
-
// business-rules base maps to 'constraint', so constraint should win.
|
|
215
|
-
const entry = makeEntry({
|
|
216
|
-
entryId: 'BR-1',
|
|
217
|
-
name: 'Entry creation must use createEntry gate',
|
|
218
|
-
collectionSlug: 'business-rules',
|
|
219
|
-
relations: [
|
|
220
|
-
makeRelation({ type: 'constrains' }),
|
|
221
|
-
makeRelation({ type: 'constrains' }),
|
|
222
|
-
makeRelation({ type: 'governs' }),
|
|
223
|
-
],
|
|
224
|
-
});
|
|
225
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
226
|
-
expect(results).toHaveLength(1);
|
|
227
|
-
// Both constraint and policy are plausible; the function with the highest score wins.
|
|
228
|
-
// With 2x constrains boosts, constraint should dominate.
|
|
229
|
-
expect(results[0].governanceFunction).toBe('constraint');
|
|
230
|
-
expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
describe('classifyGovernance — passthrough fields', () => {
|
|
234
|
-
it('passes data and relations through to result', () => {
|
|
235
|
-
const data = { someField: 'someValue' };
|
|
236
|
-
const relation = makeRelation({ type: 'constrains' });
|
|
237
|
-
const entry = makeEntry({
|
|
238
|
-
entryId: 'STD-99',
|
|
239
|
-
name: 'Some standard',
|
|
240
|
-
collectionSlug: 'standards',
|
|
241
|
-
data,
|
|
242
|
-
relations: [relation],
|
|
243
|
-
});
|
|
244
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
245
|
-
expect(results[0].data).toBe(data);
|
|
246
|
-
expect(results[0].relations).toEqual([relation]);
|
|
247
|
-
});
|
|
248
|
-
it('returns entryId, name, and collectionSlug unchanged', () => {
|
|
249
|
-
const entry = makeEntry({
|
|
250
|
-
entryId: 'ARCH-42',
|
|
251
|
-
name: 'My architecture entry',
|
|
252
|
-
collectionSlug: 'architecture',
|
|
253
|
-
});
|
|
254
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
255
|
-
expect(results[0].entryId).toBe('ARCH-42');
|
|
256
|
-
expect(results[0].name).toBe('My architecture entry');
|
|
257
|
-
expect(results[0].collectionSlug).toBe('architecture');
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
describe('classifyGovernance — name signal boosts', () => {
|
|
261
|
-
it('workspace collection signals boost that collection metadata function', () => {
|
|
262
|
-
const withKeyword = makeEntry({
|
|
263
|
-
entryId: 'BR-2',
|
|
264
|
-
name: 'Auth security check before MCP tool execution',
|
|
265
|
-
collectionSlug: 'business-rules',
|
|
266
|
-
});
|
|
267
|
-
const withoutKeyword = makeEntry({
|
|
268
|
-
entryId: 'BR-3',
|
|
269
|
-
name: 'Some business rule',
|
|
270
|
-
collectionSlug: 'business-rules',
|
|
271
|
-
});
|
|
272
|
-
const [withResult] = classifyGovernance([withKeyword], COLLECTIONS);
|
|
273
|
-
const [withoutResult] = classifyGovernance([withoutKeyword], COLLECTIONS);
|
|
274
|
-
expect(withResult.governanceFunction).toBe('constraint');
|
|
275
|
-
expect(withResult.confidence).toBeGreaterThan(withoutResult.confidence);
|
|
276
|
-
expect(withoutResult.governanceFunction).toBe('constraint');
|
|
277
|
-
});
|
|
278
|
-
it('matchedSignals contains human-readable explanations', () => {
|
|
279
|
-
const entry = makeEntry({
|
|
280
|
-
entryId: 'STD-5',
|
|
281
|
-
name: 'Quality gate for test coverage',
|
|
282
|
-
collectionSlug: 'standards',
|
|
283
|
-
relations: [makeRelation({ type: 'constrains' })],
|
|
284
|
-
});
|
|
285
|
-
const [result] = classifyGovernance([entry], COLLECTIONS);
|
|
286
|
-
expect(result.matchedSignals.length).toBeGreaterThan(0);
|
|
287
|
-
expect(result.matchedSignals.some((s) => s.includes('standards'))).toBe(true);
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
describe('classifyGovernance — mixed null/non-null entryIds', () => {
|
|
291
|
-
it('only entries with non-null entryIds are returned', () => {
|
|
292
|
-
const entries = [
|
|
293
|
-
makeEntry({ entryId: 'STD-1', name: 'Valid standard', collectionSlug: 'standards' }),
|
|
294
|
-
makeEntry({ entryId: null, name: 'Draft entry', collectionSlug: 'standards' }),
|
|
295
|
-
makeEntry({ entryId: 'ARCH-2', name: 'Architecture entry', collectionSlug: 'architecture' }),
|
|
296
|
-
];
|
|
297
|
-
const results = classifyGovernance(entries, COLLECTIONS);
|
|
298
|
-
expect(results).toHaveLength(2);
|
|
299
|
-
expect(results.map((r) => r.entryId)).toEqual(['STD-1', 'ARCH-2']);
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
describe('classifyGovernance — patterns collection', () => {
|
|
303
|
-
it('PAT entry → convention', () => {
|
|
304
|
-
const entry = makeEntry({
|
|
305
|
-
entryId: 'PAT-1',
|
|
306
|
-
name: 'Additive wrapping pattern for feature flags',
|
|
307
|
-
collectionSlug: 'patterns',
|
|
308
|
-
});
|
|
309
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
310
|
-
expect(results[0].governanceFunction).toBe('convention');
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
describe('classifyGovernance — informed_by ARCH relation boosts boundary', () => {
|
|
314
|
-
it('DEC informed_by an architecture entry → keeps own convention; one informed_by edge boosts but does not override the entry base', () => {
|
|
315
|
-
// A single informed_by→boundary edge must REFINE, not OVERRIDE, the entry's
|
|
316
|
-
// own collection signal. The boost is RELATION_BOOST (0.2), never a full
|
|
317
|
-
// base, so the entry's own convention base (0.45) still wins.
|
|
318
|
-
const entry = makeEntry({
|
|
319
|
-
entryId: 'DEC-5',
|
|
320
|
-
name: 'Domain boundaries for the seven layers',
|
|
321
|
-
collectionSlug: 'decisions',
|
|
322
|
-
relations: [
|
|
323
|
-
makeRelation({
|
|
324
|
-
type: 'informed_by',
|
|
325
|
-
direction: 'outgoing',
|
|
326
|
-
otherCollectionSlug: 'architecture',
|
|
327
|
-
otherName: 'Seven system domains',
|
|
328
|
-
otherEntryId: 'ARCH-26',
|
|
329
|
-
}),
|
|
330
|
-
],
|
|
331
|
-
});
|
|
332
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
333
|
-
expect(results[0].governanceFunction).toBe('convention');
|
|
334
|
-
});
|
|
335
|
-
it('informed_by→boundary still lifts an entry with no own collection base to boundary', () => {
|
|
336
|
-
// Guard: the boost must remain a real signal. An entry whose own collection
|
|
337
|
-
// carries no governanceFunction (no base) classifies to boundary purely from
|
|
338
|
-
// the informed_by→architecture edge.
|
|
339
|
-
const entry = makeEntry({
|
|
340
|
-
entryId: 'X-1',
|
|
341
|
-
name: 'Some cross-cutting note',
|
|
342
|
-
collectionSlug: 'uncatalogued-collection',
|
|
343
|
-
relations: [
|
|
344
|
-
makeRelation({
|
|
345
|
-
type: 'informed_by',
|
|
346
|
-
direction: 'outgoing',
|
|
347
|
-
otherCollectionSlug: 'architecture',
|
|
348
|
-
otherName: 'Seven system domains',
|
|
349
|
-
otherEntryId: 'ARCH-26',
|
|
350
|
-
}),
|
|
351
|
-
],
|
|
352
|
-
});
|
|
353
|
-
const results = classifyGovernance([entry], COLLECTIONS);
|
|
354
|
-
expect(results[0].governanceFunction).toBe('boundary');
|
|
355
|
-
});
|
|
356
|
-
it('custom slugs classify from governanceFunction metadata, not PB slug names', () => {
|
|
357
|
-
const collections = [
|
|
358
|
-
{ slug: 'working-agreements', governanceRole: 'binding', governanceFunction: 'constraint' },
|
|
359
|
-
{ slug: 'system-shape', governanceRole: 'binding', governanceFunction: 'boundary' },
|
|
360
|
-
];
|
|
361
|
-
const results = classifyGovernance([
|
|
362
|
-
makeEntry({ entryId: 'WA-1', name: 'Team agreement', collectionSlug: 'working-agreements' }),
|
|
363
|
-
makeEntry({ entryId: 'SYS-1', name: 'System boundary', collectionSlug: 'system-shape' }),
|
|
364
|
-
], collections);
|
|
365
|
-
expect(results.map((r) => [r.collectionSlug, r.governanceFunction])).toEqual([
|
|
366
|
-
['working-agreements', 'constraint'],
|
|
367
|
-
['system-shape', 'boundary'],
|
|
368
|
-
]);
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
//# sourceMappingURL=chain-classifier.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chain-classifier.test.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.test.ts"],"names":[],"mappings":"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"}
|