Phase Monitor logo

Phase Monitor

Community
XuanRanL
phase-monitor

Run Phase Monitor — rank tracking, AI visibility tracking, drift detection, content refresh signals, performance reporting. Use for post-publish monitoring or scheduled checkup. Triggered by /seo-blog monitor, /perf, /rank-check, /drift, /ai-visibility, or as automated scheduled hook (T+7/14/30/90 after publish).

Overview

PublisherXuanRanL
Repositoryloamwright-SEO-Skill
Skill namephase-monitor
Stars
52
Forks
9
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by XuanRanL on GitHub. Read the source before you install it.

Installation

Install the Phase Monitor AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/XuanRanL/loamwright-SEO-Skill/tree/main/skills/phase-monitor
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/XuanRanL/loamwright-SEO-Skill.git /tmp/loamwright-SEO-Skill
mkdir -p .claude/skills
cp -r /tmp/loamwright-SEO-Skill/skills/phase-monitor .claude/skills/phase-monitor
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Phase Monitor in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Phase Monitor on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Phase Monitor is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Phase Monitor Orchestrator

Closed-loop monitoring: detect changes → feed back to Optimize phase.

Unlike other phases this runs asynchronously (scheduled), not in a synchronous user-initiated chain.

Inputs

  • state.project_slug (required, monitor is always per-project)
  • Optional state.target_urls[] (specific URLs to check; else all published URLs in change-log)

Stages (run in parallel, independent)

