@aibvf/core 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ /**
2
+ * map_to_taxonomy: senior users say "customer service", "procurement" and
3
+ * "legal", not cx, supply and risk. This maps everyday business language
4
+ * onto the canonical enums deterministically, so callers stop passing the
5
+ * wrong function. Matching is exact-first, then alias, then word overlap.
6
+ */
7
+ import type { MapTaxonomyResult } from './types.js';
8
+ export declare function mapToTaxonomy(input: {
9
+ industry?: string;
10
+ function?: string;
11
+ ai_tier?: string;
12
+ readiness?: string;
13
+ }): MapTaxonomyResult;
14
+ //# sourceMappingURL=aliases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,YAAY,CAAC;AAmEnE,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,iBAAiB,CASpB"}
@@ -0,0 +1,73 @@
1
+ import { INDUSTRIES, FUNCTIONS, AI_TIERS, READINESS } from './taxonomy.js';
2
+ const FUNCTION_ALIASES = {
3
+ cx: ['customer service', 'customer support', 'support', 'service desk', 'contact centre', 'contact center', 'customer experience', 'call centre', 'call center', 'helpdesk', 'client service'],
4
+ supply: ['procurement', 'supply chain', 'logistics', 'operations', 'ops', 'manufacturing ops', 'warehouse', 'inventory', 'sourcing', 'fulfilment', 'fulfillment'],
5
+ rd: ['r&d', 'research', 'product development', 'product', 'engineering', 'innovation', 'design', 'development'],
6
+ risk: ['legal', 'compliance', 'audit', 'risk management', 'regulatory', 'governance', 'fraud', 'controls'],
7
+ hr: ['people', 'talent', 'recruiting', 'recruitment', 'human resources', 'people operations', 'workforce', 'l&d', 'learning and development'],
8
+ sales: ['marketing', 'revenue', 'commercial', 'growth', 'business development', 'crm', 'pipeline', 'pricing'],
9
+ it: ['technology', 'infrastructure', 'devops', 'service management', 'itsm', 'platform', 'cloud', 'security operations'],
10
+ finance: ['accounting', 'fp&a', 'treasury', 'controlling', 'financial planning', 'billing', 'accounts payable', 'accounts receivable', 'fpa'],
11
+ };
12
+ const INDUSTRY_ALIASES = {
13
+ retail: ['ecommerce', 'e-commerce', 'consumer goods', 'fmcg', 'grocery', 'fashion', 'shops'],
14
+ financial: ['banking', 'bank', 'insurance', 'insurer', 'fintech', 'asset management', 'payments', 'financial services'],
15
+ healthcare: ['hospital', 'pharma', 'pharmaceutical', 'medtech', 'life sciences', 'clinical', 'health'],
16
+ manufacturing: ['industrial', 'automotive', 'factory', 'production', 'engineering company'],
17
+ technology: ['software', 'saas', 'tech', 'it services', 'telecom', 'telecommunications'],
18
+ logistics: ['transport', 'shipping', 'freight', 'distribution', 'postal'],
19
+ energy: ['utilities', 'utility', 'oil and gas', 'power', 'renewables'],
20
+ public_sector: ['government', 'municipality', 'public services', 'civil service', 'defence', 'defense'],
21
+ professional: ['consulting', 'consultancy', 'law firm', 'accounting firm', 'agency', 'professional services'],
22
+ education: ['university', 'school', 'edtech', 'training provider'],
23
+ real_estate: ['property', 'housing', 'construction', 'proptech'],
24
+ creative: ['media', 'entertainment', 'publishing', 'advertising', 'gaming'],
25
+ nonprofit: ['ngo', 'charity', 'foundation', 'not for profit', 'non-profit'],
26
+ universal: ['general', 'cross-industry', 'any', 'other'],
27
+ };
28
+ const TIER_ALIASES = {
29
+ gen1: ['rpa', 'automation', 'scripted', 'rules based', 'rules-based', 'workflow automation', 'macros', 'classic ml'],
30
+ gen2: ['genai', 'gen ai', 'generative ai', 'llm', 'copilot', 'chatbot', 'assistant', 'gpt', 'claude', 'summarisation', 'drafting'],
31
+ gen3: ['agentic', 'agents', 'autonomous', 'ai agents', 'multi-agent', 'auto-pilot', 'autopilot', 'self-directed'],
32
+ };
33
+ const READINESS_ALIASES = {
34
+ agile: ['cross-functional', 'startup', 'product-led', 'fast-moving', 'collaborative', 'empowered teams', 'change-ready'],
35
+ traditional: ['hierarchy', 'hierarchical', 'functional', 'corporate', 'committee', 'matrix', 'established'],
36
+ siloed: ['bureaucratic', 'territorial', 'rigid', 'slow', 'legacy culture', 'political', 'fragmented'],
37
+ };
38
+ function matchOne(input, canon, aliases) {
39
+ const norm = input.trim().toLowerCase().replace(/[_-]+/g, ' ');
40
+ const compact = norm.replace(/\s+/g, '');
41
+ for (const c of canon) {
42
+ if (compact === c.toLowerCase().replace(/[_\s]+/g, ''))
43
+ return { input, resolved: c, matched_on: 'exact' };
44
+ }
45
+ for (const [c, list] of Object.entries(aliases)) {
46
+ for (const a of list) {
47
+ if (norm === a)
48
+ return { input, resolved: c, matched_on: a };
49
+ }
50
+ }
51
+ for (const [c, list] of Object.entries(aliases)) {
52
+ for (const a of list) {
53
+ if (norm.includes(a) || a.includes(norm))
54
+ return { input, resolved: c, matched_on: a };
55
+ }
56
+ }
57
+ return { input, resolved: null, suggestions: [...canon] };
58
+ }
59
+ export function mapToTaxonomy(input) {
60
+ const out = {
61
+ guidance: 'Pass the resolved values to score_initiative, score_portfolio, sequence_portfolio, recommend_improvements, calculate_pace_layer_drag, get_benchmark or infer_readiness. A null resolution means no confident match: ask the user to pick from the suggestions rather than guessing.',
62
+ };
63
+ if (input.industry !== undefined)
64
+ out.industry = matchOne(input.industry, INDUSTRIES, INDUSTRY_ALIASES);
65
+ if (input.function !== undefined)
66
+ out.function = matchOne(input.function, FUNCTIONS, FUNCTION_ALIASES);
67
+ if (input.ai_tier !== undefined)
68
+ out.ai_tier = matchOne(input.ai_tier, AI_TIERS, TIER_ALIASES);
69
+ if (input.readiness !== undefined)
70
+ out.readiness = matchOne(input.readiness, READINESS, READINESS_ALIASES);
71
+ return out;
72
+ }
73
+ //# sourceMappingURL=aliases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Reproducibility: every scoring call carries an audit record naming the
3
+ * engine version, the rules that fired, and the resolved inputs, so a
4
+ * challenged verdict can be reproduced months later without asking any
5
+ * model to remember anything. Deterministic by design: no timestamps.
6
+ */
7
+ import type { AuditRecord } from './types.js';
8
+ /** Single source of truth for the engine version; bump with package.json. */
9
+ export declare const CORE_VERSION = "0.7.0";
10
+ export declare function buildAudit(rules_fired: string[], inputs_used: Record<string, unknown>): AuditRecord;
11
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,6EAA6E;AAC7E,eAAO,MAAM,YAAY,UAAU,CAAC;AAEpC,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CASnG"}
package/dist/audit.js ADDED
@@ -0,0 +1,13 @@
1
+ /** Single source of truth for the engine version; bump with package.json. */
2
+ export const CORE_VERSION = '0.7.0';
3
+ export function buildAudit(rules_fired, inputs_used) {
4
+ return {
5
+ engine: '@aibvf/core',
6
+ engine_version: CORE_VERSION,
7
+ bvf_version: '1.0',
8
+ rules_fired,
9
+ inputs_used,
10
+ note: 'Deterministic: the same inputs on the same engine version reproduce this result exactly.',
11
+ };
12
+ }
13
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAQA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,WAAqB,EAAE,WAAoC;IACpF,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,cAAc,EAAE,YAAY;QAC5B,WAAW,EAAE,KAAK;QAClB,WAAW;QACX,WAAW;QACX,IAAI,EAAE,0FAA0F;KACjG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=boardInstrument.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boardInstrument.test.d.ts","sourceRoot":"","sources":["../src/boardInstrument.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,124 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { score, recommendImprovements } from './score.js';
4
+ import { inferReadiness } from './inferReadiness.js';
5
+ import { sequencePortfolio } from './sequencePortfolio.js';
6
+ import { mapToTaxonomy } from './aliases.js';
7
+ import { CORE_VERSION } from './audit.js';
8
+ const base = {
9
+ industry: 'retail', revenue_eur: 300_000_000, function: 'cx', ai_tier: 'gen2', readiness: 'traditional',
10
+ scores: { strategic_alignment: 70, financial_return: 64, change_enablement: 48, governance_risk: 35 },
11
+ };
12
+ // ── audit ──────────────────────────────────────────────────────────────────
13
+ test('every scoring call carries a reproducible audit record', () => {
14
+ const s = score(base);
15
+ assert.equal(s.audit.engine, '@aibvf/core');
16
+ assert.equal(s.audit.engine_version, CORE_VERSION);
17
+ assert.ok(s.audit.rules_fired.some(r => r.startsWith('classify:Fix')));
18
+ assert.ok(s.audit.rules_fired.some(r => r.startsWith('value:BASE_RATES[cx]')));
19
+ const r = recommendImprovements(base);
20
+ assert.ok(r.audit.rules_fired.some(x => x.startsWith('gap:change_enablement')));
21
+ const i = inferReadiness({ function: 'cx', handoffs: 5, rework_rate: 0.2 });
22
+ assert.ok(i.audit.rules_fired.some(x => x.startsWith('classify:')));
23
+ });
24
+ test('audit reflects estimation when pillars are omitted', () => {
25
+ const s = score({ ...base, scores: undefined });
26
+ assert.ok(s.audit.rules_fired.some(r => r.startsWith('estimate:')));
27
+ assert.ok(s.audit.rules_fired.some(r => r.includes('(defaulted)')));
28
+ });
29
+ // ── sensitivity ────────────────────────────────────────────────────────────
30
+ test('sensitivity: readiness notch-down shrinks value, revenue -20pct scales, flips are named', () => {
31
+ const s = score(base);
32
+ assert.ok(s.sensitivity.readiness_one_notch_down);
33
+ assert.equal(s.sensitivity.readiness_one_notch_down.readiness, 'siloed');
34
+ assert.ok(s.sensitivity.readiness_one_notch_down.net_value_eur.high < s.net_high_eur);
35
+ assert.equal(s.sensitivity.revenue_minus_20pct.net_value_eur.low, Math.round(s.net_low_eur * 0.8));
36
+ assert.ok(s.sensitivity.verdict_flips.some(f => f.includes('to Accelerate')));
37
+ assert.ok(s.sensitivity.verdict_flips.some(f => f.includes('Stop')));
38
+ });
39
+ test('sensitivity: siloed has no notch down; Accelerate names its margins', () => {
40
+ const s = score({ ...base, readiness: 'siloed', scores: { ...base.scores } });
41
+ assert.equal(s.sensitivity.readiness_one_notch_down, null);
42
+ const a = score({ ...base, scores: { strategic_alignment: 75, financial_return: 70, change_enablement: 65, governance_risk: 38 } });
43
+ assert.equal(a.classification, 'Accelerate');
44
+ assert.ok(a.sensitivity.verdict_flips.some(f => f.includes('governance_risk +3')));
45
+ });
46
+ // ── claimed vs measured readiness ──────────────────────────────────────────
47
+ test('claimed agile vs measured siloed reports the gap as a finding', () => {
48
+ const r = inferReadiness({
49
+ function: 'supply', handoffs: 11, rework_rate: 0.22, touch_ratio: 0.08, automation_level: 0.1, cycle_time_days: 18,
50
+ claimed_readiness: 'agile',
51
+ });
52
+ assert.equal(r.readiness, 'siloed');
53
+ assert.equal(r.claimed_readiness, 'agile');
54
+ assert.equal(r.readiness_gap, 2);
55
+ assert.ok(r.gap_finding && r.gap_finding.includes('two notches'));
56
+ });
57
+ test('claimed matches measured strengthens rather than flags', () => {
58
+ const r = inferReadiness({ function: 'cx', handoffs: 1, rework_rate: 0.03, touch_ratio: 0.55, claimed_readiness: 'agile' });
59
+ assert.equal(r.readiness_gap, 0);
60
+ assert.ok(r.gap_finding && r.gap_finding.includes('holds up'));
61
+ });
62
+ // ── taxonomy aliases ───────────────────────────────────────────────────────
63
+ test('everyday language maps onto the canonical taxonomy', () => {
64
+ const m = mapToTaxonomy({ function: 'Customer Service', industry: 'Banking', ai_tier: 'GenAI copilot', readiness: 'bureaucratic' });
65
+ assert.equal(m.function.resolved, 'cx');
66
+ assert.equal(m.industry.resolved, 'financial');
67
+ assert.equal(m.ai_tier.resolved, 'gen2');
68
+ assert.equal(m.readiness.resolved, 'siloed');
69
+ });
70
+ test('no confident match returns null with suggestions, never a guess', () => {
71
+ const m = mapToTaxonomy({ function: 'astrology' });
72
+ assert.equal(m.function.resolved, null);
73
+ assert.ok(m.function.suggestions.includes('cx'));
74
+ });
75
+ // ── sequence_portfolio ─────────────────────────────────────────────────────
76
+ const seqInput = {
77
+ organization: { name: 'Test org', industry: 'financial', revenue_eur: 1_200_000_000 },
78
+ readiness: 'traditional',
79
+ initiatives: [
80
+ { id: 'a', name: 'Doomed voice bot', function: 'cx', ai_tier: 'gen3', scores: { strategic_alignment: 40, financial_return: 15, change_enablement: 30, governance_risk: 60 } },
81
+ { id: 'b', name: 'Quick finance win', function: 'finance', ai_tier: 'gen1', scores: { strategic_alignment: 72, financial_return: 68, change_enablement: 66, governance_risk: 30 } },
82
+ { id: 'c', name: 'CX assist', function: 'cx', ai_tier: 'gen2', scores: { strategic_alignment: 70, financial_return: 65, change_enablement: 62, governance_risk: 35 } },
83
+ { id: 'd', name: 'Agentic supply pilot', function: 'finance', ai_tier: 'gen3', scores: { strategic_alignment: 75, financial_return: 70, change_enablement: 64, governance_risk: 38 } },
84
+ { id: 'e', name: 'Finance copilot', function: 'finance', ai_tier: 'gen2', scores: { strategic_alignment: 68, financial_return: 63, change_enablement: 61, governance_risk: 32 } },
85
+ { id: 'f', name: 'Fixable claims triage', function: 'risk', ai_tier: 'gen2', scores: { strategic_alignment: 65, financial_return: 62, change_enablement: 45, governance_risk: 50 } },
86
+ ],
87
+ };
88
+ test('stops land in wave 1, quick wins in wave 2, fixes behind gates in wave 3', () => {
89
+ const r = sequencePortfolio(seqInput);
90
+ assert.equal(r.waves[0].initiatives.length, 1);
91
+ assert.equal(r.waves[0].initiatives[0].id, 'a');
92
+ assert.ok(r.waves[0].initiatives[0].action.includes('Stop now'));
93
+ const w3fix = r.waves[2].initiatives.find(x => x.id === 'f');
94
+ assert.ok(w3fix && w3fix.action.includes('re-score gate'));
95
+ assert.equal(r.totals.stopped, 1);
96
+ });
97
+ test('change capacity defers overflow and reports the conflict', () => {
98
+ const r = sequencePortfolio({ ...seqInput, constraints: { max_parallel_per_function: 1 } });
99
+ // three finance initiatives cannot all land at once with max_parallel 1
100
+ assert.ok(r.capacity_conflicts.some(c => c.function === 'finance'));
101
+ const placedFinanceW2 = r.waves[1].initiatives.filter(x => x.function === 'finance').length;
102
+ assert.ok(placedFinanceW2 <= 1);
103
+ assert.ok(r.capacity_conflicts.every(c => c.resolution.includes('overflow')));
104
+ });
105
+ test('sequencing is deterministic and audited', () => {
106
+ const a = sequencePortfolio(seqInput);
107
+ const b = sequencePortfolio(seqInput);
108
+ assert.deepEqual(a, b);
109
+ assert.ok(a.audit.rules_fired.some(x => x.startsWith('capacity:')));
110
+ assert.ok(a.sequencing_principles.some(p => p.includes('break an organisation')));
111
+ });
112
+ test('no em-dashes or banned vocabulary in any new output text', () => {
113
+ const blobs = [
114
+ JSON.stringify(score(base).sensitivity), JSON.stringify(score(base).audit),
115
+ JSON.stringify(inferReadiness({ function: 'supply', handoffs: 11, rework_rate: 0.22, claimed_readiness: 'agile' })),
116
+ JSON.stringify(sequencePortfolio(seqInput)),
117
+ JSON.stringify(mapToTaxonomy({ function: 'legal' })),
118
+ ].join(' ');
119
+ assert.ok(!blobs.includes('—'), 'em-dash found');
120
+ for (const w of ['boardroom', 'leverage', 'crucial', 'seamless']) {
121
+ assert.ok(!blobs.toLowerCase().includes(w), `banned word: ${w}`);
122
+ }
123
+ });
124
+ //# sourceMappingURL=boardInstrument.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boardInstrument.test.js","sourceRoot":"","sources":["../src/boardInstrument.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,10 @@ export { validate } from './validate.js';
2
2
  export { score, recommendImprovements, calculatePaceLayerDrag, estimatePillars, resolvePillars, BASE_RATES, IND_MULT, TIER_ADJ, READINESS_CAPTURE, PACE_DRAG_RATE, } from './score.js';
