(projectRoot, now = new Date())
| 826 | }; |
| 827 | |
| 828 | for (const problem of problems) { |
| 829 | if (problem.actionable) summary.actionable++; |
| 830 | if (problem.category === 'safety-block') summary.safetyBlocks++; |
| 831 | if (problem.category === 'stale' || problem.category === 'stale-approval') summary.stale++; |
| 832 | if (problem.category === 'hook-failure') summary.hookFailures++; |
| 833 | if (problem.category === 'approval-needed') summary.approvalNeeded++; |
| 834 | if (problem.category === 'resolved-approval') summary.resolvedApprovals++; |
| 835 | } |
| 836 | |
| 837 | return summary; |
| 838 | } |
| 839 | |
| 840 | function readProblems(projectRoot, now = new Date()) { |
| 841 | const telemetryDir = path.join(projectRoot, '.planning', 'telemetry'); |
| 842 | const errors = tailJsonl(path.join(telemetryDir, 'hook-errors.jsonl'), 100); |
| 843 | const auditEntries = tailJsonl(path.join(telemetryDir, 'audit.jsonl'), 300); |
| 844 | const problems = errors |
| 845 | .map((entry) => classifyHookProblem(entry, now, { auditEntries })) |
| 846 | .sort((left, right) => { |
| 847 | const severityOrder = { high: 0, medium: 1, info: 2, low: 3 }; |
no test coverage detected