@helix3/helix-cli 0.1.22-helix3.413 → 0.1.22-helix3.415

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.
Files changed (35) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +8 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/tsconfig.build.tsbuildinfo +1 -1
  5. package/dist/vehicle/audio.d.ts +52 -2
  6. package/dist/vehicle/audio.js +177 -9
  7. package/dist/vehicle/audio.js.map +1 -1
  8. package/dist/vehicle/audioDefects.d.ts +40 -0
  9. package/dist/vehicle/audioDefects.js +62 -0
  10. package/dist/vehicle/audioDefects.js.map +1 -1
  11. package/dist/vehicle/audioDistinct.d.ts +62 -0
  12. package/dist/vehicle/audioDistinct.js +479 -0
  13. package/dist/vehicle/audioDistinct.js.map +1 -0
  14. package/dist/vehicle/audioReference.d.ts +36 -0
  15. package/dist/vehicle/audioReference.js +176 -0
  16. package/dist/vehicle/audioReference.js.map +1 -0
  17. package/dist/vehicle/drive.js +4 -2
  18. package/dist/vehicle/drive.js.map +1 -1
  19. package/dist/vehicle/enginePolicy.d.ts +68 -0
  20. package/dist/vehicle/enginePolicy.js +209 -0
  21. package/dist/vehicle/enginePolicy.js.map +1 -0
  22. package/dist/vehicle/simulate.d.ts +10 -1
  23. package/dist/vehicle/simulate.js +7 -1
  24. package/dist/vehicle/simulate.js.map +1 -1
  25. package/dist/vehicle/validate.js +8 -1
  26. package/dist/vehicle/validate.js.map +1 -1
  27. package/docs/vehicle-simulate.md +16 -0
  28. package/package.json +1 -1
  29. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  30. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  31. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  32. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  33. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  34. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  35. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REFERENCE_ERROR_FACTOR = exports.REFERENCE_WARN_FACTOR = void 0;