3
3
  export { diagnoseProcess, BRAIN_VERSION, EVIDENCE, FUNCTION_MEDIANS, } from './diagnose.js';
4
4
  export { buildChangePlan } from './changePlan.js';
5
+ export { inferReadiness } from './inferReadiness.js';
6
+ export { sequencePortfolio } from './sequencePortfolio.js';
7
+ export { mapToTaxonomy } from './aliases.js';
8
+ export { buildAudit, CORE_VERSION } from './audit.js';
5
9
  export { bvfSchema } from './schema.js';
6
10
  export { INDUSTRIES, FUNCTIONS, AI_TIERS, READINESS, INDUSTRY_LABEL, FUNCTION_LABEL, TIER_LABEL } from './taxonomy.js';
7
11
  export type * from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,GAClE,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,aAAa,EAAE,QAAQ,EAAE,gBAAgB,GAC1C,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvH,mBAAmB,YAAY,CAAC;AAEhC,eAAO,MAAM,WAAW,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,GAClE,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,aAAa,EAAE,QAAQ,EAAE,gBAAgB,GAC1C,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvH,mBAAmB,YAAY,CAAC;AAEhC,eAAO,MAAM,WAAW,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,10 @@ export { validate } from './validate.js';
2
2
  export { score, recommendImprovements, calculatePaceLayerDrag, estimatePillars, resolvePillars, BASE_RATES, IND_MULT, TIER_ADJ, READINESS_CAPTURE, PACE_DRAG_RATE, } from './score.js';
