The manual.
One run, fully documented.
Get started in ten minutes, then read the operator book.
Getting started.Six steps, ten minutes.
Unzip
Copy every folder that contains SKILL.md into Grok ~/.grok/skills/ or Claude ~/.claude/skills/. Not only impact/ — commands are separate folders.
Confirm Python
python3 ~/.grok/skills/impact/scripts/expected_ctr.py 3
JSON comes back. If Python is missing, chat still runs; probes and scoring will not.
Connect mcp-gsc (optional)
Live Search Console via mcp-gsc — Google OAuth or a service account. IMPACT never stores your Google secrets.
Open a new thread
Old threads will not see new folders. Say:
Run IMPACT on example.com
Feed it real data
First run creates the vault. If MCP is off, paste a GSC Pages CSV into imports/.
You still ship
IMPACT writes tickets, maps, and drafts. You publish, deploy, and send mail.
The operator book.Manual · v1.4.
Sections 1–14What you have
IMPACT is a skill pack for Grok and Claude. You copy folders into the client's skills directory, name a domain, and the model follows the skills: measure, rank, do one thing, write a ticket.
It will not log into Google by itself. Live Search Console numbers come from mcp-gsc, or from a CSV you drop in the vault. Missing data is labeled unknown — required, not optional. It will not publish the site or send outreach.
Install
Unzip IMPACT-by-PressTitan.zip. Copy every folder that contains SKILL.md:
Confirm Python 3.10+ — expected_ctr.py 3 should return JSON.
Optional, live GSC: follow github.com/AminForou/mcp-gsc, use OAuth or a service account, enable the Search Console API, add the MCP server to your client. Open a new thread after install.
First run
Say Run IMPACT on example.com. Then:
- A vault is created if missing.
- Public pages are probed — home plus a few templates.
- Candidates are scored.
- One action is taken, or the run records "nothing beats the bar."
- A ticket and a run record are written.
Name the domain every new thread. State is per domain.
The vault
One folder per client. The action log, KPIs, and memory live here. Locations in order: config.json → vault_path, <site-repo>/.seo/, artifacts/impact/<domain-slug>/.
python3 $S/init_state.py --dir .seo --domain example.com python3 $S/init_vault.py --dir .seo --name "Client Name"
Say open the vault to print path, KPIs, last memory lines, and the queue.
What to say
seo-ops is the old name — it loads impact. Speak as IMPACT.
Scoring
score = (impact × confidence × learn) / cost
Clears the bar when score ≥ 2.0 and confidence ≥ 0.35.
Impact: 5 blocked money URL or false claim · 4 snippet or template speed on a converting URL · 3 refresh with demand · 2 new page for a missing winnable intent · 1 hygiene · 0 speculative post.
Cost is hours, minimum 0.25 — field name cost. Learn starts at 1.0 per lane and moves toward 0.4–1.4 after four scored outcomes. Creation loses to repair / refresh / correct when the protected score is at least 85% of the creation score.
python3 $S/score_actions.py candidates.json
Search Console
Live (MCP): a measure pass calls get_capabilities, list_properties, get_search_analytics (28 days, pages and queries), compare_search_periods, and inspect watchlist URLs. Save a slice under imports/gsc-mcp-YYYY-MM-DD.json. Do not add/delete properties or submit sitemaps unless you asked.
Offline (CSV): export Pages (and Queries), put them in imports/.
python3 $S/gsc_ingest.py imports/pages.csv --prior imports/pages-last-month.csv
You get totals, striking distance (position 4–15), low CTR vs expected-at-position, and decay when a prior file exists. If neither MCP nor CSV exists: clicks = unknown. Do not invent position 8.
Daily ticket
Every default run closes in this shape:
Decision: Evidence: Patch: Verify: Client ask: KPI it should move:
IMPACT report weekly: what we did, what moved, what did not, queue, next ticket. Movement stays blank unless GSC exists.
Scripts
All under impact/scripts/ — vault, measure, GSC/claims/score, and record. The full 24-tool list with commands: script reference.
python3 $S/health_probe.py https://example.com --site-checks --timeout 20 python3 $S/watchlist_probe.py --dir .seo python3 $S/claim_check.py page.html --dir .seo python3 $S/indexnow_ping.py --host example.com --key test --url https://example.com/ --dry-run
HTTP 404 on robots/sitemaps is JSON, not a crash.
Diagnostics vs commands
Diagnostics print readings: seo-audit, seo-page, seo-technical, seo-content, seo-schema, seo-geo, seo-local, seo-plan, seo-pr, seo-aeo-teardown, seo-content-brief.
After a report, say run IMPACT to get the next action. Do not treat a 40-row audit as today's execute list. Companions load when present; voice gets generic if client-context is empty.
CMS patches
If config.cms is webflow, wordpress, hubspot, or next — write the change in that tool's fields. If unknown, ship HTML <title>, meta, and a 301 row.
Limits
- No invented rankings, referring domains, or field Core Web Vitals.
- No guaranteed answer-engine citation.
- No paid links. No production publish.
- IndexNow POST only with a real key and a clear ask.
- Radar is demand; pr/angles.md is stories. Do not merge them.
When it is broken
Script traceback: run --help, then against https://example.com. Still tracebacks? That is a script bug.
Model wrote a new blog while /pricing 404s — the run ignored scoring. Reject it. Point at the vault log.
Two vaults for one client: run upgrade_state.py and delete the empty one.
GSC numbers look wrong: check whether CTR in the CSV carries a % sign. gsc_ingest.py handles both.
File map in the zip
impact/ operator, scripts, references, templates impact-*/ command + report skills seo-ops/ alias seo*/ diagnostic family humanizer/ client-context/ … companions README.md INSTALL.txt docs/ IMPACT-user-manual.md this file, at zip root as shipped
Start with section 3. Come back to section 7 when you have a GSC file.