devforgeai 1.0.4 → 1.0.6
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.
- package/CLAUDE.md +120 -0
- package/package.json +9 -1
- package/src/CLAUDE.md +699 -0
- package/src/claude/scripts/README.md +396 -0
- package/src/claude/scripts/audit-command-skill-overlap.sh +67 -0
- package/src/claude/scripts/check-hooks-fast.sh +70 -0
- package/src/claude/scripts/devforgeai-validate +6 -0
- package/src/claude/scripts/devforgeai_cli/README.md +531 -0
- package/src/claude/scripts/devforgeai_cli/__init__.py +12 -0
- package/src/claude/scripts/devforgeai_cli/cli.py +716 -0
- package/src/claude/scripts/devforgeai_cli/commands/__init__.py +1 -0
- package/src/claude/scripts/devforgeai_cli/commands/check_hooks.py +384 -0
- package/src/claude/scripts/devforgeai_cli/commands/invoke_hooks.py +149 -0
- package/src/claude/scripts/devforgeai_cli/commands/phase_commands.py +731 -0
- package/src/claude/scripts/devforgeai_cli/commands/validate_installation.py +412 -0
- package/src/claude/scripts/devforgeai_cli/context_extraction.py +426 -0
- package/src/claude/scripts/devforgeai_cli/feedback/AC_TO_TEST_MAPPING.md +636 -0
- package/src/claude/scripts/devforgeai_cli/feedback/DELIVERY_SUMMARY.txt +329 -0
- package/src/claude/scripts/devforgeai_cli/feedback/README_TEST_SPECS.md +486 -0
- package/src/claude/scripts/devforgeai_cli/feedback/TEST_IMPLEMENTATION_GUIDE.md +529 -0
- package/src/claude/scripts/devforgeai_cli/feedback/TEST_SPECIFICATIONS.md +2652 -0
- package/src/claude/scripts/devforgeai_cli/feedback/TEST_SPECS_INDEX.md +398 -0
- package/src/claude/scripts/devforgeai_cli/feedback/__init__.py +34 -0
- package/src/claude/scripts/devforgeai_cli/feedback/adaptive_questioning_engine.py +581 -0
- package/src/claude/scripts/devforgeai_cli/feedback/aggregation.py +179 -0
- package/src/claude/scripts/devforgeai_cli/feedback/commands.py +535 -0
- package/src/claude/scripts/devforgeai_cli/feedback/config_defaults.py +58 -0
- package/src/claude/scripts/devforgeai_cli/feedback/config_manager.py +423 -0
- package/src/claude/scripts/devforgeai_cli/feedback/config_models.py +192 -0
- package/src/claude/scripts/devforgeai_cli/feedback/config_schema.py +140 -0
- package/src/claude/scripts/devforgeai_cli/feedback/coverage.json +1 -0
- package/src/claude/scripts/devforgeai_cli/feedback/feature_flag.py +152 -0
- package/src/claude/scripts/devforgeai_cli/feedback/feedback_indexer.py +394 -0
- package/src/claude/scripts/devforgeai_cli/feedback/hot_reload.py +226 -0
- package/src/claude/scripts/devforgeai_cli/feedback/longitudinal.py +115 -0
- package/src/claude/scripts/devforgeai_cli/feedback/models.py +67 -0
- package/src/claude/scripts/devforgeai_cli/feedback/question_router.py +236 -0
- package/src/claude/scripts/devforgeai_cli/feedback/retrospective.py +233 -0
- package/src/claude/scripts/devforgeai_cli/feedback/skip_tracker.py +177 -0
- package/src/claude/scripts/devforgeai_cli/feedback/skip_tracking.py +221 -0
- package/src/claude/scripts/devforgeai_cli/feedback/template_engine.py +549 -0
- package/src/claude/scripts/devforgeai_cli/feedback/validation.py +163 -0
- package/src/claude/scripts/devforgeai_cli/headless/__init__.py +30 -0
- package/src/claude/scripts/devforgeai_cli/headless/answer_models.py +206 -0
- package/src/claude/scripts/devforgeai_cli/headless/answer_resolver.py +204 -0
- package/src/claude/scripts/devforgeai_cli/headless/exceptions.py +36 -0
- package/src/claude/scripts/devforgeai_cli/headless/pattern_matcher.py +156 -0
- package/src/claude/scripts/devforgeai_cli/hooks.py +313 -0
- package/src/claude/scripts/devforgeai_cli/metrics/__init__.py +46 -0
- package/src/claude/scripts/devforgeai_cli/metrics/command_metrics.py +142 -0
- package/src/claude/scripts/devforgeai_cli/metrics/failure_modes.py +152 -0
- package/src/claude/scripts/devforgeai_cli/metrics/story_segmentation.py +181 -0
- package/src/claude/scripts/devforgeai_cli/orchestrate_hooks.py +780 -0
- package/src/claude/scripts/devforgeai_cli/phase_state.py +1229 -0
- package/src/claude/scripts/devforgeai_cli/session/__init__.py +30 -0
- package/src/claude/scripts/devforgeai_cli/session/checkpoint.py +268 -0
- package/src/claude/scripts/devforgeai_cli/tests/__init__.py +1 -0
- package/src/claude/scripts/devforgeai_cli/tests/conftest.py +29 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/TEST_EXECUTION_GUIDE.md +298 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/__init__.py +3 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_adaptive_questioning_engine.py +2171 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_aggregation.py +476 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_defaults.py +133 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_manager.py +592 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_models.py +373 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_schema.py +130 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_configuration_management.py +1355 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_edge_cases.py +308 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_feature_flag.py +307 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_feedback_indexer.py +384 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_hot_reload.py +580 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_integration.py +402 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_models.py +105 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_question_routing.py +262 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_retrospective.py +333 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_skip_tracker.py +410 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_skip_tracking.py +159 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_skip_tracking_integration.py +1155 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_template_engine.py +1389 -0
- package/src/claude/scripts/devforgeai_cli/tests/feedback/test_validation_comprehensive.py +210 -0
- package/src/claude/scripts/devforgeai_cli/tests/fixtures/autonomous-deferral-story.md +46 -0
- package/src/claude/scripts/devforgeai_cli/tests/fixtures/missing-impl-notes.md +31 -0
- package/src/claude/scripts/devforgeai_cli/tests/fixtures/valid-deferral-story.md +46 -0
- package/src/claude/scripts/devforgeai_cli/tests/fixtures/valid-story-complete.md +48 -0
- package/src/claude/scripts/devforgeai_cli/tests/manual_test_invoke_hooks.sh +200 -0
- package/src/claude/scripts/devforgeai_cli/tests/session/DELIVERABLES.md +518 -0
- package/src/claude/scripts/devforgeai_cli/tests/session/TEST_SUMMARY.md +468 -0
- package/src/claude/scripts/devforgeai_cli/tests/session/__init__.py +6 -0
- package/src/claude/scripts/devforgeai_cli/tests/session/fixtures/corrupted-checkpoint.json +1 -0
- package/src/claude/scripts/devforgeai_cli/tests/session/fixtures/missing-fields-checkpoint.json +4 -0
- package/src/claude/scripts/devforgeai_cli/tests/session/fixtures/valid-checkpoint.json +15 -0
- package/src/claude/scripts/devforgeai_cli/tests/session/test_checkpoint.py +851 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_check_hooks.py +1886 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_depends_on_normalizer.py +171 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_dod_validator.py +97 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_invoke_hooks.py +1902 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_phase_commands.py +320 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_phase_commands_error_handling.py +1021 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_phase_commands_import.py +697 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_phase_state.py +2187 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_skip_tracking.py +2141 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_skip_tracking_coverage_gap.py +195 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_subagent_enforcement.py +539 -0
- package/src/claude/scripts/devforgeai_cli/tests/test_validate_installation.py +361 -0
- package/src/claude/scripts/devforgeai_cli/utils/__init__.py +11 -0
- package/src/claude/scripts/devforgeai_cli/utils/depends_on_normalizer.py +149 -0
- package/src/claude/scripts/devforgeai_cli/utils/markdown_parser.py +219 -0
- package/src/claude/scripts/devforgeai_cli/utils/story_analyzer.py +249 -0
- package/src/claude/scripts/devforgeai_cli/utils/yaml_parser.py +152 -0
- package/src/claude/scripts/devforgeai_cli/validators/__init__.py +27 -0
- package/src/claude/scripts/devforgeai_cli/validators/ast_grep_validator.py +373 -0
- package/src/claude/scripts/devforgeai_cli/validators/context_validator.py +180 -0
- package/src/claude/scripts/devforgeai_cli/validators/dod_validator.py +309 -0
- package/src/claude/scripts/devforgeai_cli/validators/git_validator.py +107 -0
- package/src/claude/scripts/devforgeai_cli/validators/grep_fallback.py +300 -0
- package/src/claude/scripts/install_hooks.sh +186 -0
- package/src/claude/scripts/invoke_feedback_hooks.sh +59 -0
- package/src/claude/scripts/migrate-ac-headers.sh +122 -0
- package/src/claude/scripts/plan_file_kb.sh +704 -0
- package/src/claude/scripts/requirements.txt +8 -0
- package/src/claude/scripts/session_catalog.sh +543 -0
- package/src/claude/scripts/setup.py +55 -0
- package/src/claude/scripts/start-devforgeai.sh +16 -0
- package/src/claude/scripts/statusline.sh +27 -0
- package/src/claude/scripts/validate_deferrals.py +344 -0
- package/src/claude/skills/devforgeai-qa/SKILL.md +1 -1
- package/src/claude/skills/researching-market/SKILL.md +2 -1
- package/src/cli/lib/copier.js +13 -1
- package/src/claude/skills/designing-systems/scripts/__pycache__/detect_anti_patterns.cpython-312.pyc +0 -0
- package/src/claude/skills/designing-systems/scripts/__pycache__/validate_all_context.cpython-312.pyc +0 -0
- package/src/claude/skills/designing-systems/scripts/__pycache__/validate_architecture.cpython-312.pyc +0 -0
- package/src/claude/skills/designing-systems/scripts/__pycache__/validate_dependencies.cpython-312.pyc +0 -0
- package/src/claude/skills/devforgeai-story-creation/scripts/__pycache__/migrate_story_v1_to_v2.cpython-312.pyc +0 -0
- package/src/claude/skills/devforgeai-story-creation/scripts/tests/__pycache__/measure_accuracy.cpython-312.pyc +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""
|
|
2
|
+
JSON Schema definition for feedback configuration validation.
|
|
3
|
+
|
|
4
|
+
This module provides the JSON schema used to validate configuration files
|
|
5
|
+
against the expected structure.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Dict, Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# JSON Schema for feedback configuration
|
|
12
|
+
FEEDBACK_CONFIG_SCHEMA: Dict[str, Any] = {
|
|
13
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
14
|
+
"title": "Feedback Configuration Schema",
|
|
15
|
+
"description": "Schema for DevForgeAI feedback system configuration (YAML-based)",
|
|
16
|
+
"type": "object",
|
|
17
|
+
"properties": {
|
|
18
|
+
"enabled": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"description": "Master enable/disable switch for feedback collection",
|
|
21
|
+
"default": True
|
|
22
|
+
},
|
|
23
|
+
"trigger_mode": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"enum": ["always", "failures-only", "specific-operations", "never"],
|
|
26
|
+
"description": "Determines when feedback is collected",
|
|
27
|
+
"default": "failures-only"
|
|
28
|
+
},
|
|
29
|
+
"operations": {
|
|
30
|
+
"type": ["array", "null"],
|
|
31
|
+
"items": {
|
|
32
|
+
"type": "string"
|
|
33
|
+
},
|
|
34
|
+
"description": "List of operations to collect feedback for (only used if trigger_mode is 'specific-operations')",
|
|
35
|
+
"default": None
|
|
36
|
+
},
|
|
37
|
+
"conversation_settings": {
|
|
38
|
+
"type": "object",
|
|
39
|
+
"description": "Conversation-level settings for feedback collection",
|
|
40
|
+
"properties": {
|
|
41
|
+
"max_questions": {
|
|
42
|
+
"type": "integer",
|
|
43
|
+
"minimum": 0,
|
|
44
|
+
"description": "Maximum number of questions per conversation (0 = unlimited)",
|
|
45
|
+
"default": 5
|
|
46
|
+
},
|
|
47
|
+
"allow_skip": {
|
|
48
|
+
"type": "boolean",
|
|
49
|
+
"description": "Whether users can skip feedback questions",
|
|
50
|
+
"default": True
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"additionalProperties": False,
|
|
54
|
+
"default": {
|
|
55
|
+
"max_questions": 5,
|
|
56
|
+
"allow_skip": True
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"skip_tracking": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"description": "Skip tracking configuration",
|
|
62
|
+
"properties": {
|
|
63
|
+
"enabled": {
|
|
64
|
+
"type": "boolean",
|
|
65
|
+
"description": "Whether skip tracking is active",
|
|
66
|
+
"default": True
|
|
67
|
+
},
|
|
68
|
+
"max_consecutive_skips": {
|
|
69
|
+
"type": "integer",
|
|
70
|
+
"minimum": 0,
|
|
71
|
+
"description": "Maximum consecutive skips allowed (0 = unlimited)",
|
|
72
|
+
"default": 3
|
|
73
|
+
},
|
|
74
|
+
"reset_on_positive": {
|
|
75
|
+
"type": "boolean",
|
|
76
|
+
"description": "Whether to reset skip counter on positive feedback",
|
|
77
|
+
"default": True
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"additionalProperties": False,
|
|
81
|
+
"default": {
|
|
82
|
+
"enabled": True,
|
|
83
|
+
"max_consecutive_skips": 3,
|
|
84
|
+
"reset_on_positive": True
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"templates": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"description": "Template preferences for feedback collection",
|
|
90
|
+
"properties": {
|
|
91
|
+
"format": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"enum": ["structured", "free-text"],
|
|
94
|
+
"description": "Template format for feedback questions",
|
|
95
|
+
"default": "structured"
|
|
96
|
+
},
|
|
97
|
+
"tone": {
|
|
98
|
+
"type": "string",
|
|
99
|
+
"enum": ["brief", "detailed"],
|
|
100
|
+
"description": "Tone for feedback questions",
|
|
101
|
+
"default": "brief"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"additionalProperties": False,
|
|
105
|
+
"default": {
|
|
106
|
+
"format": "structured",
|
|
107
|
+
"tone": "brief"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"additionalProperties": False,
|
|
112
|
+
"required": [], # All fields are optional with defaults
|
|
113
|
+
"default": {
|
|
114
|
+
"enabled": True,
|
|
115
|
+
"trigger_mode": "failures-only",
|
|
116
|
+
"operations": None,
|
|
117
|
+
"conversation_settings": {
|
|
118
|
+
"max_questions": 5,
|
|
119
|
+
"allow_skip": True
|
|
120
|
+
},
|
|
121
|
+
"skip_tracking": {
|
|
122
|
+
"enabled": True,
|
|
123
|
+
"max_consecutive_skips": 3,
|
|
124
|
+
"reset_on_positive": True
|
|
125
|
+
},
|
|
126
|
+
"templates": {
|
|
127
|
+
"format": "structured",
|
|
128
|
+
"tone": "brief"
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def get_schema() -> Dict[str, Any]:
|
|
135
|
+
"""Get a copy of the feedback configuration schema.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
Dictionary containing the JSON schema.
|
|
139
|
+
"""
|
|
140
|
+
return FEEDBACK_CONFIG_SCHEMA.copy()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"meta": {"format": 3, "version": "7.10.6", "timestamp": "2025-11-10T21:24:50.642393", "branch_coverage": false, "show_contexts": false}, "files": {"__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [8, 10, 16, 22, 26], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [8, 10, 16, 22, 26], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [8, 10, 16, 22, 26], "excluded_lines": []}}}, "adaptive_questioning_engine.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 195, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 195, "excluded_lines": 0}, "missing_lines": [16, 17, 18, 20, 23, 27, 30, 35, 51, 58, 61, 64, 66, 78, 79, 81, 110, 112, 113, 114, 115, 116, 117, 118, 121, 124, 125, 126, 129, 130, 133, 135, 137, 138, 141, 144, 147, 149, 152, 153, 154, 158, 159, 160, 161, 163, 164, 168, 169, 170, 174, 175, 176, 179, 182, 187, 188, 191, 192, 194, 195, 197, 198, 203, 207, 209, 210, 212, 215, 217, 220, 221, 224, 238, 245, 254, 255, 256, 257, 260, 261, 262, 268, 269, 270, 275, 282, 283, 285, 298, 303, 316, 317, 319, 320, 321, 322, 325, 326, 327, 328, 329, 330, 331, 332, 333, 335, 337, 349, 350, 352, 353, 355, 356, 357, 359, 360, 362, 363, 365, 366, 368, 369, 372, 373, 374, 378, 380, 382, 395, 396, 398, 399, 401, 402, 403, 404, 407, 408, 409, 410, 412, 414, 432, 435, 436, 439, 440, 441, 443, 444, 445, 446, 448, 449, 450, 453, 455, 470, 471, 472, 473, 476, 477, 479, 481, 483, 502, 503, 505, 506, 507, 508, 510, 511, 513, 515, 546, 549, 555, 556, 557, 558, 561, 562, 565, 566, 569, 570, 573, 574, 575, 577, 578, 581], "excluded_lines": [], "functions": {"AdaptiveQuestioningEngine.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [78, 79], "excluded_lines": []}, "AdaptiveQuestioningEngine.select_questions": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 58, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 58, "excluded_lines": 0}, "missing_lines": [110, 112, 113, 114, 115, 116, 117, 118, 121, 124, 125, 126, 129, 130, 133, 135, 137, 138, 141, 144, 147, 149, 152, 153, 154, 158, 159, 160, 161, 163, 164, 168, 169, 170, 174, 175, 176, 179, 182, 187, 188, 191, 192, 194, 195, 197, 198, 203, 207, 209, 210, 212, 215, 217, 220, 221, 224, 238], "excluded_lines": []}, "AdaptiveQuestioningEngine._validate_context": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [254, 255, 256, 257, 260, 261, 262, 268, 269, 270], "excluded_lines": []}, "AdaptiveQuestioningEngine._get_base_question_count": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [282, 283], "excluded_lines": []}, "AdaptiveQuestioningEngine._count_same_type_operations": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [298], "excluded_lines": []}, "AdaptiveQuestioningEngine._detect_rapid_mode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [316, 317, 319, 320, 321, 322, 325, 326, 327, 328, 329, 330, 331, 332, 333, 335], "excluded_lines": []}, "AdaptiveQuestioningEngine._is_performance_outlier": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 20, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 20, "excluded_lines": 0}, "missing_lines": [349, 350, 352, 353, 355, 356, 357, 359, 360, 362, 363, 365, 366, 368, 369, 372, 373, 374, 378, 380], "excluded_lines": []}, "AdaptiveQuestioningEngine._is_question_duplicate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 13, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 13, "excluded_lines": 0}, "missing_lines": [395, 396, 398, 399, 401, 402, 403, 404, 407, 408, 409, 410, 412], "excluded_lines": []}, "AdaptiveQuestioningEngine._get_question_set": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 14, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 14, "excluded_lines": 0}, "missing_lines": [432, 435, 436, 439, 440, 441, 443, 444, 445, 446, 448, 449, 450, 453], "excluded_lines": []}, "AdaptiveQuestioningEngine._rank_questions_by_priority": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [470, 481], "excluded_lines": []}, "AdaptiveQuestioningEngine._rank_questions_by_priority.sort_key": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [471, 472, 473, 476, 477, 479], "excluded_lines": []}, "AdaptiveQuestioningEngine._mark_optional_questions": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0}, "missing_lines": [502, 503, 505, 506, 507, 508, 510, 511, 513], "excluded_lines": []}, "AdaptiveQuestioningEngine._build_selection_rationale": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 17, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 17, "excluded_lines": 0}, "missing_lines": [546, 549, 555, 556, 557, 558, 561, 562, 565, 566, 569, 570, 573, 574, 575, 577, 578], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 25, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 25, "excluded_lines": 0}, "missing_lines": [16, 17, 18, 20, 23, 27, 30, 35, 51, 58, 61, 64, 66, 81, 245, 275, 285, 303, 337, 382, 414, 455, 483, 515, 581], "excluded_lines": []}}, "classes": {"AdaptiveQuestioningEngine": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 170, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 170, "excluded_lines": 0}, "missing_lines": [78, 79, 110, 112, 113, 114, 115, 116, 117, 118, 121, 124, 125, 126, 129, 130, 133, 135, 137, 138, 141, 144, 147, 149, 152, 153, 154, 158, 159, 160, 161, 163, 164, 168, 169, 170, 174, 175, 176, 179, 182, 187, 188, 191, 192, 194, 195, 197, 198, 203, 207, 209, 210, 212, 215, 217, 220, 221, 224, 238, 254, 255, 256, 257, 260, 261, 262, 268, 269, 270, 282, 283, 298, 316, 317, 319, 320, 321, 322, 325, 326, 327, 328, 329, 330, 331, 332, 333, 335, 349, 350, 352, 353, 355, 356, 357, 359, 360, 362, 363, 365, 366, 368, 369, 372, 373, 374, 378, 380, 395, 396, 398, 399, 401, 402, 403, 404, 407, 408, 409, 410, 412, 432, 435, 436, 439, 440, 441, 443, 444, 445, 446, 448, 449, 450, 453, 470, 471, 472, 473, 476, 477, 479, 481, 502, 503, 505, 506, 507, 508, 510, 511, 513, 546, 549, 555, 556, 557, 558, 561, 562, 565, 566, 569, 570, 573, 574, 575, 577, 578], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 25, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 25, "excluded_lines": 0}, "missing_lines": [16, 17, 18, 20, 23, 27, 30, 35, 51, 58, 61, 64, 66, 81, 245, 275, 285, 303, 337, 382, 414, 455, 483, 515, 581], "excluded_lines": []}}}, "aggregation.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 91, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 91, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 8, 11, 13, 15, 16, 17, 19, 21, 22, 23, 24, 26, 29, 31, 33, 34, 35, 37, 38, 39, 40, 41, 43, 46, 48, 50, 51, 52, 54, 55, 56, 57, 58, 60, 63, 74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 94, 96, 97, 98, 99, 100, 107, 110, 117, 119, 120, 121, 129, 131, 132, 133, 134, 136, 137, 138, 139, 141, 142, 149, 152, 159, 161, 163, 164, 166, 167, 168, 170, 171, 173, 174, 176, 177, 179], "excluded_lines": [], "functions": {"aggregate_feedback_by_story": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [13, 15, 16, 17, 19, 21, 22, 23, 24, 26], "excluded_lines": []}, "aggregate_feedback_by_epic": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [31, 33, 34, 35, 37, 38, 39, 40, 41, 43], "excluded_lines": []}, "aggregate_feedback_by_skill": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [48, 50, 51, 52, 54, 55, 56, 57, 58, 60], "excluded_lines": []}, "detect_patterns": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 21, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 21, "excluded_lines": 0}, "missing_lines": [74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 94, 96, 97, 98, 99, 100, 107], "excluded_lines": []}, "generate_insights": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [117, 119, 120, 121, 129, 131, 132, 133, 134, 136, 137, 138, 139, 141, 142, 149], "excluded_lines": []}, "export_quarterly_insights": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 14, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 14, "excluded_lines": 0}, "missing_lines": [159, 161, 163, 164, 166, 167, 168, 170, 171, 173, 174, 176, 177, 179], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 8, 11, 29, 46, 63, 110, 152], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 91, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 91, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 8, 11, 13, 15, 16, 17, 19, 21, 22, 23, 24, 26, 29, 31, 33, 34, 35, 37, 38, 39, 40, 41, 43, 46, 48, 50, 51, 52, 54, 55, 56, 57, 58, 60, 63, 74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 94, 96, 97, 98, 99, 100, 107, 110, 117, 119, 120, 121, 129, 131, 132, 133, 134, 136, 137, 138, 139, 141, 142, 149, 152, 159, 161, 163, 164, 166, 167, 168, 170, 171, 173, 174, 176, 177, 179], "excluded_lines": []}}}, "config_defaults.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [7, 11, 31, 37, 40, 52, 53, 58], "excluded_lines": [], "functions": {"get_default_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [37], "excluded_lines": []}, "get_default_nested_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [52, 53, 58], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [7, 11, 31, 40], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [7, 11, 31, 37, 40, 52, 53, 58], "excluded_lines": []}}}, "config_manager.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 161, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 161, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, 24, 27, 34, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 68, 71, 74, 75, 79, 80, 82, 84, 86, 88, 94, 95, 96, 97, 98, 100, 102, 103, 105, 107, 109, 119, 120, 122, 123, 124, 125, 127, 128, 129, 131, 132, 133, 134, 135, 136, 138, 146, 147, 148, 149, 151, 160, 161, 164, 167, 170, 171, 173, 175, 186, 187, 188, 189, 190, 192, 204, 206, 207, 208, 211, 220, 222, 223, 224, 226, 238, 240, 243, 246, 248, 250, 251, 253, 255, 263, 265, 271, 272, 273, 274, 276, 282, 283, 285, 291, 292, 294, 300, 301, 303, 309, 310, 312, 322, 323, 325, 331, 333, 339, 341, 347, 349, 355, 357, 363, 364, 365, 367, 369, 370, 371, 373, 375, 376, 378, 380, 384, 385, 388, 405, 406, 407, 408, 413, 416, 420, 421, 422, 423], "excluded_lines": [], "functions": {"ConfigurationManager.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 21, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 21, "excluded_lines": 0}, "missing_lines": [49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 68, 71, 74, 75, 79, 80, 82], "excluded_lines": []}, "ConfigurationManager._setup_logging": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [86], "excluded_lines": []}, "ConfigurationManager._log_error": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [94, 95, 96, 97, 98, 100, 102, 103], "excluded_lines": []}, "ConfigurationManager._ensure_config_directory": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [107], "excluded_lines": []}, "ConfigurationManager._load_yaml_file": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 15, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 15, "excluded_lines": 0}, "missing_lines": [119, 120, 122, 123, 124, 125, 127, 128, 129, 131, 132, 133, 134, 135, 136], "excluded_lines": []}, "ConfigurationManager._merge_nested_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [146, 147, 148, 149], "excluded_lines": []}, "ConfigurationManager._merge_with_defaults": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [160, 161, 164, 167, 170, 171, 173], "excluded_lines": []}, "ConfigurationManager._parse_nested_settings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [186, 187, 188, 189, 190], "excluded_lines": []}, "ConfigurationManager._dict_to_configuration": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0}, "missing_lines": [204, 206, 207, 208, 211, 220, 222, 223, 224], "excluded_lines": []}, "ConfigurationManager.load_configuration": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [238, 240, 243, 246, 248, 250, 251, 253], "excluded_lines": []}, "ConfigurationManager._reload_config_callback": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [263], "excluded_lines": []}, "ConfigurationManager.get_configuration": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [271, 272, 273, 274], "excluded_lines": []}, "ConfigurationManager.update_configuration": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [282, 283], "excluded_lines": []}, "ConfigurationManager.is_enabled": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [291, 292], "excluded_lines": []}, "ConfigurationManager.get_trigger_mode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [300, 301], "excluded_lines": []}, "ConfigurationManager.get_operations": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [309, 310], "excluded_lines": []}, "ConfigurationManager._get_nested_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [322, 323], "excluded_lines": []}, "ConfigurationManager.get_conversation_settings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [331], "excluded_lines": []}, "ConfigurationManager.get_skip_tracking_settings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [339], "excluded_lines": []}, "ConfigurationManager.get_template_settings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [347], "excluded_lines": []}, "ConfigurationManager.get_skip_tracker": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [355], "excluded_lines": []}, "ConfigurationManager.is_hot_reload_enabled": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [363, 364, 365], "excluded_lines": []}, "ConfigurationManager.start_hot_reload": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [369, 370, 371], "excluded_lines": []}, "ConfigurationManager.stop_hot_reload": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [375, 376], "excluded_lines": []}, "ConfigurationManager.shutdown": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [380], "excluded_lines": []}, "get_config_manager": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [405, 406, 407, 408, 413], "excluded_lines": []}, "reset_config_manager": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [420, 421, 422, 423], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 45, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 45, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, 24, 27, 34, 84, 88, 105, 109, 138, 151, 175, 192, 226, 255, 265, 276, 285, 294, 303, 312, 325, 333, 341, 349, 357, 367, 373, 378, 384, 385, 388, 416], "excluded_lines": []}}, "classes": {"ConfigurationManager": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 107, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 107, "excluded_lines": 0}, "missing_lines": [49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 68, 71, 74, 75, 79, 80, 82, 86, 94, 95, 96, 97, 98, 100, 102, 103, 107, 119, 120, 122, 123, 124, 125, 127, 128, 129, 131, 132, 133, 134, 135, 136, 146, 147, 148, 149, 160, 161, 164, 167, 170, 171, 173, 186, 187, 188, 189, 190, 204, 206, 207, 208, 211, 220, 222, 223, 224, 238, 240, 243, 246, 248, 250, 251, 253, 263, 271, 272, 273, 274, 282, 283, 291, 292, 300, 301, 309, 310, 322, 323, 331, 339, 347, 355, 363, 364, 365, 369, 370, 371, 375, 376, 380], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 54, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 54, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, 24, 27, 34, 84, 88, 105, 109, 138, 151, 175, 192, 226, 255, 265, 276, 285, 294, 303, 312, 325, 333, 341, 349, 357, 367, 373, 378, 384, 385, 388, 405, 406, 407, 408, 413, 416, 420, 421, 422, 423], "excluded_lines": []}}}, "config_models.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 85, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 85, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 13, 15, 16, 17, 18, 21, 23, 24, 27, 29, 30, 34, 35, 36, 39, 40, 47, 48, 50, 52, 53, 56, 57, 62, 63, 71, 72, 73, 75, 77, 78, 81, 82, 85, 86, 91, 92, 99, 100, 102, 104, 105, 110, 111, 117, 118, 129, 130, 131, 132, 133, 134, 136, 138, 139, 140, 141, 143, 144, 145, 146, 148, 149, 150, 151, 153, 155, 156, 161, 163, 164, 168, 170, 171, 172, 176, 178, 179, 180, 181, 183, 185], "excluded_lines": [], "functions": {"ConversationSettings.__post_init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [52, 53, 56, 57], "excluded_lines": []}, "SkipTrackingSettings.__post_init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [77, 78, 81, 82, 85, 86], "excluded_lines": []}, "TemplateSettings.__post_init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [104, 105, 110, 111], "excluded_lines": []}, "FeedbackConfiguration._normalize_nested_objects": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [138, 139, 140, 141, 143, 144, 145, 146, 148, 149, 150, 151], "excluded_lines": []}, "FeedbackConfiguration._validate_trigger_mode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [155, 156], "excluded_lines": []}, "FeedbackConfiguration._validate_enabled": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [163, 164], "excluded_lines": []}, "FeedbackConfiguration._validate_operations": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [170, 171, 172], "excluded_lines": []}, "FeedbackConfiguration.__post_init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [178, 179, 180, 181], "excluded_lines": []}, "FeedbackConfiguration.to_dict": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [185], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 47, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 47, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 13, 15, 16, 17, 18, 21, 23, 24, 27, 29, 30, 34, 35, 36, 39, 40, 47, 48, 50, 62, 63, 71, 72, 73, 75, 91, 92, 99, 100, 102, 117, 118, 129, 130, 131, 132, 133, 134, 136, 153, 161, 168, 176, 183], "excluded_lines": []}}, "classes": {"TriggerMode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "TemplateFormat": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "TemplateTone": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ConversationSettings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [52, 53, 56, 57], "excluded_lines": []}, "SkipTrackingSettings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [77, 78, 81, 82, 85, 86], "excluded_lines": []}, "TemplateSettings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [104, 105, 110, 111], "excluded_lines": []}, "FeedbackConfiguration": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 24, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 24, "excluded_lines": 0}, "missing_lines": [138, 139, 140, 141, 143, 144, 145, 146, 148, 149, 150, 151, 155, 156, 163, 164, 170, 171, 172, 178, 179, 180, 181, 185], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 47, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 47, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 13, 15, 16, 17, 18, 21, 23, 24, 27, 29, 30, 34, 35, 36, 39, 40, 47, 48, 50, 62, 63, 71, 72, 73, 75, 91, 92, 99, 100, 102, 117, 118, 129, 130, 131, 132, 133, 134, 136, 153, 161, 168, 176, 183], "excluded_lines": []}}}, "config_schema.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [8, 12, 134, 140], "excluded_lines": [], "functions": {"get_schema": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [140], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [8, 12, 134], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [8, 12, 134, 140], "excluded_lines": []}}}, "feature_flag.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 58, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 58, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 11, 12, 13, 14, 15, 18, 30, 31, 34, 35, 36, 37, 38, 39, 41, 42, 45, 46, 47, 49, 52, 55, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 75, 78, 88, 89, 91, 93, 94, 95, 96, 97, 98, 101, 104, 122, 123, 126, 128, 129, 130, 132, 133, 134], "excluded_lines": [], "functions": {"should_enable_feedback": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 15, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 15, "excluded_lines": 0}, "missing_lines": [30, 31, 34, 35, 36, 37, 38, 39, 41, 42, 45, 46, 47, 49, 52], "excluded_lines": []}, "get_collection_mode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 75], "excluded_lines": []}, "should_collect_for_operation": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [88, 89, 91, 93, 94, 95, 96, 97, 98, 101], "excluded_lines": []}, "trigger_retrospective_if_enabled": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0}, "missing_lines": [122, 123, 126, 128, 129, 130, 132, 133, 134], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 11, 12, 13, 14, 15, 18, 55, 78, 104], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 58, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 58, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 11, 12, 13, 14, 15, 18, 30, 31, 34, 35, 36, 37, 38, 39, 41, 42, 45, 46, 47, 49, 52, 55, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 75, 78, 88, 89, 91, 93, 94, 95, 96, 97, 98, 101, 104, 122, 123, 126, 128, 129, 130, 132, 133, 134], "excluded_lines": []}}}, "hot_reload.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 99, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 99, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 13, 16, 18, 19, 22, 29, 45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 61, 62, 63, 64, 65, 66, 67, 69, 72, 74, 75, 76, 78, 81, 83, 84, 85, 87, 88, 90, 92, 94, 103, 104, 106, 111, 113, 114, 115, 117, 118, 119, 120, 122, 124, 125, 126, 128, 129, 130, 131, 133, 139, 140, 143, 149, 161, 162, 163, 164, 165, 167, 173, 174, 176, 177, 178, 180, 182, 184, 185, 186, 188, 192, 194, 196, 197, 198, 199, 201, 207, 208, 210, 216, 217, 219, 225, 226], "excluded_lines": [], "functions": {"ConfigFileWatcher.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0}, "missing_lines": [45, 46, 47, 48, 49, 50, 51, 52, 53], "excluded_lines": []}, "ConfigFileWatcher._get_file_info": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [61, 62, 63, 64, 65, 66, 67], "excluded_lines": []}, "ConfigFileWatcher._watch_loop": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 13, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 13, "excluded_lines": 0}, "missing_lines": [72, 74, 75, 76, 78, 81, 83, 84, 85, 87, 88, 90, 92], "excluded_lines": []}, "ConfigFileWatcher._has_file_changed": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [103, 104, 106], "excluded_lines": []}, "ConfigFileWatcher.start": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [113, 114, 115, 117, 118, 119, 120], "excluded_lines": []}, "ConfigFileWatcher.stop": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [124, 125, 126, 128, 129, 130, 131], "excluded_lines": []}, "ConfigFileWatcher.is_running": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [139, 140], "excluded_lines": []}, "HotReloadManager.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [161, 162, 163, 164, 165], "excluded_lines": []}, "HotReloadManager._on_config_change": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [173, 174, 176, 177, 178, 180], "excluded_lines": []}, "HotReloadManager.start": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [184, 185, 186, 188, 192], "excluded_lines": []}, "HotReloadManager.stop": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [196, 197, 198, 199], "excluded_lines": []}, "HotReloadManager.is_running": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [207, 208], "excluded_lines": []}, "HotReloadManager.get_current_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [216, 217], "excluded_lines": []}, "HotReloadManager.set_current_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [225, 226], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 25, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 25, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 13, 16, 18, 19, 22, 29, 55, 69, 94, 111, 122, 133, 143, 149, 167, 182, 194, 201, 210, 219], "excluded_lines": []}}, "classes": {"FileInfo": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ConfigFileWatcher": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 48, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 48, "excluded_lines": 0}, "missing_lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 61, 62, 63, 64, 65, 66, 67, 72, 74, 75, 76, 78, 81, 83, 84, 85, 87, 88, 90, 92, 103, 104, 106, 113, 114, 115, 117, 118, 119, 120, 124, 125, 126, 128, 129, 130, 131, 139, 140], "excluded_lines": []}, "HotReloadManager": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 26, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [161, 162, 163, 164, 165, 173, 174, 176, 177, 178, 180, 184, 185, 186, 188, 192, 196, 197, 198, 199, 207, 208, 216, 217, 225, 226], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 25, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 25, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 13, 16, 18, 19, 22, 29, 55, 69, 94, 111, 122, 133, 143, 149, 167, 182, 194, 201, 210, 219], "excluded_lines": []}}}, "longitudinal.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 52, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 52, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 8, 11, 18, 20, 21, 22, 24, 25, 26, 27, 30, 32, 33, 34, 41, 44, 51, 54, 56, 57, 58, 60, 61, 62, 64, 65, 66, 68, 69, 72, 74, 82, 85, 92, 93, 95, 96, 98, 100, 101, 102, 104, 105, 107, 109, 110, 112, 113, 115], "excluded_lines": [], "functions": {"correlate_feedback_across_stories": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 13, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 13, "excluded_lines": 0}, "missing_lines": [18, 20, 21, 22, 24, 25, 26, 27, 30, 32, 33, 34, 41], "excluded_lines": []}, "identify_improvement_trajectories": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [51, 54, 56, 57, 58, 60, 61, 62, 64, 65, 66, 68, 69, 72, 74, 82], "excluded_lines": []}, "export_personal_journal": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [92, 93, 95, 96, 98, 100, 101, 102, 104, 105, 107, 109, 110, 112, 113, 115], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 8, 11, 44, 85], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 52, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 52, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 8, 11, 18, 20, 21, 22, 24, 25, 26, 27, 30, 32, 33, 34, 41, 44, 51, 54, 56, 57, 58, 60, 61, 62, 64, 65, 66, 68, 69, 72, 74, 82, 85, 92, 93, 95, 96, 98, 100, 101, 102, 104, 105, 107, 109, 110, 112, 113, 115], "excluded_lines": []}}}, "models.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 32, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 32, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 24, 26, 27, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42, 44, 55, 56, 58], "excluded_lines": [], "functions": {"Question.__post_init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [23, 24, 26, 27], "excluded_lines": []}, "FeedbackSession.to_dict": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [44], "excluded_lines": []}, "FeedbackSession.from_dict": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [58], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 26, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42, 55, 56], "excluded_lines": []}}, "classes": {"Question": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [23, 24, 26, 27], "excluded_lines": []}, "FeedbackSession": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [44, 58], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 26, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [5, 6, 7, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42, 55, 56], "excluded_lines": []}}}, "question_router.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 26, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 11, 14, 24, 26, 28, 30, 32, 33, 35, 38, 49, 51, 52, 55, 56, 58, 61, 62, 63, 70, 72, 75, 82], "excluded_lines": [], "functions": {"load_question_bank": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [24, 26, 28, 30, 32, 33, 35], "excluded_lines": []}, "get_context_aware_questions": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 11, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 11, "excluded_lines": 0}, "missing_lines": [49, 51, 52, 55, 56, 58, 61, 62, 63, 70, 72], "excluded_lines": []}, "_get_default_question_bank": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [82], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 11, 14, 38, 75], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 26, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 11, 14, 24, 26, 28, 30, 32, 33, 35, 38, 49, 51, 52, 55, 56, 58, 61, 62, 63, 70, 72, 75, 82], "excluded_lines": []}}}, "retrospective.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 60, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 60, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 10, 11, 13, 14, 17, 28, 31, 33, 36, 61, 63, 64, 70, 75, 76, 79, 80, 83, 84, 85, 87, 95, 107, 108, 111, 112, 115, 116, 119, 120, 122, 130, 140, 148, 150, 153, 171, 172, 174, 182, 184, 185, 187, 190, 201, 203, 204, 207, 209, 210, 213, 215, 216, 218, 221, 232, 233], "excluded_lines": [], "functions": {"trigger_retrospective": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [28, 31, 33], "excluded_lines": []}, "capture_feedback": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 22, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 22, "excluded_lines": 0}, "missing_lines": [61, 63, 64, 70, 75, 76, 79, 80, 83, 84, 85, 87, 95, 107, 108, 111, 112, 115, 116, 119, 120, 122], "excluded_lines": []}, "is_skip_selected": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [140, 148, 150], "excluded_lines": []}, "save_in_progress_state": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [171, 172, 174, 182, 184, 185, 187], "excluded_lines": []}, "resume_feedback": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [201, 203, 204, 207, 209, 210, 213, 215, 216, 218], "excluded_lines": []}, "detect_rapid_sequence": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [232, 233], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 13, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 13, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 10, 11, 13, 14, 17, 36, 130, 153, 190, 221], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 60, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 60, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 10, 11, 13, 14, 17, 28, 31, 33, 36, 61, 63, 64, 70, 75, 76, 79, 80, 83, 84, 85, 87, 95, 107, 108, 111, 112, 115, 116, 119, 120, 122, 130, 140, 148, 150, 153, 171, 172, 174, 182, 184, 185, 187, 190, 201, 203, 204, 207, 209, 210, 213, 215, 216, 218, 221, 232, 233], "excluded_lines": []}}}, "skip_tracker.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 78, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 78, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 15, 23, 25, 27, 34, 35, 37, 38, 39, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 62, 64, 66, 68, 76, 77, 78, 79, 80, 81, 83, 85, 94, 95, 96, 97, 98, 99, 101, 110, 111, 113, 119, 120, 121, 122, 124, 136, 138, 140, 141, 142, 143, 144, 145, 147, 156, 157, 159, 160, 162, 168, 169, 171, 176, 177], "excluded_lines": [], "functions": {"SkipTracker.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [34, 35, 37, 38, 39, 40], "excluded_lines": []}, "SkipTracker._load_existing_counters": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 17, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 17, "excluded_lines": 0}, "missing_lines": [44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 62], "excluded_lines": []}, "SkipTracker._ensure_log_directory": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "SkipTracker._log_skip_operation": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [76, 77, 78, 79, 80, 81, 83], "excluded_lines": []}, "SkipTracker.increment_skip": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [94, 95, 96, 97, 98, 99], "excluded_lines": []}, "SkipTracker.get_skip_count": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [110, 111], "excluded_lines": []}, "SkipTracker.reset_skip_counter": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [119, 120, 121, 122], "excluded_lines": []}, "SkipTracker.check_skip_limit": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [136, 138, 140, 141, 142, 143, 144, 145], "excluded_lines": []}, "SkipTracker.reset_on_positive": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [156, 157, 159, 160], "excluded_lines": []}, "SkipTracker.get_all_counters": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [168, 169], "excluded_lines": []}, "SkipTracker.clear_all_counters": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [176, 177], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 19, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 19, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 15, 23, 25, 27, 42, 64, 68, 85, 101, 113, 124, 147, 162, 171], "excluded_lines": []}}, "classes": {"SkipTracker": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 59, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 59, "excluded_lines": 0}, "missing_lines": [34, 35, 37, 38, 39, 40, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 62, 66, 76, 77, 78, 79, 80, 81, 83, 94, 95, 96, 97, 98, 99, 110, 111, 119, 120, 121, 122, 136, 138, 140, 141, 142, 143, 144, 145, 156, 157, 159, 160, 168, 169, 176, 177], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 19, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 19, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 15, 23, 25, 27, 42, 64, 68, 85, 101, 113, 124, 147, 162, 171], "excluded_lines": []}}}, "skip_tracking.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 70, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 70, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 10, 11, 15, 22, 32, 33, 35, 36, 39, 49, 50, 52, 53, 55, 58, 68, 69, 72, 73, 74, 75, 76, 79, 89, 90, 92, 93, 95, 96, 98, 99, 104, 105, 106, 107, 110, 120, 121, 122, 129, 140, 142, 143, 144, 146, 147, 148, 149, 151, 154, 155, 158, 169, 170, 171, 174, 182, 184, 185, 186, 188, 189, 191, 194, 206, 207, 214], "excluded_lines": [], "functions": {"_get_config_file": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [32, 33, 35, 36], "excluded_lines": []}, "_load_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [49, 50, 52, 53, 55], "excluded_lines": []}, "_save_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [68, 69, 72, 73, 74, 75, 76], "excluded_lines": []}, "validate_config_permissions": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [89, 90, 92, 93, 95, 96, 98, 99, 104, 105, 106, 107], "excluded_lines": []}, "_apply_config_modification": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [120, 121, 122], "excluded_lines": []}, "increment_skip": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [140, 142, 151, 154, 155], "excluded_lines": []}, "increment_skip.modify_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [143, 144, 146, 147, 148, 149], "excluded_lines": []}, "get_skip_count": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [169, 170, 171], "excluded_lines": []}, "reset_skip_count": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [182, 184, 191], "excluded_lines": []}, "reset_skip_count.modify_config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [185, 186, 188, 189], "excluded_lines": []}, "check_skip_threshold": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [206, 207], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 10, 11, 15, 22, 39, 58, 79, 110, 129, 158, 174, 194, 214], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 70, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 70, "excluded_lines": 0}, "missing_lines": [7, 8, 9, 10, 11, 15, 22, 32, 33, 35, 36, 39, 49, 50, 52, 53, 55, 58, 68, 69, 72, 73, 74, 75, 76, 79, 89, 90, 92, 93, 95, 96, 98, 99, 104, 105, 106, 107, 110, 120, 121, 122, 129, 140, 142, 143, 144, 146, 147, 148, 149, 151, 154, 155, 158, 169, 170, 171, 174, 182, 184, 185, 186, 188, 189, 191, 194, 206, 207, 214], "excluded_lines": []}}}, "template_engine.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 243, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 243, "excluded_lines": 0}, "missing_lines": [11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 35, 64, 65, 66, 67, 70, 71, 75, 76, 78, 81, 82, 83, 84, 85, 86, 87, 90, 91, 92, 93, 96, 97, 98, 99, 102, 103, 104, 105, 108, 109, 114, 115, 117, 123, 128, 130, 131, 132, 133, 138, 140, 141, 142, 143, 148, 150, 152, 153, 155, 156, 159, 160, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 178, 179, 180, 181, 183, 185, 188, 195, 196, 198, 200, 201, 204, 206, 208, 212, 213, 214, 216, 219, 222, 225, 232, 255, 257, 259, 261, 262, 265, 267, 270, 273, 274, 275, 276, 277, 278, 279, 281, 282, 284, 285, 286, 287, 292, 293, 295, 296, 297, 300, 301, 302, 305, 306, 309, 311, 314, 315, 316, 318, 319, 322, 323, 324, 325, 327, 329, 336, 356, 359, 362, 363, 364, 365, 366, 368, 371, 372, 375, 376, 379, 380, 381, 382, 383, 385, 386, 387, 388, 390, 393, 396, 398, 401, 404, 405, 406, 409, 410, 413, 414, 416, 417, 419, 422, 425, 426, 429, 431, 433, 434, 436, 437, 439, 440, 442, 443, 445, 446, 448, 449, 451, 452, 454, 457, 460, 461, 462, 463, 464, 465, 466, 468, 470, 473, 475, 478, 480, 481, 482, 483, 484, 485, 486, 488, 491, 493, 495, 496, 499, 500, 501, 502, 503, 504, 506, 508, 510, 517, 537, 538, 541, 542, 543, 546, 547, 549], "excluded_lines": [], "functions": {"select_template": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 34, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 34, "excluded_lines": 0}, "missing_lines": [64, 65, 66, 67, 70, 71, 75, 76, 78, 81, 82, 83, 84, 85, 86, 87, 90, 91, 92, 93, 96, 97, 98, 99, 102, 103, 104, 105, 108, 109, 114, 115, 117, 123], "excluded_lines": []}, "_validate_operation_type": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [130, 131, 132, 133], "excluded_lines": []}, "_validate_status": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [140, 141, 142, 143], "excluded_lines": []}, "_extract_field_mappings_from_markdown": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 24, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 24, "excluded_lines": 0}, "missing_lines": [150, 152, 153, 155, 156, 159, 160, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 178, 179, 180, 181, 183, 185], "excluded_lines": []}, "_enhance_template_with_field_mappings": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 15, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 15, "excluded_lines": 0}, "missing_lines": [195, 196, 198, 200, 201, 204, 206, 208, 212, 213, 214, 216, 219, 222, 225], "excluded_lines": []}, "map_fields": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 44, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 44, "excluded_lines": 0}, "missing_lines": [255, 257, 259, 261, 262, 265, 267, 270, 273, 274, 275, 276, 277, 278, 279, 281, 282, 284, 285, 286, 287, 292, 293, 295, 296, 297, 300, 301, 302, 305, 306, 309, 311, 314, 315, 316, 318, 319, 322, 323, 324, 325, 327, 329], "excluded_lines": []}, "render_template": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 25, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 25, "excluded_lines": 0}, "missing_lines": [356, 359, 362, 363, 364, 365, 366, 368, 371, 372, 375, 376, 379, 380, 381, 382, 383, 385, 386, 387, 388, 390, 393, 396, 398], "excluded_lines": []}, "_parse_template_content": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [404, 405, 406, 409, 410, 413, 414, 416, 417, 419], "excluded_lines": []}, "_generate_frontmatter": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [425, 426], "excluded_lines": []}, "_generate_context_section": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [431, 433, 434, 436, 437, 439, 440, 442, 443, 445, 446, 448, 449, 451, 452, 454], "excluded_lines": []}, "_calculate_sentiment": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0}, "missing_lines": [460, 461, 462, 463, 464, 465, 466, 468, 470], "excluded_lines": []}, "_extract_insights": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [475, 478, 480, 481, 482, 483, 484, 485, 486, 488], "excluded_lines": []}, "_assemble_sections": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [493, 495, 496, 499, 500, 501, 502, 503, 504, 506, 508, 510], "excluded_lines": []}, "save_rendered_template": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [537, 538, 541, 542, 543, 546, 547, 549], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 26, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 35, 128, 138, 148, 188, 232, 336, 401, 422, 429, 457, 473, 491, 517], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 243, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 243, "excluded_lines": 0}, "missing_lines": [11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 35, 64, 65, 66, 67, 70, 71, 75, 76, 78, 81, 82, 83, 84, 85, 86, 87, 90, 91, 92, 93, 96, 97, 98, 99, 102, 103, 104, 105, 108, 109, 114, 115, 117, 123, 128, 130, 131, 132, 133, 138, 140, 141, 142, 143, 148, 150, 152, 153, 155, 156, 159, 160, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 178, 179, 180, 181, 183, 185, 188, 195, 196, 198, 200, 201, 204, 206, 208, 212, 213, 214, 216, 219, 222, 225, 232, 255, 257, 259, 261, 262, 265, 267, 270, 273, 274, 275, 276, 277, 278, 279, 281, 282, 284, 285, 286, 287, 292, 293, 295, 296, 297, 300, 301, 302, 305, 306, 309, 311, 314, 315, 316, 318, 319, 322, 323, 324, 325, 327, 329, 336, 356, 359, 362, 363, 364, 365, 366, 368, 371, 372, 375, 376, 379, 380, 381, 382, 383, 385, 386, 387, 388, 390, 393, 396, 398, 401, 404, 405, 406, 409, 410, 413, 414, 416, 417, 419, 422, 425, 426, 429, 431, 433, 434, 436, 437, 439, 440, 442, 443, 445, 446, 448, 449, 451, 452, 454, 457, 460, 461, 462, 463, 464, 465, 466, 468, 470, 473, 475, 478, 480, 481, 482, 483, 484, 485, 486, 488, 491, 493, 495, 496, 499, 500, 501, 502, 503, 504, 506, 508, 510, 517, 537, 538, 541, 542, 543, 546, 547, 549], "excluded_lines": []}}}, "validation.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 60, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 60, "excluded_lines": 0}, "missing_lines": [5, 6, 9, 22, 24, 25, 27, 28, 30, 31, 33, 36, 46, 47, 50, 51, 54, 55, 56, 57, 58, 61, 62, 63, 66, 67, 68, 70, 73, 83, 84, 87, 88, 91, 92, 93, 95, 96, 98, 99, 101, 104, 114, 115, 118, 119, 120, 121, 124, 125, 128, 129, 130, 132, 135, 145, 146, 149, 159, 163], "excluded_lines": [], "functions": {"validate_response_length": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [22, 24, 25, 27, 28, 30, 31, 33], "excluded_lines": []}, "detect_spam": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [46, 47, 50, 51, 54, 55, 56, 57, 58, 61, 62, 63, 66, 67, 68, 70], "excluded_lines": []}, "is_coherent_text": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [83, 84, 87, 88, 91, 92, 93, 95, 96, 98, 99, 101], "excluded_lines": []}, "check_sensitive_content": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [114, 115, 118, 119, 120, 121, 124, 125, 128, 129, 130, 132], "excluded_lines": []}, "validate_story_id": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [145, 146], "excluded_lines": []}, "validate_workflow_type": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [159, 163], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [5, 6, 9, 36, 73, 104, 135, 149], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 60, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 60, "excluded_lines": 0}, "missing_lines": [5, 6, 9, 22, 24, 25, 27, 28, 30, 31, 33, 36, 46, 47, 50, 51, 54, 55, 56, 57, 58, 61, 62, 63, 66, 67, 68, 70, 73, 83, 84, 87, 88, 91, 92, 93, 95, 96, 98, 99, 101, 104, 114, 115, 118, 119, 120, 121, 124, 125, 128, 129, 130, 132, 135, 145, 146, 149, 159, 163], "excluded_lines": []}}}}, "totals": {"covered_lines": 0, "num_statements": 1327, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1327, "excluded_lines": 0}}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""Feature flag implementation for feedback system.
|
|
2
|
+
|
|
3
|
+
This module handles checking whether feedback collection is enabled
|
|
4
|
+
and provides graceful degradation when disabled.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
import yaml
|
|
13
|
+
YAML_AVAILABLE = True
|
|
14
|
+
except ImportError:
|
|
15
|
+
YAML_AVAILABLE = False
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def should_enable_feedback() -> bool:
|
|
19
|
+
"""Check if feedback system is enabled.
|
|
20
|
+
|
|
21
|
+
Checks in order:
|
|
22
|
+
1. Environment variable DEVFORGEAI_DISABLE_FEEDBACK
|
|
23
|
+
2. Config file devforgeai/feedback/config.yaml
|
|
24
|
+
3. Default: True (opt-in)
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
bool: True if feedback should be collected, False otherwise
|
|
28
|
+
"""
|
|
29
|
+
# Check environment variable (highest priority)
|
|
30
|
+
if os.getenv('DEVFORGEAI_DISABLE_FEEDBACK', '').lower() == 'true':
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
# Check config file
|
|
34
|
+
config_path = Path('devforgeai/feedback/config.yaml')
|
|
35
|
+
if config_path.exists() and YAML_AVAILABLE:
|
|
36
|
+
try:
|
|
37
|
+
with open(config_path) as f:
|
|
38
|
+
config = yaml.safe_load(f)
|
|
39
|
+
if config:
|
|
40
|
+
# Check enable_feedback flag
|
|
41
|
+
if config.get('enable_feedback') is False:
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
# Check mode (disabled is equivalent to enable_feedback: false)
|
|
45
|
+
if config.get('mode') == 'disabled':
|
|
46
|
+
return False
|
|
47
|
+
except Exception:
|
|
48
|
+
# If config can't be read, continue to default
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
# Default: enabled (opt-in)
|
|
52
|
+
return True
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get_collection_mode() -> str:
|
|
56
|
+
"""Get the feedback collection mode.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
str: Collection mode ('all', 'failures_only', or 'disabled')
|
|
60
|
+
"""
|
|
61
|
+
if not should_enable_feedback():
|
|
62
|
+
return 'disabled'
|
|
63
|
+
|
|
64
|
+
config_path = Path('devforgeai/feedback/config.yaml')
|
|
65
|
+
if config_path.exists() and YAML_AVAILABLE:
|
|
66
|
+
try:
|
|
67
|
+
with open(config_path) as f:
|
|
68
|
+
config = yaml.safe_load(f)
|
|
69
|
+
if config:
|
|
70
|
+
return config.get('mode', 'all')
|
|
71
|
+
except Exception:
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
# Default: collect after all operations
|
|
75
|
+
return 'all'
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def should_collect_for_operation(workflow_type: str, success_status: str) -> bool:
|
|
79
|
+
"""Determine if feedback should be collected for this operation.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
workflow_type: Type of workflow (dev, qa, orchestrate, etc.)
|
|
83
|
+
success_status: Outcome (success, failed, partial)
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
bool: True if feedback should be collected
|
|
87
|
+
"""
|
|
88
|
+
if not should_enable_feedback():
|
|
89
|
+
return False
|
|
90
|
+
|
|
91
|
+
mode = get_collection_mode()
|
|
92
|
+
|
|
93
|
+
if mode == 'disabled':
|
|
94
|
+
return False
|
|
95
|
+
elif mode == 'failures_only':
|
|
96
|
+
return success_status in ['failed', 'partial']
|
|
97
|
+
elif mode == 'all':
|
|
98
|
+
return True
|
|
99
|
+
else:
|
|
100
|
+
# Unknown mode, default to all
|
|
101
|
+
return True
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def trigger_retrospective_if_enabled(
|
|
105
|
+
workflow_type: str,
|
|
106
|
+
story_id: str,
|
|
107
|
+
success_status: str
|
|
108
|
+
) -> Optional[dict]:
|
|
109
|
+
"""Trigger feedback collection if enabled.
|
|
110
|
+
|
|
111
|
+
This is the main entry point for feedback collection. It checks
|
|
112
|
+
feature flags and collection mode before triggering retrospective.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
workflow_type: Type of workflow that completed
|
|
116
|
+
story_id: Story ID associated with operation
|
|
117
|
+
success_status: Outcome of operation
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
dict | None: Feedback data if collected, None if skipped
|
|
121
|
+
"""
|
|
122
|
+
if not should_collect_for_operation(workflow_type, success_status):
|
|
123
|
+
return None
|
|
124
|
+
|
|
125
|
+
# Import here to avoid circular dependency
|
|
126
|
+
from .retrospective import trigger_retrospective
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
return trigger_retrospective(workflow_type, story_id, success_status)
|
|
130
|
+
except Exception as e:
|
|
131
|
+
# Graceful degradation: log error, return None
|
|
132
|
+
import logging
|
|
133
|
+
logging.warning(f"Feedback collection failed: {e}")
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# Example usage in command implementations:
|
|
138
|
+
#
|
|
139
|
+
# from .feedback.feature_flag import trigger_retrospective_if_enabled
|
|
140
|
+
#
|
|
141
|
+
# # After operation completes:
|
|
142
|
+
# feedback = trigger_retrospective_if_enabled(
|
|
143
|
+
# workflow_type='dev',
|
|
144
|
+
# story_id='STORY-042',
|
|
145
|
+
# success_status='success'
|
|
146
|
+
# )
|
|
147
|
+
#
|
|
148
|
+
# # Command continues regardless of feedback result
|
|
149
|
+
# # feedback will be None if:
|
|
150
|
+
# # - Feature disabled
|
|
151
|
+
# # - Collection mode is failures_only and operation succeeded
|
|
152
|
+
# # - Feedback collection failed (graceful degradation)
|