Prompt Evolution System
Patterns for metrics-driven prompt improvement — externalized storage, A/B testing, quality gates, and auto-rollback.
Three Phases
| Phase |
When |
Backend |
Capability |
| Static |
MVP |
LocalPromptStore (JSON files) |
Fixed prompts, manual edits |
| Observing |
Month 2+ |
CosmosPromptStore or DB |
Metrics collection, no mutations |
| Evolving |
Month 3+ |
CosmosPromptStore or DB |
Auto-propose variants, A/B test, promote |
PromptStore Interface
interface IPromptStore {
getPrompt(id: string, variables: Record<string, unknown>): Promise<ResolvedPrompt>;
getVariants(id: string): Promise<PromptVariant[]>;
recordExecution(id: string, metrics: ExecutionMetrics): Promise<void>;
promoteVariant(id: string, variantId: string): Promise<void>;
rollback(id: string, toVersion: string): Promise<void>;
}
// Both LocalPromptStore and CosmosPromptStore implement this interface
// Swap is transparent — controlled by environment config
Metrics Framework
| Category |
Metrics |
Purpose |
| Engagement |
session_length, actions_per_minute, return_rate |
User interest |
| Quality |
coherence_score, factual_accuracy, response_relevance |
Output quality |
| Persona |
persona_consistency, tone_rating, helpfulness |
Character voice (if applicable) |
| Task |
task_completion_rate, time_to_complete, accuracy |
Core task metrics |
| CX |
error_rate, timeout_rate, retry_count |
Technical quality |
| Cost |
tokens_per_request, cost_per_session, latency_p95 |
Operational efficiency |
interface ExecutionMetrics {
promptId: string;
variantId?: string;
timestamp: number;
latency: number; // ms
tokenCount: number;
modelUsed: string;
qualityScore?: number; // 0-1, from automated evaluation
userFeedback?: number; // 1-5 star rating (if collected)
}
Evolution Lifecycle
Observe → Analyze → Propose → A/B Test → Evaluate → Promote or Rollback
Thresholds
| Executions |
Stage |
Action |
| 0-25 |
Observe |
Collect baseline metrics only |
| 25-50 |
Identify |
Flag underperforming prompts (below median) |
| 50-100 |
Propose |
EvolutionEngine generates improvement variants |
| 100+ |
A/B Test |
Run variant against baseline (50/50 split) |
| 200+ |
Evaluate |
Statistical significance test (p < 0.05) |
| Significant |
Decide |
If variant > baseline by 5%+: promote. Else: discard |
EvolutionEngine Interface
interface IEvolutionEngine {
analyzePerformance(promptId: string): Promise<PerformanceReport>;
proposeVariant(promptId: string, direction: EvolutionDirection): Promise<PromptVariant>;
startABTest(promptId: string, variantId: string): Promise<ABTestConfig>;
evaluateTest(testId: string): Promise<ABTestResult>;
promote(promptId: string, variantId: string): Promise<void>;
rollback(promptId: string): Promise<void>;
}
type EvolutionDirection =
| 'more_engaging' // increase user interaction
| 'more_concise' // reduce token usage
| 'more_character' // strengthen persona voice
| 'more_accurate' // improve factual consistency
| 'better_guidance' // more helpful without spoiling
| 'locale_optimize'; // improve non-English prompts
Quality Gate
All evolved prompts must pass quality validation before promotion:
async function qualityGate(
original: ResolvedPrompt,
variant: ResolvedPrompt,
): Promise<QualityGateResult> {
// 1. Generate sample outputs from each prompt
// 2. Compare quality scores
// 3. Check for persona drift (if applicable)
// 4. If drift > threshold: REJECT variant
// 5. If quality improvement + consistency maintained: APPROVE
return {
approved: qualityDelta > 0.05 && driftScore < DRIFT_THRESHOLD,
qualityDelta,
driftScore,
reason: string,
};
}
Safety Guards
| Guard |
What It Prevents |
| Rate limiter |
Max 1 evolution per prompt per week |
| Rollback trigger |
Quality drop > 10% after promotion → auto-rollback |
| Safety lock |
Evolution cannot modify safety rules |
| System prompt lock |
Evolution cannot modify instruction hierarchy |
| Quality gate |
Evolution cannot drift persona or reduce quality |
Implementation Checklist
Phase 1: Static
Phase 2: Observing
Phase 3: Evolving
Activation Patterns
| Trigger |
Response |
| "prompt evolution", "prompt versioning" |
Full skill activation |
| "A/B testing", "prompt testing" |
Evolution Lifecycle + Thresholds |
| "prompt metrics", "prompt quality" |
Metrics Framework section |
| "prompt rollback", "quality regression" |
Safety Guards section |
| "prompt store", "externalize prompts" |
PromptStore Interface section |
1---2name: prompt-evolution-system3description: Externalized prompt store, A/B testing, metrics-driven evolution, quality gates, and auto-rollback4---56# Prompt Evolution System78Patterns for metrics-driven prompt improvement — externalized storage, A/B testing, quality gates, and auto-rollback.910---1112## Three Phases1314| Phase | When | Backend | Capability |15|-------|------|---------|-----------|16| **Static** | MVP | `LocalPromptStore` (JSON files) | Fixed prompts, manual edits |17| **Observing** | Month 2+ | `CosmosPromptStore` or DB | Metrics collection, no mutations |18| **Evolving** | Month 3+ | `CosmosPromptStore` or DB | Auto-propose variants, A/B test, promote |1920---2122## PromptStore Interface2324```typescript25interface IPromptStore {26 getPrompt(id: string, variables: Record<string, unknown>): Promise<ResolvedPrompt>;27 getVariants(id: string): Promise<PromptVariant[]>;28 recordExecution(id: string, metrics: ExecutionMetrics): Promise<void>;29 promoteVariant(id: string, variantId: string): Promise<void>;30 rollback(id: string, toVersion: string): Promise<void>;31}3233// Both LocalPromptStore and CosmosPromptStore implement this interface34// Swap is transparent — controlled by environment config35```3637---3839## Metrics Framework4041| Category | Metrics | Purpose |42|----------|---------|---------|43| **Engagement** | session_length, actions_per_minute, return_rate | User interest |44| **Quality** | coherence_score, factual_accuracy, response_relevance | Output quality |45| **Persona** | persona_consistency, tone_rating, helpfulness | Character voice (if applicable) |46| **Task** | task_completion_rate, time_to_complete, accuracy | Core task metrics |47| **CX** | error_rate, timeout_rate, retry_count | Technical quality |48| **Cost** | tokens_per_request, cost_per_session, latency_p95 | Operational efficiency |4950```typescript51interface ExecutionMetrics {52 promptId: string;53 variantId?: string;54 timestamp: number;55 latency: number; // ms56 tokenCount: number;57 modelUsed: string;58 qualityScore?: number; // 0-1, from automated evaluation59 userFeedback?: number; // 1-5 star rating (if collected)60}61```6263---6465## Evolution Lifecycle6667```68Observe → Analyze → Propose → A/B Test → Evaluate → Promote or Rollback69```7071### Thresholds7273| Executions | Stage | Action |74|-----------|-------|--------|75| 0-25 | Observe | Collect baseline metrics only |76| 25-50 | Identify | Flag underperforming prompts (below median) |77| 50-100 | Propose | EvolutionEngine generates improvement variants |78| 100+ | A/B Test | Run variant against baseline (50/50 split) |79| 200+ | Evaluate | Statistical significance test (p < 0.05) |80| Significant | Decide | If variant > baseline by 5%+: promote. Else: discard |8182### EvolutionEngine Interface8384```typescript85interface IEvolutionEngine {86 analyzePerformance(promptId: string): Promise<PerformanceReport>;87 proposeVariant(promptId: string, direction: EvolutionDirection): Promise<PromptVariant>;88 startABTest(promptId: string, variantId: string): Promise<ABTestConfig>;89 evaluateTest(testId: string): Promise<ABTestResult>;90 promote(promptId: string, variantId: string): Promise<void>;91 rollback(promptId: string): Promise<void>;92}9394type EvolutionDirection =95 | 'more_engaging' // increase user interaction96 | 'more_concise' // reduce token usage97 | 'more_character' // strengthen persona voice98 | 'more_accurate' // improve factual consistency99 | 'better_guidance' // more helpful without spoiling100 | 'locale_optimize'; // improve non-English prompts101```102103---104105## Quality Gate106107All evolved prompts must pass quality validation before promotion:108109```typescript110async function qualityGate(111 original: ResolvedPrompt,112 variant: ResolvedPrompt,113): Promise<QualityGateResult> {114 // 1. Generate sample outputs from each prompt115 // 2. Compare quality scores116 // 3. Check for persona drift (if applicable)117 // 4. If drift > threshold: REJECT variant118 // 5. If quality improvement + consistency maintained: APPROVE119120 return {121 approved: qualityDelta > 0.05 && driftScore < DRIFT_THRESHOLD,122 qualityDelta,123 driftScore,124 reason: string,125 };126}127```128129---130131## Safety Guards132133| Guard | What It Prevents |134|-------|-----------------|135| **Rate limiter** | Max 1 evolution per prompt per week |136| **Rollback trigger** | Quality drop > 10% after promotion → auto-rollback |137| **Safety lock** | Evolution cannot modify safety rules |138| **System prompt lock** | Evolution cannot modify instruction hierarchy |139| **Quality gate** | Evolution cannot drift persona or reduce quality |140141---142143## Implementation Checklist144145### Phase 1: Static146147- [ ] Define prompt templates in JSON/YAML files148- [ ] Implement `LocalPromptStore` with variable interpolation149- [ ] Add basic execution logging (latency, token count)150- [ ] Establish baseline metrics for each prompt151152### Phase 2: Observing153154- [ ] Migrate to persistent store (Cosmos DB, PostgreSQL, etc.)155- [ ] Add comprehensive metrics collection156- [ ] Build performance dashboard157- [ ] Identify underperforming prompts manually158159### Phase 3: Evolving160161- [ ] Implement `EvolutionEngine` with AI-assisted variant generation162- [ ] Add A/B testing infrastructure (traffic splitting, metric comparison)163- [ ] Implement statistical significance testing164- [ ] Add auto-rollback on quality regression165- [ ] Deploy quality gate for all promotions166167---168169## Activation Patterns170171| Trigger | Response |172|---------|----------|173| "prompt evolution", "prompt versioning" | Full skill activation |174| "A/B testing", "prompt testing" | Evolution Lifecycle + Thresholds |175| "prompt metrics", "prompt quality" | Metrics Framework section |176| "prompt rollback", "quality regression" | Safety Guards section |177| "prompt store", "externalize prompts" | PromptStore Interface section |