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.
Files changed (134) hide show
  1. package/CLAUDE.md +120 -0
  2. package/package.json +9 -1
  3. package/src/CLAUDE.md +699 -0
  4. package/src/claude/scripts/README.md +396 -0
  5. package/src/claude/scripts/audit-command-skill-overlap.sh +67 -0
  6. package/src/claude/scripts/check-hooks-fast.sh +70 -0
  7. package/src/claude/scripts/devforgeai-validate +6 -0
  8. package/src/claude/scripts/devforgeai_cli/README.md +531 -0
  9. package/src/claude/scripts/devforgeai_cli/__init__.py +12 -0
  10. package/src/claude/scripts/devforgeai_cli/cli.py +716 -0
  11. package/src/claude/scripts/devforgeai_cli/commands/__init__.py +1 -0
  12. package/src/claude/scripts/devforgeai_cli/commands/check_hooks.py +384 -0
  13. package/src/claude/scripts/devforgeai_cli/commands/invoke_hooks.py +149 -0
  14. package/src/claude/scripts/devforgeai_cli/commands/phase_commands.py +731 -0
  15. package/src/claude/scripts/devforgeai_cli/commands/validate_installation.py +412 -0
  16. package/src/claude/scripts/devforgeai_cli/context_extraction.py +426 -0
  17. package/src/claude/scripts/devforgeai_cli/feedback/AC_TO_TEST_MAPPING.md +636 -0
  18. package/src/claude/scripts/devforgeai_cli/feedback/DELIVERY_SUMMARY.txt +329 -0
  19. package/src/claude/scripts/devforgeai_cli/feedback/README_TEST_SPECS.md +486 -0
  20. package/src/claude/scripts/devforgeai_cli/feedback/TEST_IMPLEMENTATION_GUIDE.md +529 -0
  21. package/src/claude/scripts/devforgeai_cli/feedback/TEST_SPECIFICATIONS.md +2652 -0
  22. package/src/claude/scripts/devforgeai_cli/feedback/TEST_SPECS_INDEX.md +398 -0
  23. package/src/claude/scripts/devforgeai_cli/feedback/__init__.py +34 -0
  24. package/src/claude/scripts/devforgeai_cli/feedback/adaptive_questioning_engine.py +581 -0
  25. package/src/claude/scripts/devforgeai_cli/feedback/aggregation.py +179 -0
  26. package/src/claude/scripts/devforgeai_cli/feedback/commands.py +535 -0
  27. package/src/claude/scripts/devforgeai_cli/feedback/config_defaults.py +58 -0
  28. package/src/claude/scripts/devforgeai_cli/feedback/config_manager.py +423 -0
  29. package/src/claude/scripts/devforgeai_cli/feedback/config_models.py +192 -0
  30. package/src/claude/scripts/devforgeai_cli/feedback/config_schema.py +140 -0
  31. package/src/claude/scripts/devforgeai_cli/feedback/coverage.json +1 -0
  32. package/src/claude/scripts/devforgeai_cli/feedback/feature_flag.py +152 -0
  33. package/src/claude/scripts/devforgeai_cli/feedback/feedback_indexer.py +394 -0
  34. package/src/claude/scripts/devforgeai_cli/feedback/hot_reload.py +226 -0
  35. package/src/claude/scripts/devforgeai_cli/feedback/longitudinal.py +115 -0
  36. package/src/claude/scripts/devforgeai_cli/feedback/models.py +67 -0
  37. package/src/claude/scripts/devforgeai_cli/feedback/question_router.py +236 -0
  38. package/src/claude/scripts/devforgeai_cli/feedback/retrospective.py +233 -0
  39. package/src/claude/scripts/devforgeai_cli/feedback/skip_tracker.py +177 -0
  40. package/src/claude/scripts/devforgeai_cli/feedback/skip_tracking.py +221 -0
  41. package/src/claude/scripts/devforgeai_cli/feedback/template_engine.py +549 -0
  42. package/src/claude/scripts/devforgeai_cli/feedback/validation.py +163 -0
  43. package/src/claude/scripts/devforgeai_cli/headless/__init__.py +30 -0
  44. package/src/claude/scripts/devforgeai_cli/headless/answer_models.py +206 -0
  45. package/src/claude/scripts/devforgeai_cli/headless/answer_resolver.py +204 -0
  46. package/src/claude/scripts/devforgeai_cli/headless/exceptions.py +36 -0
  47. package/src/claude/scripts/devforgeai_cli/headless/pattern_matcher.py +156 -0
  48. package/src/claude/scripts/devforgeai_cli/hooks.py +313 -0
  49. package/src/claude/scripts/devforgeai_cli/metrics/__init__.py +46 -0
  50. package/src/claude/scripts/devforgeai_cli/metrics/command_metrics.py +142 -0
  51. package/src/claude/scripts/devforgeai_cli/metrics/failure_modes.py +152 -0
  52. package/src/claude/scripts/devforgeai_cli/metrics/story_segmentation.py +181 -0
  53. package/src/claude/scripts/devforgeai_cli/orchestrate_hooks.py +780 -0
  54. package/src/claude/scripts/devforgeai_cli/phase_state.py +1229 -0
  55. package/src/claude/scripts/devforgeai_cli/session/__init__.py +30 -0
  56. package/src/claude/scripts/devforgeai_cli/session/checkpoint.py +268 -0
  57. package/src/claude/scripts/devforgeai_cli/tests/__init__.py +1 -0
  58. package/src/claude/scripts/devforgeai_cli/tests/conftest.py +29 -0
  59. package/src/claude/scripts/devforgeai_cli/tests/feedback/TEST_EXECUTION_GUIDE.md +298 -0
  60. package/src/claude/scripts/devforgeai_cli/tests/feedback/__init__.py +3 -0
  61. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_adaptive_questioning_engine.py +2171 -0
  62. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_aggregation.py +476 -0
  63. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_defaults.py +133 -0
  64. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_manager.py +592 -0
  65. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_models.py +373 -0
  66. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_config_schema.py +130 -0
  67. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_configuration_management.py +1355 -0
  68. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_edge_cases.py +308 -0
  69. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_feature_flag.py +307 -0
  70. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_feedback_indexer.py +384 -0
  71. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_hot_reload.py +580 -0
  72. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_integration.py +402 -0
  73. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_models.py +105 -0
  74. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_question_routing.py +262 -0
  75. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_retrospective.py +333 -0
  76. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_skip_tracker.py +410 -0
  77. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_skip_tracking.py +159 -0
  78. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_skip_tracking_integration.py +1155 -0
  79. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_template_engine.py +1389 -0
  80. package/src/claude/scripts/devforgeai_cli/tests/feedback/test_validation_comprehensive.py +210 -0
  81. package/src/claude/scripts/devforgeai_cli/tests/fixtures/autonomous-deferral-story.md +46 -0
  82. package/src/claude/scripts/devforgeai_cli/tests/fixtures/missing-impl-notes.md +31 -0
  83. package/src/claude/scripts/devforgeai_cli/tests/fixtures/valid-deferral-story.md +46 -0
  84. package/src/claude/scripts/devforgeai_cli/tests/fixtures/valid-story-complete.md +48 -0
  85. package/src/claude/scripts/devforgeai_cli/tests/manual_test_invoke_hooks.sh +200 -0
  86. package/src/claude/scripts/devforgeai_cli/tests/session/DELIVERABLES.md +518 -0
  87. package/src/claude/scripts/devforgeai_cli/tests/session/TEST_SUMMARY.md +468 -0
  88. package/src/claude/scripts/devforgeai_cli/tests/session/__init__.py +6 -0
  89. package/src/claude/scripts/devforgeai_cli/tests/session/fixtures/corrupted-checkpoint.json +1 -0
  90. package/src/claude/scripts/devforgeai_cli/tests/session/fixtures/missing-fields-checkpoint.json +4 -0
  91. package/src/claude/scripts/devforgeai_cli/tests/session/fixtures/valid-checkpoint.json +15 -0
  92. package/src/claude/scripts/devforgeai_cli/tests/session/test_checkpoint.py +851 -0
  93. package/src/claude/scripts/devforgeai_cli/tests/test_check_hooks.py +1886 -0
  94. package/src/claude/scripts/devforgeai_cli/tests/test_depends_on_normalizer.py +171 -0
  95. package/src/claude/scripts/devforgeai_cli/tests/test_dod_validator.py +97 -0
  96. package/src/claude/scripts/devforgeai_cli/tests/test_invoke_hooks.py +1902 -0
  97. package/src/claude/scripts/devforgeai_cli/tests/test_phase_commands.py +320 -0
  98. package/src/claude/scripts/devforgeai_cli/tests/test_phase_commands_error_handling.py +1021 -0
  99. package/src/claude/scripts/devforgeai_cli/tests/test_phase_commands_import.py +697 -0
  100. package/src/claude/scripts/devforgeai_cli/tests/test_phase_state.py +2187 -0
  101. package/src/claude/scripts/devforgeai_cli/tests/test_skip_tracking.py +2141 -0
  102. package/src/claude/scripts/devforgeai_cli/tests/test_skip_tracking_coverage_gap.py +195 -0
  103. package/src/claude/scripts/devforgeai_cli/tests/test_subagent_enforcement.py +539 -0
  104. package/src/claude/scripts/devforgeai_cli/tests/test_validate_installation.py +361 -0
  105. package/src/claude/scripts/devforgeai_cli/utils/__init__.py +11 -0
  106. package/src/claude/scripts/devforgeai_cli/utils/depends_on_normalizer.py +149 -0
  107. package/src/claude/scripts/devforgeai_cli/utils/markdown_parser.py +219 -0
  108. package/src/claude/scripts/devforgeai_cli/utils/story_analyzer.py +249 -0
  109. package/src/claude/scripts/devforgeai_cli/utils/yaml_parser.py +152 -0
  110. package/src/claude/scripts/devforgeai_cli/validators/__init__.py +27 -0
  111. package/src/claude/scripts/devforgeai_cli/validators/ast_grep_validator.py +373 -0
  112. package/src/claude/scripts/devforgeai_cli/validators/context_validator.py +180 -0
  113. package/src/claude/scripts/devforgeai_cli/validators/dod_validator.py +309 -0
  114. package/src/claude/scripts/devforgeai_cli/validators/git_validator.py +107 -0
  115. package/src/claude/scripts/devforgeai_cli/validators/grep_fallback.py +300 -0
  116. package/src/claude/scripts/install_hooks.sh +186 -0
  117. package/src/claude/scripts/invoke_feedback_hooks.sh +59 -0
  118. package/src/claude/scripts/migrate-ac-headers.sh +122 -0
  119. package/src/claude/scripts/plan_file_kb.sh +704 -0
  120. package/src/claude/scripts/requirements.txt +8 -0
  121. package/src/claude/scripts/session_catalog.sh +543 -0
  122. package/src/claude/scripts/setup.py +55 -0
  123. package/src/claude/scripts/start-devforgeai.sh +16 -0
  124. package/src/claude/scripts/statusline.sh +27 -0
  125. package/src/claude/scripts/validate_deferrals.py +344 -0
  126. package/src/claude/skills/devforgeai-qa/SKILL.md +1 -1
  127. package/src/claude/skills/researching-market/SKILL.md +2 -1
  128. package/src/cli/lib/copier.js +13 -1
  129. package/src/claude/skills/designing-systems/scripts/__pycache__/detect_anti_patterns.cpython-312.pyc +0 -0
  130. package/src/claude/skills/designing-systems/scripts/__pycache__/validate_all_context.cpython-312.pyc +0 -0
  131. package/src/claude/skills/designing-systems/scripts/__pycache__/validate_architecture.cpython-312.pyc +0 -0
  132. package/src/claude/skills/designing-systems/scripts/__pycache__/validate_dependencies.cpython-312.pyc +0 -0
  133. package/src/claude/skills/devforgeai-story-creation/scripts/__pycache__/migrate_story_v1_to_v2.cpython-312.pyc +0 -0
  134. 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)