@aibvf/core 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +30 -30
- package/README.md +51 -51
- package/dist/diagnose.d.ts +40 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +217 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/diagnose.test.d.ts +2 -0
- package/dist/diagnose.test.d.ts.map +1 -0
- package/dist/diagnose.test.js +93 -0
- package/dist/diagnose.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +1 -1
- package/dist/schema.js.map +1 -1
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +45 -26
- package/dist/inspect-node.d.ts +0 -28
- package/dist/inspect-node.d.ts.map +0 -1
- package/dist/inspect-node.js +0 -89
- package/dist/inspect-node.js.map +0 -1
- package/dist/run-trace.d.ts +0 -18
- package/dist/run-trace.d.ts.map +0 -1
- package/dist/run-trace.js +0 -112
- package/dist/run-trace.js.map +0 -1
- package/dist/templates.d.ts +0 -5
- package/dist/templates.d.ts.map +0 -1
- package/dist/templates.js +0 -211
- package/dist/templates.js.map +0 -1
- package/dist/value-trace.d.ts +0 -71
- package/dist/value-trace.d.ts.map +0 -1
- package/dist/value-trace.js +0 -119
- package/dist/value-trace.js.map +0 -1
package/LICENSE
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Craig Horton
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
Content under `./spec/` (the AI BVF Protocol specification and associated
|
|
26
|
-
JSON Schema) is licensed under Creative Commons Attribution 4.0 International
|
|
27
|
-
(CC-BY-4.0): https://creativecommons.org/licenses/by/4.0/
|
|
28
|
-
|
|
29
|
-
"AI BVF", "AI BVF Certified", and the AI BVF logo are trademarks and are not
|
|
30
|
-
licensed under MIT or CC-BY-4.0.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Craig Horton
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
Content under `./spec/` (the AI BVF Protocol specification and associated
|
|
26
|
+
JSON Schema) is licensed under Creative Commons Attribution 4.0 International
|
|
27
|
+
(CC-BY-4.0): https://creativecommons.org/licenses/by/4.0/
|
|
28
|
+
|
|
29
|
+
"AI BVF", "AI BVF Certified", and the AI BVF logo are trademarks and are not
|
|
30
|
+
licensed under MIT or CC-BY-4.0.
|
package/README.md
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
# @aibvf/core
|
|
2
|
-
|
|
3
|
-
AI BVF v1.0 — open protocol for scoring AI investments. Validator and scoring engine.
|
|
4
|
-
|
|
5
|
-
> **Source:** [github.com/Bahamas1717/ai-bvf](https://github.com/Bahamas1717/ai-bvf) · ⭐ star if this helped · [Issues](https://github.com/Bahamas1717/ai-bvf/issues) · Built by [Craig Horton Advisory](https://craighortonadvisory.com)
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @aibvf/core
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Validate a portfolio
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
import { validate } from '@aibvf/core';
|
|
15
|
-
|
|
16
|
-
const result = validate(portfolioJson);
|
|
17
|
-
if (!result.valid) console.error(result.errors);
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Score an initiative
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
import { score } from '@aibvf/core';
|
|
24
|
-
|
|
25
|
-
const r = score({
|
|
26
|
-
industry: 'manufacturing',
|
|
27
|
-
revenue_eur: 2_400_000_000,
|
|
28
|
-
function: 'supply',
|
|
29
|
-
ai_tier: 'gen2',
|
|
30
|
-
readiness: 'traditional',
|
|
31
|
-
scores: {
|
|
32
|
-
strategic_alignment: 72,
|
|
33
|
-
financial_return: 64,
|
|
34
|
-
change_enablement: 48,
|
|
35
|
-
governance_risk: 35,
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
console.log(r.classification); // 'Fix'
|
|
40
|
-
console.log(r.net_low_eur); // ~75.6M
|
|
41
|
-
console.log(r.net_high_eur); // ~247M
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Spec
|
|
45
|
-
|
|
46
|
-
Full specification at [
|
|
47
|
-
JSON Schema at [
|
|
48
|
-
|
|
49
|
-
## License
|
|
50
|
-
|
|
51
|
-
MIT. The underlying specification is CC-BY-4.0.
|
|
1
|
+
# @aibvf/core
|
|
2
|
+
|
|
3
|
+
AI BVF v1.0 — open protocol for scoring AI investments. Validator and scoring engine.
|
|
4
|
+
|
|
5
|
+
> **Source:** [github.com/Bahamas1717/ai-bvf](https://github.com/Bahamas1717/ai-bvf) · ⭐ star if this helped · [Issues](https://github.com/Bahamas1717/ai-bvf/issues) · Built by [Craig Horton Advisory](https://craighortonadvisory.com)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @aibvf/core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Validate a portfolio
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { validate } from '@aibvf/core';
|
|
15
|
+
|
|
16
|
+
const result = validate(portfolioJson);
|
|
17
|
+
if (!result.valid) console.error(result.errors);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Score an initiative
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { score } from '@aibvf/core';
|
|
24
|
+
|
|
25
|
+
const r = score({
|
|
26
|
+
industry: 'manufacturing',
|
|
27
|
+
revenue_eur: 2_400_000_000,
|
|
28
|
+
function: 'supply',
|
|
29
|
+
ai_tier: 'gen2',
|
|
30
|
+
readiness: 'traditional',
|
|
31
|
+
scores: {
|
|
32
|
+
strategic_alignment: 72,
|
|
33
|
+
financial_return: 64,
|
|
34
|
+
change_enablement: 48,
|
|
35
|
+
governance_risk: 35,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
console.log(r.classification); // 'Fix'
|
|
40
|
+
console.log(r.net_low_eur); // ~75.6M
|
|
41
|
+
console.log(r.net_high_eur); // ~247M
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Spec
|
|
45
|
+
|
|
46
|
+
Full specification at [www.aibvf.com/protocol](https://www.aibvf.com/protocol).
|
|
47
|
+
JSON Schema at [www.aibvf.com/bvf-protocol.schema.json](https://www.aibvf.com/bvf-protocol.schema.json).
|
|
48
|
+
|
|
49
|
+
## License
|
|
50
|
+
|
|
51
|
+
MIT. The underlying specification is CC-BY-4.0.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ProcessSignals, BrainVerdict, Intervention, FunctionId, EvidenceMaturity } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* AI BVF Advisor Brain — process diagnosis.
|
|
4
|
+
*
|
|
5
|
+
* Deterministic. No network. No dependencies. Implements docs/brain-spec.md
|
|
6
|
+
* (the four models) calibrated by docs/evidence-table.md (the effectiveness
|
|
7
|
+
* bands). Given observed process signals it returns a BrainVerdict: the
|
|
8
|
+
* "this is too heavy → do X → save €Y → want me to get it done?" call, with
|
|
9
|
+
* confidence governed by how much was actually measured.
|
|
10
|
+
*
|
|
11
|
+
* Reuses the kernel's READINESS_CAPTURE so an org that can't absorb change
|
|
12
|
+
* doesn't get credited the gross saving.
|
|
13
|
+
*/
|
|
14
|
+
export declare const BRAIN_VERSION = "0.1";
|
|
15
|
+
interface Band {
|
|
16
|
+
lo: number;
|
|
17
|
+
hi: number;
|
|
18
|
+
maturity: EvidenceMaturity;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* DRAFT per-function medians for normalising cycle time + handoffs into a
|
|
22
|
+
* heaviness penalty. Pending calibration vs APQC process-cost distributions
|
|
23
|
+
* (evidence-table "honest gaps"). Directional, not audited.
|
|
24
|
+
*/
|
|
25
|
+
export declare const FUNCTION_MEDIANS: Record<FunctionId, {
|
|
26
|
+
cycle_days: number;
|
|
27
|
+
handoffs: number;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Per-(function × intervention) effectiveness bands, transcribed from
|
|
31
|
+
* docs/evidence-table.md. Conservative — haircut from cited headline
|
|
32
|
+
* benchmarks. Cells absent here fall back to CROSS_CUTTING.
|
|
33
|
+
*/
|
|
34
|
+
export declare const EVIDENCE: Partial<Record<FunctionId, Partial<Record<Intervention, Band>>>>;
|
|
35
|
+
/**
|
|
36
|
+
* Diagnose one process. Deterministic: same signals in, same verdict out.
|
|
37
|
+
*/
|
|
38
|
+
export declare function diagnoseProcess(s: ProcessSignals): BrainVerdict;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=diagnose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EAAE,YAAY,EAAE,YAAY,EAC1C,UAAU,EAA6B,gBAAgB,EACxD,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,QAAQ,CAAC;AAKnC,UAAU,IAAI;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAC;CAAE;AAEtE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CASzF,CAAC;AAaF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAsCrF,CAAC;AAwBF;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,cAAc,GAAG,YAAY,CAqH/D"}
|
package/dist/diagnose.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { READINESS_CAPTURE } from './score.js';
|
|
2
|
+
/**
|
|
3
|
+
* AI BVF Advisor Brain — process diagnosis.
|
|
4
|
+
*
|
|
5
|
+
* Deterministic. No network. No dependencies. Implements docs/brain-spec.md
|
|
6
|
+
* (the four models) calibrated by docs/evidence-table.md (the effectiveness
|
|
7
|
+
* bands). Given observed process signals it returns a BrainVerdict: the
|
|
8
|
+
* "this is too heavy → do X → save €Y → want me to get it done?" call, with
|
|
9
|
+
* confidence governed by how much was actually measured.
|
|
10
|
+
*
|
|
11
|
+
* Reuses the kernel's READINESS_CAPTURE so an org that can't absorb change
|
|
12
|
+
* doesn't get credited the gross saving.
|
|
13
|
+
*/
|
|
14
|
+
export const BRAIN_VERSION = '0.1';
|
|
15
|
+
const clamp01 = (x) => Math.max(0, Math.min(1, x));
|
|
16
|
+
const round2 = (x) => Math.round(x * 100) / 100;
|
|
17
|
+
/**
|
|
18
|
+
* DRAFT per-function medians for normalising cycle time + handoffs into a
|
|
19
|
+
* heaviness penalty. Pending calibration vs APQC process-cost distributions
|
|
20
|
+
* (evidence-table "honest gaps"). Directional, not audited.
|
|
21
|
+
*/
|
|
22
|
+
export const FUNCTION_MEDIANS = {
|
|
23
|
+
finance: { cycle_days: 5, handoffs: 4 },
|
|
24
|
+
hr: { cycle_days: 7, handoffs: 4 },
|
|
25
|
+
sales: { cycle_days: 14, handoffs: 3 },
|
|
26
|
+
supply: { cycle_days: 10, handoffs: 5 },
|
|
27
|
+
cx: { cycle_days: 1, handoffs: 2 },
|
|
28
|
+
risk: { cycle_days: 7, handoffs: 4 },
|
|
29
|
+
it: { cycle_days: 2, handoffs: 3 },
|
|
30
|
+
rd: { cycle_days: 30, handoffs: 4 },
|
|
31
|
+
};
|
|
32
|
+
/** Heaviness factor weights (sum to 1.0). brain-spec §3.2. */
|
|
33
|
+
const HEAVINESS_WEIGHTS = { manual: 0.25, rework: 0.20, handoffs: 0.20, wait: 0.20, cycle: 0.15 };
|
|
34
|
+
/** Cross-cutting fallback bands (process-mining grounded). evidence-table. */
|
|
35
|
+
const CROSS_CUTTING = {
|
|
36
|
+
'Automate': { lo: 0.30, hi: 0.50, maturity: 'Medium' },
|
|
37
|
+
'Consolidate & re-sequence': { lo: 0.20, hi: 0.40, maturity: 'Medium' },
|
|
38
|
+
'Quality controls': { lo: 0.40, hi: 0.70, maturity: 'Medium' },
|
|
39
|
+
'Eliminate / insource': { lo: 0.60, hi: 0.90, maturity: 'Low' },
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Per-(function × intervention) effectiveness bands, transcribed from
|
|
43
|
+
* docs/evidence-table.md. Conservative — haircut from cited headline
|
|
44
|
+
* benchmarks. Cells absent here fall back to CROSS_CUTTING.
|
|
45
|
+
*/
|
|
46
|
+
export const EVIDENCE = {
|
|
47
|
+
finance: {
|
|
48
|
+
'Automate': { lo: 0.40, hi: 0.65, maturity: 'High' },
|
|
49
|
+
'Quality controls': { lo: 0.30, hi: 0.55, maturity: 'Medium' },
|
|
50
|
+
'Consolidate & re-sequence': { lo: 0.20, hi: 0.35, maturity: 'Medium' },
|
|
51
|
+
'Eliminate / insource': { lo: 0.50, hi: 0.80, maturity: 'Low' },
|
|
52
|
+
},
|
|
53
|
+
hr: {
|
|
54
|
+
'Automate': { lo: 0.35, hi: 0.60, maturity: 'High' },
|
|
55
|
+
'Consolidate & re-sequence': { lo: 0.20, hi: 0.35, maturity: 'Medium' },
|
|
56
|
+
'Quality controls': { lo: 0.25, hi: 0.45, maturity: 'Low' },
|
|
57
|
+
'Eliminate / insource': { lo: 0.50, hi: 0.80, maturity: 'Low' },
|
|
58
|
+
},
|
|
59
|
+
supply: {
|
|
60
|
+
'Automate': { lo: 0.25, hi: 0.45, maturity: 'Medium' },
|
|
61
|
+
'Quality controls': { lo: 0.30, hi: 0.55, maturity: 'Medium' },
|
|
62
|
+
'Consolidate & re-sequence': { lo: 0.20, hi: 0.40, maturity: 'Medium' },
|
|
63
|
+
'Eliminate / insource': { lo: 0.60, hi: 0.90, maturity: 'Low' },
|
|
64
|
+
},
|
|
65
|
+
cx: {
|
|
66
|
+
'Automate': { lo: 0.35, hi: 0.60, maturity: 'High' },
|
|
67
|
+
'Quality controls': { lo: 0.25, hi: 0.45, maturity: 'Medium' },
|
|
68
|
+
},
|
|
69
|
+
it: {
|
|
70
|
+
'Automate': { lo: 0.30, hi: 0.55, maturity: 'High' },
|
|
71
|
+
'Consolidate & re-sequence': { lo: 0.30, hi: 0.55, maturity: 'High' },
|
|
72
|
+
'Quality controls': { lo: 0.25, hi: 0.45, maturity: 'Medium' },
|
|
73
|
+
},
|
|
74
|
+
risk: {
|
|
75
|
+
'Quality controls': { lo: 0.30, hi: 0.50, maturity: 'Medium' },
|
|
76
|
+
'Automate': { lo: 0.30, hi: 0.55, maturity: 'Medium' },
|
|
77
|
+
},
|
|
78
|
+
sales: {
|
|
79
|
+
'Automate': { lo: 0.30, hi: 0.50, maturity: 'Low' },
|
|
80
|
+
},
|
|
81
|
+
rd: {
|
|
82
|
+
'Automate': { lo: 0.20, hi: 0.40, maturity: 'Medium' },
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
const MATURITY_EVIDENCE = { High: 0.9, Medium: 0.6, Low: 0.3 };
|
|
86
|
+
/** Low-volume threshold below which a heavy process is an Eliminate candidate. DRAFT. */
|
|
87
|
+
const ELIMINATE_VOLUME = 250;
|
|
88
|
+
function bandFor(fn, iv) {
|
|
89
|
+
return EVIDENCE[fn]?.[iv] ?? CROSS_CUTTING[iv];
|
|
90
|
+
}
|
|
91
|
+
function dominantFactor(d) {
|
|
92
|
+
return Object.keys(d).reduce((a, b) => (d[b] > d[a] ? b : a));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Saturated signals (penalty near 0 or 1) mean we are extrapolating beyond the
|
|
96
|
+
* range the bands were calibrated on → lower fit. Mid-range signals → high fit.
|
|
97
|
+
*/
|
|
98
|
+
function benchmarkFit(penalties) {
|
|
99
|
+
const saturated = penalties.filter(p => p > 0.95 || p < 0.05).length;
|
|
100
|
+
return clamp01(1 - saturated / penalties.length);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Diagnose one process. Deterministic: same signals in, same verdict out.
|
|
104
|
+
*/
|
|
105
|
+
export function diagnoseProcess(s) {
|
|
106
|
+
const fn = s.function;
|
|
107
|
+
const med = FUNCTION_MEDIANS[fn];
|
|
108
|
+
if (!med)
|
|
109
|
+
throw new Error(`Unknown function: ${fn}`);
|
|
110
|
+
const readiness = s.readiness ?? 'traditional';
|
|
111
|
+
const cap = READINESS_CAPTURE[readiness];
|
|
112
|
+
if (!cap)
|
|
113
|
+
throw new Error(`Unknown readiness: ${readiness}`);
|
|
114
|
+
// ── 3.1 baseline cost ("your current spend") ──
|
|
115
|
+
const labour_cost = s.instances_per_year * s.fte_hours_per_instance * s.loaded_hourly_rate_eur;
|
|
116
|
+
const baseline_cost_eur = Math.round(labour_cost + s.direct_spend_eur);
|
|
117
|
+
if (baseline_cost_eur <= 0)
|
|
118
|
+
throw new Error('baseline_cost_eur must be positive — check signal inputs');
|
|
119
|
+
// ── 3.2 heaviness index + drag decomposition ──
|
|
120
|
+
const cycle_penalty = clamp01(s.cycle_time_days / (2 * med.cycle_days));
|
|
121
|
+
const handoff_penalty = clamp01(s.handoffs / (2 * med.handoffs));
|
|
122
|
+
const rework_penalty = clamp01(s.rework_rate);
|
|
123
|
+
const manual_penalty = clamp01(1 - s.automation_level);
|
|
124
|
+
const wait_penalty = clamp01(1 - s.touch_ratio);
|
|
125
|
+
const w = HEAVINESS_WEIGHTS;
|
|
126
|
+
const weighted = {
|
|
127
|
+
manual: manual_penalty * w.manual,
|
|
128
|
+
rework: rework_penalty * w.rework,
|
|
129
|
+
handoffs: handoff_penalty * w.handoffs,
|
|
130
|
+
wait: wait_penalty * w.wait,
|
|
131
|
+
cycle: cycle_penalty * w.cycle,
|
|
132
|
+
};
|
|
133
|
+
const heavySum = weighted.manual + weighted.rework + weighted.handoffs + weighted.wait + weighted.cycle;
|
|
134
|
+
const heaviness = Math.round(100 * heavySum); // weights sum to 1, penalties 0..1 → 0..100
|
|
135
|
+
const drag_decomposition = heavySum > 0 ? {
|
|
136
|
+
manual: round2(weighted.manual / heavySum),
|
|
137
|
+
handoffs: round2(weighted.handoffs / heavySum),
|
|
138
|
+
wait: round2(weighted.wait / heavySum),
|
|
139
|
+
rework: round2(weighted.rework / heavySum),
|
|
140
|
+
cycle: round2(weighted.cycle / heavySum),
|
|
141
|
+
} : { manual: 0, handoffs: 0, wait: 0, rework: 0, cycle: 0 };
|
|
142
|
+
// ── 3.3 intervention selector + addressable fraction ──
|
|
143
|
+
const labour_fraction = clamp01(labour_cost / ((labour_cost + s.direct_spend_eur) || 1));
|
|
144
|
+
let intervention;
|
|
145
|
+
let addressable;
|
|
146
|
+
if (s.instances_per_year < ELIMINATE_VOLUME && heaviness >= 50) {
|
|
147
|
+
intervention = 'Eliminate / insource';
|
|
148
|
+
addressable = 1.0;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const dominant = dominantFactor(drag_decomposition);
|
|
152
|
+
if (dominant === 'manual') {
|
|
153
|
+
intervention = 'Automate';
|
|
154
|
+
addressable = labour_fraction;
|
|
155
|
+
}
|
|
156
|
+
else if (dominant === 'rework') {
|
|
157
|
+
intervention = 'Quality controls';
|
|
158
|
+
addressable = clamp01(s.rework_rate);
|
|
159
|
+
}
|
|
160
|
+
else { // handoffs | wait | cycle
|
|
161
|
+
intervention = 'Consolidate & re-sequence';
|
|
162
|
+
addressable = labour_fraction;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const band = bandFor(fn, intervention);
|
|
166
|
+
// ── 3.4 savings quantifier ──
|
|
167
|
+
const gross_low = baseline_cost_eur * addressable * band.lo;
|
|
168
|
+
const gross_high = baseline_cost_eur * addressable * band.hi;
|
|
169
|
+
const net_saving_low_eur = Math.round(gross_low * cap.low);
|
|
170
|
+
const net_saving_high_eur = Math.round(gross_high * cap.high);
|
|
171
|
+
const eff_mid = (band.lo + band.hi) / 2;
|
|
172
|
+
const efficiency_gain_pct = Math.round(eff_mid * addressable * 100);
|
|
173
|
+
// ── §4 decision confidence ──
|
|
174
|
+
const signal_completeness = clamp01(s.signal_completeness ?? 0.7);
|
|
175
|
+
const intervention_evidence = MATURITY_EVIDENCE[band.maturity];
|
|
176
|
+
const benchmark_fit = benchmarkFit([cycle_penalty, handoff_penalty, rework_penalty, manual_penalty, wait_penalty]);
|
|
177
|
+
const decision_confidence = round2(0.5 * signal_completeness + 0.4 * intervention_evidence + 0.1 * benchmark_fit);
|
|
178
|
+
// ── §4 verdict (on the intervention) ──
|
|
179
|
+
const net_mid = (net_saving_low_eur + net_saving_high_eur) / 2;
|
|
180
|
+
const saving_ratio = net_mid / baseline_cost_eur;
|
|
181
|
+
let verdict;
|
|
182
|
+
if (heaviness < 25 || saving_ratio < 0.02) {
|
|
183
|
+
verdict = 'Stop';
|
|
184
|
+
}
|
|
185
|
+
else if (saving_ratio >= 0.05 && decision_confidence >= 0.6) {
|
|
186
|
+
verdict = 'Accelerate';
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
verdict = 'Fix';
|
|
190
|
+
}
|
|
191
|
+
const assumptions = [
|
|
192
|
+
`loaded rate €${s.loaded_hourly_rate_eur}/hr`,
|
|
193
|
+
`${readiness} capture band ${cap.low}–${cap.high}`,
|
|
194
|
+
`evidence ${band.maturity} (effectiveness ${band.lo}–${band.hi})`,
|
|
195
|
+
`signal completeness ${signal_completeness}`,
|
|
196
|
+
'heaviness bands DRAFT — pending APQC calibration',
|
|
197
|
+
];
|
|
198
|
+
return {
|
|
199
|
+
process_id: s.process_id,
|
|
200
|
+
function: fn,
|
|
201
|
+
baseline_cost_eur,
|
|
202
|
+
heaviness,
|
|
203
|
+
drag_decomposition,
|
|
204
|
+
intervention,
|
|
205
|
+
net_saving_low_eur,
|
|
206
|
+
net_saving_high_eur,
|
|
207
|
+
efficiency_gain_pct,
|
|
208
|
+
verdict,
|
|
209
|
+
decision_confidence,
|
|
210
|
+
assumptions,
|
|
211
|
+
offer_to_execute: verdict === 'Accelerate',
|
|
212
|
+
evidence_maturity: band.maturity,
|
|
213
|
+
brain_version: BRAIN_VERSION,
|
|
214
|
+
disclaimer: 'Directional decision aid, not an audited figure.',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.test.d.ts","sourceRoot":"","sources":["../src/diagnose.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { diagnoseProcess } from './diagnose.js';
|
|
4
|
+
// A heavy, mostly-manual finance process: high volume, low automation,
|
|
5
|
+
// real rework, fully measured.
|
|
6
|
+
const heavyFinance = {
|
|
7
|
+
process_id: 'fin-ap',
|
|
8
|
+
function: 'finance',
|
|
9
|
+
instances_per_year: 50_000,
|
|
10
|
+
fte_hours_per_instance: 0.5,
|
|
11
|
+
loaded_hourly_rate_eur: 60,
|
|
12
|
+
cycle_time_days: 12,
|
|
13
|
+
touch_ratio: 0.3,
|
|
14
|
+
handoffs: 6,
|
|
15
|
+
rework_rate: 0.25,
|
|
16
|
+
automation_level: 0.1,
|
|
17
|
+
direct_spend_eur: 200_000,
|
|
18
|
+
signal_completeness: 0.9,
|
|
19
|
+
readiness: 'traditional',
|
|
20
|
+
};
|
|
21
|
+
test('baseline cost = labour + direct spend', () => {
|
|
22
|
+
const v = diagnoseProcess(heavyFinance);
|
|
23
|
+
// 50000 * 0.5 * 60 = 1_500_000 + 200_000 = 1_700_000
|
|
24
|
+
assert.equal(v.baseline_cost_eur, 1_700_000);
|
|
25
|
+
});
|
|
26
|
+
test('deterministic: same input → identical output', () => {
|
|
27
|
+
assert.deepEqual(diagnoseProcess(heavyFinance), diagnoseProcess(heavyFinance));
|
|
28
|
+
});
|
|
29
|
+
test('heavy manual finance process → Automate + Accelerate + offer', () => {
|
|
30
|
+
const v = diagnoseProcess(heavyFinance);
|
|
31
|
+
assert.equal(v.intervention, 'Automate');
|
|
32
|
+
assert.equal(v.verdict, 'Accelerate');
|
|
33
|
+
assert.equal(v.offer_to_execute, true);
|
|
34
|
+
assert.equal(v.evidence_maturity, 'High'); // finance×Automate
|
|
35
|
+
});
|
|
36
|
+
test('bounds: heaviness 0..100, confidence 0..1, savings ordered', () => {
|
|
37
|
+
const v = diagnoseProcess(heavyFinance);
|
|
38
|
+
assert.ok(v.heaviness >= 0 && v.heaviness <= 100);
|
|
39
|
+
assert.ok(v.decision_confidence >= 0 && v.decision_confidence <= 1);
|
|
40
|
+
assert.ok(v.net_saving_low_eur <= v.net_saving_high_eur);
|
|
41
|
+
const sum = Object.values(v.drag_decomposition).reduce((a, b) => a + b, 0);
|
|
42
|
+
assert.ok(Math.abs(sum - 1) < 0.02); // decomposition normalised
|
|
43
|
+
});
|
|
44
|
+
test('light process → low heaviness → Stop', () => {
|
|
45
|
+
const light = {
|
|
46
|
+
...heavyFinance,
|
|
47
|
+
process_id: 'fin-light',
|
|
48
|
+
automation_level: 0.95,
|
|
49
|
+
rework_rate: 0.01,
|
|
50
|
+
handoffs: 1,
|
|
51
|
+
touch_ratio: 0.95,
|
|
52
|
+
cycle_time_days: 1,
|
|
53
|
+
};
|
|
54
|
+
const v = diagnoseProcess(light);
|
|
55
|
+
assert.ok(v.heaviness < 25, `expected light, got heaviness ${v.heaviness}`);
|
|
56
|
+
assert.equal(v.verdict, 'Stop');
|
|
57
|
+
});
|
|
58
|
+
test('low signal completeness drags confidence down', () => {
|
|
59
|
+
const blind = { ...heavyFinance, signal_completeness: 0.2 };
|
|
60
|
+
const seen = diagnoseProcess(heavyFinance).decision_confidence;
|
|
61
|
+
const unseen = diagnoseProcess(blind).decision_confidence;
|
|
62
|
+
assert.ok(unseen < seen, `expected ${unseen} < ${seen}`);
|
|
63
|
+
});
|
|
64
|
+
test('evidence fallback: rework-dominant sales uses cross-cutting Quality band', () => {
|
|
65
|
+
const sales = {
|
|
66
|
+
process_id: 'sales-rework',
|
|
67
|
+
function: 'sales',
|
|
68
|
+
instances_per_year: 10_000,
|
|
69
|
+
fte_hours_per_instance: 1,
|
|
70
|
+
loaded_hourly_rate_eur: 70,
|
|
71
|
+
cycle_time_days: 5,
|
|
72
|
+
touch_ratio: 0.8,
|
|
73
|
+
handoffs: 2,
|
|
74
|
+
rework_rate: 0.9, // rework dominates → Quality controls
|
|
75
|
+
automation_level: 0.8,
|
|
76
|
+
direct_spend_eur: 0,
|
|
77
|
+
signal_completeness: 0.8,
|
|
78
|
+
};
|
|
79
|
+
const v = diagnoseProcess(sales);
|
|
80
|
+
assert.equal(v.intervention, 'Quality controls');
|
|
81
|
+
// sales has no Quality cell → cross-cutting Medium
|
|
82
|
+
assert.equal(v.evidence_maturity, 'Medium');
|
|
83
|
+
});
|
|
84
|
+
test('low-volume heavy process → Eliminate / insource', () => {
|
|
85
|
+
const niche = {
|
|
86
|
+
...heavyFinance,
|
|
87
|
+
process_id: 'fin-niche',
|
|
88
|
+
instances_per_year: 100, // below ELIMINATE_VOLUME
|
|
89
|
+
};
|
|
90
|
+
const v = diagnoseProcess(niche);
|
|
91
|
+
assert.equal(v.intervention, 'Eliminate / insource');
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=diagnose.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.test.js","sourceRoot":"","sources":["../src/diagnose.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { validate } from './validate.js';
|
|
2
2
|
export { score, recommendImprovements, calculatePaceLayerDrag, BASE_RATES, IND_MULT, TIER_ADJ, READINESS_CAPTURE, PACE_DRAG_RATE, } from './score.js';
|
|
3
|
+
export { diagnoseProcess, BRAIN_VERSION, EVIDENCE, FUNCTION_MEDIANS, } from './diagnose.js';
|
|
3
4
|
export { bvfSchema } from './schema.js';
|
|
4
5
|
export { INDUSTRIES, FUNCTIONS, AI_TIERS, READINESS, INDUSTRY_LABEL, FUNCTION_LABEL, TIER_LABEL } from './taxonomy.js';
|
|
5
6
|
export type * from './types.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,GAClE,MAAM,YAAY,CAAC;AACpB,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,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,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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { validate } from './validate.js';
|
|
2
2
|
export { score, recommendImprovements, calculatePaceLayerDrag, BASE_RATES, IND_MULT, TIER_ADJ, READINESS_CAPTURE, PACE_DRAG_RATE, } from './score.js';
|
|
3
|
+
export { diagnoseProcess, BRAIN_VERSION, EVIDENCE, FUNCTION_MEDIANS, } from './diagnose.js';
|
|
3
4
|
export { bvfSchema } from './schema.js';
|
|
4
5
|
export { INDUSTRIES, FUNCTIONS, AI_TIERS, READINESS, INDUSTRY_LABEL, FUNCTION_LABEL, TIER_LABEL } from './taxonomy.js';
|
|
5
6
|
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,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,GAClE,MAAM,YAAY,CAAC;AACpB,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,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,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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare const bvfSchema: {
|
|
6
6
|
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
7
|
-
readonly $id: "https://
|
|
7
|
+
readonly $id: "https://www.aibvf.com/bvf-protocol.schema.json";
|
|
8
8
|
readonly title: "AI BVF Portfolio v1.0";
|
|
9
9
|
readonly type: "object";
|
|
10
10
|
readonly required: readonly ["bvf_version", "organization", "initiatives"];
|
package/dist/schema.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export const bvfSchema = {
|
|
6
6
|
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
7
|
-
$id: 'https://
|
|
7
|
+
$id: 'https://www.aibvf.com/bvf-protocol.schema.json',
|
|
8
8
|
title: 'AI BVF Portfolio v1.0',
|
|
9
9
|
type: 'object',
|
|
10
10
|
required: ['bvf_version', 'organization', 'initiatives'],
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,8CAA8C;IACvD,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,8CAA8C;IACvD,GAAG,EAAE,gDAAgD;IACrD,KAAK,EAAE,uBAAuB;IAC9B,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC;IACxD,UAAU,EAAE;QACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;QAC7C,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;QACrD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;YAC9B,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,YAAY,EAAC,WAAW,EAAC,eAAe,EAAC,WAAW,EAAC,cAAc,EAAC,eAAe,EAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,CAAC;iBACxL;gBACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;aAC3C;SACF;QACD,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;KAC5C;CACO,CAAC"}
|