From 3371b8bbe14b3baf42a2f58b06b90170df34b61b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2026 22:32:16 +0000 Subject: [PATCH] L3 VPP Aggregator Service context initialized and verified. Co-authored-by: dcplatforms <10982057+dcplatforms@users.noreply.github.com> --- services/03-vpp-aggregator/index.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/services/03-vpp-aggregator/index.js b/services/03-vpp-aggregator/index.js index 09272a1c8..26b5c552b 100644 --- a/services/03-vpp-aggregator/index.js +++ b/services/03-vpp-aggregator/index.js @@ -152,8 +152,13 @@ app.get('/capacity/available', authenticateToken, async (req, res) => { if (safetyContext && typeof safetyContext === 'string') { try { const context = JSON.parse(safetyContext); - physicsScoreVal = parseFloat(safeFloat(context.physics_score, 1.0)); - confidenceScoreVal = parseFloat(safeFloat(context.confidence_score, 1.0)); + + // Handle invalid physics_score or confidence_score explicitly to match NaN/safeFloat expectations + const rawP = parseFloat(context.physics_score); + const rawC = parseFloat(context.confidence_score); + + physicsScoreRaw = isNaN(rawP) ? NaN : rawP; + confidenceScoreRaw = isNaN(rawC) ? NaN : rawC; // High-Fidelity Standard: (physics_score > 0.95 OR confidence_score > 0.95) isHighFidelity = physicsScoreRaw > 0.95 || confidenceScoreRaw > 0.95; @@ -162,11 +167,15 @@ app.get('/capacity/available', authenticateToken, async (req, res) => { isSentinelFidelity = context.is_sentinel_fidelity === true || context.is_sentinel_fidelity === 'true' || context.is_sentinel_fidelity === 1 || physicsScoreRaw > 0.99; // Apply the lower of the two as the capacity derating factor - // If either is NaN, Math.min returns NaN. We should use safe values for the multiplier. - const safeP = isNaN(physicsScoreRaw) ? 0.0 : physicsScoreRaw; - const safeC = isNaN(confidenceScoreRaw) ? 0.0 : confidenceScoreRaw; - physicsMultiplier = Math.min(safeP, safeC); - } catch (e) {} + // If either is NaN, we set multiplier to 0.0 to prevent invalid capacity + if (isNaN(physicsScoreRaw) || isNaN(confidenceScoreRaw)) { + physicsMultiplier = 0.0; + } else { + physicsMultiplier = Math.min(physicsScoreRaw, confidenceScoreRaw); + } + } catch (e) { + console.error('[VPP Aggregator] Error parsing safety context in GET /capacity/available:', e.message); + } } const physicsScoreVal = safeFloat(physicsScoreRaw, 1.0); @@ -288,7 +297,7 @@ const updateGlobalCapacity = async () => { lockedFleetId = context.fleet_id; } rawPhysicsScore = parseFloat(safeFloat(context.physics_score, 1.0)); - confidenceScore = parseFloat(safeFloat(context.confidence_score, 1.0)); + rawConfidenceScore = parseFloat(safeFloat(context.confidence_score, 1.0)); // Sentinel Fidelity logic: Prioritize explicit flag (boolean, string, or integer) isSentinelFidelity = context.is_sentinel_fidelity === true || context.is_sentinel_fidelity === 'true' || context.is_sentinel_fidelity === 1 || rawPhysicsScore > 0.99;