function renderPWarLeaderboard(data) { const container = document.getElementById('p-war-table-container'); if (!container) return; const sortedData = [...data].sort((a, b) => a.p_war - b.p_war); container.innerHTML = `
${sortedData.map((p, idx) => { const status = getStatusInfo(p.p_war, p.is_auto_delete); const soi = p.p_war; const pred = p.predicted_soi; const rowId = `project-${idx}`; let trendIcon = ""; if (pred !== null) { const diff = pred - soi; if (diff < -5) trendIcon = '▼ 급락'; else if (diff < 0) trendIcon = '↘ 하락'; else trendIcon = '↗ 유지'; } // 수식 상세 데이터 준비 const baseLambda = 0.04; const scaleImpact = Math.min(0.04, Math.log10(p.file_count + 1) * 0.008); const envImpact = Math.max(0, p.ai_lambda - baseLambda - scaleImpact); // 존재 신뢰도 패널티 (ECV) let ecvText = "100% (신뢰)"; let ecvClass = "highlight-val"; if (p.file_count === 0) { ecvText = "5% (유령 프로젝트 패널티)"; ecvClass = "highlight-penalty"; } else if (p.file_count < 10) { ecvText = "40% (소규모 껍데기 패널티)"; ecvClass = "highlight-penalty"; } return ` `; }).join('')}
프로젝트명 파일 수 방치일 상태 판정 현재 SOI 실무 투입 AI 예보 (14d)
${p.project_nm} ${p.file_count.toLocaleString()}개 ${p.days_stagnant}일 ${status.label} ${soi.toFixed(1)}%
${p.work_effort}%
${pred !== null ? pred.toFixed(1) + '%' : '-'} ${trendIcon}
⚙️ AI 위험 적응형 모델(AAS) 산출 시뮬레이션
📊 실질 업무 활성화 분석 (Work Vitality) 투입률 ${p.work_effort}%
최근 30개 수집 이력 중 단순 로그 갱신이 아닌 실제 파일 수의 변동이 포착된 날의 비율입니다. 현재 이 프로젝트는 ${p.work_effort >= 70 ? '매우 밀도 높은 실무' : p.work_effort <= 30 ? '형식적 관리 위주의 정체' : '간헐적인 성과물'} 상태를 보이고 있습니다.
1
동적 위험 계수(λ) 산출
λ = ${p.ai_lambda.toFixed(4)}
4
활동 품질 검증 (Quality)
${p.log_quality >= 1.0 ? '성과물 직결 실무 활동 감지' : p.log_quality >= 0.7 ? '시스템 구조적 활동 주류' : '단순 행정적 활동 판명'}
Factor = ${(p.log_quality * 100).toFixed(0)}%
2
방치 시간 감쇄 적용
Result = ${((soi / (p.file_count === 0 ? 0.05 : p.file_count < 10 ? 0.4 : 1) / p.log_quality) || 0).toFixed(1)}%
3
존재 진정성 (ECV)
Factor = ${ecvText}
* 최종 점수는 위 4개 팩터의 연쇄 추론 결과입니다.
최종 P-SOI: ${soi.toFixed(1)}%
`; }