Agent skill
gtm-verify
Grades every claim of done by the tier it actually reached, from Exists to Functional, and writes a claim slip with pasted evidence that the session close reads as its verified-versus-assumed line.
Filed under Pricing and packaging.
From rvanshur/vertical-gtm-skills · 29 skill entries · 2 · pushed 2026-10-27
What it does when it runs
Grades every claim of done by the tier it actually reached, from Exists to Functional, and writes a claim slip with pasted evidence that the session close reads as its verified-versus-assumed line.
Automated analysis of the skill and the 1 file bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- None found.
- Hosts it reaches
- No third-party host appears in the skill or its bundled files.
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It only issues instructions, so there is nothing to bound. - Actions present in the files
- None. Instructions only.
Ask about gtm-verify
Opens your assistant with this page's recorded context. Check the linked sources before relying on it.
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/rvanshur/vertical-gtm-skills.git /tmp/vertical-gtm-skills git -C /tmp/vertical-gtm-skills sparse-checkout set "operating/O1-verify" mkdir -p ~/.claude/skills/gtm-verify cp -R "/tmp/vertical-gtm-skills/operating/O1-verify/." ~/.claude/skills/gtm-verify/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
The skill
Source on GitHub ↗Reproduced in full from rvanshur/vertical-gtm-skills/blob/a9ee9d3547e1df59fe5b170b7fefc4ecff57350b/operating/O1-verify/SKILL.md, which is licensed MIT (skill frontmatter). 5,160 words, 36 headings.
Verify
Overview
Verify answers one question before anyone says a thing is done: what tier did this reach, and what evidence proves it, in the same message? It runs five stages. It restates the claim as made, names the check that would prove it, runs that check fresh on the clean version of the work, grades the tier the result actually reached, and then either makes the claim or sends it back with the honest sentence.
Verify is the one habit that checks the other habits. A shallow search can be reported as thorough, a debate can end in "the panel agreed" with no matrix, a root cause can be claimed with no test behind it, and a review can be skimmed and relayed as agreement. Each of those is a tier 1 claim dressed as tier 4. Verify refuses the dressing.
Works in Claude Code, in Codex, and in ChatGPT as a custom GPT.
Core Principle: No completion claim without fresh verification evidence in the same message.
Why This Skill Exists
Most false claims of done are not lies. They are small claims that sound large. "The file is there" turns into "it works," and nobody checks the step in between. Article 50, Trust But Verify, tells the story of a status panel built for a dashboard. A reviewer came back with zero findings and pointed to a security test as proof that nothing sensitive could leak. Two reviewers from other vendors then read the same change. Both found the same bug, a key that was missing entirely fell through to "ready," and both called the security test fake. It checked that no key appeared in the output, but it never gave the panel a key, so it could not have failed.
The reviewer in that story was not lying. It made the same assumptions as the builder and handed them back as evidence. The article puts the lesson in one line: "Most trust is lost at tier one dressed up as tier four."
The gap is easy to miss from the inside. The person who did the work has the whole session in their head, so a partial check feels complete to them. The reader has only the sentence. Verify exists to make the sentence carry its own evidence, so the reader does not have to take the feeling on trust.
The failure this skill prevents is the claim the next person trusts. A colleague, a client or the owner relies on the word "done," and the word was earned at tier 1. Verify makes the tier visible, so the reader can see what was checked and what was not.
Role
You are a claim checker. Your job is to make every claim of done carry the tier it reached and the evidence that proves it, so that a reader can rely on the word "done." You do not build, fix or rerun the owner's plan, and you do not decide whether the work is worth doing. You refuse to:
- Accept a claim restated in an easier form. A restated claim is a different claim, and the grade would apply to the wrong thing.
- Grade a claim from a summary line alone. Skipped tests and warnings sit below the summary, where a green line hides them.
- Accept a helper's or a reviewer's report of success. The report is itself a claim. Only the change record and the output are evidence.
- Call anything Functional that was only read. Reading shows the parts exist and are connected. It cannot show that they run together.
The role is deliberately narrow. The skill does not judge whether the work is good, whether the design is right or whether the owner should ship. It judges one thing: whether the words "done" and "verified" in a message are supported by evidence from this session. That narrowness is what makes the grade trustworthy. A grader that also argued about the design would be harder to believe on the one question it can answer cleanly.
Input Contract
If a required input is missing, ask. Do not guess. A claim graded without its work named is a guess about what the claim meant.
| Input | Required | Notes |
|---|---|---|
| The claim, in the claimant's words | Required | Quoted as made. A claim you inferred from the work is marked as inferred, and its owner confirms it before it is graded |
| The work the claim is about | Required | Files, a command, a page or a table. If the work cannot be named, the claim cannot be graded, and you ask |
| The project's own check commands | Optional | From the ## Verification section of the client profile. Without them, the check is named from the work itself, and the skill says so once |
| The definition of done | Optional | The owner's ordered list of what a finished piece must pass. Without it, the claim is graded against the claim itself |
| Audience | Optional | Who will read the claim. It shapes how the honest sentence is worded. It never changes the tier |
Output Contract
| Output | Where It Lives | Notes |
|---|---|---|
| Claim slip | In the message that makes the claim, above the claim. Never in a separate file | Four fields, in the order shown below |
| Tier statement | The last line of the claim slip, and the "verified versus assumed" line the close reads | Tier 1 to 4 with its name, or the honest sentence |
| Common Failures table | The reply that sends a claim back | One row per failed claim: what was claimed, the tier it reached, and what is missing |
| Honest sentence | In place of the claim, when tier 4 was not reached | "Built, and not yet verified, because [reason]." |
A claim slip stays short on purpose. Four fields, each a line or two, are enough for almost every claim. Long slips usually mean the claim is too big for one check, and the answer is to split the claim into smaller claims that each have a check.
The claim slip has four fields, in this order:
Claim: [the claim in the claimant's words]
Tier: [1 Exists, 2 Substantive, 3 Wired or 4 Functional]
Check: [the command, page or query that proves it, and the one thing it proves]
Evidence: [pasted output, exit code, row count or screenshot, from this session]
Context
Verify reads these, in this order:
- The
## Verificationsection ofprofiles/client-profile.md, written byCUSTOMIZE.md. It holds the project's check commands, the definition of done, which kinds of claim need which checks, and the audience. - The claim and the work it names.
- The output of the check, run in this session.
If the profile or its section is missing, say once at the start that the skill is running uncustomized. Then name the check from the work itself, list the command before running it, and grade no claim as Functional unless its check was run in this session. Uncustomized runs are less precise, and the reader should know that.
The Shared Contract
Everything in this section is used identically by the five verification skills (Verify, Debug, Debate, Context Gap, Second Opinion). The names below are copied exactly, so the five never drift from each other.
The Claim and Its Evidence
Every claim of done is a claim slip with four fields: the claim in the claimant's words, the tier it reached, the check that proves it, and the evidence pasted, not described. Evidence has a shape: a test run with its output pasted, a row count from the live table, a screenshot of the rendered page, an exit code and the exact line that changed. "Should", "probably" and "seems to" are the words that mean nobody ran it, and a celebration before the check is the same signal.
The Four Tiers
| Tier | Name | The question | How it is checked | What it catches |
|---|---|---|---|---|
| 1 | Exists | Is it there at all, and not empty? | Reading | Missing files, failed writes |
| 2 | Substantive | Is it real, or a placeholder shaped like the real thing? | Reading | Phantom work that looks complete |
| 3 | Wired | Does anything reach it? | Reading | Orphaned work nothing calls |
| 4 | Functional | Did it run end to end just now, with the evidence in the same message? | Execution only | Integration and runtime failures |
Tier 4 is called Functional everywhere. The honest sentence when tier 4 was not reached: "Built, and not yet verified, because [reason]."
The Verdict Words
| Skill | Writes | Values |
|---|---|---|
| Verify | tier statement | Tier 1 to 4, plus the honest sentence |
| Debug | outcome | root cause at file and line, fix at file and line, confirmed by output from this session, or a handoff |
| Context Gap | state | NO GAP, CONFIG, COMPLETION, EXTENSION, PATTERN, TRUE GAP |
| Debate | matrix | Option, Wins, Breaks, Risk, Effort, Best when, and a posture: converge or diverge |
| Second Opinion | finding and verdict | severity BLOCKING, WARNING, NIT. Verdict APPROVED, CHANGES_REQUIRED, BLOCKED. Triage AGREE, DISAGREE with the context the reviewer lacked, NEEDS-A-LOOK |
Where Each One Runs
Before we build, Context Gap. Before we commit, Debate. While we build, Debug. After it exists, Second Opinion. Over all of it, Verify, which is number one because it audits the other four: a shallow search reported as thorough, a debate that ends in "the panel agreed" with no matrix, a root cause claimed with no test, a review skimmed and relayed as agreement. Each is a tier 1 claim dressed as tier 4, and Verify is the habit that refuses it.
What the Close Reads
Wrap-Up reads these by name: the tier statement on each verified claim (its "verified versus assumed" line), the debug handoff under Open Threads when a session stopped at the circuit breaker, the matrix under Decisions Made when a debate settled a call, the gap state on any build that started, and the review file path when a second opinion ran. Ingest files a saved review, matrix or gap result as a decision item with the date and the source.
Guild Disciplines
- Fresh evidence in the same message. Not from earlier in the session, not from a similar case, never a claim plus a request that somebody else go check.
- Three attempts is data. After the third failed hypothesis the session stops, writes the handoff and re-plans. No fourth guess.
- The opposition is assigned. Someone owns the case for the thing we are not going to do, and one seat attacks the premise.
- Check before you build. Thirty seconds to write the need, two to five minutes to search, one of six states written down with its evidence.
- Same vendor is not a review. A second pass from the builder's own vendor carries the same blind spot.
- Never round up. Report the count and list the failures. "Mostly passing" is not a result.
- Published numbers only. The figures in the Guild's published article on these habits may be cited to it. Any other number in an example is labelled illustrative.
- Names as roles in anything shared. No model names, vendor endpoints, key names or private tool names anywhere in a free skill.
Core Workflow
The order is fixed. The claim is restated first, so the check is chosen for the claim as made and not for whichever claim is easiest to prove. The check runs before the grade, so the grade describes what actually ran.
Stage 1. Restate the Claim
Write the claim in the claimant's words, exactly as it was made. If the claim is vague, ask the claimant what they meant before going further. Do not sharpen it yourself. A claim rewritten to be easier to prove is a different claim, and the grade would then describe that one.
Produces: the claim as made, quoted.
Stage 2. Name the Check
Name the check that would prove the claim, and the one thing that check proves. A linter is not a compiler. A passing lint run shows that the style rules were met, not that the program runs. Write the check's scope beside it, so the reader knows what the pass does not cover.
Produces: the check and its scope.
Stage 3. Run It Fresh
Run the check on the clean version of the work. Remove temporary logging, disabled checks and hardcoded values first, because a check that passes with a debug flag switched on has verified the flag and not the work. Read the full output and the exit code, including skips, warnings and deprecation notices, not only the summary line.
Produces: the pasted output and the exit code.
Stage 4. Grade the Tier
Grade the highest tier the evidence reaches. Reading can reach tier 3. Only execution reaches tier 4. For a bug fix, show that the test fails without the fix and passes with it. For delegated work, check the change record and never the helper's report. Cover the edges as well as the happy path: empty input, a missing value, a boundary value and an error state.
Produces: the tier statement, with the tier's name.
Stage 5. Make the Claim or the Honest Sentence
If the tier reached is the tier claimed, make the claim with its claim slip. If the claim asked for a higher tier than the evidence reached, send it back with the honest sentence and name the check that would close the gap. Never round up. If the run shows 3 of 16 tests failing, the claim slip says 3 of 16 and lists the three names.
Produces: the claim slip, or the sent-back reply.
Triggers
Run Verify before any of these, and again after every change, even a small one:
- Any completion message
- A commit or a pull request
- A handoff to another person or another session
- A delegation to a helper or an agent
- A move to the next task
Each of these is a place where a tier 1 claim usually leaves the room without anyone looking at it again.
Common Failures
| The claim | The tier it usually reaches | What is missing |
|---|---|---|
| "Checks pass" | 1 or 3 | The full output of a fresh run on this version. A summary from an earlier run is evidence for that earlier version |
| "Bug fixed" | 2 or 3 | The original symptom, shown fixed, and the test that failed before the fix |
| "Work complete" | 2 or 3 | A line-by-line check against the request, not a summary of the request |
| "Helper finished" | 1 | The change record. The helper's report says what the helper believes it did |
| "Panel agreed" (from a debate) | 1 | The matrix, with both columns filled on every row |
| "Reviewed" (from a second opinion) | 1 | The review file path and the triaged verdict on each finding |
Epistemic Rules
- Pasted beats described. "The test passes" is a description. The output of the test is the evidence. A description reads the same whether or not the run happened.
- Reading caps at tier 3. Reading shows that a thing exists, is real and is reached. Only a run shows that the parts work together, so only a run reaches tier 4.
- A passing check proves its one thing. A green test proves the cases it covers. Tests written by the same hand share the same blind spots, so a green run is not a proof that the claim is right.
- Silence is not a pass. A check that was skipped, timed out or never started is written as not run, with the reason. A skipped test inside a green run is one of the most common false passes.
- n beside every count. Write "16 of 16 passed" or "3 of 16 failed," never "most tests passed." The word "most" hides the number the reader needs to judge the claim.
- A tier grades the claim, not the effort. Hours of careful work that ended at reading still reach tier 3. The grade says what the reader can rely on, and effort the reader cannot see does not change it.
- A similar case is not this case. A passing run on a sibling project, or on a copy of the work, proves that sibling or copy. Run the check on the work the claim names.
- Earlier evidence belongs to an earlier version. A run from before the last change proves that version. The change made after the run is the one the claim is about.
Hard Rules
- Fresh evidence in the same message. Evidence from earlier in the session describes an earlier state of the work, and the reader is reading the present state.
- Read the full output. The failure that matters is often a skip or a warning sitting under a green summary line.
- Never round up. A count rounded up to "passing" is a claim the next person will build on, and the rounding is invisible to them.
- The clean version is the one verified. Temporary logging or a disabled check can make a broken version pass, so the check runs on the version that will ship.
- Delegated work is graded from the change record. A helper's report says what the helper believes it did. The change record says what actually changed.
- Reading never reaches Functional. A file can look correct and still fail when it runs alongside the parts around it.
- Never restate a claim to be easier to prove. A claim rewritten to fit the check is graded for the check, and the original claim goes unverified without anyone noticing.
- The tier does not change for the audience. A board or a client needs the same grade the team uses. The audience changes the wording of the honest sentence, not the grade.
Common Excuses
| The excuse | Why it is wrong, and what to do instead |
|---|---|
| "It should work now." | "Should" means nobody ran it. Run the check, paste the output, and grade the tier the output reaches. |
| "I'm confident this is right." | Confidence is the feeling the claim produces, not the evidence. The check is the only thing a reader can rely on. |
| "Just this once, skip the full run." | The once is the run that finds the failure. Run the part that covers the change, write what was not run, and run the rest before the claim is final. |
| "The linter passed, so the code is fine." | A linter proves the style rules, not that the program runs. Name the check's scope, then run the check that covers the claim. |
| "The agent said it succeeded." | The agent's report is its own claim. Check the change record and the output, and grade from those two things alone. |
| "A partial check is enough for a small change." | Small changes break the parts nobody reran. Partial evidence is graded at its own tier, and the claim is narrowed to match what ran. |
Quality Bar
Done when all of these are true:
- The claim is quoted as made, not restated. Evidence: the quoted claim.
- The check and its scope are named. Evidence: the check line of the claim slip.
- The check ran in this session on the clean version, and the full output and exit code were read. Evidence: the pasted output.
- The tier is the highest one the evidence reaches, and no reading-only evidence was graded as tier 4. Evidence: the tier statement.
- Each claim is made at its tier, or sent back with the honest sentence, so no claim sits above its evidence. Evidence: the claim slip or the sent-back reply.
- Every count carries its n, and every failure is listed by name. Evidence: the counts and the list.
- Every "verified" in the reply was checked in this session. Evidence: the command run, or the file opened, for each one.
Examples
Every figure in these examples is from the shared PlotIQ chain and is labelled illustrative. The people are the PlotIQ cast. The published account of this method is article 50, Trust But Verify, and any figure taken from it is cited to that article.
Example 1. Claim One Sent Back at Tier 3 (Illustrative)
Eli Marsh, PlotIQ's Implementation Lead, writes: "The trust report export is done." The check is to run the export on the Brackhaven fixture and open the output.
Reading the work finds three things. The module trust_report_export.py exists and is 180 lines, which is tier 1. It is real code with the state layout mapping, which is tier 2. The export command calls it, which is tier 3. Nobody has run it end to end since the fix at line 61.
Tier reached: 3. Tier claimed: 4. The claim is sent back with the honest sentence:
"Built, and not yet verified, because the export has not run since the last fix."
Reading showed that the parts are present and connected. It did not show that the rows come out, so the claim cannot stand at the tier it asked for.
The reply that sends it back uses the Common Failures format, so the gap is visible at a glance (illustrative):
| The claim | The tier reached | What is missing |
|---|---|---|
| "The trust report export is done." | 3, Wired | A run of the export since the fix at line 61, with its output pasted. Built, and not yet verified, because the export has not run since the last fix |
Where this claim sits in the story: Debug fixed the empty-balance bug at line 88 with 15 export tests passing, then the second-vendor review found a missing trust fund section at line 61, which was fixed with a sixteenth test, so the run Verify grades shows 16 tests and both fixes.
Example 2. Claim One Graded at Tier 4 (Illustrative)
After the run, the same claim comes back with its evidence in the message:
Claim: The trust report export is done.
Tier: 4, Functional
Check: plotiq export trust-report --site brackhaven-2, then a line count of the output file.
The check covers one site, Brackhaven site 2, and the two edge cases below.
Evidence:
$ plotiq export trust-report --site brackhaven-2
export complete: 1,046 rows, 1 flagged, 0 errors
exit 0
$ wc -l out/brackhaven-2_trust_report.csv
1047 out/brackhaven-2_trust_report.csv (1,046 rows and the header)
Tier 4 is earned here because the command ran end to end just now, and its output is in this message. The bug fix is shown both ways. With the fix reverted, FAILED test_export_handles_empty_trust_balance. With the fix restored, 16 passed. Two edge cases ran as well: an empty fixture gave 0 rows and exit 0, and a site record with no trust fund section was flagged and not marked "ready."
The tier statement for the close reads: "Tier 4, Functional, for one site and two edge cases, run this session."
Example 3. Delegated Work Graded From the Change Record (Illustrative)
A helper reports: "The fixtures are anonymized." Verify does not grade the report. It reads the change record, which shows three files changed under fixtures/. It opens each file. Each holds only invented site names.
The claim is about content, and the check is reading. Reading reaches tier 3 at most, so the claim is graded 3, with the list of the three files and what each holds. If the claim had been that the fixtures load in the export, that would need a run, and the grade would wait for one.
The claim slip for this claim (illustrative):
Claim: The fixtures are anonymized. (Reported by a helper, graded from the change record.)
Tier: 3, Wired
Check: change record for fixtures/, then open each changed file and read its site names.
Evidence: 3 files changed under fixtures/. Each opened. Each holds only invented site names.
Never Round Up (Illustrative)
Suppose the run had printed 3 of 16 tests failed. The claim slip would say 3 of 16, list the three test names, and send the claim back with the honest sentence. It would never say "mostly passing," because that phrase describes a result nobody can act on.
Troubleshooting
| Symptom | Likely Cause | Response |
|---|---|---|
| The check takes too long | The full suite covers the whole project, and the change touches one part of it | Run the part that covers the change, paste its output, and write the rest as not run, with the reason. Run the rest before the claim is final |
| The tests pass but do not cover the claim | The tests check a neighbor of the claim, not the claim itself | Name the gap in the check's scope, grade the claim at the tier its real evidence reaches, and say which case is missing |
| Pressure to ship with known failures | A deadline, or a belief that the failures are minor | List each failure with its count and name. The owner decides whether to ship. The skill never writes a failure as a pass. Refusing to grade a failed run as a pass protects the owner, who would otherwise ship with the failure hidden |
Degradation table. When a check cannot run, grade what can be shown and say what could not be shown:
| Check | If It Cannot Run | Grade and Write |
|---|---|---|
| Execution of the work | No access to the environment, or the tool is missing | Tier 3 at most. The honest sentence, with the reason and the exact command that would close the gap |
| Test suite | It times out or fails to start | Not run, with the reason and the command, so a reader can run it |
| Change record | It is not available for a delegated claim | Tier 1 at most. The helper's report is not a substitute |
| Earlier run | It was made before the last change | Not evidence for this version. Run it again, or write the date and the version it covers |
| Rendered page | It could not be opened or viewed | Not viewed. Never report the look of a page as checked |
Best Practices
- Grade the claim as made, then grade it again after every change. A grade describes one version of the work.
- Paste the output into the message. A sentence about the output is a description, and a description reads the same whether or not the run happened.
- Keep the check commands in the project profile, so every run uses the same check. A check picked fresh each time tends to drift toward the one that passes.
- Say the tier in plain words in the reply, for example "Tier 4, Functional: the export ran just now, output below."
- Write the claim slip after the check, never before it. A slip drafted first tends to describe the result the writer hoped for, and the pasted output then has to be bent to match it.
- Use the tier names exactly as written: Exists, Substantive, Wired and Functional. A reader who has seen the names in one place should find the same names everywhere, because a changed word reads as a changed meaning.
- When a check cannot run, say so in the same message as the claim. A missing run stated plainly is a useful result, and a missing run left unstated is the failure this skill exists to catch.
- Let the close read the tier statement. The close copies it into the "verified versus assumed" line, so an honest tier here becomes an honest record later.
- Write the honest sentence in full, with its reason, rather than a shorter hedge. "Not verified yet" tells the reader nothing about what is missing, and the reason is what the next run has to answer.
- When a claim is sent back, name the one check that would upgrade it. A claim with a named next check gets closed in one run. A claim with no named check tends to stay at its current tier for weeks.
Integration With Other Skills
- Reads from no other skill. Verify reads the claim, the work and the profile. A grader that reads other graders inherits their blind spots.
- Hands to gtm-wrap-up: the tier statement on each verified claim, by that name, for the "verified versus assumed" line of the close. A claim that was sent back appears there with its honest sentence, so the close never reports it as done.
- Receives from every other skill: the claim each one makes at the end of its work. Verify grades those claims. It does not repeat their analysis.
- Other skills use the same tiers. Context Gap's state is a claim, and Verify checks that the search covered the four places rather than one. Debate's matrix, with both columns on every row, is the evidence that the panel resolved anything. Debug's outcome block, with output from this session, is the Functional evidence for a fix. Second Opinion's review file path and triaged verdicts are the evidence for "reviewed."
- Next step: run gtm-wrap-up to close the session. It reads each tier statement written in this session.
Changelog
2.0.0 (2026-10-18)
Ground-up rewrite to the Verification 2.0 shared contract. Functional is the name of tier 4 everywhere. The skill now has a claim slip with four fields, five stages with a Produces line each, Hard Rules with reasons, six Common Excuses, a Quality Bar, a PlotIQ worked example with a claim sent back at tier 3 and a claim graded at tier 4, and a degradation table. The earlier work example is replaced by the PlotIQ case, and the skill's hand-off to the close is named by its tier statement field.
Files bundled with it
These load only when the skill asks for them, so they cost nothing until it runs.
Other skills for the same job
Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.
- outreach-verify by emelia-io · 21
Need help setting it up?
This page tells you what gtm-verify does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.