Stop the claim verifier contradicting a PR against its own live page - #21737
Conversation
The pre-merge verifier stamped PR #21720's `terraform-provider` pin bump (0.10.0 -> 1.4.0, the real latest release) `contradicted`, citing the live published copy of the file under review. That page shows the pre-change text, so it disagrees with every value a PR changes. A ledger audit found 9 of 66 contradicted verdicts citing the reviewed page's own URL and 9 more resting on other pulumi.com pages alone. The shape is a useful change detector (it also caught two real bot regressions, #21552 and #21602), so it is re-verified, not downgraded: - verify-claims.py: a contradicted/mismatch whose only source is the reviewed page's live URL, or a contradicted resting on editorial pulumi.com pages alone, gets one more pass1 hop with a note explaining why that source is not evidence. An independently sourced answer stands; otherwise the verdict becomes `unverifiable`, stamped `source_discipline_gate: self-reference | same-site-only`, with the original reasoning preserved as an author question. Generated reference pages and URLs the claim itself names are exempt. - route_claim: a `version` claim's non-URL source_hint names a package, not an external authority, so it routes pass1 (release tags) instead of being web-searched into pulumi.com's own page. - claim-extraction.md: worked example 14 (whose version a nested `packages:` pin belongs to) and a `pulumi/<repo>` source_hint preference for version claims. - Verifier prompt and fact-check.md state that rules 2 and 5 are now harness-enforced. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A live replay of the #21720 claims showed the self-reference gate's blind spot: on the gh lane the verifier cites the reviewed file by repo path, not by its pulumi.com URL, and the shape check returned early when a source named no URL. A `contradicted` resting on the reviewed file alone says the extracted claim and the page disagree -- an extraction misreading or a page contradicting itself -- so it gets the same single re-check, told to return `not-a-claim`, `mismatch`, or an independently sourced verdict. `mismatch` is left alone: a page that disagrees with itself is a legitimate finding. The gated record's author question is now specific to the gate. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Your site preview for commit d15a885 is ready! 🎉 http://www-testing-pulumi-docs-origin-pr-21737-d15a885d.s3-website.us-west-2.amazonaws.com |
Reviewer's guide v2 — not for the authorTip This is the reviewer's guide. Work through the PR author: your to-do list is the other review comment, "Author action guide" — nothing on this card is yours. Approval needed from: @pulumi/docs-tools — any member's approval satisfies the merge gate. Note What this PR changes:
Wrongness that would matter here is a gate that swallows a real regression — silently downgrading a Review confidence:
|
| ID | Where | Finding |
|---|---|---|
| F1 | .claude/commands/docs-review/scripts/verify-claims.py L422 |
The new version carve-out routes every version claim with a non-URL hint to the gh/local-reads lane, including hints that name a genuinely external authority — the test suite pins Node.js to that lane. Nothing is lost mechanically (that lane can escalate back out to web search, and the escalation path is exercised elsewhere in the suite), so this is a cost-and-latency call, not a correctness one: confirm you're happy paying an extra hop on third-party version pins to stop Pulumi package pins being judged against pulumi.com's own page. ✋ Accepted as-is by CamSoper on 2026-09-18. Accepting as-is — it's the right trade. Version claims carrying a bare non-URL hint are rare (~60 of ~4,000 claims in the index, most with no hint at all), pass1 escalates to web search when gh can't close it, and the failure this replaces was a false blocker needing a human dispute to clear. An extra hop on the occasional Node.js pin is cheap next to that; if PR #21736's claim artifacts show it costing real money, a narrower rule is easy to add with data in hand. |
Editorial stances introduced by this PR
Superlative, ranking, or comparative language the diff adds. No verdict — a page's own framing isn't fact-checkable — but confirm each is a stance the docs should take, and that no agent-written rewrite introduced it unasked.
- L181
.claude/commands/docs-review/references/fact-check.md— "The canonical worked-example set — composite/split, implicit comparison, quantitative, negative, the third-party-attribution flip, and the hard…" — positioning (found by regex)
✅ What you can rubber-stamp
- Facts: no factual claims found in the changed lines.
- Mechanics: no internal links added.
- Style: 0 advisory suggestion(s) left with the author; never blocking.
💡 Pre-existing issues in touched files: 0 — details on the evidence page.
📎 Full evidence: verification trail, investigation log, review history.
Review v2 · updated 2026-09-18T19:24:26Z · head commit d15a885
For the reviewer: the @claude <your point> #update-review re-adjudicates with your input.
Author action guide v2 — nothing blocks mergeNote Nothing here blocks merge — no open items need an answer from you. A human reviewer still approves the merge. This PR changes the docs-review tooling itself — it stops the claim verifier from treating the live published copy of a page (or another pulumi.com page) as proof that the page is wrong, and adds tests for the new behavior; the review checked the changed logic, its tests, and the reference docs that describe it, and found nothing that needs an answer from you. 🚨 Fix or disagreeNothing to fix — this section is empty. ❓ Questions for youNo open questions for you. 📎 Full evidence: verification trail, investigation log, review history. Review v2 · updated 2026-09-18T19:24:26Z · head commit d15a885 How to answerEvery 🚨 and ❓ item above needs one of these before merge:
The Please don't edit, hide, or delete this comment — it is the review's record. Full mechanics: CONTRIBUTING.md §AI-assisted contributions. |
|
@claude F1: accepting as-is -- it's the right trade. Version claims that carry a bare non-URL hint are rare (version is ~60 of ~4,000 claims in the index, and most carry no hint at all), pass1 escalates to web search when gh can't close it, and the failure this replaces was a false blocker that needed a human dispute to clear. An extra hop on the occasional Node.js pin is cheap next to that. If PR #21736's claim artifacts later show it costing real money, a narrower rule is easy to add with data in hand. #update-review |
|
🤖 Review updated on @CamSoper's request. |
Proposed changes
On #21720 the pre-merge review stamped three correct edits
contradicted(a glow-up refreshing an exampleterraform-providerpin from0.10.0to1.4.0, which is the latest release). Two of the three verdicts cited the live published copy of the page under review as their source. That page still shows the old value, so the check is a tautology: any PR that changes a number "contradicts" it. A human had to dispute the findings before the update lane rangh release listand conceded.It isn't a one-off. Across the 117 v3 review records in the ledger, 66 verdicts are
contradicted; 9 cite the reviewed page's own live URL and 9 more rest on other pulumi.com pages alone. The verifier prompt already forbids both, but only the generated-from-data rule was enforced in code.Source-discipline gates (
verify-claims.py)contradicted/mismatchwhose only source is the reviewed page's own live URL, acontradictedwhose only sources are editorial pulumi.com pages, and acontradictedciting only the reviewed file's repo path each get one re-check in the pass1 (gh) lane, told exactly what the first pass leaned on and why it isn't evidence.unverifiable, stampedsource_discipline_gate, keeps the original reasoning, and asks the composer for an author question instead of a 🚨.--dry-runand without a repo root.Routing
versionclaim with a non-URLsource_hintnow routes pass1 instead of pass3.claim-extraction.mdtells the extractor to put the package name insource_hint, and the router treated any bare name as "named external source, go web search". So a pin for a Pulumi package without "pulumi" in its name (terraform-provider) got web-searched, where the top hit is pulumi.com's own page.Prose kept in sync
fact-check.mdnow say which rules are harness-enforced.fact-check.mdwas missing the self-reference rule entirely, and its worked-example count was stale.claim-extraction.md: worked example 14 for aPulumi.yamlpackages:block (theversionbinds to the package,parametersnames the wrapped provider), and theversionrow prefers thepulumi/<repo>hint form.Verification
make test-review-pipelinepasses, including 61 new tests built on the real ledger verdicts from #21720, #21552, #21602, #21394, and #21509.Live replay of the #21720 claims (real model calls, same inputs):
versionclaims with hintterraform-providergh)contradictedciting the page's own live URLgh release list,verifiedFork CI smoke (CamSoper#246, the exact #21720 diff, one run): all three
1.4.0claims routed pass1 and came backverifiedagainstgh release list -R pulumi/pulumi-terraform-provider; zerocontradicted; validator clean. The routing fix kept the claims off web search, so the re-check hop itself didn't fire in CI -- its live evidence is the local replay above.Known residual: when the extracted claim text misdescribes the page ("pins the
randomprovider to 1.4.0"), the verifier can still returnmismatchagainst the page itself. That's an extraction error, and worked example 14 is the fix for it, but it's prompt-level and the replay can't prove it.Also worth knowing: the
pulumi/<repo>hint form yields entity keys likeversion/pulumi-pulumi-gcp(vsversion/pulumi-gcpfor the bare form). That quirk predates this PR -- worked example 4 already recommends thepulumi/<repo>form -- but more claims will take that shape now, so claims-index continuity shifts for them. Not touchingentity_key.pyhere.reverify-claims.pycallsprocess_claim, so the nightly lane gets the re-check too. Its own own-corpus demotion still runs afterward.Related issues (optional)
Follow-ups filed: #21732 (give the verifier the PR body's rationale), #21733 (27% of
verifiedverdicts cite only the page under review). Companion: #21736 (persist the claim records this trace couldn't find).