Agent skill
update
Change an artifact that already exists in the Process library.
From sarahcallmesmadds/gtm-operator · 27 skills · 0 · pushed 2026-09-02
What it does when it runs
Change an artifact that already exists in the Process library. Use when a document is wrong, out of date, or has been flagged by `audit`. Asks separately whether the edit counts as having re-read the artifact, and only then moves the verification fields. Triggers on "update this SOP", "fix that artifact", "this document is wrong", "mark this as reviewed".
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
- 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 does act, so it runs under whatever permissions your session already grants. - 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/process/skills/update" mkdir -p ~/.claude/skills/update-13 cp -R "/tmp/gtm-operator/plugins/process/skills/update/." ~/.claude/skills/update-13/
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.
The skill
Source on GitHub ↗Reproduced in full from sarahcallmesmadds/gtm-operator/blob/a93c6e98a742d183823691197b8d9be9edd114c6/plugins/process/skills/update/SKILL.md, which is licensed MIT (repository). 810 words, 7 headings.
update
Changes an artifact that already exists. Most changes to a library are edits
rather than creates, and the natural path runs audit to here.
node "${CLAUDE_PLUGIN_ROOT}/scripts/process.js" context
node "${CLAUDE_PLUGIN_ROOT}/scripts/process.js" update <before.json> <after.json> [YYYY-MM-DD]
node "${CLAUDE_PLUGIN_ROOT}/scripts/process.js" prove-update <update.json> <readback.json>
Do not build a property payload by hand. It resolves the workspace's own property and option names through the config map. A hand-written payload carrying the names this plugin shipped with writes to properties that do not exist on a renamed workspace.
Step 0. Refuse to start without config
Run context. If it refuses, print what it said and stop.
Step 1. Fetch the artifact and keep its url
Fetch the page and save it as before.json with its url on it. Without the
url nothing can say which page the update is for, and update refuses rather
than writing to a page it cannot name.
Step 2. Ask the one question that cannot be inferred
Does this edit count as having re-read the artifact for accuracy?
Ask the person. Do not decide it from how large the edit looks.
- Yes.
Last checked for accuracy,Verified byandVerified dateall move to today. - No. None of them move.
Put the answer on after.json as "reviewed": true or "reviewed": false.
update refuses if it is missing, and that refusal is deliberate: a missing
answer and "no I did not re-read it" are different, and only one of them is a
decision somebody made.
Why this matters more than it looks. Last checked for accuracy is what
drives the staleness check. Stamping it on an edit that was not a review makes a
stale document look freshly checked, and nothing downstream can tell. Leaving it
alone on a real review only means the artifact stays flagged, which a person can
see and fix.
Step 3. Write the after artifact and run update
after.json is the artifact as it would be, plus reviewed. Only fields that
actually differ are sent.
A property-only edit needs no body. Leave body out entirely when changing a
status, a tag or an owner. Anything you do not send stays as it is on the page.
A section you DO send has to be filled, because a heading sent with nothing under
it is how a section gets emptied by accident.
Clearing a person clears it. Set Owner to null to empty it. It will not
quietly become whoever installed the plugin.
Leaving a field out leaves it alone. Only a field you actually put in
after.json can change. To empty one, put it there with an explicit null.
Omitting it never clears it, and the output lists what it left untouched.
Pass rows keyed by the logical names, the ones in this plugin's schema, not
the workspace's own property names. A page fetched from Notion comes back keyed
the workspace's way, and update refuses that rather than reading every field as
unchanged.
Then show the person, before anything is written:
changedand the values either side.clearing, if anything is being emptied. An emptied property goes as an explicit empty value, because leaving it out means the write does nothing and the old value survives while the person is told it was saved.archiving, ifStatusis becomingArchive. Never archive without a yes.
Step 4. Send it, then prove it
Send the properties to the page named by target. Then re-fetch the page,
keeping its url, and pass the output of update and the re-fetched page to
prove-update.
Not the two files you started with. A payload rebuilt from a merged row has no record of what was emptied, so a clear that silently failed would read as a clean write.
prove-update says what it did not check, every time, including when it passes.
Report that alongside the result rather than reporting a clean write.
What this skill does not do
- Does not create. That is
new. - Does not archive without asking. It flags the archive and waits.
- Does not touch Memos. Memos is append-only, and a correction there is a new memo rather than an edit.
- Does not rewrite a body wholesale when a section is what changed. Send the sections that changed. Rewriting the whole body loses the wording of everything else.
- Does not write the
ParentorSupersedesrelation. Neither is built in this version. Say so rather than letting a link read as set. - Does not decide whether this is an edit or a replacement. A Strategy
Decision that now reaches a different conclusion on the same problem is
not an edit: editing it destroys the record of what was previously decided and
why. That is a person's call, and
newis where a replacement starts.
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.
- product-update-logger by Varnan-Tech · 645
- salesforce-pipeline-update by composio-community · 2
Need help setting it up?
This page tells you what update 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.