htmlgraph 0.20.1__py3-none-any.whl → 0.27.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
  2. htmlgraph/.htmlgraph/agents.json +72 -0
  3. htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  4. htmlgraph/__init__.py +51 -1
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +26 -10
  7. htmlgraph/agent_registry.py +2 -1
  8. htmlgraph/analytics/__init__.py +8 -1
  9. htmlgraph/analytics/cli.py +86 -20
  10. htmlgraph/analytics/cost_analyzer.py +391 -0
  11. htmlgraph/analytics/cost_monitor.py +664 -0
  12. htmlgraph/analytics/cost_reporter.py +675 -0
  13. htmlgraph/analytics/cross_session.py +617 -0
  14. htmlgraph/analytics/dependency.py +10 -6
  15. htmlgraph/analytics/pattern_learning.py +771 -0
  16. htmlgraph/analytics/session_graph.py +707 -0
  17. htmlgraph/analytics/strategic/__init__.py +80 -0
  18. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  19. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  20. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  21. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  22. htmlgraph/analytics/work_type.py +67 -27
  23. htmlgraph/analytics_index.py +53 -20
  24. htmlgraph/api/__init__.py +3 -0
  25. htmlgraph/api/cost_alerts_websocket.py +416 -0
  26. htmlgraph/api/main.py +2498 -0
  27. htmlgraph/api/static/htmx.min.js +1 -0
  28. htmlgraph/api/static/style-redesign.css +1344 -0
  29. htmlgraph/api/static/style.css +1079 -0
  30. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  31. htmlgraph/api/templates/dashboard.html +794 -0
  32. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  33. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  34. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  35. htmlgraph/api/templates/partials/agents.html +317 -0
  36. htmlgraph/api/templates/partials/event-traces.html +373 -0
  37. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  38. htmlgraph/api/templates/partials/features.html +578 -0
  39. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  40. htmlgraph/api/templates/partials/metrics.html +346 -0
  41. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  42. htmlgraph/api/templates/partials/orchestration.html +198 -0
  43. htmlgraph/api/templates/partials/spawners.html +375 -0
  44. htmlgraph/api/templates/partials/work-items.html +613 -0
  45. htmlgraph/api/websocket.py +538 -0
  46. htmlgraph/archive/__init__.py +24 -0
  47. htmlgraph/archive/bloom.py +234 -0
  48. htmlgraph/archive/fts.py +297 -0
  49. htmlgraph/archive/manager.py +583 -0
  50. htmlgraph/archive/search.py +244 -0
  51. htmlgraph/atomic_ops.py +560 -0
  52. htmlgraph/attribute_index.py +2 -1
  53. htmlgraph/bounded_paths.py +539 -0
  54. htmlgraph/builders/base.py +57 -2
  55. htmlgraph/builders/bug.py +19 -3
  56. htmlgraph/builders/chore.py +19 -3
  57. htmlgraph/builders/epic.py +19 -3
  58. htmlgraph/builders/feature.py +27 -3
  59. htmlgraph/builders/insight.py +2 -1
  60. htmlgraph/builders/metric.py +2 -1
  61. htmlgraph/builders/pattern.py +2 -1
  62. htmlgraph/builders/phase.py +19 -3
  63. htmlgraph/builders/spike.py +29 -3
  64. htmlgraph/builders/track.py +42 -1
  65. htmlgraph/cigs/__init__.py +81 -0
  66. htmlgraph/cigs/autonomy.py +385 -0
  67. htmlgraph/cigs/cost.py +475 -0
  68. htmlgraph/cigs/messages_basic.py +472 -0
  69. htmlgraph/cigs/messaging.py +365 -0
  70. htmlgraph/cigs/models.py +771 -0
  71. htmlgraph/cigs/pattern_storage.py +427 -0
  72. htmlgraph/cigs/patterns.py +503 -0
  73. htmlgraph/cigs/posttool_analyzer.py +234 -0
  74. htmlgraph/cigs/reporter.py +818 -0
  75. htmlgraph/cigs/tracker.py +317 -0
  76. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  77. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  78. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  79. htmlgraph/cli/__init__.py +42 -0
  80. htmlgraph/cli/__main__.py +6 -0
  81. htmlgraph/cli/analytics.py +1424 -0
  82. htmlgraph/cli/base.py +685 -0
  83. htmlgraph/cli/constants.py +206 -0
  84. htmlgraph/cli/core.py +954 -0
  85. htmlgraph/cli/main.py +147 -0
  86. htmlgraph/cli/models.py +475 -0
  87. htmlgraph/cli/templates/__init__.py +1 -0
  88. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  89. htmlgraph/cli/work/__init__.py +239 -0
  90. htmlgraph/cli/work/browse.py +115 -0
  91. htmlgraph/cli/work/features.py +568 -0
  92. htmlgraph/cli/work/orchestration.py +676 -0
  93. htmlgraph/cli/work/report.py +728 -0
  94. htmlgraph/cli/work/sessions.py +466 -0
  95. htmlgraph/cli/work/snapshot.py +559 -0
  96. htmlgraph/cli/work/tracks.py +486 -0
  97. htmlgraph/cli_commands/__init__.py +1 -0
  98. htmlgraph/cli_commands/feature.py +195 -0
  99. htmlgraph/cli_framework.py +115 -0
  100. htmlgraph/collections/__init__.py +2 -0
  101. htmlgraph/collections/base.py +197 -14
  102. htmlgraph/collections/bug.py +2 -1
  103. htmlgraph/collections/chore.py +2 -1
  104. htmlgraph/collections/epic.py +2 -1
  105. htmlgraph/collections/feature.py +2 -1
  106. htmlgraph/collections/insight.py +2 -1
  107. htmlgraph/collections/metric.py +2 -1
  108. htmlgraph/collections/pattern.py +2 -1
  109. htmlgraph/collections/phase.py +2 -1
  110. htmlgraph/collections/session.py +194 -0
  111. htmlgraph/collections/spike.py +13 -2
  112. htmlgraph/collections/task_delegation.py +241 -0
  113. htmlgraph/collections/todo.py +14 -1
  114. htmlgraph/collections/traces.py +487 -0
  115. htmlgraph/config/cost_models.json +56 -0
  116. htmlgraph/config.py +190 -0
  117. htmlgraph/context_analytics.py +2 -1
  118. htmlgraph/converter.py +116 -7
  119. htmlgraph/cost_analysis/__init__.py +5 -0
  120. htmlgraph/cost_analysis/analyzer.py +438 -0
  121. htmlgraph/dashboard.html +2246 -248
  122. htmlgraph/dashboard.html.backup +6592 -0
  123. htmlgraph/dashboard.html.bak +7181 -0
  124. htmlgraph/dashboard.html.bak2 +7231 -0
  125. htmlgraph/dashboard.html.bak3 +7232 -0
  126. htmlgraph/db/__init__.py +38 -0
  127. htmlgraph/db/queries.py +790 -0
  128. htmlgraph/db/schema.py +1788 -0
  129. htmlgraph/decorators.py +317 -0
  130. htmlgraph/dependency_models.py +2 -1
  131. htmlgraph/deploy.py +26 -27
  132. htmlgraph/docs/API_REFERENCE.md +841 -0
  133. htmlgraph/docs/HTTP_API.md +750 -0
  134. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  135. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  136. htmlgraph/docs/README.md +532 -0
  137. htmlgraph/docs/__init__.py +77 -0
  138. htmlgraph/docs/docs_version.py +55 -0
  139. htmlgraph/docs/metadata.py +93 -0
  140. htmlgraph/docs/migrations.py +232 -0
  141. htmlgraph/docs/template_engine.py +143 -0
  142. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  143. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  144. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  145. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  146. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  147. htmlgraph/docs/version_check.py +163 -0
  148. htmlgraph/edge_index.py +2 -1
  149. htmlgraph/error_handler.py +544 -0
  150. htmlgraph/event_log.py +86 -37
  151. htmlgraph/event_migration.py +2 -1
  152. htmlgraph/file_watcher.py +12 -8
  153. htmlgraph/find_api.py +2 -1
  154. htmlgraph/git_events.py +67 -9
  155. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  156. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  157. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  158. htmlgraph/hooks/__init__.py +8 -0
  159. htmlgraph/hooks/bootstrap.py +169 -0
  160. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  161. htmlgraph/hooks/concurrent_sessions.py +208 -0
  162. htmlgraph/hooks/context.py +350 -0
  163. htmlgraph/hooks/drift_handler.py +525 -0
  164. htmlgraph/hooks/event_tracker.py +790 -99
  165. htmlgraph/hooks/git_commands.py +175 -0
  166. htmlgraph/hooks/installer.py +5 -1
  167. htmlgraph/hooks/orchestrator.py +327 -76
  168. htmlgraph/hooks/orchestrator_reflector.py +31 -4
  169. htmlgraph/hooks/post_tool_use_failure.py +32 -7
  170. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  171. htmlgraph/hooks/posttooluse.py +92 -19
  172. htmlgraph/hooks/pretooluse.py +527 -7
  173. htmlgraph/hooks/prompt_analyzer.py +637 -0
  174. htmlgraph/hooks/session_handler.py +668 -0
  175. htmlgraph/hooks/session_summary.py +395 -0
  176. htmlgraph/hooks/state_manager.py +504 -0
  177. htmlgraph/hooks/subagent_detection.py +202 -0
  178. htmlgraph/hooks/subagent_stop.py +369 -0
  179. htmlgraph/hooks/task_enforcer.py +99 -4
  180. htmlgraph/hooks/validator.py +212 -91
  181. htmlgraph/ids.py +2 -1
  182. htmlgraph/learning.py +125 -100
  183. htmlgraph/mcp_server.py +2 -1
  184. htmlgraph/models.py +217 -18
  185. htmlgraph/operations/README.md +62 -0
  186. htmlgraph/operations/__init__.py +79 -0
  187. htmlgraph/operations/analytics.py +339 -0
  188. htmlgraph/operations/bootstrap.py +289 -0
  189. htmlgraph/operations/events.py +244 -0
  190. htmlgraph/operations/fastapi_server.py +231 -0
  191. htmlgraph/operations/hooks.py +350 -0
  192. htmlgraph/operations/initialization.py +597 -0
  193. htmlgraph/operations/initialization.py.backup +228 -0
  194. htmlgraph/operations/server.py +303 -0
  195. htmlgraph/orchestration/__init__.py +58 -0
  196. htmlgraph/orchestration/claude_launcher.py +179 -0
  197. htmlgraph/orchestration/command_builder.py +72 -0
  198. htmlgraph/orchestration/headless_spawner.py +281 -0
  199. htmlgraph/orchestration/live_events.py +377 -0
  200. htmlgraph/orchestration/model_selection.py +327 -0
  201. htmlgraph/orchestration/plugin_manager.py +140 -0
  202. htmlgraph/orchestration/prompts.py +137 -0
  203. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  204. htmlgraph/orchestration/spawners/__init__.py +16 -0
  205. htmlgraph/orchestration/spawners/base.py +194 -0
  206. htmlgraph/orchestration/spawners/claude.py +173 -0
  207. htmlgraph/orchestration/spawners/codex.py +435 -0
  208. htmlgraph/orchestration/spawners/copilot.py +294 -0
  209. htmlgraph/orchestration/spawners/gemini.py +471 -0
  210. htmlgraph/orchestration/subprocess_runner.py +36 -0
  211. htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
  212. htmlgraph/orchestration.md +563 -0
  213. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  214. htmlgraph/orchestrator.py +2 -1
  215. htmlgraph/orchestrator_config.py +357 -0
  216. htmlgraph/orchestrator_mode.py +115 -4
  217. htmlgraph/parallel.py +2 -1
  218. htmlgraph/parser.py +86 -6
  219. htmlgraph/path_query.py +608 -0
  220. htmlgraph/pattern_matcher.py +636 -0
  221. htmlgraph/pydantic_models.py +476 -0
  222. htmlgraph/quality_gates.py +350 -0
  223. htmlgraph/query_builder.py +2 -1
  224. htmlgraph/query_composer.py +509 -0
  225. htmlgraph/reflection.py +443 -0
  226. htmlgraph/refs.py +344 -0
  227. htmlgraph/repo_hash.py +512 -0
  228. htmlgraph/repositories/__init__.py +292 -0
  229. htmlgraph/repositories/analytics_repository.py +455 -0
  230. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  231. htmlgraph/repositories/feature_repository.py +581 -0
  232. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  233. htmlgraph/repositories/feature_repository_memory.py +607 -0
  234. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  235. htmlgraph/repositories/filter_service.py +620 -0
  236. htmlgraph/repositories/filter_service_standard.py +445 -0
  237. htmlgraph/repositories/shared_cache.py +621 -0
  238. htmlgraph/repositories/shared_cache_memory.py +395 -0
  239. htmlgraph/repositories/track_repository.py +552 -0
  240. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  241. htmlgraph/repositories/track_repository_memory.py +508 -0
  242. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  243. htmlgraph/sdk/__init__.py +398 -0
  244. htmlgraph/sdk/__init__.pyi +14 -0
  245. htmlgraph/sdk/analytics/__init__.py +19 -0
  246. htmlgraph/sdk/analytics/engine.py +155 -0
  247. htmlgraph/sdk/analytics/helpers.py +178 -0
  248. htmlgraph/sdk/analytics/registry.py +109 -0
  249. htmlgraph/sdk/base.py +484 -0
  250. htmlgraph/sdk/constants.py +216 -0
  251. htmlgraph/sdk/core.pyi +308 -0
  252. htmlgraph/sdk/discovery.py +120 -0
  253. htmlgraph/sdk/help/__init__.py +12 -0
  254. htmlgraph/sdk/help/mixin.py +699 -0
  255. htmlgraph/sdk/mixins/__init__.py +15 -0
  256. htmlgraph/sdk/mixins/attribution.py +113 -0
  257. htmlgraph/sdk/mixins/mixin.py +410 -0
  258. htmlgraph/sdk/operations/__init__.py +12 -0
  259. htmlgraph/sdk/operations/mixin.py +427 -0
  260. htmlgraph/sdk/orchestration/__init__.py +17 -0
  261. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  262. htmlgraph/sdk/orchestration/spawner.py +204 -0
  263. htmlgraph/sdk/planning/__init__.py +19 -0
  264. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  265. htmlgraph/sdk/planning/mixin.py +211 -0
  266. htmlgraph/sdk/planning/parallel.py +186 -0
  267. htmlgraph/sdk/planning/queue.py +210 -0
  268. htmlgraph/sdk/planning/recommendations.py +87 -0
  269. htmlgraph/sdk/planning/smart_planning.py +319 -0
  270. htmlgraph/sdk/session/__init__.py +19 -0
  271. htmlgraph/sdk/session/continuity.py +57 -0
  272. htmlgraph/sdk/session/handoff.py +110 -0
  273. htmlgraph/sdk/session/info.py +309 -0
  274. htmlgraph/sdk/session/manager.py +103 -0
  275. htmlgraph/sdk/strategic/__init__.py +26 -0
  276. htmlgraph/sdk/strategic/mixin.py +563 -0
  277. htmlgraph/server.py +295 -107
  278. htmlgraph/session_hooks.py +300 -0
  279. htmlgraph/session_manager.py +285 -3
  280. htmlgraph/session_registry.py +587 -0
  281. htmlgraph/session_state.py +436 -0
  282. htmlgraph/session_warning.py +2 -1
  283. htmlgraph/sessions/__init__.py +23 -0
  284. htmlgraph/sessions/handoff.py +756 -0
  285. htmlgraph/system_prompts.py +450 -0
  286. htmlgraph/templates/orchestration-view.html +350 -0
  287. htmlgraph/track_builder.py +33 -1
  288. htmlgraph/track_manager.py +38 -0
  289. htmlgraph/transcript.py +18 -5
  290. htmlgraph/validation.py +115 -0
  291. htmlgraph/watch.py +2 -1
  292. htmlgraph/work_type_utils.py +2 -1
  293. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
  294. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
  295. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  296. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  297. htmlgraph/cli.py +0 -4839
  298. htmlgraph/sdk.py +0 -2359
  299. htmlgraph-0.20.1.dist-info/RECORD +0 -118
  300. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  301. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  302. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  303. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  304. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