4
+ exports.roughness = roughness;
5
+ exports.timbreMetrics = timbreMetrics;
6
+ exports.compareToReference = compareToReference;
7
+ exports.loadReferenceClip = loadReferenceClip;
8
+ exports.loadReferenceClips = loadReferenceClips;
9
+ /**
10
+ * Compare a sound with a recording of the real thing: the gate that needs a reference the CLI cannot invent.
11
+ *
12
+ * The caller supplies a clip of the real car (an idle recording for the engine, optionally one per slot: horn,
13
+ * startup, ...). The same three cheap timbre measures are taken from the clip and from the candidate sound with ONE
14
+ * implementation, so a method difference can never read as a timbre difference:
15
+ *
16
+ * - spectral centroid: the amplitude-weighted mean frequency, 20 Hz - 10 kHz (a bright or dull voice);
17
+ * - roughness: the depth of the 8-60 Hz amplitude modulation of the 150 Hz - 2.5 kHz band (firing lumpiness; a
18
+ * smoothed-over synthetic engine is lower, an exaggerated chug is higher).
19
+ *
20
+ * A field recording is not a studio take: mic distance, wind and the recorder's EQ move every one of these by a
21
+ * factor of 2-4 between two honest recordings of the SAME car (four idle recordings of one car measured 273-1324 Hz
22
+ * centroid), so the tolerance is a factor, WARN outside 2.5x and ERROR outside 10x, not a percentage. Several reference
23
+ * clips for one slot are reduced to their median.
24
+ */
25
+ const node_child_process_1 = require("node:child_process");
26
+ const node_fs_1 = require("node:fs");
27
+ const node_path_1 = require("node:path");
28
+ const audioSpectral_1 = require("./audioSpectral");
29
+ /** WARN when candidate / reference falls outside [1/WARN, WARN]; ERROR outside [1/ERROR, ERROR]. */
30
+ exports.REFERENCE_WARN_FACTOR = 2.5;
31
+ exports.REFERENCE_ERROR_FACTOR = 10;
32
+ const SECONDS = 6;
33
+ function centred(samples, sr, seconds) {
34
+ const cap = Math.floor(sr * seconds);
35
+ if (samples.length <= cap)
36
+ return samples;
37
+ const start = Math.floor((samples.length - cap) / 2);
38
+ return samples.subarray(start, start + cap);
39
+ }
40
+ /** Zero everything outside [lo, hi] Hz in a spectrum of `size` points (both halves). */
41
+ function bandpass(re, im, sr, lo, hi) {
42
+ const size = re.length;
43
+ for (let k = 0; k <= size / 2; k += 1) {
44
+ const hz = (k * sr) / size;
45
+ if (hz < lo || hz > hi) {
46
+ re[k] = 0;
47
+ im[k] = 0;
48
+ if (k > 0 && k < size / 2) {
49
+ re[size - k] = 0;
50
+ im[size - k] = 0;
51
+ }
52
+ }
53
+ }
54
+ }
55
+ function inverse(re, im) {
56
+ const n = re.length;
57
+ const r = Float64Array.from(re);
58
+ const i = new Float64Array(n);
59
+ for (let k = 0; k < n; k += 1)
60
+ i[k] = -im[k];
61
+ (0, audioSpectral_1.fft)(r, i);
62
+ for (let k = 0; k < n; k += 1) {
63
+ r[k] /= n;
64
+ i[k] = -i[k] / n;
65
+ }
66
+ return { re: r, im: i };
67
+ }
68
+ /** Depth of the 8-60 Hz amplitude modulation of the 150 Hz - 2.5 kHz band, relative to its mean level. */
69
+ function roughness(samples, sr) {
70
+ const x = centred(samples, sr, SECONDS);
71
+ const size = (0, audioSpectral_1.pow2ceil)(x.length);
72
+ const re = new Float64Array(size);
73
+ const im = new Float64Array(size);
74
+ let mean = 0;
75
+ for (let i = 0; i < x.length; i += 1)
76
+ mean += x[i];
77
+ mean /= Math.max(1, x.length);
78
+ for (let i = 0; i < x.length; i += 1)
79
+ re[i] = x[i] - mean;
80
+ (0, audioSpectral_1.fft)(re, im);
81
+ bandpass(re, im, sr, 150, Math.min(2500, sr * 0.45));
82
+ // analytic signal: keep the positive half, doubled
83
+ for (let k = 1; k < size / 2; k += 1) {
84
+ re[k] *= 2;
85
+ im[k] *= 2;
86
+ }
87
+ for (let k = size / 2 + 1; k < size; k += 1) {
88
+ re[k] = 0;
89
+ im[k] = 0;
90
+ }
91
+ const an = inverse(re, im);
92
+ const env = new Float64Array(x.length);
93
+ let envMean = 0;
94
+ for (let i = 0; i < x.length; i += 1) {
95
+ env[i] = Math.hypot(an.re[i], an.im[i]);
96
+ envMean += env[i];
97
+ }
98
+ envMean /= Math.max(1, x.length);
99
+ if (!(envMean > 1e-9))
100
+ return 0;
101
+ const r2 = new Float64Array(size);
102
+ const i2 = new Float64Array(size);
103
+ r2.set(env);
104
+ (0, audioSpectral_1.fft)(r2, i2);
105
+ bandpass(r2, i2, sr, 8, 60);
106
+ const m = inverse(r2, i2).re;
107
+ let ss = 0;
108
+ for (let i = 0; i < x.length; i += 1)
109
+ ss += m[i] * m[i];
110
+ return Math.sqrt(ss / x.length) / envMean;
111
+ }
112
+ function timbreMetrics(samples, sr) {
113
+ const x = centred(samples, sr, SECONDS);
114
+ const { f, p } = (0, audioSpectral_1.welchFine)(x, sr);
115
+ const hi = Math.min(10000, sr * 0.45);
116
+ let a = 0;
117
+ let af = 0;
118
+ for (let i = 0; i < f.length; i += 1) {
119
+ if (f[i] >= 20 && f[i] <= hi) {
120
+ const amp = Math.sqrt(p[i]);
121
+ a += amp;
122
+ af += amp * f[i];
123
+ }
124
+ }
125
+ return { centroidHz: a > 0 ? af / a : 0, roughness: roughness(samples, sr), seconds: samples.length / sr };
126
+ }
127
+ const median = (v) => {
128
+ const s = [...v].sort((p, q) => p - q);
129
+ return s.length === 0 ? 0 : s.length % 2 ? s[(s.length - 1) / 2] : (s[s.length / 2 - 1] + s[s.length / 2]) / 2;
130
+ };
131
+ /** Candidate timbre against one or more reference clips of the same sound (median over the references). */
132
+ function compareToReference(candidate, references) {
133
+ if (references.length === 0)
134
+ return [];
135
+ const rows = [
136
+ ['centroid', 'spectral centroid', candidate.centroidHz, median(references.map((r) => r.centroidHz))],
137
+ ['roughness', 'roughness (8-60 Hz modulation depth)', candidate.roughness, median(references.map((r) => r.roughness))],
138
+ ];
139
+ return rows.map(([metric, label, c, r]) => {
140
+ const ratio = r > 0 && c > 0 ? c / r : r > 0 ? 0 : 1;
141
+ const dev = ratio > 0 ? Math.max(ratio, 1 / ratio) : Infinity;
142
+ return { metric, label, candidate: c, reference: r, ratio, level: dev > exports.REFERENCE_ERROR_FACTOR ? 'error' : dev > exports.REFERENCE_WARN_FACTOR ? 'warn' : 'ok' };
143
+ });
144
+ }
145
+ /** Decode a reference clip: a WAV directly; any other format (mp3, m4a, ogg, webm) through `ffmpeg` when it is installed. */
146
+ function loadReferenceClip(path) {
147
+ const file = (0, node_path_1.resolve)(path);
148
+ if (!(0, node_fs_1.existsSync)(file))
149
+ throw new Error(`reference clip ${path} does not exist`);
150
+ let bytes = new Uint8Array((0, node_fs_1.readFileSync)(file));
151
+ const isWav = bytes.length > 12 && Buffer.from(bytes.subarray(0, 4)).toString('ascii') === 'RIFF' && Buffer.from(bytes.subarray(8, 12)).toString('ascii') === 'WAVE';
152
+ if (!isWav) {
153
+ const r = (0, node_child_process_1.spawnSync)('ffmpeg', ['-v', 'error', '-i', file, '-ac', '1', '-ar', '44100', '-c:a', 'pcm_s16le', '-f', 'wav', '-'], { maxBuffer: 512 * 1024 * 1024 });
154
+ if (r.error || r.status !== 0 || !r.stdout?.length) {
155
+ throw new Error(`reference clip ${path} is not a WAV and ffmpeg could not convert it (${r.error?.message ?? r.stderr?.toString().trim() ?? 'not installed'}); convert it first: ffmpeg -i ${(0, node_path_1.basename)(path)} -ac 1 -ar 44100 -c:a pcm_s16le reference.wav`);
156
+ }
157
+ bytes = new Uint8Array(r.stdout);
158
+ }
159
+ const { samples, sampleRate } = (0, audioSpectral_1.decodeWavMono)(bytes, true);
160
+ return { source: (0, node_path_1.basename)(path), samples, sampleRate };
161
+ }
162
+ /**
163
+ * `--reference` values: `clip` (the engine at idle) or `slot=clip` (a named slot: `horn=horn.wav`, `startup=start.wav`).
164
+ * Repeat a slot to give several clips of it; the median is compared.
165
+ */
166
+ function loadReferenceClips(values) {
167
+ const bySlot = new Map();
168
+ for (const value of values) {
169
+ const m = /^([A-Za-z][A-Za-z0-9]*)=(.+)$/.exec(value);
170
+ const slot = m && !(0, node_fs_1.existsSync)(value) ? m[1] : 'idle';
171
+ const path = m && !(0, node_fs_1.existsSync)(value) ? m[2] : value;
172
+ bySlot.set(slot, [...(bySlot.get(slot) ?? []), loadReferenceClip(path)]);
173
+ }
174
+ return { bySlot };
175
+ }
176
+ //# sourceMappingURL=audioReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioReference.js","sourceRoot":"","sources":["../../src/vehicle/audioReference.ts"],"names":[],"mappings":"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"}
@@ -136,8 +136,10 @@ function foldPart(hc, pkg, ops, slotType) {
136
136
  }
