(base, feat)
| 135 | // have one attempt per task in the current harness, so soft == hard for now. |
| 136 | |
| 137 | function classifyTaskMoves(base, feat) { |
| 138 | const hard = []; // baseline pass → feature fail |
| 139 | const recovered = []; // baseline fail → feature pass |
| 140 | const allIds = new Set([...Object.keys(base.byId), ...Object.keys(feat.byId)]); |
| 141 | for (const id of allIds) { |
| 142 | const b = base.byId[id]; |
| 143 | const f = feat.byId[id]; |
| 144 | if (!b || !f) continue; // task added or removed — skip silently |
| 145 | if (b.passed && !f.passed) hard.push(id); |
| 146 | if (!b.passed && f.passed) recovered.push(id); |
| 147 | } |
| 148 | return { hard, recovered }; |
| 149 | } |
| 150 | |
| 151 | // ─── rendering ─────────────────────────────────────────────────────────────── |
| 152 |
no outgoing calls
no test coverage detected