@productbrain/cli 0.1.0-beta.2293 → 0.1.0-beta.2312

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.
@@ -1,11 +1,18 @@
1
1
  /**
2
- * Chain Classifier — BET-286 Slice 1
2
+ * Chain Classifier — types only.
3
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.
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;;;;;;;;GAQG;AAIH,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,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;AA2BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,EAAE,EAC/B,WAAW,GAAE,yBAAyB,EAAO,GAC5C,oBAAoB,EAAE,CAwFxB"}
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 — BET-286 Slice 1
2
+ * Chain Classifier — types only.
3
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.
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
- /** 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
- /**
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;;;;;;;;GAQG;AAoEH,sDAAsD;AACtD,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,wDAAwD;AACxD,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,uDAAuD;AACvD,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB;;;;GAIG;AACH,MAAM,gBAAgB,GAAmE;IACvF,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE;IAC/D,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE;IACxD,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;CAC3D,CAAC;AAEF,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA+B,EAC/B,cAA2C,EAAE;IAE7C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,mDAAmD;QACnD,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,SAAS;QAErC,MAAM,MAAM,GAAa,IAAI,GAAG,EAAE,CAAC;QACnC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC;QAClC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9C,kEAAkE;QAClE,MAAM,SAAS,GAAG,iCAAiC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvE,IAAI,SAAS,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,wBAAwB,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,iEAAiE;QACjE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAE5C,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACnC,IAAI,YAAY,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,IAAI,YAAY,KAAK,aAAa,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAG,iCAAiC,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACjG,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;oBAC3B,sEAAsE;oBACtE,qEAAqE;oBACrE,uEAAuE;oBACvE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,6BAA6B,GAAG,CAAC,mBAAmB,oBAAoB,CAAC,CAAC;gBAC9G,CAAC;YACH,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,SAAS,IAAI,UAAU,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC;YAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAG,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACrE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CACzC,CAAC;YACF,IAAI,aAAa,EAAE,CAAC;gBAClB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,sBAAsB,aAAa,aAAa,SAAS,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,MAAM,GAAuB,cAAc,CAAC;QAChD,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACjC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,MAAM,GAAG,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,UAAU,EAAE,kBAAkB,KAAK,cAAc,EAAE,CAAC;YACtD,MAAM,GAAG,cAAc,CAAC;YACxB,SAAS,GAAG,CAAC,CAAC;QAChB,CAAC;QAED,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAEvD,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,kBAAkB,EAAE,MAAM;YAC1B,UAAU;YACV,cAAc,EAAE,OAAO;YACvB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0EAA0E;AAE1E,SAAS,QAAQ,CAAC,MAAgB,EAAE,EAAsB,EAAE,KAAa;IACvE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iCAAiC,CACxC,UAAiD,EACjD,KAA4B;IAE5B,MAAM,QAAQ,GAAG,2BAA2B,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC7E,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC5E,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAc;IACjD,IACE,KAAK,KAAK,YAAY;QACtB,KAAK,KAAK,UAAU;QACpB,KAAK,KAAK,YAAY;QACtB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,UAAU;QACpB,KAAK,KAAK,cAAc;QACxB,KAAK,KAAK,cAAc,EACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
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;AAI7D,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,CA4F3B"}
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
- const classified = classifyGovernance(entries, collections);
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,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA2BnD,yEAAyE;AAEzE,qEAAqE;AACrE,MAAM,uBAAuB,GAAkB;IAC7C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,uEAAuE;IACpF,IAAI,EAAE,iOAAiO;IACvO,UAAU,EAAE,mBAAmB;IAC/B,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,yEAAyE;AAEzE,MAAM,oBAAoB,GAAG;IAC3B,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,cAAc;CACN,CAAC;AAIX,sEAAsE;AACtE,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,yEAAyE;AAEzE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA8B,EAC9B,WAA4B;IAE5B,MAAM,UAAU,GAAoB;QAClC,YAAY,EAAE,CAAC;QACf,iBAAiB,EAAE,CAAC;QACpB,cAAc,EAAE,CAAC;QACjB,kBAAkB,EAAE,CAAC;QACrB,uBAAuB,EAAE,CAAC;KAC3B,CAAC;IAEF,gEAAgE;IAChE,4EAA4E;IAC5E,IAAI,OAA+B,CAAC;IACpC,IAAI,WAAW,GAAgC,EAAE,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAqD,kCAAkC,EAAE,EAAE,CAAC,CAAC;QAC9H,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QACvG,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,uBAAuB;YACjC,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,EAAE;SACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAA8B,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACtG,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,2BAA2B;IAC3B,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE5D,2DAA2D;IAC3D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,uDAAuD;IACvD,MAAM,aAAa,GAAoB,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAEhC,KAAK,MAAM,EAAE,IAAI,oBAAoB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAEvE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,+CAA+C;YAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,uBAAuB,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAEjE,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;YACxB,IAAI,MAAM,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;gBAC5C,kBAAkB,EAAE,CAAC;YACvB,CAAC;YACD,0EAA0E;YAC1E,4FAA4F;YAC5F,SAAS;QACX,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,gEAAgE;IAChE,0FAA0F;IAC1F,MAAM,MAAM,GAAG,qBAAqB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAoB;QAC7B,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,iBAAiB,EAAE,UAAU,CAAC,MAAM;QACpC,cAAc,EAAE,WAAW,CAAC,MAAM;QAClC,kBAAkB;QAClB,uBAAuB;KACxB,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,WAAW;QAClB,IAAI;QACJ,QAAQ,EAAE,IAAI;QACd,KAAK;QACL,UAAU;KACX,CAAC;AACJ,CAAC;AAED,yEAAyE;AAEzE;;;;;GAKG;AACH,SAAS,qBAAqB,CAC5B,KAAsB,EACtB,UAAiD;IAEjD,+DAA+D;IAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,wCAAwC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAiC,CAAC;QAC5F,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,WAAW,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,QAAQ,GAAG,QAAQ,CAAC;QACtD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@productbrain/cli",
3
- "version": "0.1.0-beta.2293",
3
+ "version": "0.1.0-beta.2312",
4
4
  "description": "Product Brain — Chain knowledge and write-back CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=chain-classifier.test.d.ts.map
@@ -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":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,GAInB,MAAM,uBAAuB,CAAC;AAE/B,0EAA0E;AAE1E,SAAS,SAAS,CAAC,SAA2G;IAC5H,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,kBAAkB,EAAE,IAAI;QACxB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,EAAE;QACb,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,SAA6D;IACjF,OAAO;QACL,SAAS,EAAE,UAAU;QACrB,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,aAAa;QACxB,mBAAmB,EAAE,IAAI;QACzB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAgC;IAC/C;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,UAAU;QAC/B,kBAAkB,EAAE,YAAY;QAChC,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;QAClD,aAAa,EAAE,mEAAmE;KACnF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,gBAAgB;QACtB,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,eAAe;QACpC,kBAAkB,EAAE,YAAY;QAChC,qBAAqB,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;QAC3C,aAAa,EAAE,yEAAyE;KACzF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,cAAc;QACpB,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,mBAAmB;QACxC,kBAAkB,EAAE,UAAU;QAC9B,aAAa,EAAE,oFAAoF;KACpG;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,UAAU;QAC/B,kBAAkB,EAAE,YAAY;QAChC,qBAAqB,EAAE,CAAC,YAAY,CAAC;QACrC,aAAa,EAAE,uDAAuD;KACvE;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,SAAS;QAC9B,kBAAkB,EAAE,YAAY;QAChC,aAAa,EAAE,oCAAoC;KACpD;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,QAAQ;QAC7B,kBAAkB,EAAE,QAAQ;QAC5B,aAAa,EAAE,uDAAuD;KACvE;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,MAAM;QAC3B,kBAAkB,EAAE,UAAU;QAC9B,aAAa,EAAE,6CAA6C;KAC7D;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,WAAW;QAC3B,mBAAmB,EAAE,eAAe;QACpC,kBAAkB,EAAE,cAAc;QAClC,aAAa,EAAE,wBAAwB;KACxC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,kBAAkB;QACxB,cAAc,EAAE,SAAS;QACzB,mBAAmB,EAAE,cAAc;QACnC,kBAAkB,EAAE,cAAc;QAClC,qBAAqB,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;QACnD,aAAa,EAAE,wCAAwC;KACxD;CACF,CAAC;AAEF,0EAA0E;AAE1E,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,kCAAkC;YACxC,cAAc,EAAE,WAAW;YAC3B,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,CAAC;SAC/E,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,sBAAsB;YAC5B,cAAc,EAAE,cAAc;SAC/B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,4CAA4C;YAClD,cAAc,EAAE,WAAW;SAC5B,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,SAAS,CAAC;YAC5B,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,eAAe;YACrB,cAAc,EAAE,WAAW;SAC5B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QAEnE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,6BAA6B;YACnC,cAAc,EAAE,OAAO;SACxB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,uBAAuB;YAC7B,cAAc,EAAE,UAAU;YAC1B,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,CAAC;SAC5E,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,2CAA2C;YACjD,cAAc,EAAE,kBAAkB;SACnC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,wBAAwB;YAC9B,cAAc,EAAE,WAAW;SAC5B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,yBAAyB;YAC/B,cAAc,EAAE,UAAU;YAC1B,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;SAClD,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,uDAAuD;QACvD,2DAA2D;QAC3D,sEAAsE;QACtE,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,0CAA0C;YAChD,cAAc,EAAE,gBAAgB;YAChC,SAAS,EAAE;gBACT,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBACpC,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBACpC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aAClC;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,sFAAsF;QACtF,yDAAyD;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,eAAe;YACrB,cAAc,EAAE,WAAW;YAC3B,IAAI;YACJ,SAAS,EAAE,CAAC,QAAQ,CAAC;SACtB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,uBAAuB;YAC7B,cAAc,EAAE,cAAc;SAC/B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,WAAW,GAAG,SAAS,CAAC;YAC5B,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,+CAA+C;YACrD,cAAc,EAAE,gBAAgB;SACjC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,SAAS,CAAC;YAC/B,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,oBAAoB;YAC1B,cAAc,EAAE,gBAAgB;SACjC,CAAC,CAAC;QAEH,MAAM,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QACpE,MAAM,CAAC,aAAa,CAAC,GAAG,kBAAkB,CAAC,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC;QAE1E,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,gCAAgC;YACtC,cAAc,EAAE,WAAW;YAC3B,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;SAClD,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,OAAO,GAAG;YACd,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;YACpF,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;YAC9E,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;SAC7F,CAAC;QAEF,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,6CAA6C;YACnD,cAAc,EAAE,UAAU;SAC3B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC9E,EAAE,CAAC,gIAAgI,EAAE,GAAG,EAAE;QACxI,4EAA4E;QAC5E,yEAAyE;QACzE,8DAA8D;QAC9D,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,wCAAwC;YAC9C,cAAc,EAAE,WAAW;YAC3B,SAAS,EAAE;gBACT,YAAY,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,UAAU;oBACrB,mBAAmB,EAAE,cAAc;oBACnC,SAAS,EAAE,sBAAsB;oBACjC,YAAY,EAAE,SAAS;iBACxB,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,4EAA4E;QAC5E,6EAA6E;QAC7E,qCAAqC;QACrC,MAAM,KAAK,GAAG,SAAS,CAAC;YACtB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,yBAAyB;YAC/B,cAAc,EAAE,yBAAyB;YACzC,SAAS,EAAE;gBACT,YAAY,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,UAAU;oBACrB,mBAAmB,EAAE,cAAc;oBACnC,SAAS,EAAE,sBAAsB;oBACjC,YAAY,EAAE,SAAS;iBACxB,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,WAAW,GAAgC;YAC/C,EAAE,IAAI,EAAE,oBAAoB,EAAE,cAAc,EAAE,SAAS,EAAE,kBAAkB,EAAE,YAAY,EAAE;YAC3F,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE;SACpF,CAAC;QACF,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;YAC5F,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;SACzF,EAAE,WAAW,CAAC,CAAC;QAEhB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3E,CAAC,oBAAoB,EAAE,YAAY,CAAC;YACpC,CAAC,cAAc,EAAE,UAAU,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}