137
137
  async function measureDrive(hc, pkg, ops, slotType) {
138
138
  const { tuning: t, warnings } = foldPart(hc, pkg, ops, slotType);
139
- const physics = (pkg.physics ?? {});
140
- const c = await hc.measureVehicle(t, { speedLimitKph: physics.engine?.speedLimiterKph?.value ?? null });
139
+ // UNGOVERNED, always: the live runtime never applies `physics.engine.speedLimiterKph` (only the instrument reads it), so
140
+ // a governed package would pin the base and the fitted top speed at the same limiter and hide every engine, gearbox
141
+ // and ECU effect on it. Identical to the old call for any package without a limiter.
142
+ const c = await hc.measureVehicle(t, { speedLimitKph: null });
141
143
  const pedal = await stop(hc, t, 60 * MPH, { brake: exports.PART_PEDAL });
142
144
  const hb = await stop(hc, t, 60 * KPH, { brake: 0, handbrake: 1 });
143
145
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/vehicle/drive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/vehicle/drive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * ENGINE POLICY: two modelling rules the platform car follows, checked from the package alone (plus, when a simulation
3
+ * ran, the instrument's own ungoverned top speed).
4
+ *
5
+ * 1. THE PLATFORM CAR RUNS UNGOVERNED. A market or gentlemen's-agreement speed governor (a domestic-market 180 km/h cap,
6
+ * a 250 km/h agreement) is a rule about the car, not the car's physics. `physics.engine.speedLimiterKph` is read by
7
+ * the engine's INSTRUMENT only (`measureVehicle({ speedLimitKph })`); the live land solver never applies it, so
8
+ * authoring one makes the instrument, `targets.topSpeedKph`, the description and the gates say "180" about a car that
9
+ * really drives at its drag-limited speed. A limiter far below the ungoverned top speed is therefore a WARN.
10
+ * 2. THE TORQUE CURVE TARGETS THE DECLARED CRANK FIGURES. The maker's peak torque and power, at the crank, are the
11
+ * target. Real-world losses live in `drivetrainEfficiency` and aero drag, and 0-100 / top speed are met with grip,
12
+ * gearing and launch, never with an engine inflated to a dyno figure or a speed number.
13
+ *
14
+ * Both are WARNINGS: the declared figures are read from prose (manufacturer citation titles), not a structured field, so
15
+ * a hard error could refuse a legitimate car on a misread; `helix vehicle validate` and `simulate` print them with the
16
+ * fix. Everything here is generic: it names no car.
17
+ */
18
+ import type { VehicleIssue } from './validate';
19
+ /** A limiter below this fraction of the ungoverned top speed is a market governor, not the car's physics. */
20
+ export declare const GOVERNOR_FRACTION = 0.9;
21
+ /** The authored curve (and the fields that state it) may exceed the declared crank figure by this much. */
22
+ export declare const DECLARED_FIGURE_TOLERANCE = 0.05;
23
+ /** Peak torque figures quoted in `text`, as N·m. Accepts N·m / N.m / Nm, kgm and lb-ft. */
24
+ export declare function torquesNm(text: string): number[];
25
+ /** Peak power figures quoted in `text`, as kW. Accepts kW, PS / CV, hp / bhp. */
26
+ export declare function powersKw(text: string): number[];
27
+ export interface DeclaredFigures {
28
+ torqueNm: number | null;
29
+ powerKw: number | null;
30
+ /** Where each figure came from: a manufacturer citation id, or the package's own peak field. */
31
+ torqueFrom: string | null;
32
+ powerFrom: string | null;
33
+ }
34
+ /**
35
+ * The maker's declared crank figures. A `manufacturer` citation that quotes them wins; with none, the package's own
36
+ * `physics.engine.peakTorqueNm` / `peakPowerKw` stand in. When several manufacturer citations quote different figures
37
+ * (variants), the largest is used: the check only ever flags a curve ABOVE every declared figure.
38
+ */
39
+ export declare function declaredCrankFigures(pkg: unknown): DeclaredFigures;
40
+ /** One authored crank curve: `physics.engine.torqueCurve` and, separately, the one the land solver runs. */
41
+ export interface AuthoredCurve {
42
+ path: string;
43
+ points: Array<[number, number]>;
44
+ }
45
+ /**
46
+ * Every authored crank curve. The package states one (`physics.engine.torqueCurve`) and the land solver runs another
47
+ * (`simulation.land.driveline.engine.torqueCurve.points`); editing only the first changes nothing in the simulation, so
48
+ * both are held to the declared figures.
49
+ */
50
+ export declare function authoredCurves(pkg: unknown): AuthoredCurve[];
51
+ export interface EnginePolicyOptions {
52
+ /** The instrument's ungoverned top speed, km/h, used when the package declares no `targets.ungovernedTopSpeedKph`. */
53
+ simulatedUngovernedKph?: number | null;
54
+ }
55
+ /** The speed-governor rule. */
56
+ export declare function speedGovernorIssues(pkg: unknown, opts?: EnginePolicyOptions): VehicleIssue[];
57
+ /** The torque rule: no authored curve may exceed the declared crank figures by more than ~5 %. */
58
+ export declare function declaredTorqueIssues(pkg: unknown): VehicleIssue[];
59
+ /**
60
+ * AWD authoring: the land solver reads the split from `simulation.land.driveline.centre`, but each wheel's `powered` flag
61
+ * comes from `physics.driveBiasFront` (front wheels powered iff it is above 0, rear wheels iff it is below 1). An AWD car
62
+ * whose bias is exactly 0 or 1 therefore has an unpowered axle whatever its centre diff says (measured: the front axle
63
+ * got 0 % of the drive and the car lost a third of its top speed). Inside (0, 1) the bias is the nominal front share, so
64
+ * it should agree with `centre.torqueSplit`.
65
+ */
66
+ export declare function awdBiasIssues(pkg: unknown): VehicleIssue[];
67
+ /** Every engine-policy finding for a package. */
68
+ export declare function enginePolicyIssues(pkg: unknown, opts?: EnginePolicyOptions): VehicleIssue[];
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DECLARED_FIGURE_TOLERANCE = exports.GOVERNOR_FRACTION = void 0;
4
+ exports.torquesNm = torquesNm;
5
+ exports.powersKw = powersKw;
6
+ exports.declaredCrankFigures = declaredCrankFigures;
7
+ exports.authoredCurves = authoredCurves;
8
+ exports.speedGovernorIssues = speedGovernorIssues;
9
+ exports.declaredTorqueIssues = declaredTorqueIssues;
10
+ exports.awdBiasIssues = awdBiasIssues;
11
+ exports.enginePolicyIssues = enginePolicyIssues;
12
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
13
+ const finite = (v) => typeof v === 'number' && Number.isFinite(v);
14
+ /** A limiter below this fraction of the ungoverned top speed is a market governor, not the car's physics. */
15
+ exports.GOVERNOR_FRACTION = 0.9;
16
+ /** The authored curve (and the fields that state it) may exceed the declared crank figure by this much. */
17
+ exports.DECLARED_FIGURE_TOLERANCE = 0.05;
18
+ const sourcedValue = (block) => (isRecord(block) && finite(block.value) ? block.value : null);
19
+ // ── declared crank figures ──────────────────────────────────────────────────────────────────────────────────────────
20
+ const NUM = String.raw `(\d{1,3}(?:,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?)`;
21
+ const toNumber = (s) => Number(s.replace(/,/g, ''));
22
+ const matchAll = (text, re) => [...text.matchAll(re)].map((m) => toNumber(m[1]));
23
+ /** Peak torque figures quoted in `text`, as N·m. Accepts N·m / N.m / Nm, kgm and lb-ft. */
24
+ function torquesNm(text) {
25
+ return [
26
+ ...matchAll(text, new RegExp(`${NUM}\\s*N\\s*[·.•\\-\\s]?\\s*m(?![a-z])`, 'gi')),
27
+ ...matchAll(text, new RegExp(`${NUM}\\s*kgf?\\s*[·.•\\-\\s]?\\s*m(?![a-z])`, 'gi')).map((v) => v * 9.80665),
28
+ ...matchAll(text, new RegExp(`${NUM}\\s*lb\\s*[·.•\\-\\s]?\\s*ft(?![a-z])`, 'gi')).map((v) => v * 1.355818),
29
+ ].filter((v) => v >= 20 && v <= 20000);
30
+ }
31
+ /** Peak power figures quoted in `text`, as kW. Accepts kW, PS / CV, hp / bhp. */
32
+ function powersKw(text) {
33
+ return [
34
+ ...matchAll(text, new RegExp(`${NUM}\\s*kW(?![a-z])`, 'g')),
35
+ ...matchAll(text, new RegExp(`${NUM}\\s*(?:PS|CV)(?![a-z])`, 'g')).map((v) => v * 0.7355),
36
+ ...matchAll(text, new RegExp(`${NUM}\\s*(?:b?hp)(?![a-z])`, 'gi')).map((v) => v * 0.7457),
37
+ ].filter((v) => v >= 3 && v <= 20000);
38
+ }
39
+ /** A citation that states the AXLE or WHEEL output (a dyno), not the crank, is not a declared crank figure. */
40
+ const WHEEL_FIGURE = /\b(at the wheels?|whp|wheel horsepower|chassis dyno|dyno|rwhp|awhp)\b/i;
41
+ /**
42
+ * The maker's declared crank figures. A `manufacturer` citation that quotes them wins; with none, the package's own
43
+ * `physics.engine.peakTorqueNm` / `peakPowerKw` stand in. When several manufacturer citations quote different figures
44
+ * (variants), the largest is used: the check only ever flags a curve ABOVE every declared figure.
45
+ */
46
+ function declaredCrankFigures(pkg) {
47
+ const p = isRecord(pkg) ? pkg : {};
48
+ const engine = isRecord(p.physics) && isRecord(p.physics.engine) ? p.physics.engine : {};
49
+ let torqueNm = null;
50
+ let powerKw = null;
51
+ let torqueFrom = null;
52
+ let powerFrom = null;
53
+ for (const c of Array.isArray(p.citations) ? p.citations : []) {
54
+ if (!isRecord(c) || c.kind !== 'manufacturer' || typeof c.title !== 'string' || WHEEL_FIGURE.test(c.title))
55
+ continue;
56
+ const id = typeof c.id === 'string' ? c.id : 'citation';
57
+ const t = torquesNm(c.title);
58
+ const w = powersKw(c.title);
59
+ if (t.length > 0 && (torqueNm === null || Math.max(...t) > torqueNm)) {
60
+ torqueNm = Math.max(...t);
61
+ torqueFrom = id;
62
+ }
63
+ if (w.length > 0 && (powerKw === null || Math.max(...w) > powerKw)) {
64
+ powerKw = Math.max(...w);
65
+ powerFrom = id;
66
+ }
67
+ }
68
+ if (torqueNm === null) {
69
+ const own = sourcedValue(engine.peakTorqueNm);
70
+ if (own !== null) {
71
+ torqueNm = own;
72
+ torqueFrom = 'physics.engine.peakTorqueNm';
73
+ }
74
+ }
75
+ if (powerKw === null) {
76
+ const own = sourcedValue(engine.peakPowerKw);
77
+ if (own !== null) {
78
+ powerKw = own;
79
+ powerFrom = 'physics.engine.peakPowerKw';
80
+ }
81
+ }
82
+ return { torqueNm, powerKw, torqueFrom, powerFrom };
83
+ }
84
+ const pairs = (lut) => Array.isArray(lut) ? lut.filter((pt) => Array.isArray(pt) && finite(pt[0]) && finite(pt[1])).map((pt) => [pt[0], pt[1]]) : [];
85
+ /**
86
+ * Every authored crank curve. The package states one (`physics.engine.torqueCurve`) and the land solver runs another
87
+ * (`simulation.land.driveline.engine.torqueCurve.points`); editing only the first changes nothing in the simulation, so
88
+ * both are held to the declared figures.
89
+ */
90
+ function authoredCurves(pkg) {
91
+ const p = isRecord(pkg) ? pkg : {};
92
+ const engine = isRecord(p.physics) && isRecord(p.physics.engine) ? p.physics.engine : {};
93
+ const land = isRecord(p.simulation) && isRecord(p.simulation.land) ? p.simulation.land : {};
94
+ const dl = isRecord(land.driveline) && isRecord(land.driveline.engine) ? land.driveline.engine : {};
95
+ const out = [];
96
+ const physics = pairs(isRecord(engine.torqueCurve) ? engine.torqueCurve.value : undefined);
97
+ if (physics.length >= 2)
98
+ out.push({ path: 'physics.engine.torqueCurve', points: physics });
99
+ const solver = pairs(isRecord(dl.torqueCurve) ? dl.torqueCurve.points : undefined);
100
+ if (solver.length >= 2)
101
+ out.push({ path: 'simulation.land.driveline.engine.torqueCurve.points', points: solver });
102
+ return out;
103
+ }
104
+ const f0 = (v) => String(Math.round(v));
105
+ const pct = (v) => `${v >= 0 ? '+' : ''}${(v * 100).toFixed(1)} %`;
106
+ /** The speed-governor rule. */
107
+ function speedGovernorIssues(pkg, opts = {}) {
108
+ const p = isRecord(pkg) ? pkg : {};
109
+ const engine = isRecord(p.physics) && isRecord(p.physics.engine) ? p.physics.engine : {};
110
+ const limiter = sourcedValue(engine.speedLimiterKph);
111
+ if (limiter === null || limiter <= 0)
112
+ return [];
113
+ const targets = isRecord(p.targets) ? p.targets : {};
114
+ const declared = sourcedValue(targets.ungovernedTopSpeedKph);
115
+ const simulated = finite(opts.simulatedUngovernedKph) ? opts.simulatedUngovernedKph : null;
116
+ const reference = declared ?? simulated;
117
+ if (reference === null || reference <= 0 || limiter >= exports.GOVERNOR_FRACTION * reference)
118
+ return [];
119
+ const basis = declared !== null ? `targets.ungovernedTopSpeedKph ${f0(declared)} km/h` : `the instrument's ungoverned top speed ${f0(simulated)} km/h`;
120
+ const topTarget = sourcedValue(targets.topSpeedKph);
121
+ return [{
122
+ code: 'SPEED_LIMITER_IS_A_MARKET_GOVERNOR',
123
+ level: 'warn',
124
+ path: 'physics.engine.speedLimiterKph',
125
+ message: `speedLimiterKph ${f0(limiter)} km/h is below ${Math.round(exports.GOVERNOR_FRACTION * 100)} % of ${basis}: a market or agreement governor is not the car's physics. The platform car runs UNGOVERNED (the live land solver never applies this field; only the instrument does), so the limiter just pins simulate/validate and any top-speed target${topTarget !== null ? ` (targets.topSpeedKph ${f0(topTarget)})` : ''} at ${f0(limiter)} km/h while the car really drives at its drag-limited speed`,
126
+ fix: 'set physics.engine.speedLimiterKph.value to null, set targets.topSpeedKph to the ungoverned figure (the same as targets.ungovernedTopSpeedKph), and mention the real governor only in the description / market text. No add-on can toggle it: an ECU add-on has no op path for a speed limiter, and the live runtime has none to toggle — skills/helix-vehicles/references/physics-from-specs.md "Top speed: governed vs ungoverned"',
127
+ }];
128
+ }
129
+ /** The torque rule: no authored curve may exceed the declared crank figures by more than ~5 %. */
130
+ function declaredTorqueIssues(pkg) {
131
+ const curves = authoredCurves(pkg);
132
+ if (curves.length === 0)
133
+ return [];
134
+ const declared = declaredCrankFigures(pkg);
135
+ const p = isRecord(pkg) ? pkg : {};
136
+ const engine = isRecord(p.physics) && isRecord(p.physics.engine) ? p.physics.engine : {};
137
+ const ownTorque = sourcedValue(engine.peakTorqueNm);
138
+ const ownPower = sourcedValue(engine.peakPowerKw);
139
+ const tol = 1 + exports.DECLARED_FIGURE_TOLERANCE;
140
+ const over = [];
141
+ for (const c of curves) {
142
+ const peakTorque = Math.max(...c.points.map((pt) => pt[1]));
143
+ const peakPower = Math.max(...c.points.map((pt) => (pt[1] * pt[0]) / 9549));
144
+ if (declared.torqueNm !== null && peakTorque > declared.torqueNm * tol)
145
+ over.push(`${c.path} peaks at ${f0(peakTorque)} N·m against the declared ${f0(declared.torqueNm)} N·m (${pct(peakTorque / declared.torqueNm - 1)}; ${declared.torqueFrom})`);
146
+ if (declared.powerKw !== null && peakPower > declared.powerKw * tol)
147
+ over.push(`${c.path} implies ${f0(peakPower)} kW against the declared ${f0(declared.powerKw)} kW (${pct(peakPower / declared.powerKw - 1)}; ${declared.powerFrom})`);
148
+ // The package's own peak fields must also describe its own curve.
149
+ if (c.path.startsWith('physics.') && ownTorque !== null && peakTorque > ownTorque * tol)
150
+ over.push(`${c.path} peaks at ${f0(peakTorque)} N·m, above its own physics.engine.peakTorqueNm ${f0(ownTorque)} N·m`);
151
+ if (c.path.startsWith('physics.') && ownPower !== null && peakPower > ownPower * tol)
152
+ over.push(`${c.path} implies ${f0(peakPower)} kW, above its own physics.engine.peakPowerKw ${f0(ownPower)} kW`);
153
+ }
154
+ if (declared.torqueNm !== null && ownTorque !== null && declared.torqueFrom !== 'physics.engine.peakTorqueNm' && ownTorque > declared.torqueNm * tol)
155
+ over.push(`physics.engine.peakTorqueNm is ${f0(ownTorque)} N·m against the declared ${f0(declared.torqueNm)} N·m (${pct(ownTorque / declared.torqueNm - 1)})`);
156
+ if (declared.powerKw !== null && ownPower !== null && declared.powerFrom !== 'physics.engine.peakPowerKw' && ownPower > declared.powerKw * tol)
157
+ over.push(`physics.engine.peakPowerKw is ${f0(ownPower)} kW against the declared ${f0(declared.powerKw)} kW (${pct(ownPower / declared.powerKw - 1)})`);
158
+ if (over.length === 0)
159
+ return [];
160
+ return [{
161
+ code: 'TORQUE_CURVE_EXCEEDS_DECLARED_CRANK_FIGURES',
162
+ level: 'warn',
163
+ path: 'physics.engine.torqueCurve',
164
+ message: `${over.join('; ')}. The engine is the maker's declared crank figure; it is not tuned to a dyno or a top-speed number`,
165
+ fix: `scale BOTH torque curves (physics.engine.torqueCurve and simulation.land.driveline.engine.torqueCurve.points, which must stay identical) and peakTorqueNm / peakPowerKw back to the declared crank figures (±${Math.round(exports.DECLARED_FIGURE_TOLERANCE * 100)} %); carry real-world losses in physics.engine.drivetrainEfficiency and aero drag, and meet 0-100 / top speed with grip, gearing and launch — never an inflated curve. If the published figure is a market cap that real cars exceed, still target the declared figure and say so in the description — skills/helix-vehicles/references/physics-from-specs.md "Torque: target the declared crank figures"`,
166
+ }];
167
+ }
168
+ /**
169
+ * AWD authoring: the land solver reads the split from `simulation.land.driveline.centre`, but each wheel's `powered` flag
170
+ * comes from `physics.driveBiasFront` (front wheels powered iff it is above 0, rear wheels iff it is below 1). An AWD car
171
+ * whose bias is exactly 0 or 1 therefore has an unpowered axle whatever its centre diff says (measured: the front axle
172
+ * got 0 % of the drive and the car lost a third of its top speed). Inside (0, 1) the bias is the nominal front share, so
173
+ * it should agree with `centre.torqueSplit`.
174
+ */
175
+ function awdBiasIssues(pkg) {
176
+ const p = isRecord(pkg) ? pkg : {};
177
+ const land = isRecord(p.simulation) && isRecord(p.simulation.land) ? p.simulation.land : {};
178
+ const dl = isRecord(land.driveline) ? land.driveline : {};
179
+ if (!isRecord(dl.centre) || !isRecord(dl.front) || !isRecord(dl.rear))
180
+ return [];
181
+ const bias = isRecord(p.physics) ? sourcedValue(p.physics.driveBiasFront) : null;
182
+ if (bias === null)
183
+ return [];
184
+ const split = finite(dl.centre.torqueSplit) ? dl.centre.torqueSplit : null;
185
+ if (bias <= 0 || bias >= 1) {
186
+ return [{
187
+ code: 'AWD_DRIVE_BIAS_UNPOWERS_AN_AXLE',
188
+ level: 'warn',
189
+ path: 'physics.driveBiasFront',
190
+ message: `the driveline has a centre diff and both axle diffs (AWD) but physics.driveBiasFront is ${bias}: the ${bias <= 0 ? 'front' : 'rear'} wheels are flagged unpowered from it and receive no drive whatever the centre diff says`,
191
+ fix: `set physics.driveBiasFront to the nominal front share of drive torque at zero slip, strictly between 0 and 1 (e.g. 0.05 for a rear-biased clutch-pack car whose maker says 0:100, otherwise the declared split) and keep simulation.land.driveline.centre.torqueSplit equal to it — skills/helix-vehicles/references/physics-from-specs.md "All-wheel drive"`,
192
+ }];
193
+ }
194
+ if (split !== null && Math.abs(split - bias) > 0.05) {
195
+ return [{
196
+ code: 'AWD_DRIVE_BIAS_DISAGREES_WITH_CENTRE_SPLIT',
197
+ level: 'warn',
198
+ path: 'physics.driveBiasFront',
199
+ message: `physics.driveBiasFront ${bias} and simulation.land.driveline.centre.torqueSplit ${split} state two different front shares (the solver uses the centre diff; add-ons that move driveBiasFront scale the split)`,
200
+ fix: 'make them equal: both are the nominal front share of drive torque at zero slip — skills/helix-vehicles/references/physics-from-specs.md "All-wheel drive"',
201
+ }];
202
+ }
203
+ return [];
204
+ }
205
+ /** Every engine-policy finding for a package. */
206
+ function enginePolicyIssues(pkg, opts = {}) {
207
+ return [...speedGovernorIssues(pkg, opts), ...declaredTorqueIssues(pkg), ...awdBiasIssues(pkg)];
208
+ }
209
+ //# sourceMappingURL=enginePolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enginePolicy.js","sourceRoot":"","sources":["../../src/vehicle/enginePolicy.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { EngineRuntime, LoadedRuntime } from './simulateRuntime';
2
+ import type { VehicleIssue } from './validate';
2
3
  import { type KeyboardLaunchReport } from './keyboardLaunch';
3
4
  type Json = Record<string, unknown>;
4
5
  /** The fraction a figure may miss its target by when a spec leaf carries no tolerance. */
@@ -149,6 +150,11 @@ export interface SimulationReport {
149
150
  * block is authored but the runtime predates it (it is then ignored here AND live, by the same runtime).
150
151
  */
151
152
  tractionControl: TractionControlReport;
153
+ /**
154
+ * Engine-policy warnings (`enginePolicy.ts`): a speed limiter far below the ungoverned top speed (the platform car runs
155
+ * ungoverned) and a torque curve above the declared crank figures. Printed with the report; `validate` surfaces them.
156
+ */
157
+ policy: VehicleIssue[];
152
158
  }
153
159
  export interface TractionControlReport {
154
160
  authored: boolean;
@@ -206,5 +212,8 @@ export interface SimulateOptions {
206
212
  /** Measure the package with a loaded runtime and compare every figure. Throws only when the engine cannot run it. */
207
213
  export declare function simulateVehicle(pkg: unknown, runtime: LoadedRuntime, opts?: SimulateOptions): Promise<SimulationReport>;
208
214
  export declare function formatTractionControl(tc: TractionControlReport | undefined): string;
209
- export declare function formatSimulationReport(r: SimulationReport): string;
215
+ /** `withPolicy: false` omits the engine-policy lines (`validate` already lists them as issues above the report). */
216
+ export declare function formatSimulationReport(r: SimulationReport, opts?: {
217
+ withPolicy?: boolean;
218
+ }): string;
210
219
  export {};