@@ -0,0 +1,365 @@
1
+ """
2
+ Imperative Message Generation for CIGS
3
+
4
+ Generates escalating imperative messages for delegation enforcement.
5
+
6
+ Reference: .htmlgraph/spikes/computational-imperative-guidance-system-design.md (Part 4)
7
+ """
8
+
9
+ from .models import OperationClassification
10
+
11
+
12
+ class ImperativeMessageGenerator:
13
+ """Generate imperative messages with escalation for delegation violations.
14
+
15
+ The generator supports 4 escalation levels:
16
+ - Level 0: Guidance (informative, no cost shown)
17
+ - Level 1: Imperative (commanding, includes cost)
18
+ - Level 2: Final Warning (urgent, includes consequences)
19
+ - Level 3: Circuit Breaker (blocking, requires acknowledgment)
20
+
21
+ Each level includes progressively more urgent messaging and additional context.
22
+ """
23
+
24
+ ESCALATION_LEVELS = {
25
+ 0: {
26
+ "prefix": "💡 GUIDANCE",
27
+ "tone": "informative",
28
+ "includes_cost": False,
29
+ "includes_suggestion": True,
30
+ "includes_consequences": False,
31
+ "requires_acknowledgment": False,
32
+ },
33
+ 1: {
34
+ "prefix": "🔴 IMPERATIVE",
35
+ "tone": "commanding",
36
+ "includes_cost": True,
37
+ "includes_suggestion": True,
38
+ "includes_consequences": False,
39
+ "requires_acknowledgment": False,
40
+ },
41
+ 2: {
42
+ "prefix": "⚠️ FINAL WARNING",
43
+ "tone": "urgent",
44
+ "includes_cost": True,
45
+ "includes_suggestion": True,
46
+ "includes_consequences": True,
47
+ "requires_acknowledgment": False,
48
+ },
49
+ 3: {
50
+ "prefix": "🚨 CIRCUIT BREAKER",
51
+ "tone": "blocking",
52
+ "includes_cost": True,
53
+ "includes_suggestion": True,
54
+ "includes_consequences": True,
55
+ "requires_acknowledgment": True,
56
+ },
57
+ }
58
+
59
+ # Tool-specific core messages
60
+ TOOL_MESSAGES = {
61
+ "Read": "YOU MUST delegate file reading to Explorer subagent",
62
+ "Grep": "YOU MUST delegate code search to Explorer subagent",
63
+ "Glob": "YOU MUST delegate file search to Explorer subagent",
64
+ "Edit": "YOU MUST delegate code changes to Coder subagent",
65
+ "Write": "YOU MUST delegate file writing to Coder subagent",
66
+ "NotebookEdit": "YOU MUST delegate notebook editing to Coder subagent",
67
+ "Bash": "YOU MUST delegate command execution to appropriate subagent",
68
+ }
69
+
70
+ # Category-specific rationales (WHY delegation is mandatory)
71
+ RATIONALES = {
72
+ "direct_exploration": (
73
+ "Exploration operations have unpredictable scope. "
74
+ "What looks like 'one Read' often becomes 3-5 reads. "
75
+ "Each direct read pollutes your strategic context with tactical details."
76
+ ),
77
+ "direct_implementation": (
78
+ "Implementation requires iteration (write → test → fix → test). "
79
+ "Delegating keeps your context focused on architecture, "
80
+ "while subagent handles the edit-test cycle."
81
+ ),
82
+ "exploration_sequence": (
83
+ "You have already executed multiple exploration operations. "
84
+ "This pattern indicates research work that should be delegated. "
85
+ "Subagent can explore comprehensively and return a summary."
86
+ ),
87
+ "direct_git": (
88
+ "Git operations cascade unpredictably (hooks, conflicts, push failures). "
89
+ "Copilot specializes in git AND costs 60% less than Task()."
90
+ ),
91
+ "direct_testing": (
92
+ "Test execution requires multiple iterations and debugging cycles. "
93
+ "Delegating test runs keeps test output out of your strategic context."
94
+ ),
95
+ }
96
+
97
+ def generate(
98
+ self,
99
+ tool: str,
100
+ classification: OperationClassification,
101
+ violation_count: int,
102
+ autonomy_level: str = "strict",
103
+ ) -> str:
104
+ """Generate imperative message based on context.
105
+
106
+ Args:
107
+ tool: Tool being used (Read, Grep, Edit, etc.)
108
+ classification: Operation classification with delegation details
109
+ violation_count: Number of violations in current session (0-3+)
110
+ autonomy_level: Current autonomy level ("strict", "guided", "observer")
111
+
112
+ Returns:
113
+ Formatted imperative message with appropriate escalation level
114
+ """
115
+ # Determine escalation level (0-3)
116
+ level = min(violation_count, 3)
117
+ config = self.ESCALATION_LEVELS[level]
118
+
119
+ message_parts = []
120
+
121
+ # 1. Prefix with escalation indicator + core message
122
+ core_msg = self._get_core_message(tool, classification)
123
+ message_parts.append(f"{config['prefix']}: {core_msg}")
124
+
125
+ # 2. WHY this is mandatory
126
+ rationale = self._get_rationale(classification)
127
+ message_parts.append(f"\n\n**WHY:** {rationale}")
128
+
129
+ # 3. Cost impact (if applicable for this level)
130
+ if config["includes_cost"]:
131
+ cost_msg = self._get_cost_message(classification)
132
+ message_parts.append(f"\n\n**COST IMPACT:** {cost_msg}")
133
+
134
+ # 4. What to do instead
135
+ if config["includes_suggestion"]:
136
+ message_parts.append(
137
+ f"\n\n**INSTEAD:** {classification.suggested_delegation}"
138
+ )
139
+
140
+ # 5. Consequences (for levels 2+)
141
+ if config["includes_consequences"]:
142
+ consequence = self._get_consequence_message(level)
143
+ message_parts.append(f"\n\n**CONSEQUENCE:** {consequence}")
144
+
145
+ # 6. Acknowledgment requirement (level 3 only)
146
+ if config["requires_acknowledgment"]:
147
+ message_parts.append(
148
+ "\n\n**REQUIRED:** Acknowledge this violation before proceeding:\n"
149
+ "`uv run htmlgraph orchestrator acknowledge-violation`\n\n"
150
+ "OR disable enforcement:\n"
151
+ "`uv run htmlgraph orchestrator set-level guidance`"
152
+ )
153
+
154
+ return "".join(message_parts)
155
+
156
+ def _get_core_message(
157
+ self, tool: str, classification: OperationClassification
158
+ ) -> str:
159
+ """Get core imperative message based on tool.
160
+
161
+ Args:
162
+ tool: Tool name
163
+ classification: Operation classification
164
+
165
+ Returns:
166
+ Core imperative message
167
+ """
168
+ return self.TOOL_MESSAGES.get(
169
+ tool, f"YOU MUST delegate {tool} operations to appropriate subagent"
170
+ )
171
+
172
+ def _get_rationale(self, classification: OperationClassification) -> str:
173
+ """Explain WHY delegation is mandatory.
174
+
175
+ Args:
176
+ classification: Operation classification
177
+
178
+ Returns:
179
+ Rationale explaining why delegation is required
180
+ """
181
+ # Use category-specific rationale or classification reason
182
+ rationale = self.RATIONALES.get(
183
+ classification.category, "Delegation preserves your strategic context."
184
+ )
185
+
186
+ # If classification provides specific reason, append it
187
+ if classification.reason and classification.reason not in rationale:
188
+ rationale = f"{rationale} {classification.reason}"
189
+
190
+ return rationale
191
+
192
+ def _get_cost_message(self, classification: OperationClassification) -> str:
193
+ """Generate cost impact message.
194
+
195
+ Args:
196
+ classification: Operation classification with cost estimates
197
+
198
+ Returns:
199
+ Formatted cost impact message
200
+ """
201
+ if classification.predicted_cost > 0 and classification.optimal_cost > 0:
202
+ savings_pct = classification.waste_percentage
203
+ return (
204
+ f"Direct execution costs ~{classification.predicted_cost:,} tokens in your context. "
205
+ f"Delegation would cost ~{classification.optimal_cost:,} tokens "
206
+ f"({savings_pct:.0f}% savings)."
207
+ )
208
+ else:
209
+ # Generic message if costs not available
210
+ return (
211
+ "Direct execution pollutes your context with tactical details. "
212
+ "Delegation isolates these details in subagent context."
213
+ )
214
+
215
+ def _get_consequence_message(self, level: int) -> str:
216
+ """Get consequence message for high escalation levels.
217
+
218
+ Args:
219
+ level: Escalation level (0-3)
220
+
221
+ Returns:
222
+ Consequence message appropriate for the level
223
+ """
224
+ if level == 2:
225
+ return (
226
+ "Next violation will trigger circuit breaker, "
227
+ "requiring manual acknowledgment before further operations."
228
+ )
229
+ elif level == 3:
230
+ return (
231
+ "Circuit breaker is now ACTIVE. "
232
+ "All delegation-required operations require explicit acknowledgment until reset."
233
+ )
234
+ return ""
235
+
236
+
237
+ class PositiveReinforcementGenerator:
238
+ """Generate positive feedback for correct delegation patterns.
239
+
240
+ Provides encouraging messages when Claude correctly delegates operations,
241
+ reinforcing good behavior and showing concrete benefits.
242
+ """
243
+
244
+ ENCOURAGEMENTS = [
245
+ "Excellent delegation pattern!",
246
+ "Perfect use of subagent!",
247
+ "Context preserved effectively!",
248
+ "Optimal delegation choice!",
249
+ "Great strategic thinking!",
250
+ "Correct workflow applied!",
251
+ ]
252
+
253
+ def generate(
254
+ self,
255
+ tool: str,
256
+ cost_savings: int,
257
+ compliance_rate: float,
258
+ session_waste: int = 0,
259
+ ) -> str:
260
+ """Generate positive reinforcement message.
261
+
262
+ Args:
263
+ tool: Delegation tool used (Task, spawn_gemini, etc.)
264
+ cost_savings: Estimated tokens saved by delegating
265
+ compliance_rate: Current session compliance rate (0.0-1.0)
266
+ session_waste: Total waste tokens accumulated this session
267
+
268
+ Returns:
269
+ Formatted positive reinforcement message
270
+ """
271
+ import random
272
+
273
+ base = random.choice(self.ENCOURAGEMENTS)
274
+
275
+ message_parts = [f"✅ {base}"]
276
+
277
+ # Impact section
278
+ impact_lines = [
279
+ "\n\n**Impact:**",
280
+ f"- Saved ~{cost_savings:,} tokens of context",
281
+ "- Subagent handled tactical details",
282
+ "- Your strategic view remains clean",
283
+ ]
284
+ message_parts.append("\n".join(impact_lines))
285
+
286
+ # Session stats section
287
+ stats_lines = [
288
+ "\n\n**Session Stats:**",
289
+ f"- Delegation compliance: {compliance_rate:.0%}",
290
+ ]
291
+
292
+ if session_waste > 0:
293
+ stats_lines.append(
294
+ f"- Waste avoided: {session_waste:,} tokens saved by delegating"
295
+ )
296
+
297
+ if compliance_rate >= 0.9:
298
+ stats_lines.append(
299
+ "- Outstanding! Keep up the excellent delegation pattern."
300
+ )
301
+ elif compliance_rate >= 0.75:
302
+ stats_lines.append(
303
+ "- Keep it up! Consistent delegation improves response quality."
304
+ )
305
+ else:
306
+ stats_lines.append(
307
+ "- Good progress! Continue delegating to improve efficiency."
308
+ )
309
+
310
+ message_parts.append("\n".join(stats_lines))
311
+
312
+ return "".join(message_parts)
313
+
314
+ def generate_session_summary(
315
+ self,
316
+ total_delegations: int,
317
+ compliance_rate: float,
318
+ efficiency_score: float,
319
+ total_savings: int,
320
+ ) -> str:
321
+ """Generate end-of-session positive summary.
322
+
323
+ Args:
324
+ total_delegations: Number of successful delegations
325
+ compliance_rate: Session compliance rate (0.0-1.0)
326
+ efficiency_score: Cost efficiency score (0-100)
327
+ total_savings: Total tokens saved through delegation
328
+
329
+ Returns:
330
+ Session summary message
331
+ """
332
+ message_parts = ["## ✅ Delegation Session Summary\n"]
333
+
334
+ # Overall performance
335
+ if compliance_rate >= 0.9 and efficiency_score >= 80:
336
+ message_parts.append(
337
+ "**Outstanding Performance!** Excellent delegation discipline.\n"
338
+ )
339
+ elif compliance_rate >= 0.75:
340
+ message_parts.append(
341
+ "**Good Performance!** Strong delegation patterns observed.\n"
342
+ )
343
+ else:
344
+ message_parts.append(
345
+ "**Room for Improvement.** Continue working on delegation.\n"
346
+ )
347
+
348
+ # Metrics
349
+ metrics = [
350
+ "\n**Metrics:**",
351
+ f"- Total delegations: {total_delegations}",
352
+ f"- Compliance rate: {compliance_rate:.1%}",
353
+ f"- Efficiency score: {efficiency_score:.0f}/100",
354
+ f"- Tokens saved: {total_savings:,}",
355
+ ]
356
+ message_parts.append("\n".join(metrics))
357
+
358
+ # Encouragement
359
+ if compliance_rate < 0.75:
360
+ message_parts.append(
361
+ "\n\n**Next Session:** Focus on delegating exploration and implementation "
362
+ "tasks to specialized subagents."
363
+ )
364
+
365
+ return "\n".join(message_parts)