3
3
  export { diagnoseProcess, BRAIN_VERSION, EVIDENCE, FUNCTION_MEDIANS, } from './diagnose.js';
4
4
  export { buildChangePlan } from './changePlan.js';
5
+ export { inferReadiness } from './inferReadiness.js';
6
+ export { sequencePortfolio } from './sequencePortfolio.js';
7
+ export { mapToTaxonomy } from './aliases.js';
8
+ export { buildAudit, CORE_VERSION } from './audit.js';
5
9
  export { bvfSchema } from './schema.js';
6
10
  export { INDUSTRIES, FUNCTIONS, AI_TIERS, READINESS, INDUSTRY_LABEL, FUNCTION_LABEL, TIER_LABEL } from './taxonomy.js';
7
11
  export const BVF_VERSION = '1.0';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,GAClE,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,aAAa,EAAE,QAAQ,EAAE,gBAAgB,GAC1C,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGvH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,GAClE,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,aAAa,EAAE,QAAQ,EAAE,gBAAgB,GAC1C,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGvH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * infer_readiness: measure organisational readiness instead of asking for it.
3
+ *
4
+ * Readiness is the AI BVF's most consequential input, it sets the value
5
+ * capture rate, the pace-layer drag, and (since 0.8.0) the estimated
6
+ * change-enablement pillar, and it has always been self-reported, which is
7
+ * the same gaming surface every maturity model carries. This module closes
8
+ * that surface: it reads the operational signals an organisation cannot
9
+ * easily flatter, hand-offs, rework, wait time, automation coverage and
10
+ * cycle time against the published function medians, and returns the
11
+ * readiness classification the process data supports, with a confidence
12
+ * governed by how many signals were provided and how well they agree.
13
+ *
14
+ * The mapping is the operational definition of the words themselves:
15
+ * siloed IS many hand-offs, high rework and long waits; agile IS few
16
+ * hand-offs, low rework and short decision loops. Deterministic, like
17
+ * everything in the engine: same signals, same answer.
18
+ */
19
+ import type { InferReadinessInput, InferReadinessResult } from './types.js';
20
+ /**
21
+ * Infer readiness from measured process signals. Requires `function` (for
22
+ * the medians) and at least two of the five signals; confidence scales with
23
+ * coverage and drops when the signals disagree.
24
+ */
25
+ export declare function inferReadiness(input: InferReadinessInput): InferReadinessResult;
26
+ //# sourceMappingURL=inferReadiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferReadiness.d.ts","sourceRoot":"","sources":["../src/inferReadiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAyB,mBAAmB,EAAE,oBAAoB,EAAc,MAAM,YAAY,CAAC;AAY/G;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA4F/E"}
@@ -0,0 +1,90 @@
1
+ import { FUNCTION_MEDIANS } from './diagnose.js';
2
+ import { buildAudit } from './audit.js';
3
+ const LEAN_LABEL = { 0: 'agile', 1: 'traditional', 2: 'siloed' };
4
+ function read(signal, value, lean, note) {
5
+ return { signal, value, leans: LEAN_LABEL[lean], note };
6
+ }
7
+ /**
8
+ * Infer readiness from measured process signals. Requires `function` (for
9
+ * the medians) and at least two of the five signals; confidence scales with
10
+ * coverage and drops when the signals disagree.
11
+ */
12
+ export function inferReadiness(input) {
13
+ const med = FUNCTION_MEDIANS[input.function];
14
+ if (!med)
15
+ throw new Error(`Unknown function: ${input.function}`);
16
+ const reads = [];
17
+ const leans = [];
18
+ if (typeof input.handoffs === 'number') {
19
+ const ratio = input.handoffs / med.handoffs;
20
+ const lean = ratio >= 1.5 ? 2 : ratio >= 1.0 ? 1 : 0;
21
+ leans.push(lean);
22
+ reads.push(read('handoffs', input.handoffs, lean, `${input.handoffs} hand-offs against a ${med.handoffs} median for ${input.function}: ${lean === 2 ? 'work moves by escalation, the structural signature of a siloed organisation' : lean === 1 ? 'a functional hierarchy passing work along its lines' : 'few owners per outcome, decisions stay close to the work'}.`));
23
+ }
24
+ if (typeof input.rework_rate === 'number') {
25
+ const lean = input.rework_rate >= 0.15 ? 2 : input.rework_rate >= 0.05 ? 1 : 0;
26
+ leans.push(lean);
27
+ reads.push(read('rework_rate', input.rework_rate, lean, `${Math.round(input.rework_rate * 100)}% of instances reopened: ${lean === 2 ? 'quality is being negotiated between departments after the fact' : lean === 1 ? 'normal friction for a traditional operating model' : 'first-time-right discipline, a fast-feedback culture'}.`));
28
+ }
29
+ if (typeof input.touch_ratio === 'number') {
30
+ const lean = input.touch_ratio < 0.15 ? 2 : input.touch_ratio <= 0.4 ? 1 : 0;
31
+ leans.push(lean);
32
+ reads.push(read('touch_ratio', input.touch_ratio, lean, `${Math.round(input.touch_ratio * 100)}% of elapsed time is actual work, the rest is waiting: ${lean === 2 ? 'the process spends its life in queues between functions' : lean === 1 ? 'meaningful wait states between owners' : 'short decision loops, little queueing'}.`));
33
+ }
34
+ if (typeof input.automation_level === 'number') {
35
+ const lean = input.automation_level < 0.2 ? 2 : input.automation_level <= 0.5 ? 1 : 0;
36
+ leans.push(lean);
37
+ reads.push(read('automation_level', input.automation_level, lean, `${Math.round(input.automation_level * 100)}% already automated: ${lean === 2 ? 'manual effort is the norm, prior automation attempts have not stuck' : lean === 1 ? 'partial automation, typical of a traditional estate' : 'the organisation already absorbs automation well'}.`));
38
+ }
39
+ if (typeof input.cycle_time_days === 'number') {
40
+ const ratio = input.cycle_time_days / med.cycle_days;
41
+ const lean = ratio >= 1.5 ? 2 : ratio >= 0.75 ? 1 : 0;
42
+ leans.push(lean);
43
+ reads.push(read('cycle_time_days', input.cycle_time_days, lean, `${input.cycle_time_days} days against a ${med.cycle_days}-day median for ${input.function}: ${lean === 2 ? 'the operating model is adding most of the elapsed time' : lean === 1 ? 'in line with a functional hierarchy' : 'faster than the median, the structure is not in the way'}.`));
44
+ }
45
+ if (leans.length < 2) {
46
+ throw new Error('infer_readiness needs at least two measured signals (of handoffs, rework_rate, touch_ratio, automation_level, cycle_time_days). With fewer, self-reported readiness plus signal_completeness is the honest fallback.');
47
+ }
48
+ const avg = leans.reduce((s, l) => s + l, 0) / leans.length;
49
+ const readiness = avg >= 1.4 ? 'siloed' : avg >= 0.7 ? 'traditional' : 'agile';
50
+ // Confidence: coverage sets the base, disagreement discounts it.
51
+ const COVERAGE_BASE = { 2: 45, 3: 60, 4: 75, 5: 90 };
52
+ const base = COVERAGE_BASE[leans.length] ?? 90;
53
+ const spread = Math.max(...leans) - Math.min(...leans); // 0 = unanimous, 2 = fully split
54
+ const confidence = Math.max(20, Math.round(base - spread * 10));
55
+ const disagreement = spread === 2
56
+ ? 'The signals disagree with each other, some read agile while others read siloed, which usually means readiness is uneven across the process rather than one thing. Treat the classification as the centre of gravity and look at the per-signal reads.'
57
+ : undefined;
58
+ // Claimed versus measured: when the organisation's self-image and its
59
+ // process data disagree, the gap is the finding, not a rounding error.
60
+ const ORDER = { agile: 0, traditional: 1, siloed: 2 };
61
+ let claimedBlock = {};
62
+ if (input.claimed_readiness) {
63
+ const gap = ORDER[readiness] - ORDER[input.claimed_readiness];
64
+ claimedBlock = {
65
+ claimed_readiness: input.claimed_readiness,
66
+ readiness_gap: gap,
67
+ ...(gap > 0 ? { gap_finding: `The organisation describes itself as ${input.claimed_readiness} and measures as ${readiness}, ${gap === 1 ? 'one notch' : 'two notches'} below its self-image. That gap is itself a change-readiness finding: plan the change work for the measured level, because the process data is what the initiative will actually land on.` }
68
+ : gap < 0 ? { gap_finding: `The organisation describes itself as ${input.claimed_readiness} but measures as ${readiness}, better than it claims. Understated capacity is rare and useful: there is more change absorption available than the self-report suggests.` }
69
+ : { gap_finding: `Claimed and measured readiness agree at ${readiness}: the self-report holds up against the process data, which strengthens confidence in every score built on it.` }),
70
+ };
71
+ }
72
+ return {
73
+ readiness,
74
+ readiness_basis: 'measured',
75
+ confidence,
76
+ signals_used: leans.length,
77
+ signal_reads: reads,
78
+ ...(disagreement ? { disagreement } : {}),
79
+ ...claimedBlock,
80
+ guidance: `Pass readiness="${readiness}" to score_initiative, score_portfolio, recommend_improvements or calculate_pace_layer_drag. If this measured classification is lower than the self-reported one, trust the process data: the gap between what an organisation says and what its hand-offs show is itself a change-readiness finding.`,
81
+ audit: buildAudit([
82
+ `signals:${leans.length}`,
83
+ `mean_lean:${(leans.reduce((a, b) => a + b, 0) / leans.length).toFixed(2)}`,
84
+ `classify:${readiness}`,
85
+ `confidence:${confidence}(coverage_base-disagreement)`,
86
+ ...(input.claimed_readiness ? [`claimed_vs_measured:${input.claimed_readiness}->${readiness}`] : []),
87
+ ], { function: input.function, signals_provided: leans.length, ...(input.claimed_readiness ? { claimed_readiness: input.claimed_readiness } : {}) }),
88
+ };
89
+ }
90
+ //# sourceMappingURL=inferReadiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferReadiness.js","sourceRoot":"","sources":["../src/inferReadiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inferReadiness.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferReadiness.test.d.ts","sourceRoot":"","sources":["../src/inferReadiness.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { inferReadiness } from './inferReadiness.js';
4
+ test('siloed-shaped signals classify siloed (procurement-flow shape)', () => {
5
+ const r = inferReadiness({ function: 'supply', handoffs: 11, rework_rate: 0.22, touch_ratio: 0.08, automation_level: 0.1, cycle_time_days: 18 });
6
+ assert.equal(r.readiness, 'siloed');
7
+ assert.equal(r.readiness_basis, 'measured');
8
+ assert.equal(r.signals_used, 5);
9
+ assert.ok(r.confidence >= 70);
10
+ });
11
+ test('agile-shaped signals classify agile (ticket-triage shape)', () => {
12
+ const r = inferReadiness({ function: 'cx', handoffs: 1, rework_rate: 0.03, touch_ratio: 0.55, automation_level: 0.6, cycle_time_days: 0.5 });
13
+ assert.equal(r.readiness, 'agile');
14
+ assert.ok(r.confidence >= 70);
15
+ });
16
+ test('middle signals classify traditional', () => {
17
+ const r = inferReadiness({ function: 'finance', handoffs: 4, rework_rate: 0.08, touch_ratio: 0.3, automation_level: 0.35, cycle_time_days: 5 });
18
+ assert.equal(r.readiness, 'traditional');
19
+ });
20
+ test('fewer signals means lower confidence', () => {
21
+ const five = inferReadiness({ function: 'supply', handoffs: 11, rework_rate: 0.22, touch_ratio: 0.08, automation_level: 0.1, cycle_time_days: 18 });
22
+ const two = inferReadiness({ function: 'supply', handoffs: 11, rework_rate: 0.22 });
23
+ assert.equal(two.readiness, 'siloed');
24
+ assert.ok(two.confidence < five.confidence);
25
+ });
26
+ test('disagreeing signals discount confidence and attach the disagreement note', () => {
27
+ const r = inferReadiness({ function: 'cx', handoffs: 6, rework_rate: 0.02, touch_ratio: 0.6, automation_level: 0.1 });
28
+ assert.ok(r.disagreement && r.disagreement.includes('disagree'));
29
+ const unanimous = inferReadiness({ function: 'cx', handoffs: 1, rework_rate: 0.02, touch_ratio: 0.6, automation_level: 0.6 });
30
+ assert.ok(r.confidence < unanimous.confidence);
31
+ });
32
+ test('fewer than two signals refuses honestly', () => {
33
+ assert.throws(() => inferReadiness({ function: 'cx', handoffs: 3 }), /at least two measured signals/);
34
+ });
35
+ test('deterministic: same signals, same answer', () => {
36
+ const a = inferReadiness({ function: 'hr', handoffs: 7, rework_rate: 0.18, touch_ratio: 0.1 });
37
+ const b = inferReadiness({ function: 'hr', handoffs: 7, rework_rate: 0.18, touch_ratio: 0.1 });
38
+ assert.deepEqual(a, b);
39
+ });
40
+ test('per-signal reads explain each lean in plain language', () => {
41
+ const r = inferReadiness({ function: 'supply', handoffs: 11, rework_rate: 0.22 });
42
+ assert.equal(r.signal_reads.length, 2);
43
+ assert.ok(r.signal_reads.every(s => s.note.length > 20 && ['agile', 'traditional', 'siloed'].includes(s.leans)));
44
+ assert.ok(!JSON.stringify(r).includes('—'), 'em-dash found in output text');
45
+ });
46
+ //# sourceMappingURL=inferReadiness.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferReadiness.test.js","sourceRoot":"","sources":["../src/inferReadiness.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../src/score.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAAE,WAAW,EACvB,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,eAAe,EAC/B,YAAY,EAAE,WAAW,EACH,MAAM,EAAE,SAAS,EACxC,MAAM,YAAY,CAAC;AAMpB,UAAU,QAAQ;IAChB,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAS/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAe3D,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;CAAkD,CAAC;AAExE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAIpB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAIxF,CAAC;AAgDF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,GACzE,YAAY,CAed;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG;IACjD,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAaA;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAgEpD;AAwBD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAoD5E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAwB7E"}
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../src/score.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAAE,WAAW,EACvB,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,eAAe,EAC/B,YAAY,EAAE,WAAW,EACH,MAAM,EAAE,SAAS,EACxC,MAAM,YAAY,CAAC;AAOpB,UAAU,QAAQ;IAChB,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAS/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAe3D,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;CAAkD,CAAC;AAExE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAIpB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAIxF,CAAC;AAgDF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,GACzE,YAAY,CAed;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG;IACjD,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAaA;AAoCD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CA8FpD;AAwBD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CA6D5E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAwB7E"}