Skill v1.0.0
Trusted Publisher100/100version: "1.0.0" name: align-cli-webapp-reports description: Compare CLI visual readiness report with local webapp report for a given repo, identify differences in checks/rendering/scoring, and fix them disable-model-invocation: true
You are debugging consistency between two readiness report outputs for the AgentRC project:
- CLI visual report — generated by
npm run dev -- readiness --visualfrom the repo root (produces an HTML file) - Webapp report — rendered by the local dev server at
http://localhost:3000/{owner}/{repo}
Both should produce identical results for the same repository because they share the same core engine (packages/core/src/services/readiness.ts). In practice they can diverge due to rendering differences or scoring logic bugs.
Architecture Reference
Shared Core (source of truth for checks)
packages/core/src/services/readiness.ts— All criteria definitions,countStatus(),buildCriteria(),buildExtras(), pillar/level aggregation- Criteria scopes:
repo(always),app(per-application),area(only with--per-area) countStatus()excludes skipped checks from the denominator when computing pillar pass/total- Extras (bonus checks) are not scored — they don't affect levels or totals
CLI Rendering
packages/core/src/services/visualReport.ts— Generates the standalone HTML reportcalculateAiToolingData()— Aggregates AI criteria across repos (counts all including skipped in the hero display)- Total checks:
report.pillars.reduce((s, p) => s + p.total, 0) - Does not render bonus/extras section in HTML output
Webapp Backend
webapp/backend/src/services/scanner.js— Clones repo, callsrunReadinessReport()from@agentrc/corewebapp/backend/src/routes/scan.js—POST /api/scanendpoint- Returns the raw
ReadinessReportJSON (same shape as CLI) - Uses
@agentrc/coreas afile:../../packages/coredependency — always uses local source code
Webapp Frontend
webapp/frontend/src/report.js— Independent rendering implementation (NOT shared with CLI)buildHero()— Total fromreport.pillars.reduce((s, p) => s + p.total, 0)buildAiToolingHero()— Renders all AI criteria (including skipped) with pass/total countbuildPillarDetails()— Shows per-pillar expandable cards- Does render bonus checks section (unlike CLI)
- Has Service Information section (policy chain, engine signals) — CLI doesn't
Known Inconsistency Patterns
- AI Hero vs Pillar scoring: Both implementations count skipped checks as non-passing in the AI Hero but exclude them from pillar denominator via
countStatus() - Rendering gaps: Webapp shows bonus checks + service info; CLI doesn't
- Icon mapping: CLI uses HTML entities via
getAiCriterionIcon(); webapp uses emoji viaAI_ICONSmap — new criteria IDs may get fallback icon (🔧) in webapp
Step-by-Step Procedure
Phase 0: Start Local Webapp
- Start the webapp backend dev server (from the repo root):
`` cd webapp/backend && npm run dev ``
This starts the Express server at http://localhost:3000 with the local @agentrc/core source.
- Optionally serve the frontend for full visual testing:
`` cd webapp/frontend && npx vite --port 5173 ``
Phase 1: Generate Both Reports
- Run the CLI against the target repo to produce the visual HTML report:
`` npm run dev -- readiness --visual --repo {owner}/{repo} ``
Save the output HTML (typically readiness-report.html).
- Hit the local webapp API to get the raw JSON:
`` POST http://localhost:3000/api/scan Body: {"repo_url":"https://github.com/{owner}/{repo}"} ``
Example with PowerShell:
``powershell $response = Invoke-RestMethod -Uri "http://localhost:3000/api/scan" -Method POST -ContentType "application/json" -Body '{"repo_url":"https://github.com/{owner}/{repo}"}' -TimeoutSec 120 ``
- Also open the local webapp page for visual comparison:
http://localhost:5173/{owner}/{repo}(if frontend dev server is running) orhttp://localhost:3000/{owner}/{repo}(if backend serves static files).
Phase 2: Compare Data Layer
- Extract from CLI HTML: total checks, per-pillar passed/total, AI hero passed/total/percentage, criteria list with statuses, achieved level, fix-first items.
- Extract from webapp JSON: same fields. Use:
``powershell $pillars = $response.pillars $totalPassed = ($pillars | Measure-Object -Property passed -Sum).Sum $totalChecks = ($pillars | Measure-Object -Property total -Sum).Sum Write-Host "Total: $totalPassed of $totalChecks checks" Write-Host "Criteria count: $($response.criteria.Count)" ``
- Diff the two — check for:
- Missing criteria in either side (criteria list length mismatch)
- Status mismatches for the same criterion ID
- Total check count differences (pillar aggregation)
- AI Tooling hero percentage/label differences
- Achieved level and next-level calculation differences
- Fix-first list ordering differences
Phase 3: Compare Rendering Layer
- Compare how both renderers handle:
- Skipped checks display (icon, text, inclusion in totals)
- Bonus/extras section presence
- Pillar grouping (repo-health vs ai-setup)
- AI criterion icons for new/unknown IDs
- Score thresholds for labels (Excellent/Good/Fair/Getting Started/Not Started)
Phase 4: Root Cause & Fix
- For each difference found, classify as:
- Rendering divergence → Fix in either
visualReport.ts(CLI) orreport.js(webapp) to align - Scoring logic bug → Fix in
readiness.ts(core) which fixes both - Icon/label mapping gap → Update the icon map in the affected renderer
- Implement the fixes directly in the source files.
- After fixing, restart the webapp dev server and re-run Phase 1-2 to verify alignment.
Phase 5: Validate
- Confirm both reports show identical:
- Total check count (e.g., "11 of 20")
- Per-pillar passed/total
- AI Tooling hero percentage and label
- Achieved maturity level
- Fix-first items (same set, same order)
- Note any acceptable differences that are by-design (e.g., webapp shows bonus checks, CLI doesn't).
- Run existing tests to ensure no regressions:
`` npm test cd webapp/backend && npm test ``
Output Format
Produce a comparison table:
| Aspect | CLI Value | Webapp Value | Match? | Root Cause | Fix | |
|---|---|---|---|---|---|---|
| Total checks | X of Y | X of Z | ... | ... | ... | |
| AI Hero % | ...% | ...% | ... | ... | ... | |
| ... | ... | ... | ... | ... | ... |
Then implement the fixes and verify.