empathy-framework 4.6.6__py3-none-any.whl → 4.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
- empathy_framework-4.7.0.dist-info/RECORD +354 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
"""Prompt Engineering Quality Wizard - Level 4 Anticipatory Empathy
|
|
2
|
-
|
|
3
|
-
Alerts developers to prompt quality issues before they impact AI performance.
|
|
4
|
-
|
|
5
|
-
In our experience developing AI Nurse Florence and the Empathy Framework,
|
|
6
|
-
we learned that prompt quality degrades subtly over time. This wizard alerts
|
|
7
|
-
you to drift patterns, context inefficiencies, and structural issues before
|
|
8
|
-
they compound into major problems.
|
|
9
|
-
|
|
10
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
11
|
-
Licensed under Fair Source 0.9
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
import os
|
|
15
|
-
import re
|
|
16
|
-
import sys
|
|
17
|
-
from typing import Any
|
|
18
|
-
|
|
19
|
-
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "src"))
|
|
20
|
-
|
|
21
|
-
from empathy_os.plugins import BaseWizard
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class PromptEngineeringWizard(BaseWizard):
|
|
25
|
-
"""Level 4 Anticipatory: Analyzes prompt quality and alerts to degradation.
|
|
26
|
-
|
|
27
|
-
What This Wizard Learned From Experience:
|
|
28
|
-
- Prompts drift subtly as features evolve
|
|
29
|
-
- Context bloat reduces effectiveness over time
|
|
30
|
-
- Inconsistent structures across prompts create confusion
|
|
31
|
-
- Early detection prevents compounding quality issues
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
def __init__(self):
|
|
35
|
-
super().__init__(
|
|
36
|
-
name="Prompt Engineering Quality Wizard",
|
|
37
|
-
domain="software",
|
|
38
|
-
empathy_level=4,
|
|
39
|
-
category="ai_development",
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
def get_required_context(self) -> list[str]:
|
|
43
|
-
"""Required context for prompt analysis"""
|
|
44
|
-
return [
|
|
45
|
-
"prompt_files", # List of prompt template files
|
|
46
|
-
"project_path", # Path to project
|
|
47
|
-
"ai_provider", # openai, anthropic, etc. (optional)
|
|
48
|
-
"version_history", # Git history (optional for drift detection)
|
|
49
|
-
]
|
|
50
|
-
|
|
51
|
-
async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
52
|
-
"""Analyze prompt quality and predict degradation patterns.
|
|
53
|
-
|
|
54
|
-
In our experience: Prompt quality issues compound quickly.
|
|
55
|
-
A small inconsistency today becomes a major refactor in weeks.
|
|
56
|
-
"""
|
|
57
|
-
self.validate_context(context)
|
|
58
|
-
|
|
59
|
-
prompt_files = context["prompt_files"]
|
|
60
|
-
_project_path = context["project_path"]
|
|
61
|
-
version_history = context.get("version_history", [])
|
|
62
|
-
|
|
63
|
-
# Current issues (Levels 1-3)
|
|
64
|
-
issues = await self._analyze_prompt_quality(prompt_files)
|
|
65
|
-
|
|
66
|
-
# Level 4: Predict future problems
|
|
67
|
-
predictions = await self._predict_prompt_degradation(prompt_files, version_history, context)
|
|
68
|
-
|
|
69
|
-
# Generate recommendations
|
|
70
|
-
recommendations = self._generate_recommendations(issues, predictions)
|
|
71
|
-
|
|
72
|
-
# Extract patterns for cross-domain learning
|
|
73
|
-
patterns = self._extract_patterns(issues, predictions)
|
|
74
|
-
|
|
75
|
-
return {
|
|
76
|
-
"issues": issues,
|
|
77
|
-
"predictions": predictions,
|
|
78
|
-
"recommendations": recommendations,
|
|
79
|
-
"patterns": patterns,
|
|
80
|
-
"confidence": self._calculate_confidence(context),
|
|
81
|
-
"metadata": {
|
|
82
|
-
"wizard": self.name,
|
|
83
|
-
"empathy_level": self.empathy_level,
|
|
84
|
-
"prompts_analyzed": len(prompt_files),
|
|
85
|
-
},
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async def _analyze_prompt_quality(self, prompt_files: list[str]) -> list[dict[str, Any]]:
|
|
89
|
-
"""Analyze current prompt quality (Level 3 Proactive).
|
|
90
|
-
|
|
91
|
-
Checks for immediate issues that impact AI performance.
|
|
92
|
-
"""
|
|
93
|
-
issues = []
|
|
94
|
-
|
|
95
|
-
for prompt_file in prompt_files:
|
|
96
|
-
# Read prompt content
|
|
97
|
-
try:
|
|
98
|
-
with open(prompt_file) as f:
|
|
99
|
-
content = f.read()
|
|
100
|
-
except Exception as e:
|
|
101
|
-
issues.append(
|
|
102
|
-
{
|
|
103
|
-
"severity": "error",
|
|
104
|
-
"type": "file_read_error",
|
|
105
|
-
"file": prompt_file,
|
|
106
|
-
"message": f"Could not read prompt file: {e}",
|
|
107
|
-
},
|
|
108
|
-
)
|
|
109
|
-
continue
|
|
110
|
-
|
|
111
|
-
# Check prompt structure
|
|
112
|
-
if not self._has_clear_structure(content):
|
|
113
|
-
issues.append(
|
|
114
|
-
{
|
|
115
|
-
"severity": "warning",
|
|
116
|
-
"type": "unclear_structure",
|
|
117
|
-
"file": prompt_file,
|
|
118
|
-
"message": (
|
|
119
|
-
"Prompt lacks clear structure (role, task, context, constraints). "
|
|
120
|
-
"In our experience, structured prompts perform more reliably."
|
|
121
|
-
),
|
|
122
|
-
"suggestion": "Use sections: ## Role, ## Task, ## Context, ## Constraints",
|
|
123
|
-
},
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
# Check for context bloat
|
|
127
|
-
if len(content) > 4000: # Arbitrary threshold from experience
|
|
128
|
-
issues.append(
|
|
129
|
-
{
|
|
130
|
-
"severity": "warning",
|
|
131
|
-
"type": "context_bloat",
|
|
132
|
-
"file": prompt_file,
|
|
133
|
-
"message": (
|
|
134
|
-
f"Prompt is {len(content)} characters. "
|
|
135
|
-
"Longer prompts often contain redundancy that reduces clarity."
|
|
136
|
-
),
|
|
137
|
-
"suggestion": "Review for redundancy. Consider separating into base + context injection.",
|
|
138
|
-
},
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
# Check for vague instructions
|
|
142
|
-
vague_patterns = [r"\bhelp\b", r"\btry to\b", r"\bmaybe\b", r"\bif possible\b"]
|
|
143
|
-
vague_found = []
|
|
144
|
-
for pattern in vague_patterns:
|
|
145
|
-
if re.search(pattern, content, re.IGNORECASE):
|
|
146
|
-
vague_found.append(pattern.strip("\\b"))
|
|
147
|
-
|
|
148
|
-
if vague_found:
|
|
149
|
-
issues.append(
|
|
150
|
-
{
|
|
151
|
-
"severity": "info",
|
|
152
|
-
"type": "vague_language",
|
|
153
|
-
"file": prompt_file,
|
|
154
|
-
"message": (
|
|
155
|
-
f"Vague language detected: {', '.join(vague_found)}. "
|
|
156
|
-
"Precise instructions yield more consistent results."
|
|
157
|
-
),
|
|
158
|
-
"suggestion": "Use imperative verbs: 'Analyze', 'Extract', 'Generate'",
|
|
159
|
-
},
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
# Check for missing examples
|
|
163
|
-
if not self._has_examples(content):
|
|
164
|
-
issues.append(
|
|
165
|
-
{
|
|
166
|
-
"severity": "info",
|
|
167
|
-
"type": "missing_examples",
|
|
168
|
-
"file": prompt_file,
|
|
169
|
-
"message": (
|
|
170
|
-
"No examples found. In our experience, few-shot examples "
|
|
171
|
-
"significantly improve output quality."
|
|
172
|
-
),
|
|
173
|
-
"suggestion": "Add 2-3 examples in <example> tags",
|
|
174
|
-
},
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
return issues
|
|
178
|
-
|
|
179
|
-
async def _predict_prompt_degradation(
|
|
180
|
-
self,
|
|
181
|
-
prompt_files: list[str],
|
|
182
|
-
version_history: list[dict],
|
|
183
|
-
context: dict[str, Any],
|
|
184
|
-
) -> list[dict[str, Any]]:
|
|
185
|
-
"""Level 4 Anticipatory: Predict prompt quality degradation.
|
|
186
|
-
|
|
187
|
-
Experience-based insight: Prompts drift as codebases evolve.
|
|
188
|
-
Early alerts prevent compound degradation.
|
|
189
|
-
"""
|
|
190
|
-
predictions = []
|
|
191
|
-
|
|
192
|
-
# Pattern 1: Prompt-code drift
|
|
193
|
-
if len(version_history) > 0:
|
|
194
|
-
prompt_changes = self._count_prompt_changes(version_history)
|
|
195
|
-
code_changes = self._count_code_changes(version_history)
|
|
196
|
-
|
|
197
|
-
if code_changes > prompt_changes * 3:
|
|
198
|
-
predictions.append(
|
|
199
|
-
{
|
|
200
|
-
"type": "prompt_code_drift",
|
|
201
|
-
"alert": (
|
|
202
|
-
"Code is evolving faster than prompts. "
|
|
203
|
-
"In our experience, this leads to AI responses that become "
|
|
204
|
-
"less relevant as the codebase changes. Alert: Review prompts "
|
|
205
|
-
"to ensure they reflect current architecture."
|
|
206
|
-
),
|
|
207
|
-
"probability": "high",
|
|
208
|
-
"impact": "medium",
|
|
209
|
-
"prevention_steps": [
|
|
210
|
-
"Schedule quarterly prompt review",
|
|
211
|
-
"Link prompt updates to major code refactors",
|
|
212
|
-
"Add prompt validation tests",
|
|
213
|
-
"Document prompt-code dependencies",
|
|
214
|
-
],
|
|
215
|
-
"reasoning": (
|
|
216
|
-
"Code evolution without corresponding prompt updates creates "
|
|
217
|
-
"misalignment. We've seen this reduce AI effectiveness by 30-50%."
|
|
218
|
-
),
|
|
219
|
-
},
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
# Pattern 2: Prompt sprawl
|
|
223
|
-
if len(prompt_files) > 10:
|
|
224
|
-
predictions.append(
|
|
225
|
-
{
|
|
226
|
-
"type": "prompt_sprawl",
|
|
227
|
-
"alert": (
|
|
228
|
-
f"You have {len(prompt_files)} prompt files. "
|
|
229
|
-
"In our experience, prompt count above 15 leads to maintenance burden. "
|
|
230
|
-
"Alert: Consider consolidating with parameterized base prompts before "
|
|
231
|
-
"this becomes unwieldy."
|
|
232
|
-
),
|
|
233
|
-
"probability": "medium-high",
|
|
234
|
-
"impact": "medium",
|
|
235
|
-
"prevention_steps": [
|
|
236
|
-
"Create base prompt templates",
|
|
237
|
-
"Use variable injection for variations",
|
|
238
|
-
"Implement prompt composition pattern",
|
|
239
|
-
"Document prompt inheritance structure",
|
|
240
|
-
],
|
|
241
|
-
"reasoning": (
|
|
242
|
-
"Each additional prompt increases maintenance surface. "
|
|
243
|
-
"We've found 3-5 base prompts with composition scales better than "
|
|
244
|
-
"dozens of standalone prompts."
|
|
245
|
-
),
|
|
246
|
-
},
|
|
247
|
-
)
|
|
248
|
-
|
|
249
|
-
# Pattern 3: Missing version control
|
|
250
|
-
prompts_with_versions = sum(1 for f in prompt_files if self._has_version_marker(f))
|
|
251
|
-
|
|
252
|
-
if prompts_with_versions < len(prompt_files) * 0.5:
|
|
253
|
-
predictions.append(
|
|
254
|
-
{
|
|
255
|
-
"type": "prompt_versioning_gap",
|
|
256
|
-
"alert": (
|
|
257
|
-
"Most prompts lack version markers. "
|
|
258
|
-
"In our experience, unversioned prompts make debugging AI behavior "
|
|
259
|
-
"extremely difficult. Alert: Implement versioning before issues arise."
|
|
260
|
-
),
|
|
261
|
-
"probability": "high",
|
|
262
|
-
"impact": "high",
|
|
263
|
-
"prevention_steps": [
|
|
264
|
-
"Add version markers to all prompts (e.g., v1.2.0)",
|
|
265
|
-
"Log prompt version with each AI request",
|
|
266
|
-
"Create prompt changelog",
|
|
267
|
-
"Implement A/B testing framework for prompt changes",
|
|
268
|
-
],
|
|
269
|
-
"reasoning": (
|
|
270
|
-
"When AI behavior changes unexpectedly, version tracking is essential "
|
|
271
|
-
"for debugging. We learned this the hard way."
|
|
272
|
-
),
|
|
273
|
-
},
|
|
274
|
-
)
|
|
275
|
-
|
|
276
|
-
# Pattern 4: Context window inefficiency
|
|
277
|
-
total_prompt_size = sum(self._estimate_token_count(f) for f in prompt_files)
|
|
278
|
-
avg_size = total_prompt_size / len(prompt_files) if prompt_files else 0
|
|
279
|
-
|
|
280
|
-
if avg_size > 2000: # tokens
|
|
281
|
-
predictions.append(
|
|
282
|
-
{
|
|
283
|
-
"type": "context_window_inefficiency",
|
|
284
|
-
"alert": (
|
|
285
|
-
f"Average prompt size ~{int(avg_size)} tokens. "
|
|
286
|
-
"In our experience, prompts above 2000 tokens often contain "
|
|
287
|
-
"redundancy that could be refactored. Alert: Review for efficiency "
|
|
288
|
-
"before context costs compound."
|
|
289
|
-
),
|
|
290
|
-
"probability": "medium",
|
|
291
|
-
"impact": "medium",
|
|
292
|
-
"prevention_steps": [
|
|
293
|
-
"Extract common instructions to base template",
|
|
294
|
-
"Use dynamic context injection (not static bloat)",
|
|
295
|
-
"Implement prompt caching strategies",
|
|
296
|
-
"Consider retrieval-augmented generation for large contexts",
|
|
297
|
-
],
|
|
298
|
-
"reasoning": (
|
|
299
|
-
"Token costs scale linearly with prompt size. We've reduced costs "
|
|
300
|
-
"40-60% by refactoring bloated prompts."
|
|
301
|
-
),
|
|
302
|
-
},
|
|
303
|
-
)
|
|
304
|
-
|
|
305
|
-
return predictions
|
|
306
|
-
|
|
307
|
-
def _generate_recommendations(self, issues: list[dict], predictions: list[dict]) -> list[str]:
|
|
308
|
-
"""Generate actionable recommendations"""
|
|
309
|
-
recommendations = []
|
|
310
|
-
|
|
311
|
-
# High-impact predictions first
|
|
312
|
-
high_impact = [p for p in predictions if p.get("impact") in ["high", "medium"]]
|
|
313
|
-
for pred in high_impact:
|
|
314
|
-
recommendations.append(f"[ALERT] {pred['alert']}")
|
|
315
|
-
recommendations.append(" Prevention steps:")
|
|
316
|
-
for step in pred["prevention_steps"][:3]: # Top 3
|
|
317
|
-
recommendations.append(f" - {step}")
|
|
318
|
-
|
|
319
|
-
# Critical issues
|
|
320
|
-
critical = [i for i in issues if i.get("severity") == "error"]
|
|
321
|
-
if critical:
|
|
322
|
-
recommendations.append(f"\n[CRITICAL] Fix {len(critical)} errors immediately")
|
|
323
|
-
|
|
324
|
-
# Quick wins
|
|
325
|
-
warnings = [i for i in issues if i.get("severity") == "warning"]
|
|
326
|
-
if len(warnings) > 3:
|
|
327
|
-
recommendations.append(
|
|
328
|
-
f"\n[QUICK WIN] Address {len(warnings)} warnings to improve prompt quality",
|
|
329
|
-
)
|
|
330
|
-
|
|
331
|
-
return recommendations
|
|
332
|
-
|
|
333
|
-
def _extract_patterns(
|
|
334
|
-
self,
|
|
335
|
-
issues: list[dict],
|
|
336
|
-
predictions: list[dict],
|
|
337
|
-
) -> list[dict[str, Any]]:
|
|
338
|
-
"""Extract patterns for cross-domain learning (Level 5).
|
|
339
|
-
|
|
340
|
-
Pattern: Drift detection applies to many domains.
|
|
341
|
-
"""
|
|
342
|
-
patterns = []
|
|
343
|
-
|
|
344
|
-
if any(p["type"] == "prompt_code_drift" for p in predictions):
|
|
345
|
-
patterns.append(
|
|
346
|
-
{
|
|
347
|
-
"pattern_type": "artifact_code_drift",
|
|
348
|
-
"description": (
|
|
349
|
-
"When artifacts (prompts, docs, configs) evolve slower than "
|
|
350
|
-
"code, misalignment compounds over time"
|
|
351
|
-
),
|
|
352
|
-
"domain_agnostic": True,
|
|
353
|
-
"applicable_to": [
|
|
354
|
-
"AI prompt engineering",
|
|
355
|
-
"API documentation",
|
|
356
|
-
"Configuration management",
|
|
357
|
-
"Clinical protocols (healthcare)",
|
|
358
|
-
"Compliance documentation",
|
|
359
|
-
],
|
|
360
|
-
"detection": "Compare change velocity: artifacts vs code",
|
|
361
|
-
"threshold": "Alert when code_changes > artifact_changes * 3",
|
|
362
|
-
},
|
|
363
|
-
)
|
|
364
|
-
|
|
365
|
-
return patterns
|
|
366
|
-
|
|
367
|
-
def _calculate_confidence(self, context: dict[str, Any]) -> float:
|
|
368
|
-
"""Calculate analysis confidence"""
|
|
369
|
-
confidence = 0.75 # Base
|
|
370
|
-
|
|
371
|
-
if context.get("version_history"):
|
|
372
|
-
confidence += 0.15 # History improves drift detection
|
|
373
|
-
|
|
374
|
-
if len(context.get("prompt_files", [])) > 5:
|
|
375
|
-
confidence += 0.05 # More data = better patterns
|
|
376
|
-
|
|
377
|
-
return min(1.0, confidence)
|
|
378
|
-
|
|
379
|
-
# Helper methods
|
|
380
|
-
|
|
381
|
-
def _has_clear_structure(self, content: str) -> bool:
|
|
382
|
-
"""Check if prompt has clear structural markers"""
|
|
383
|
-
markers = ["##", "Role:", "Task:", "Context:", "Instructions:"]
|
|
384
|
-
return any(marker in content for marker in markers)
|
|
385
|
-
|
|
386
|
-
def _has_examples(self, content: str) -> bool:
|
|
387
|
-
"""Check if prompt contains examples"""
|
|
388
|
-
example_markers = ["<example>", "Example:", "For example:", "```"]
|
|
389
|
-
return any(marker in content for marker in example_markers)
|
|
390
|
-
|
|
391
|
-
def _count_prompt_changes(self, history: list[dict]) -> int:
|
|
392
|
-
"""Count prompt-related changes in version history"""
|
|
393
|
-
return sum(
|
|
394
|
-
1
|
|
395
|
-
for commit in history
|
|
396
|
-
if any(
|
|
397
|
-
"prompt" in f.lower() or f.endswith(".txt") or f.endswith(".md")
|
|
398
|
-
for f in commit.get("files", [])
|
|
399
|
-
)
|
|
400
|
-
)
|
|
401
|
-
|
|
402
|
-
def _count_code_changes(self, history: list[dict]) -> int:
|
|
403
|
-
"""Count code changes in version history"""
|
|
404
|
-
return sum(
|
|
405
|
-
1
|
|
406
|
-
for commit in history
|
|
407
|
-
if any(f.endswith((".py", ".js", ".ts", ".java")) for f in commit.get("files", []))
|
|
408
|
-
)
|
|
409
|
-
|
|
410
|
-
def _has_version_marker(self, filepath: str) -> bool:
|
|
411
|
-
"""Check if file has version marker"""
|
|
412
|
-
try:
|
|
413
|
-
with open(filepath) as f:
|
|
414
|
-
content = f.read()
|
|
415
|
-
return bool(re.search(r"v\d+\.\d+\.\d+|version:", content, re.IGNORECASE))
|
|
416
|
-
except OSError:
|
|
417
|
-
return False
|
|
418
|
-
|
|
419
|
-
def _estimate_token_count(self, filepath: str) -> int:
|
|
420
|
-
"""Rough estimate of token count (chars / 4)"""
|
|
421
|
-
try:
|
|
422
|
-
with open(filepath) as f:
|
|
423
|
-
return len(f.read()) // 4
|
|
424
|
-
except OSError:
|
|
425
|
-
return 0
|