Skip to content

Add geo-gap-fixer GTM Intelligence skill (LLM GEO gap audit) - #43

Merged
farizanjum merged 6 commits into
Varnan-Tech:mainfrom
ajaycodesitbetter:feat/geo-gap-fixer
Jun 6, 2026
Merged

Add geo-gap-fixer GTM Intelligence skill (LLM GEO gap audit)#43
farizanjum merged 6 commits into
Varnan-Tech:mainfrom
ajaycodesitbetter:feat/geo-gap-fixer

Conversation

@ajaycodesitbetter

Copy link
Copy Markdown
Contributor

This PR adds geo-gap-fixer, a GTM Intelligence skill that audits how often LLMs recommend a brand vs competitors and turns those visibility gaps into a GEO content backlog (FAQs, comparison pages, alternatives, authority targets).

What this skill does

  • Probes multiple LLMs with buyer-intent prompts.
  • Extracts brand/competitor mentions, rank, citations, and framing.
  • Computes share-of-voice per LLM and prompt-level wins/losses.
  • Generates a GEO action plan: pages and content to ship next.

Files added

  • skills/geo-gap-fixer/README.md
  • skills/geo-gap-fixer/SKILL.md
  • skills/geo-gap-fixer/.env.example
  • skills/geo-gap-fixer/package.json
  • skills/geo-gap-fixer/config.example.json
  • skills/geo-gap-fixer/scripts/probe_llms.py
  • skills/geo-gap-fixer/scripts/analyze_results.py
  • skills/geo-gap-fixer/scripts/build_report.py
  • skills/geo-gap-fixer/references/prompt_templates.md
  • skills/geo-gap-fixer/references/scoring_rubric.md
  • skills/geo-gap-fixer/references/output_format.md
  • skills/geo-gap-fixer/.gitignore

How I tested

  • python -m py_compile scripts/probe_llms.py scripts/analyze_results.py scripts/build_report.py
  • python -c "import json; json.load(open('package.json')); json.load(open('config.example.json'))"
  • pnpm exec tsx scripts/update-readme.ts
  • pnpm exec tsx scripts/update-contributing.ts
  • pnpm exec tsx scripts/build-registry.ts
  • npx "@opendirectory.dev/skills" install geo-gap-fixer --target opencode (success)

Copilot AI review requested due to automatic review settings June 5, 2026 17:29

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a new geo-gap-fixer skill that probes multiple LLMs with buyer-intent prompts, analyzes brand visibility/citations/sentiment, and generates a 5-section GEO audit report; also registers the skill in the repo skill registry and updates the root skills list/count.

Changes:

  • Added a 3-step pipeline: probe LLMs → analyze responses → build markdown/JSON reports.
  • Added reference docs for prompt templates, scoring rubric, and sample output format.
  • Registered geo-gap-fixer in packages/cli/registry.json and updated root README skill count/list.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
skills/geo-gap-fixer/scripts/probe_llms.py New LLM probing CLI with provider adapters, retries, and raw response persistence
skills/geo-gap-fixer/scripts/analyze_results.py New analysis pipeline: mentions/rank/sentiment/citations/framing → analysis.json
skills/geo-gap-fixer/scripts/build_report.py New markdown + JSON report generator with 5 required sections
skills/geo-gap-fixer/references/scoring_rubric.md Documents how metrics are computed and thresholds used
skills/geo-gap-fixer/references/prompt_templates.md Defines default prompt templates used by probing script
skills/geo-gap-fixer/references/output_format.md Sample output for generated report
skills/geo-gap-fixer/package.json Skill metadata for OpenDirectory
skills/geo-gap-fixer/config.example.json Sample configuration for running the skill
skills/geo-gap-fixer/SKILL.md Agent/runbook instructions for executing the pipeline
skills/geo-gap-fixer/README.md User-facing documentation and quickstart
skills/geo-gap-fixer/.gitignore Ignores runtime outputs and local secrets
skills/geo-gap-fixer/.env.example Documents required env vars for providers
packages/cli/registry.json Registers the new skill and updates some existing registry entries
README.md Updates skill count/badge and adds geo-gap-fixer to the skills table

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread skills/geo-gap-fixer/scripts/probe_llms.py
Comment thread skills/geo-gap-fixer/scripts/analyze_results.py
Comment thread skills/geo-gap-fixer/scripts/analyze_results.py
Comment thread skills/geo-gap-fixer/scripts/analyze_results.py
Comment thread skills/geo-gap-fixer/scripts/analyze_results.py
Comment thread skills/geo-gap-fixer/scripts/analyze_results.py Outdated
Comment thread skills/geo-gap-fixer/scripts/build_report.py Outdated
Comment thread skills/geo-gap-fixer/scripts/probe_llms.py Outdated
Comment thread skills/geo-gap-fixer/references/output_format.md
Comment thread skills/geo-gap-fixer/README.md Outdated
@greptile-apps