1. rank-tracker
   - Query GSC for impressions/clicks/position per URL (your property only)
   - SerpApi (engine=google) = LIVE SERP rank for tracked keywords incl. competitors —
     GSC only sees your own property; SerpApi sees the whole SERP. Pooled free 250/mo:
     `python -m scripts.fetch.serpapi_query --engine google --q "{keyword}" --gl {cc} --json`
     → find your domain's position in organic_results; record competitor positions too
   - Compare to baseline (projects/{slug}/baselines/)
   - T+7 / T+14 / T+30 / T+90 windows
   - Position change → traffic impact table (#1→#2 = -55%)
   - Output: projects/{slug}/rank-history-{date}.json

2. ai-visibility-tracker
   - Active probe: ChatGPT/PPLX/Claude/Gemini × 5 queries per article
   - SerpApi AI-answer engines = is the article's domain CITED in each engine's AI answer?
     Track BOTH distinct Google GEO surfaces (they cite independently):
       · `--engine ai_overview`    → Google AI Overview (inline summary): check its `references[]` links
       · `--engine google_ai_mode` → Google AI Mode (the dedicated AI tab): richer `references[]`
         ({title, link, source, snippet}) + reconstructed_markdown — a SECOND, independent GEO signal
     Plus `--engine bing` (Bing/Copilot surface). For each engine, match the project domain against
     every `references[].link` → cited? at what rank/index? Record per engine + per query.
     Structured + repeatable; complements the ChatGPT/PPLX/Claude/Gemini LLM probes.
     (Non-US target markets: `naver` / `baidu` are also callable.)
   - Compare to geo-baseline.json
   - ai_resolution_status changes: recognized → partial = alert
   - Cumulative citation count over time
   - Output: projects/{slug}/probes/{engine}-{date}.json

3. drift-detector
   - SHA-256 hash content + meta + schema
   - Compare to projects/{slug}/baselines/{snapshot}.sqlite
   - 17-rule diff (claude-seo pattern)
   - 3 severity levels: critical / high / medium
   - Output: drift-report-{date}.json + new baseline if approved

4. content-refresher
   - Compute decay score (0-100): traffic 30 + rank 25 + CTR 15 + freshness 15 + replacement 15
   - SerpApi `--engine google_trends` interest trajectory for the head term → a declining search-
     interest trend is an early decay signal feeding the freshness component (topic cooling, not
     just rank loss)
   - Threshold actions:
     - <30 → urgent refresh
     - 30-50 → schedule refresh in 7d
     - 50-75 → schedule refresh in 30d
     - >75 → healthy, defer
   - Output: refresh-queue.json

5. performance-reporter
   - Aggregate 30+ KPIs from all 4 above
   - Time periods: week / month / quarter
   - Include AI citation KPIs (per-engine)
   - Output: projects/{slug}/perf-{period}-{date}.md

Alert routing (σ-based severity)

P0 (3σ deviation, Emergency): SMS + phone + Slack
P1 (2σ, Critical):            Slack + Email
P2 (1.5σ, Warning):           Email
P3 (1σ, Info):                weekly digest

Suppression rules:

  • 24h cooldown for same alert
  • Weekend +20% threshold (avoid alert storms)
  • Maintenance windows (configurable)
  • Batch correlation (group related alerts)
  • Recovery auto-close

Triggers

Manual

  • /rank-check <url>
  • /ai-visibility <url>
  • /drift <domain>
  • /perf <domain> → full report
  • /alerts → current alert list

Scheduled (via hooks/scheduled.json)

  • Daily: ai-visibility-tracker for high-priority articles
  • Weekly: rank-tracker + drift-detector
  • Monthly: performance-reporter (executive summary)

Event-driven

  • New article published → register T+7/14/30/90 callbacks
  • Drift detected critical → auto-trigger /aio-recovery for AIO-loss case

Feedback loop (executable dispatcher — Rule 6)

Monitoring is only useful if it drives ACTION. The decision router turns the first-party GSC data into a prioritized, signal-typed optimization plan that names the MINIMAL sufficient skill per opportunity — instead of a human reading the report and full-rewriting everything:

bash
# diagnose one project (or --all) → projects/{slug}/audits/refresh-plan.json + ranked report
python -m scripts.monitor.refresh_decision_router --site {slug} --json

It classifies each opportunity by signal and routes it (grounded in 2026 CTR/GEO thresholds):

Signal (auto-detected)ActionSkill to run
CONTENT_GAP — a tag/category archive ranks a query (no dedicated article)createseo-blog /article (check cannibalization first)
PAGE2_DEPTH — real article pos 11-20, high impr, ~0 clicksoptimize (depth)subskills/cross-cutting/rewrite/ (full)
LOW_CTR — real article top-10 but CTR < ½ the position benchmarkoptimize (surgical)subskills/optimize/meta-builder/ (title/meta only)
DEEP_WEAK — real article pos > 20optimize (comprehensive)subskills/cross-cutting/rewrite/
NOT_IN_AI — query triggers AI Overview/Mode, our domain not citedoptimize (GEO)subskills/optimize/ai-overview-recovery/
CANNIBALIZE — 2+ of our pages rank the same queryconsolidaterewrite audit + manual 301
"Schema broken" (drift-detector)fixsubskills/optimize/schema-generator/

DRAFT-FIRST / human-in-the-loop: the router only WRITES the plan — it never mutates or republishes a live post. Each action is executed as a separate, gated step via the named skill (which republishes as a draft by default, per Rule 5a). The router replaces the triage, not the review.

Second axis — content quality (the router is signal-only)

The router acts on SEARCH signals (CTR/rank/AI) and never reads the body, so it misses a post that ranks fine yet is thin, stale, orphaned or weakly-sourced. Run the content scanner as the complementary CONTENT axis:

bash
python -m scripts.monitor.content_audit --site {slug} --json   # → projects/{slug}/audits/content-audit.json

It flags (mechanical, cheap): THIN, STALE, ORPHAN (<3 distinct internal links), THIN_SOURCING (<2 distinct external citations — an E-E-A-T risk on YMYL), YEAR_DRIFT. Fix ORPHAN with internal-linker, THIN_SOURCING by adding authoritative citations (mcp__us-gov__* / mcp__pubmed__*), THIN/STALE via rewrite /update. What it CANNOT see — factual errors, outdated specifics, citation AUTHORITY — needs an LLM read: route those posts to the fact-checker agent / rewrite Phase-1 audit (which use the authoritative-source MCPs). The scanner tells you WHICH posts to send there.

Closing the loop — verification + structural fixers

Three executors complete the lifecycle (all write project-level plans/journals; none auto-mutate a live site — Rule 5a):

bash
# 1. VERIFICATION — record every optimization with a baseline; re-check the delta at T+14/T+30.
#    Without this, every title/citation/rewrite fix is fire-and-forget and unprovable.
python -m scripts.monitor.optimization_journal --verify --site {slug} --window 14    # did it work?
python -m scripts.monitor.optimization_journal --report --site {slug}
#    --record is now wired into the post-publish fixers (rewrite Phase 7, ai-overview-recovery
#    Phase 3.5); they journal the before/after when they apply a change. Enforced by
#    tests/test_optimization_journal_wiring.py (Rule 6: no markdown-only "should call").

# 2. INTERNAL-LINK GRAPH — the orphan fixer the per-post linker can't be (it only links forward).
python -m scripts.monitor.internal_link_graph --site {slug} --json   # → internal-link-plan.json
#    Apply the suggested INBOUND links via the internal-linker subskill (draft-first).

# 3. PRUNE / CONSOLIDATE PLANNER — the "act" half of content cleanup (content_audit only detects).
python -m scripts.monitor.prune_consolidate_planner --site {slug} --json   # → prune-consolidate-plan.json
#    DESTRUCTIVE output (301 merges / noindex) — human signs off; never auto-executed.

Lifecycle now closed: create → publish → monitor (dual-engine) → diagnose (signal + content axes) → fix (minimal skill, draft-first) → record the change → T+14/30 verify it worked → learn.

Output

Per project, accumulated history:

projects/{slug}/
├── rank-history-{YYYY-MM-DD}.json
├── perf-week-{YYYY-MM-DD}.md
├── perf-month-{YYYY-MM-DD}.md
├── probes/{engine}-{YYYY-MM-DD}.json
├── drift-report-{YYYY-MM-DD}.json
├── baselines/{snapshot-sha}.sqlite
└── refresh-queue.json

See also

  • 5 sub-skills under subskills/monitor/
  • references/geo/geo-score-feedback-loop.md (T+14/45/90 windows design)
  • scripts/monitor/perf_report_generator.py

Frequently asked questions

What does the Phase Monitor AI skill do?

Run Phase Monitor — rank tracking, AI visibility tracking, drift detection, content refresh signals, performance reporting. Use for post-publish monitoring or scheduled checkup. Triggered by /seo-blog monitor, /perf, /rank-check, /drift, /ai-visibility, or as automated scheduled hook (T+7/14/30/90 after publish).

Why use Phase Monitor on TypingMind?

Because you install it once and use it with any model. Phase Monitor is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Phase Monitor in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/XuanRanL/loamwright-SEO-Skill/tree/main/skills/phase-monitor. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Phase Monitor?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Phase Monitor?

As many as you like. As long as a model supports skills, you can use Phase Monitor with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Phase Monitor AI skill free?

Yes. It is published on GitHub by XuanRanL under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