B2.3 + P11.1 + P11.2 + monster schema fix
B2.3 LatestWinsGate fireAndWait:
Added fireAndWait(value, ctx?) returning per-fire settlement promise.
Supersede resolves with frozen sentinel {superseded: true} (no
rejection — callers branch on value without try/catch). Dispatch
errors also resolve (with undefined); error surfaces via gate.lastError.
LatestWinsGate.js 75 → 116 lines. 12/12 tests pass.
P11.1 convert.possibilities(measure):
New helper returning sorted+deduped unit names for a measure.
Cached per measure. Reuses existing convert measures map. Also
exposed convert.measures() listing all known measures.
convert/index.js +21 lines. New test file: 90 lines, 12/12 tests.
P11.2 commandRegistry.units field:
Pre-dispatch normalisation pipeline. descriptor.units = {measure,
default}; commandRegistry extracts msg.payload + msg.unit (3 shapes),
validates against measure, converts to default, falls back + warns
with accepted-list on unknown/wrong-measure. Falls back gracefully
if convert.possibilities is missing. commandRegistry.js 164 → 237.
+7 new tests covering all 4 paths.
monster schema fix (P11.2 sibling):
generalFunctions/src/configs/monster.json was stripping four
legitimate constraint keys (nominalFlowMin, flowMax, maxRainRef,
minSampleIntervalSec). Added them with defaults matching the
legacy nodeClass coercion. Side effect: this also UNBLOCKED the
monster cooldown-guard test (separate ROOT-CAUSE entry below).
CONTRACTS.md §4 + §8 updated. 144/144 basic tests + 206/206 full
generalFunctions tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -301,4 +301,26 @@ convert = function (value) {
|
||||
return new Converter(value);
|
||||
};
|
||||
|
||||
/**
|
||||
* Top-level helper: list accepted unit names for a measure.
|
||||
* Cached per measure. Unknown measures return [].
|
||||
*/
|
||||
var _possibilitiesCache = Object.create(null);
|
||||
convert.possibilities = function (measure) {
|
||||
if (!measure || typeof measure !== 'string') return [];
|
||||
if (_possibilitiesCache[measure]) return _possibilitiesCache[measure].slice();
|
||||
if (!measures[measure]) {
|
||||
_possibilitiesCache[measure] = [];
|
||||
return [];
|
||||
}
|
||||
var units = Converter.prototype.possibilities.call({ origin: { measure: measure } }, measure);
|
||||
var deduped = Array.from(new Set(units)).sort();
|
||||
_possibilitiesCache[measure] = deduped;
|
||||
return deduped.slice();
|
||||
};
|
||||
|
||||
convert.measures = function () {
|
||||
return keys(measures).slice();
|
||||
};
|
||||
|
||||
module.exports = convert;
|
||||
|
||||
Reference in New Issue
Block a user