greptile-apps Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds geo-gap-fixer, a new GTM Intelligence skill that probes multiple LLM APIs with buyer-intent prompts, extracts brand/competitor visibility metrics, and generates a prioritised GEO content backlog. Previously flagged issues (NameError in build_action_plan, missing single-provider warning, incorrect health-assessment or logic) have all been addressed.

  • probe_llms.py: Orchestrates prompt generation and multi-provider API calls with retry/backoff; the four provider adapters (OpenAI, Anthropic, Google, Perplexity) are inconsistent on temperature — only OpenAI sets temperature=0.0, and the Google adapter passes the system prompt as concatenated user content rather than via the Gemini system_instruction config, making cross-provider results less comparable.
  • analyze_results.py: Extracts mention rate, rank, sentiment, citations, and framing; produces analysis.json consumed by the report builder.
  • build_report.py: Assembles a markdown + JSON GEO audit report with share-of-voice table, loss log, competitor language patterns, citation gaps, and a prioritised action plan.

Confidence Score: 5/5

Safe to merge — this is a self-contained new skill addition with no changes to shared infrastructure beyond registry/count metadata updates.

All three Python scripts are new files with no impact on existing skills. The previously identified crash-level and logic bugs have been fixed. The remaining findings are consistency improvements (temperature settings, Google system instruction) that affect audit reproducibility but do not cause failures or data corruption.

skills/geo-gap-fixer/scripts/probe_llms.py — the provider adapter inconsistencies (temperature, Google system instruction) are worth tightening before the first real audit run.

Important Files Changed

Filename Overview
skills/geo-gap-fixer/scripts/probe_llms.py Adds LLM probe orchestrator with retry/backoff logic; single-provider warning (previously missing) is now correctly emitted. Inconsistent temperature settings across adapters (only OpenAI sets temperature=0.0) and Google's system-prompt concatenation pattern may reduce reproducibility and cross-provider consistency.
skills/geo-gap-fixer/scripts/analyze_results.py Adds brand mention, rank, sentiment, citation, and framing analysis. Core logic is sound; NEGATIVE_KEYWORDS omits however that the scoring rubric documents as a negative keyword (flagged in a prior review round).
skills/geo-gap-fixer/scripts/build_report.py Previously flagged NameError (undefined meta) and incorrect health-assessment or logic have both been resolved; build_action_plan now correctly defines meta = analysis["meta"] and the health ladder uses proper and/elif guards.
skills/geo-gap-fixer/references/scoring_rubric.md Documents all five scoring metrics and overall health thresholds; lists however as a negative keyword that is absent from the code's NEGATIVE_KEYWORDS list.
skills/geo-gap-fixer/config.example.json Example config with Linear as the demo brand; all required keys are present and valid.
skills/geo-gap-fixer/package.json Minimal metadata package.json; no dependency list, which is intentional for a Python-based skill registered in the directory.

Sequence Diagram

