diff --git a/clients/web/src/components/screens/SkillsScreen/SkillsScreen.stories.tsx b/clients/web/src/components/screens/SkillsScreen/SkillsScreen.stories.tsx index 2c480950..bfe69899 100644 --- a/clients/web/src/components/screens/SkillsScreen/SkillsScreen.stories.tsx +++ b/clients/web/src/components/screens/SkillsScreen/SkillsScreen.stories.tsx @@ -132,7 +132,7 @@ export const ConformingSkill: Story = { const control = canvas.getByRole("button", { name: /Conformance/ }); await expect(control).toHaveAttribute("aria-expanded", "false"); await userEvent.click(control); - await expect(canvas.getByText("Conforms")).toBeInTheDocument(); + await expect(canvas.getByText("No structural issues")).toBeInTheDocument(); }, }; diff --git a/clients/web/src/components/screens/SkillsScreen/SkillsScreen.test.tsx b/clients/web/src/components/screens/SkillsScreen/SkillsScreen.test.tsx index 7c5843da..9513bf70 100644 --- a/clients/web/src/components/screens/SkillsScreen/SkillsScreen.test.tsx +++ b/clients/web/src/components/screens/SkillsScreen/SkillsScreen.test.tsx @@ -211,10 +211,10 @@ describe("SkillsScreen", () => { await user.click(screen.getByText("data-analysis")); const control = screen.getByRole("button", { name: /Conformance/ }); expect(control).toHaveAttribute("aria-expanded", "false"); - expect(screen.queryByText("Conforms")).not.toBeInTheDocument(); + expect(screen.queryByText("No structural issues")).not.toBeInTheDocument(); await user.click(control); - expect(screen.getByText("Conforms")).toBeInTheDocument(); + expect(screen.getByText("No structural issues")).toBeInTheDocument(); expect(screen.queryByTestId("skill-issues")).not.toBeInTheDocument(); }); diff --git a/clients/web/src/components/screens/SkillsScreen/SkillsScreen.tsx b/clients/web/src/components/screens/SkillsScreen/SkillsScreen.tsx index cb72458d..47101900 100644 --- a/clients/web/src/components/screens/SkillsScreen/SkillsScreen.tsx +++ b/clients/web/src/components/screens/SkillsScreen/SkillsScreen.tsx @@ -33,6 +33,7 @@ import { type SkillIssue, type SkillVerification, } from "@inspector/core/mcp/skills.js"; +import { CodeHighlight } from "../../elements/CodeHighlight/CodeHighlight"; import { ContentViewer } from "../../elements/ContentViewer/ContentViewer"; import { ListToggle } from "../../elements/ListToggle/ListToggle"; import { useValueChange } from "../../../hooks/useValueChange"; @@ -372,9 +373,13 @@ const InlineRow = Group.withProps({ wrap: "nowrap", }); +// The per-row integrity check. Carries the same shield as "Verify all" — both +// verify digests, and giving only one of them the icon made the icon look +// decorative rather than meaningful. const RowVerifyButton = Button.withProps({ variant: "subtle", size: "compact-xs", + leftSection: , }); // The action column: sized to its button and right-aligned, so the buttons form @@ -1270,7 +1275,12 @@ export function SkillsScreen({ )} {issues.length === 0 ? ( - + // Titled for the check it actually summarises. Now that + // every verdict renders in this one section, an + // unqualified "Conforms" sits directly above a red digest + // mismatch and flatly contradicts it — the static checks + // passing says nothing about the bytes. + No structural issues found in this entry. ) : ( @@ -1571,17 +1581,18 @@ export function SkillsScreen({ - {/* The raw YAML the server served, not a re-serialised - object: this app carries no YAML parser, and for a - conformance tool the bytes on the wire are the more - useful answer anyway. */} -