fix: address Copilot review round 14 on #2248

**The TUI ignored `incomplete`.** Round 12 added that field precisely so a
consumer could tell "not fully checked" from a real failure, and then the one
client that reads the report did not consume it — which made the field
decorative. The pane shows an Incomplete: block with the report's own reason,
and the status line reads INCOMPLETE rather than FAILED.

It sits ABOVE the manifest, not beside the status line: it explains the list
that follows — only the first N rows were fetched, the rest stay marked `·`
because nobody looked at them — and below a 512-row manifest it would be
off-screen, which is the same as absent. Found by writing the test, whose
first version asserted against a 600-entry fixture and could see neither
string. The test triggers truncation through the BYTE budget instead, so the
manifest stays three rows and the assertions measure the pane rather than the
test's viewport.

**The capped self-entry was reported under the wrong URI.** A manifest may
write its self-entry in a normalized-equivalent form; the fallback recorded
`entry.uri`, so manifest rows keyed on the declared spelling matched nothing
while the normalized extra-files filter suppressed it as already covered. The
verdict existed in the report and appeared nowhere on screen. Recorded under
`declaredSelf.uri` now.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND46Ci64DC3tzBy9aG81Nc
Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
cliffhall 2026-09-07 22:20:20 -04:00
commit 01a8f14c24

View file

@ -402,6 +402,26 @@ export function SkillsTab({
</Box>
))}
{/* ABOVE the manifest, because it explains the list that
follows: only the first N rows were fetched, and the rest
stay marked `·` because nobody looked at them. Below a
512-row manifest it would be off-screen, which is the same as
absent. `verifySkills` sets `incomplete` precisely so a
consumer can tell "not fully checked" from a real failure
(Copilot). */}
{activeReport?.incomplete && (
<>
<Box marginTop={1} flexShrink={0}>
<Text bold color="yellow">
Incomplete:
</Text>
</Box>
<Box paddingLeft={2} flexShrink={0}>
<Text color="yellow">{activeReport.incomplete}</Text>
</Box>
</>
)}
<Box marginTop={1} flexShrink={0}>
<Text bold>
Manifest
@ -504,7 +524,9 @@ export function SkillsTab({
: activeReport
? activeReport.ok
? "[Verified — Enter to re-verify]"
: "[Verification FAILED — Enter to re-verify]"
: activeReport.incomplete
? "[Verification INCOMPLETE — Enter to re-verify]"
: "[Verification FAILED — Enter to re-verify]"
: "[Enter to verify digests and frontmatter]"}
</Text>
</Box>