Rotation queue: reconcile against live chain directs in normalizeStatuses - never activate a sponsor the chain says is already 2/2 qualified (also syncs stale direct counts upward)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-08-19 14:37:48 -05:00
parent dd6644bc3b
commit 6ebe436cf3
2 changed files with 19 additions and 1 deletions
+11
View File
@@ -316,6 +316,17 @@ function recordEvent(event, source) {
writeJson(ANALYTICS_FILE, a);
}
function normalizeStatuses(sponsors, preferredActiveId=null) {
// Chain reconciliation: queue members can qualify through leg activity long
// BEFORE their rotation turn, and the event-driven auto-counter never sees
// it (bit us twice on 2026-08-19: #41, then #46 activated while already
// 2/2 on-chain). Never activate someone the chain says is qualified.
sponsors=sponsors.map(s=>{
if(s.status==='qualified')return s;
const dc=chain.liveDirects(Number(s.id));
if(dc!=null&&dc>=2)return {...s,directs:2,status:'qualified'};
if(dc!=null&&dc>(Number(s.directs)||0))return {...s,directs:dc};
return s;
});
const eligible=sponsors.filter(s=>s.status!=='qualified');
let activeId=preferredActiveId;
if(!activeId || !eligible.some(s=>s.id===activeId)){