skills/prompt-template-manager/SKILL.md
Version-control, parameterize, and A/B test LLM prompt templates with Git-native workflows. Activate on: prompt versioning, prompt templates, A/B test prompts, manage prompts, prompt registry. NOT for: writing prompts from scratch (prompt-engineer), fine-tuning data (fine-tuning-dataset-curator).
npx skillsauth add curiositech/windags-skills prompt-template-managerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Version-control, parameterize, and A/B test LLM prompt templates using Git-native workflows and structured registries.
Activate on: "prompt versioning", "prompt template", "A/B test prompts", "prompt registry", "manage prompt variants", "prompt as code", "parameterized prompts", "prompt lifecycle"
NOT for: Writing or optimizing individual prompts (prompt-engineer), fine-tuning dataset preparation (fine-tuning-dataset-curator), or LLM application architecture (ai-engineer)
prompts/{domain}/{name}.yaml with metadata, variables, and versioned content.{{variable}} placeholders for dynamic content; separate static instruction from dynamic context.| Domain | Technologies | Notes |
|--------|-------------|-------|
| Template Format | YAML + Jinja2, Handlebars, Mustache | YAML frontmatter for metadata, body for template |
| Version Control | Git tags, branches, semantic versioning | v1.2.0 tags for production, branches for experiments |
| A/B Testing | Feature flags (LaunchDarkly, Unleash, custom) | Percentage-based routing with metrics collection |
| Registry | File-based, PostgreSQL, Redis | Central lookup for template resolution at runtime |
| Evaluation | LLM-as-judge, human eval, RAGAS | Automated comparison of variant outputs |
| Rendering | Jinja2 (Python), Handlebars (JS), custom | Variable interpolation with type validation |
prompts/
├── customer-support/
│ ├── ticket-classifier.yaml # Active production template
│ ├── ticket-classifier.v2.yaml # Experiment variant
│ └── response-generator.yaml
├── content/
│ ├── blog-outline.yaml
│ └── social-post.yaml
└── _shared/
├── system-safety.yaml # Reusable system prompt fragments
└── output-format-json.yaml
# prompts/customer-support/ticket-classifier.yaml
name: ticket-classifier
version: "1.3.0"
model: claude-sonnet-4-20250514
temperature: 0
description: Classify support tickets into categories
variables:
- name: ticket_text
type: string
required: true
- name: categories
type: list
default: [billing, technical, account, other]
includes:
- _shared/output-format-json.yaml
template: |
You are a support ticket classifier.
Classify the following ticket into exactly one category.
Categories: {{categories | join(", ")}}
Ticket:
{{ticket_text}}
{{> output-format-json}}
tests:
- input: { ticket_text: "I can't log in to my account" }
expected_category: "account"
- input: { ticket_text: "You charged me twice" }
expected_category: "billing"
Request ──→ [Router] ──→ Variant A (control, 80%) ──→ [LLM] ──→ Response + Log
│ │
└──→ Variant B (experiment, 20%) ──→ [LLM] ──→ Response + Log
│
▼
[Metrics Store]
- latency
- token count
- quality score
- user feedback
│
▼
[Evaluation]
Winner → promote to 100%
# A/B routing with metrics
import random, time
class PromptRouter:
def __init__(self, registry, metrics):
self.registry = registry
self.metrics = metrics
def resolve(self, template_name: str, user_id: str) -> dict:
variants = self.registry.get_variants(template_name)
# Deterministic assignment by user_id for consistency
bucket = hash(f"{user_id}:{template_name}") % 100
for variant in variants:
if bucket < variant["traffic_pct"]:
self.metrics.log("variant_assigned", {
"template": template_name,
"variant": variant["version"],
"user_id": user_id
})
return variant
bucket -= variant["traffic_pct"]
return variants[0] # Default to control
System Prompt = [safety-preamble] + [role-definition] + [output-format]
User Prompt = [context-injection] + [user-query] + [constraints]
Compose from reusable fragments:
_shared/safety-preamble.yaml ──→ "You must not generate harmful content..."
_shared/json-output.yaml ──→ "Respond with valid JSON matching this schema..."
domain/role.yaml ──→ "You are an expert in {{domain}}..."
Final prompt = render(compose([safety, role, output]), variables)
_shared/ for composition{{placeholders}} in outputtools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.