sequenceDiagram
    participant User
    participant probe as probe_llms.py
    participant OpenAI
    participant Anthropic
    participant Google
    participant Perplexity
    participant analyze as analyze_results.py
    participant report as build_report.py

    User->>probe: python probe_llms.py --config config.json
    probe->>probe: load_config() + generate_prompts()
    loop For each prompt x provider
        probe->>OpenAI: "chat.completions.create (temp=0.0)"
        probe->>Anthropic: messages.create (no temp set)
        probe->>Google: generate_content (system prompt concatenated)
        probe->>Perplexity: chat.completions.create (no temp/max_tokens)
    end
    probe-->>User: data/raw_responses.json

    User->>analyze: python analyze_results.py
    analyze->>analyze: find_mentions() / compute_rank() / compute_sentiment()
    analyze->>analyze: share_of_voice + wins/losses + citation_gaps
    analyze-->>User: data/analysis.json

    User->>report: python build_report.py
    report->>report: build_share_of_voice() + build_loss_log()
    report->>report: build_competitor_language() + build_citation_gaps()
    report->>report: build_action_plan() - Critical / High / Growth
    report-->>User: report/geo_audit_report.md + .json
Loading

Reviews (6): Last reviewed commit: "chore: rebase geo gap fixer and refresh ..." | Re-trigger Greptile

Comment thread skills/geo-gap-fixer/scripts/build_report.py Outdated
Comment thread skills/geo-gap-fixer/scripts/probe_llms.py
Comment thread skills/geo-gap-fixer/scripts/build_report.py
Comment thread skills/geo-gap-fixer/scripts/build_report.py
@ajaycodesitbetter

Copy link
Copy Markdown
Contributor Author

All Copilot and Greptile comments have been addressed in code and marked resolved, and both checks (Greptile Review + PR Validation) are green. This should be ready to merge from my side.

@farizanjum

Copy link
Copy Markdown
Contributor

Thanks for adding the geo-gap-fixer skill @ajaycodesitbetter . The architecture separating probing, analysis, and reporting is excellent

Please address the following issues before merging:

  1. Root README Regression: Your branch appears to be based on an older commit. It accidentally removes the recently added Manus AI support section and reverts the agent badge count. Please rebase on the latest main branch or restore those sections manually.

  2. Skill README Standardization: The geo-gap-fixer README is missing the standard installation block. Please replace your custom Quickstart installation steps with the standard <!-- OPENDIRECTORY_INSTALL_START --> to <!-- OPENDIRECTORY_INSTALL_END --> block found in other skills.

  3. Python Script Edge Cases:

  • analyze_results.py (Mention Detection): The \b word boundary regex fails if a brand name contains non-word characters like "C++". Consider using lookarounds: (?<!\w)name(?!\w).
  • analyze_results.py (URL Parsing): The URL_PATTERN regex captures trailing punctuation if a URL ends a sentence. Please strip trailing periods during domain extraction.
  • analyze_results.py (Sentiment Scoring): The script uses search() which only checks for the existence of a keyword. Using len(findall()) would properly count frequency for a more accurate weighted score.
  • probe_llms.py (Retry Logic): The _retry decorator catches all exceptions. Blindly retrying permanent errors like 401 Unauthorized wastes execution time. Consider restricting retries to transient errors like 429s or 5xxs.

Please let me know once these are updated.

@ajaycodesitbetter

Copy link
Copy Markdown
Contributor Author

All four points addressed in 8e26ee8: rebased on latest main (Manus AI section + badge count restored, skill count 57->61), standardized README with OPENDIRECTORY_INSTALL_START/END block, fixed \b -> lookarounds for C++ style brands, stripped trailing URL punctuation, switched sentiment to findall() frequency counts, restricted retries to 429/5xx only, and brand domain citation row is now always injected. Both checks green. Please re-review when ready!

@farizanjum
farizanjum merged commit e6f376c into Varnan-Tech:main Jun 6, 2026
2 checks passed
@farizanjum

Copy link
Copy Markdown
Contributor

cool, seems good to me!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants