skills/reviewing-ai-output-groundedness/SKILL.md
Human review protocol for whether AI output is grounded in its sources: claim-by-claim attribution, hallucination classes, citation verification, sampling that is defensible, and a recorded attestation because groundedness cannot be fully automated. Also covers the responsible-AI pass - harmful output, bias, disclosure and privacy. Use when reviewing a RAG or summarisation feature, when factuality matters more than fluency, or when an eval suite needs the human check it cannot replace.
npx skillsauth add jaktestowac/awesome-copilot-for-testers reviewing-ai-output-groundednessInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when a feature states facts derived from sources, and someone has to establish whether those facts are actually in the sources.
An eval suite catches structural regressions and can approximate faithfulness with a judge. It cannot tell you whether a confident, fluent, well-cited paragraph is quietly wrong in a way that matters to this domain. That judgement is human, it is sampled rather than exhaustive, and it ends in an attestation rather than a pass.
Fluency is the trap. Ungrounded output does not look broken - it looks better than grounded output, because nothing in it is hedged.
Before reading a single output, write down what the domain requires - this decides what counts as a finding:
A summariser for internal triage and a summariser for clinical notes have the same architecture and completely different bars. The bar comes from the domain owner, not from the reviewer.
From ./resources/groundedness-review-protocol.md. A defensible sample needs each of:
20–30 outputs is a working review. Below ten, you are collecting anecdotes. Each output must come with the sources actually retrieved for it - reviewing an answer against the corpus rather than against its own retrieval measures the wrong thing and will send you tuning prompts to fix retrieval.
For each output, split it into atomic claims and verify each against the retrieved sources:
| Verdict | Meaning | | --- | --- | | Grounded | stated in a retrieved source; cite the location | | Unsupported inference | reasonable, follows from the sources, but not stated | | Fabricated | not in the sources and not derivable | | Contradicted | the sources say otherwise | | Conflated | merges two sources or two entities into one wrong statement | | Stale | correct in an outdated source that was retrieved | | Unverifiable | cannot be checked from the sources available |
Then check the citations separately: does each cited source exist, was it retrieved, and does it actually support the specific claim it is attached to? A citation that points at a real document making a different point is the most damaging failure mode in the set, because it survives every automated check.
Finally check omission: what did the sources say that the output should have carried and did not? Caveats, conditions, exceptions, dates, and "this applies only to X" clauses are the usual casualties.
For every ungrounded claim, ask which layer failed:
| Failure | Diagnosis | | --- | --- | | The right document was never retrieved | retrieval - fix the index, chunking, or query | | The document was retrieved and misread | generation - fix the prompt or the model | | The document was retrieved and correct, output contradicts it | generation, and the worst kind | | No document exists | coverage - the feature should say so, and should not answer |
Skipping this is how teams spend weeks on prompt engineering to fix an indexing bug.
While the sample is open, run the checklist in ./resources/responsible-ai-checklist.md: harmful or unsafe content, bias across groups where the domain makes that meaningful, privacy leakage into output, disclosure (does the user know this is AI-generated and that it can be wrong), appropriate refusal, and whether confidence is calibrated to the evidence.
Confidence calibration is the one most often missed: output that hedges on well-supported claims and states thin ones flatly is actively misleading, even when every claim is technically grounded.
Record the review as an attestation, never as a score (attesting-manual-verification):
Then feed what is mechanisable back into the eval suite: every fabricated or contradicted claim becomes a permanent regression case (testing-llm-features). That is how a human review compounds instead of evaporating.
./resources/groundedness-review-protocol.md - sampling design, claim decomposition, the verdict classes with examples, citation and omission checks, the review worksheet./resources/responsible-ai-checklist.md - harm, bias, privacy, disclosure, refusal, and confidence calibration, scoped to a tester's judgementtesting-llm-features - the automated layer; findings here become permanent eval cases theretesting-llm-guardrails - runtime controls and adversarial resistance, as opposed to factualityattesting-manual-verification - where this review's attestation lives and how it expiresreporting-bugs - filing individual groundedness failures with evidenceassessing-release-readiness - the attestation is release evidence, with its limitations attachedhandling-sensitive-test-data - real outputs and sources often contain personal dataThis skill is complete when:
testing
Tests the customization assets themselves - skills, prompts, custom agents, instructions - the way a product is tested: activation cases that check an asset fires when it should and stays quiet when it should not, output-contract cases, safety cases, collision cases between assets competing for the same trigger, a weighted rubric scored blind, and a baseline-versus-candidate gate before an edit ships. Use when a skill is edited and nobody knows whether behaviour changed, when two skills fight over the same request, when a description is being tuned for discoverability, when a collection has grown past manual spot-checking, or when the request mentions skill evals, prompt regression, or "does this skill actually work".
development
Shapes QA output for the person who has to act on it: result and blocker in the first two lines, one decision per report, findings ordered by what they cost, the long artifact in a file and the decisions in the message, and magnitude stated in units the reader can count. Use when a report is accurate but nobody acts on it, when a finding set is too long to read under time pressure, when the same findings must be retold for a developer, a release manager, and an on-call engineer, or when the request mentions "too long", "make this readable", "just tell me what to do", "so what", or "summarize this for stakeholders". Pairs with unslop-answers, which makes the same report honest.
testing
Verifies that the lines and branches a change actually touched are executed by tests, using LCOV or Cobertura diff coverage instead of whole-repo percentages, and escalates uncovered high-risk changes into a blocking finding. Use when a pull request needs a coverage gate that unrelated tests cannot satisfy, when total coverage looks healthy but the diff is untested, when wiring diff coverage into CI, or when someone claims a change is covered because the suite is green.
development
Cuts AI tells from test code: tests that pass without proving anything, tautological assertions, mock-only tests, hardcoded waits, coverage theater, vague names, swallowed errors, retries used as fixes. Use whenever test code is written, changed, or reviewed, including tests produced as a side effect of a feature task, and when the request mentions "review these tests", "are these tests any good", "this test always passes", "this suite is flaky", or "clean up these tests". Must always apply to test code.