Agent skill
check
Tell the user whether gtm-operator can still see what it created in Notion, and repair the things it owns.
From sarahcallmesmadds/gtm-operator · 27 skills · 0 · pushed 2026-09-02
What it does when it runs
Tell the user whether gtm-operator can still see what it created in Notion, and repair the things it owns. Use when something that worked has stopped working, when another gtm-operator skill fails a Notion call in a way that looks like drift rather than a bad request, or when the user says "check gtm-operator", "is my setup still working", "something is broken in Notion". Reads config and all six databases. Makes no change in Notion without an explicit yes, and only to repair. It reads and queries freely, which is the whole job. It does write one file locally, the read-back its own commands are given.
Read from the skill and the 0 files 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
- mcp__*__notion-fetch
- mcp__*__notion-get-users
- mcp__*__notion-query-data-sources
- mcp__*__notion-update-data-source
- Hosts it reaches
- No third-party host appears in the skill or its bundled files.
- Tool permissions it declares
- Write
- Bash(node:*)
- mcp__*__notion-fetch
- mcp__*__notion-query-data-sources
- mcp__*__notion-update-data-source
- mcp__*__notion-get-users
- Actions present in the files
- shellwrites files
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/sarahcallmesmadds/gtm-operator.git /tmp/gtm-operator git -C /tmp/gtm-operator sparse-checkout set "plugins/setup/skills/check" mkdir -p ~/.claude/skills/check-20 cp -R "/tmp/gtm-operator/plugins/setup/skills/check/." ~/.claude/skills/check-20/
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 ↗
Or take the whole library
This repo ships a .claude-plugin manifest, so Claude Code can install all 27 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.
/plugin marketplace add sarahcallmesmadds/gtm-operator /plugin
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.
Before you install: this skill will not complete its job on a bare agent. It needs mcp__*__notion-fetch, mcp__*__notion-get-users, mcp__*__notion-query-data-sources, mcp__*__notion-update-data-source, which you have to obtain separately.
The skill
Source on GitHub ↗Reproduced in full from sarahcallmesmadds/gtm-operator/blob/a93c6e98a742d183823691197b8d9be9edd114c6/plugins/setup/skills/check/SKILL.md, which is licensed MIT (repository). 1,370 words, 10 headings.
check
Find out what has drifted, say it plainly, and repair only what this plugin owns.
The line this skill holds: repair what the plugin owns, never touch what the user wrote. Re-adding a select value the schema already defines is restoring something the plugin made. Deciding which of somebody's four tags to drop is not, and this skill will not do it.
How this skill works
scripts/check.js decides what to send. You send it. The Notion calls go
through the connected client, which a script cannot reach, so the script builds
every call and judges every answer, and you make the calls in between.
node "${CLAUDE_PLUGIN_ROOT}/scripts/check.js" plan # what to fetch and query
node "${CLAUDE_PLUGIN_ROOT}/scripts/check.js" judge <readback.json> # the findings
node "${CLAUDE_PLUGIN_ROOT}/scripts/check.js" repairs <readback.json> # what a yes would do
node "${CLAUDE_PLUGIN_ROOT}/scripts/check.js" adopt <readback.json> <id>...
node "${CLAUDE_PLUGIN_ROOT}/scripts/check.js" send <readback.json> <id>...
node "${CLAUDE_PLUGIN_ROOT}/scripts/check.js" prove-sent <before.json> <after.json> <id>...
Do not compose a query or a statement by hand. Every one of them is generated, including the two rule queries, which resolve the workspace's own property and option names through the config map. A hand-written query asking about the shipped names comes back with no rows on a renamed workspace, and no rows is exactly what a healthy workspace looks like.
Step 1. Run the plan and make the calls
plan lists what to fetch, in order, and what to record for each. Follow it
exactly, and record all of it:
found: whether the database id resolved at all.title: what the database is called in Notion now.dataSources: every data source id on it, not only the recorded one.schema: the properties of the recorded data source.person.found: whether the recorded person id is still in the user list.rules: the rows each rule query returned, as page urls.
Write them into one file in the shape plan describes and pass it to judge.
A key you leave out is not a pass. Anything missing comes back as "not checked", which is a different answer from "fine", and this skill keeps them apart on purpose.
Step 2. Report what came back, in three parts
judge gives three lists and they are not the same thing:
- Broken. Something this plugin created is not as it was.
- Worth knowing. Real, not a failure. A second data source appearing is the common one: queries keep using the recorded one, correctly, and the user needs to know that is why the new one is invisible.
- Not checked. Nothing came back to judge it with, so nothing is claimed.
Read all three to the user. Never summarise the third as everything being fine, and never present a clean result as "everything is working": this skill does not look at the saved views, and it says so in its own output every time.
Step 3. Show what could be repaired, and get one yes per repair
repairs splits them, because the two kinds behave differently:
- Config repairs send nothing to Notion. The workspace is right and this plugin's record of it is wrong. Adopting a rename is the common one.
- Workspace repairs send a statement. Re-adding a lost select value, or rebuilding a relation whose two halves are both gone.
Each carries an id. Pass the ids the user approved and nothing else. A missing
option value gets two repairs, :renamed and :lost, because it was either
renamed or deleted, those need opposite answers, and choosing is the user's job.
repairs does not print the statement for a workspace repair. Get it with
send, which clears the proof before it hands the statement over, because from
that moment the workspace is about to stop matching what was verified. There is
no other way to obtain it, on purpose: a step that can be skipped is a step that
gets skipped.
One statement here has never been measured. The one that adds a lost select
value back is the only thing this plugin sends with no dated proof behind it,
and send labels it. Tell the user what it did, in as many words: what was
sent, what came back, and that this was the first time anybody watched it. That
is the measurement, and it is worth having.
Do not write it to a file from here. This skill ships as a plugin, and the
only thing it can be sure of is the plugin directory. DECISIONS.md is a file in
the repository this was built in, so an installed copy reaching for that name
writes into whatever working directory somebody happened to start in, which is
somebody else's file with somebody else's reasoning in it.
Anything ambiguous is in withheld with the reason. Read those out too. They
are not repaired and they are not nothing.
Step 4. Prove the repair, do not assume it
A call that returned without an error proves nothing here. Notion accepts some things it cannot do and discards them silently.
adoptproves itself and prints the result. It judges the same read-back again through the new record, which is the right proof for a repair that sent nothing, and fetching again would let a workspace that changed in between look like a record being corrected. There is no separate command for this, because a separate command could only ask half the question: whether the finding is gone. Whether it was ever there needs the record as it was, which is whatadoptjust changed, so run afterwards it answered "proved" to an id somebody had invented.- After sending a statement yourself, fetch again and run
prove-sentwith both files. It passes only when the finding it was meant to clear is gone.
Step 5. Say the install is no longer proved, and how to fix that
Any repair, of either kind, clears the proof that this workspace matches the manifest. That is correct: what the proof was taken against has changed.
Two commands put it back, and both are needed:
node "${CLAUDE_PLUGIN_ROOT}/scripts/install.js" verify <readback.json>
node "${CLAUDE_PLUGIN_ROOT}/scripts/install.js" complete
verify restores completion by itself only when the install was still complete
when it started, and after a repair it is not.
What this skill does not do
- It does not rename anything in Notion. It is the user's workspace. The config map exists precisely so this plugin adapts to their names rather than the other way round.
- It does not remove a select value somebody added. Extra values are theirs.
- It does not touch a content row, and never deletes.
- It does not fix either rule violation. Rows carrying more than three tags, and rows in Process whose parent is not a Strategy Decision, are counted and reported. Which of four tags to drop is a judgment about content somebody wrote.
- It does not fix an artifact. That is
update. - It does not create a database. A database missing from config is reported
and pointed at
add, which is not built yet. - It does not look at the saved views. See below.
Views are outside this skill, deliberately
The nine checks in plugins/setup/SKILLS.md do not include a view, and closing that gap
means carrying the name map into the view compiler, which changes what gets
sent to Notion rather than what gets read back.
So somebody can break a saved view and this skill will still pass. It says so every time it runs. Do not soften that when reporting: a person who has just been told everything is fine will not go and look at their views.
The judgment this skill carries
Whether a thing is missing or moved. A deleted database and one renamed and unshared look identical from outside and the remedies are opposite. Anything ambiguous stops and asks rather than choosing, and the output gives both readings rather than picking the likelier one.
The same judgment one level down decides a rename. A property the schema cannot find, beside a property the schema does not know, of the right type, is a candidate. One candidate is a proposal. Two is a question.
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.
- claim-check by pmalliance · 66
- message-consistency-check by pmalliance · 66
- evaluation-pipeline-check by zime-ai · 14
- negotiation-pipeline-check by zime-ai · 14
- poc-pilot-pipeline-check by zime-ai · 14
- prospect-pipeline-check by zime-ai · 14
- qualify-pipeline-check by zime-ai · 14
- won-pipeline-check by zime-ai · 14
Need help setting it up?
This page tells you what check 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.