Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 1x 1x 5x 5x 5x 6x 18x 18x 18x 18x 2x 2x 16x 18x 18x 18x 18x 18x 18x 18x 18x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 1x 1x 5x 1x 1x 5x 5x 2x 2x 1x 1x 1x | import { DyE2E_VQA_DOMEvidence_Interface } from '../../_models/interfaces/dom-evidence.interface';
/**
* `DyE2E_VQA_RiskScore_Util` — evidence-aggregátor risk-score-ra (state×viewport szintén).
*
* **Az AI-fókusz-jel** (organizer MP-3 SP-3.5 mintából): a determinisztikus DOM-detektorok
* `severityHint`-je alapján priorizálja az AI-review-jelölteket.
*
* **scope-LOCK**: nem dönt verdict-et — csak SCORE-t ad. Az AI agent dönti el a finding-et.
*
* **Score-konvenció** (0..100):
* - 0 = clean (egyetlen detektor sem detektált semmit)
* - 1-25 = low (csak low/info-szintű detektor)
* - 26-50 = medium (medium detektorok)
* - 51-75 = high (high detektor VAGY több medium)
* - 76-100 = blocker-jelölt (blocker-hint VAGY 2+ high detektor)
*/
export interface DyE2E_VQA_RiskScore_Result {
/** Aggregált pontszám 0..100. */
score: number;
/** Súly-kategória. */
band: 'clean' | 'low' | 'medium' | 'high' | 'blocker-candidate';
/** Detektor-szignatúrák, amik a score-hoz hozzájárultak (top 5). */
contributors: { detector: string; severityHint: string | null; weight: number }[];
/** Aktív detektorok száma. */
detectedCount: number;
/** Összes detektor száma. */
totalCount: number;
}
const SEVERITY_WEIGHTS: Record<string, number> = {
blocker: 50,
high: 25,
medium: 12,
low: 5,
informational: 1,
};
export class DyE2E_VQA_RiskScore_Util {
/** Egy state×viewport evidence-tömbjéből aggregált risk-score. */
static fromEvidence(evidence: unknown[]): DyE2E_VQA_RiskScore_Result {
if (!Array.isArray(evidence)) {
return { score: 0, band: 'clean', contributors: [], detectedCount: 0, totalCount: 0 };
}
const contributors: { detector: string; severityHint: string | null; weight: number }[] = [];
let total: number = 0;
let detectedCount: number = 0;
for (const e of evidence) {
total++;
const ev: DyE2E_VQA_DOMEvidence_Interface | { detector?: string; detected?: boolean; severityHint?: string } =
e as DyE2E_VQA_DOMEvidence_Interface;
if (!ev || !ev.detected) {
continue;
}
detectedCount++;
const sev: string = ev.severityHint ?? 'low';
const weight: number = SEVERITY_WEIGHTS[sev] ?? 5;
contributors.push({
detector: String((ev as { detector?: string }).detector ?? 'unknown'),
severityHint: ev.severityHint ?? null,
weight: weight,
});
}
const rawScore: number = contributors.reduce((acc, c) => acc + c.weight, 0);
const cappedScore: number = Math.min(100, rawScore);
return {
score: cappedScore,
band: this.toBand(cappedScore),
contributors: contributors.sort((a, b) => b.weight - a.weight).slice(0, 5),
detectedCount,
totalCount: total,
};
}
/** Bundle-szintű aggregátor: minden state×viewport scoring-summary. */
static fromBundleEvidenceFiles(
perStateViewportEvidence: Record<string, unknown[]>,
): { [stateViewportKey: string]: DyE2E_VQA_RiskScore_Result } {
const result: { [k: string]: DyE2E_VQA_RiskScore_Result } = {};
for (const [k, evidence] of Object.entries(perStateViewportEvidence)) {
result[k] = this.fromEvidence(evidence);
}
return result;
}
/** Bundle-szinten priorizált AI-fókusz-lista (highest score first, max N). */
static topPriorities(
scoresByKey: { [k: string]: DyE2E_VQA_RiskScore_Result },
maxN: number = 10,
): { key: string; score: DyE2E_VQA_RiskScore_Result }[] {
return Object.entries(scoresByKey)
.map(([key, score]) => ({ key, score }))
.sort((a, b) => b.score.score - a.score.score)
.slice(0, maxN);
}
private static toBand(score: number): DyE2E_VQA_RiskScore_Result['band'] {
if (score === 0) {
return 'clean';
}
if (score <= 25) {
return 'low';
}
if (score <= 50) {
return 'medium';
}
if (score <= 75) {
return 'high';
}
return 'blocker-candidate';
}
}
|