(payload)
| 251 | } |
| 252 | |
| 253 | function renderEvaluation(payload) { |
| 254 | const result = ensureEvaluationPayload(payload); |
| 255 | |
| 256 | return [ |
| 257 | `# Plugin Eval Report: ${result.target.name}`, |
| 258 | "", |
| 259 | section("At a Glance", [ |
| 260 | `- Score: ${result.summary.score}/100`, |
| 261 | `- Grade: ${result.summary.grade}`, |
| 262 | `- Risk: ${result.summary.riskLevel}`, |
| 263 | `- Checks: ${result.summary.checkCounts.fail} fail, ${result.summary.checkCounts.warn} warn, ${result.summary.checkCounts.info} info`, |
| 264 | `- Active budget: ${result.budgets.trigger_cost_tokens.value + result.budgets.invoke_cost_tokens.value} tokens (${result.budgets.invoke_cost_tokens.band})`, |
| 265 | `- Observed usage: ${result.observedUsage?.sampleCount ? `${result.observedUsage.sampleCount} sample${result.observedUsage.sampleCount === 1 ? "" : "s"}` : "not supplied"}`, |
| 266 | ]), |
| 267 | "", |
| 268 | section("Why It Matters", result.summary.whyBullets.map((item) => `- ${item}`)), |
| 269 | "", |
| 270 | section("Fix First", renderFindingList(result.summary.fixFirst, "No urgent fixes were identified.")), |
| 271 | "", |
| 272 | section("Recommended Next Step", renderNextAction(result.nextAction)), |
| 273 | "", |
| 274 | section("Details", [ |
| 275 | detailsBlock("Watch next", renderFindingList(result.summary.watchNext, "No secondary findings queued.")), |
| 276 | detailsBlock( |
| 277 | "Improvement brief", |
| 278 | [ |
| 279 | `- ${result.improvementBrief?.summary || "No improvement brief available."}`, |
| 280 | ...(result.improvementBrief?.goals?.length > 0 |
| 281 | ? result.improvementBrief.goals.map((item) => `- Goal: ${item}`) |
| 282 | : []), |
| 283 | ...(result.improvementBrief?.measurementGoals?.length > 0 |
| 284 | ? result.improvementBrief.measurementGoals.map((item) => `- Measure: ${item}`) |
| 285 | : []), |
| 286 | ...(result.improvementBrief?.suggestedPrompt |
| 287 | ? [`- Suggested prompt: ${result.improvementBrief.suggestedPrompt}`] |
| 288 | : []), |
| 289 | ].join("\n"), |
| 290 | ), |
| 291 | detailsBlock( |
| 292 | "Budgets and observed usage", |
| 293 | [renderBudgets(result.budgets), "", renderObservedUsage(result.observedUsage)].join("\n"), |
| 294 | ), |
| 295 | detailsBlock("Measurement plan", renderMeasurementPlan(result.measurementPlan)), |
| 296 | detailsBlock("Use From Codex Chat", renderWorkflowGuide(result.workflowGuide)), |
| 297 | detailsBlock("Checks", renderChecks(result.checks)), |
| 298 | detailsBlock("Metrics", renderMetrics(result.metrics)), |
| 299 | detailsBlock("Score details", [ |
| 300 | `- Starting score: ${result.summary.scoreBreakdown.startingScore}`, |
| 301 | `- Total deductions: -${result.summary.scoreBreakdown.totalDeductions}`, |
| 302 | `- Final score: ${result.summary.scoreBreakdown.finalScore}`, |
| 303 | ...(result.summary.riskReasons?.length > 0 |
| 304 | ? result.summary.riskReasons.map((item) => `- Risk: ${item}`) |
| 305 | : []), |
| 306 | "", |
| 307 | renderDeductions(result.summary), |
| 308 | "", |
| 309 | renderCategoryDeductions(result.summary), |
| 310 | ].join("\n")), |
no test coverage detected