From 2872a30b9699a8cdfbe412e912426109e574c082 Mon Sep 17 00:00:00 2001 From: martbost Date: Wed, 19 Aug 2026 06:13:41 -0500 Subject: [PATCH] Coaching scan: expose earnedPol + next upgradeCost on at-risk entries for funded-vs-timing nudge framing Co-Authored-By: Claude Fable 5 --- chain.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chain.js b/chain.js index e6e7df6..3cd6f1e 100644 --- a/chain.js +++ b/chain.js @@ -683,7 +683,9 @@ function getCoachingScan(rootId, maxItems = 15) { if (missing > 0) atRisk.push({ id, level: lvl, levelName: levelName(lvl), qualified: q, directCount: m.directCount || 0, atRiskPol: +missing.toFixed(2), fromIds: fromIds.slice(0, 6), need: q ? 'upgrade' : 'qualify', neededLevel: q ? minDepth + 1 : null, - neededLevelName: q ? levelName(minDepth + 1) : null }); + neededLevelName: q ? levelName(minDepth + 1) : null, + earnedPol: +(m.earnedPol || 0).toFixed(2), + upgradeCost: q ? +(((costs.up[m.tier === 2 ? 2 : 1] || [])[lvl - 1]) || 0).toFixed(2) : null }); if (q && lvl === 1) rollForward.push({ id, earnedPol: +(m.earnedPol || 0).toFixed(2), ascensusCost: +((costs.up[m.tier === 2 ? 2 : 1] || [])[0] || 0).toFixed(2) }); if ((m.directCount || 0) === 1) oneAway.push({ id, levelName: levelName(lvl) });