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. */}
-