htmlgraph 0.9.3__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.
- htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/.htmlgraph/agents.json +72 -0
- htmlgraph/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/__init__.py +173 -17
- htmlgraph/__init__.pyi +123 -0
- htmlgraph/agent_detection.py +127 -0
- htmlgraph/agent_registry.py +45 -30
- htmlgraph/agents.py +160 -107
- htmlgraph/analytics/__init__.py +9 -2
- htmlgraph/analytics/cli.py +190 -51
- htmlgraph/analytics/cost_analyzer.py +391 -0
- htmlgraph/analytics/cost_monitor.py +664 -0
- htmlgraph/analytics/cost_reporter.py +675 -0
- htmlgraph/analytics/cross_session.py +617 -0
- htmlgraph/analytics/dependency.py +192 -100
- htmlgraph/analytics/pattern_learning.py +771 -0
- htmlgraph/analytics/session_graph.py +707 -0
- htmlgraph/analytics/strategic/__init__.py +80 -0
- htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
- htmlgraph/analytics/strategic/pattern_detector.py +876 -0
- htmlgraph/analytics/strategic/preference_manager.py +709 -0
- htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
- htmlgraph/analytics/work_type.py +190 -14
- htmlgraph/analytics_index.py +135 -51
- htmlgraph/api/__init__.py +3 -0
- htmlgraph/api/cost_alerts_websocket.py +416 -0
- htmlgraph/api/main.py +2498 -0
- htmlgraph/api/static/htmx.min.js +1 -0
- htmlgraph/api/static/style-redesign.css +1344 -0
- htmlgraph/api/static/style.css +1079 -0
- htmlgraph/api/templates/dashboard-redesign.html +1366 -0
- htmlgraph/api/templates/dashboard.html +794 -0
- htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
- htmlgraph/api/templates/partials/activity-feed.html +1100 -0
- htmlgraph/api/templates/partials/agents-redesign.html +317 -0
- htmlgraph/api/templates/partials/agents.html +317 -0
- htmlgraph/api/templates/partials/event-traces.html +373 -0
- htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
- htmlgraph/api/templates/partials/features.html +578 -0
- htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
- htmlgraph/api/templates/partials/metrics.html +346 -0
- htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
- htmlgraph/api/templates/partials/orchestration.html +198 -0
- htmlgraph/api/templates/partials/spawners.html +375 -0
- htmlgraph/api/templates/partials/work-items.html +613 -0
- htmlgraph/api/websocket.py +538 -0
- htmlgraph/archive/__init__.py +24 -0
- htmlgraph/archive/bloom.py +234 -0
- htmlgraph/archive/fts.py +297 -0
- htmlgraph/archive/manager.py +583 -0
- htmlgraph/archive/search.py +244 -0
- htmlgraph/atomic_ops.py +560 -0
- htmlgraph/attribute_index.py +208 -0
- htmlgraph/bounded_paths.py +539 -0
- htmlgraph/builders/__init__.py +14 -0
- htmlgraph/builders/base.py +118 -29
- htmlgraph/builders/bug.py +150 -0
- htmlgraph/builders/chore.py +119 -0
- htmlgraph/builders/epic.py +150 -0
- htmlgraph/builders/feature.py +31 -6
- htmlgraph/builders/insight.py +195 -0
- htmlgraph/builders/metric.py +217 -0
- htmlgraph/builders/pattern.py +202 -0
- htmlgraph/builders/phase.py +162 -0
- htmlgraph/builders/spike.py +52 -19
- htmlgraph/builders/track.py +148 -72
- htmlgraph/cigs/__init__.py +81 -0
- htmlgraph/cigs/autonomy.py +385 -0
- htmlgraph/cigs/cost.py +475 -0
- htmlgraph/cigs/messages_basic.py +472 -0
- htmlgraph/cigs/messaging.py +365 -0
- htmlgraph/cigs/models.py +771 -0
- htmlgraph/cigs/pattern_storage.py +427 -0
- htmlgraph/cigs/patterns.py +503 -0
- htmlgraph/cigs/posttool_analyzer.py +234 -0
- htmlgraph/cigs/reporter.py +818 -0
- htmlgraph/cigs/tracker.py +317 -0
- htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/cli/.htmlgraph/agents.json +72 -0
- htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/cli/__init__.py +42 -0
- htmlgraph/cli/__main__.py +6 -0
- htmlgraph/cli/analytics.py +1424 -0
- htmlgraph/cli/base.py +685 -0
- htmlgraph/cli/constants.py +206 -0
- htmlgraph/cli/core.py +954 -0
- htmlgraph/cli/main.py +147 -0
- htmlgraph/cli/models.py +475 -0
- htmlgraph/cli/templates/__init__.py +1 -0
- htmlgraph/cli/templates/cost_dashboard.py +399 -0
- htmlgraph/cli/work/__init__.py +239 -0
- htmlgraph/cli/work/browse.py +115 -0
- htmlgraph/cli/work/features.py +568 -0
- htmlgraph/cli/work/orchestration.py +676 -0
- htmlgraph/cli/work/report.py +728 -0
- htmlgraph/cli/work/sessions.py +466 -0
- htmlgraph/cli/work/snapshot.py +559 -0
- htmlgraph/cli/work/tracks.py +486 -0
- htmlgraph/cli_commands/__init__.py +1 -0
- htmlgraph/cli_commands/feature.py +195 -0
- htmlgraph/cli_framework.py +115 -0
- htmlgraph/collections/__init__.py +18 -0
- htmlgraph/collections/base.py +415 -98
- htmlgraph/collections/bug.py +53 -0
- htmlgraph/collections/chore.py +53 -0
- htmlgraph/collections/epic.py +53 -0
- htmlgraph/collections/feature.py +12 -26
- htmlgraph/collections/insight.py +100 -0
- htmlgraph/collections/metric.py +92 -0
- htmlgraph/collections/pattern.py +97 -0
- htmlgraph/collections/phase.py +53 -0
- htmlgraph/collections/session.py +194 -0
- htmlgraph/collections/spike.py +56 -16
- htmlgraph/collections/task_delegation.py +241 -0
- htmlgraph/collections/todo.py +511 -0
- htmlgraph/collections/traces.py +487 -0
- htmlgraph/config/cost_models.json +56 -0
- htmlgraph/config.py +190 -0
- htmlgraph/context_analytics.py +344 -0
- htmlgraph/converter.py +216 -28
- htmlgraph/cost_analysis/__init__.py +5 -0
- htmlgraph/cost_analysis/analyzer.py +438 -0
- htmlgraph/dashboard.html +2406 -307
- htmlgraph/dashboard.html.backup +6592 -0
- htmlgraph/dashboard.html.bak +7181 -0
- htmlgraph/dashboard.html.bak2 +7231 -0
- htmlgraph/dashboard.html.bak3 +7232 -0
- htmlgraph/db/__init__.py +38 -0
- htmlgraph/db/queries.py +790 -0
- htmlgraph/db/schema.py +1788 -0
- htmlgraph/decorators.py +317 -0
- htmlgraph/dependency_models.py +19 -2
- htmlgraph/deploy.py +142 -125
- htmlgraph/deployment_models.py +474 -0
- htmlgraph/docs/API_REFERENCE.md +841 -0
- htmlgraph/docs/HTTP_API.md +750 -0
- htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
- htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
- htmlgraph/docs/README.md +532 -0
- htmlgraph/docs/__init__.py +77 -0
- htmlgraph/docs/docs_version.py +55 -0
- htmlgraph/docs/metadata.py +93 -0
- htmlgraph/docs/migrations.py +232 -0
- htmlgraph/docs/template_engine.py +143 -0
- htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
- htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
- htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
- htmlgraph/docs/templates/base_agents.md.j2 +78 -0
- htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
- htmlgraph/docs/version_check.py +163 -0
- htmlgraph/edge_index.py +182 -27
- htmlgraph/error_handler.py +544 -0
- htmlgraph/event_log.py +100 -52
- htmlgraph/event_migration.py +13 -4
- htmlgraph/exceptions.py +49 -0
- htmlgraph/file_watcher.py +101 -28
- htmlgraph/find_api.py +75 -63
- htmlgraph/git_events.py +145 -63
- htmlgraph/graph.py +1122 -106
- htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/hooks/.htmlgraph/agents.json +72 -0
- htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
- htmlgraph/hooks/__init__.py +45 -0
- htmlgraph/hooks/bootstrap.py +169 -0
- htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
- htmlgraph/hooks/concurrent_sessions.py +208 -0
- htmlgraph/hooks/context.py +350 -0
- htmlgraph/hooks/drift_handler.py +525 -0
- htmlgraph/hooks/event_tracker.py +1314 -0
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/hooks-config.example.json +12 -0
- htmlgraph/hooks/installer.py +343 -0
- htmlgraph/hooks/orchestrator.py +674 -0
- htmlgraph/hooks/orchestrator_reflector.py +223 -0
- htmlgraph/hooks/post-checkout.sh +28 -0
- htmlgraph/hooks/post-commit.sh +24 -0
- htmlgraph/hooks/post-merge.sh +26 -0
- htmlgraph/hooks/post_tool_use_failure.py +273 -0
- htmlgraph/hooks/post_tool_use_handler.py +257 -0
- htmlgraph/hooks/posttooluse.py +408 -0
- htmlgraph/hooks/pre-commit.sh +94 -0
- htmlgraph/hooks/pre-push.sh +28 -0
- htmlgraph/hooks/pretooluse.py +819 -0
- htmlgraph/hooks/prompt_analyzer.py +637 -0
- htmlgraph/hooks/session_handler.py +668 -0
- htmlgraph/hooks/session_summary.py +395 -0
- htmlgraph/hooks/state_manager.py +504 -0
- htmlgraph/hooks/subagent_detection.py +202 -0
- htmlgraph/hooks/subagent_stop.py +369 -0
- htmlgraph/hooks/task_enforcer.py +255 -0
- htmlgraph/hooks/task_validator.py +177 -0
- htmlgraph/hooks/validator.py +628 -0
- htmlgraph/ids.py +41 -27
- htmlgraph/index.d.ts +286 -0
- htmlgraph/learning.py +767 -0
- htmlgraph/mcp_server.py +69 -23
- htmlgraph/models.py +1586 -87
- htmlgraph/operations/README.md +62 -0
- htmlgraph/operations/__init__.py +79 -0
- htmlgraph/operations/analytics.py +339 -0
- htmlgraph/operations/bootstrap.py +289 -0
- htmlgraph/operations/events.py +244 -0
- htmlgraph/operations/fastapi_server.py +231 -0
- htmlgraph/operations/hooks.py +350 -0
- htmlgraph/operations/initialization.py +597 -0
- htmlgraph/operations/initialization.py.backup +228 -0
- htmlgraph/operations/server.py +303 -0
- htmlgraph/orchestration/__init__.py +58 -0
- htmlgraph/orchestration/claude_launcher.py +179 -0
- htmlgraph/orchestration/command_builder.py +72 -0
- htmlgraph/orchestration/headless_spawner.py +281 -0
- htmlgraph/orchestration/live_events.py +377 -0
- htmlgraph/orchestration/model_selection.py +327 -0
- htmlgraph/orchestration/plugin_manager.py +140 -0
- htmlgraph/orchestration/prompts.py +137 -0
- htmlgraph/orchestration/spawner_event_tracker.py +383 -0
- htmlgraph/orchestration/spawners/__init__.py +16 -0
- htmlgraph/orchestration/spawners/base.py +194 -0
- htmlgraph/orchestration/spawners/claude.py +173 -0
- htmlgraph/orchestration/spawners/codex.py +435 -0
- htmlgraph/orchestration/spawners/copilot.py +294 -0
- htmlgraph/orchestration/spawners/gemini.py +471 -0
- htmlgraph/orchestration/subprocess_runner.py +36 -0
- htmlgraph/orchestration/task_coordination.py +343 -0
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
- htmlgraph/orchestrator.py +669 -0
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +328 -0
- htmlgraph/orchestrator_validator.py +133 -0
- htmlgraph/parallel.py +646 -0
- htmlgraph/parser.py +160 -35
- htmlgraph/path_query.py +608 -0
- htmlgraph/pattern_matcher.py +636 -0
- htmlgraph/planning.py +147 -52
- htmlgraph/pydantic_models.py +476 -0
- htmlgraph/quality_gates.py +350 -0
- htmlgraph/query_builder.py +109 -72
- htmlgraph/query_composer.py +509 -0
- htmlgraph/reflection.py +443 -0
- htmlgraph/refs.py +344 -0
- htmlgraph/repo_hash.py +512 -0
- htmlgraph/repositories/__init__.py +292 -0
- htmlgraph/repositories/analytics_repository.py +455 -0
- htmlgraph/repositories/analytics_repository_standard.py +628 -0
- htmlgraph/repositories/feature_repository.py +581 -0
- htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
- htmlgraph/repositories/feature_repository_memory.py +607 -0
- htmlgraph/repositories/feature_repository_sqlite.py +858 -0
- htmlgraph/repositories/filter_service.py +620 -0
- htmlgraph/repositories/filter_service_standard.py +445 -0
- htmlgraph/repositories/shared_cache.py +621 -0
- htmlgraph/repositories/shared_cache_memory.py +395 -0
- htmlgraph/repositories/track_repository.py +552 -0
- htmlgraph/repositories/track_repository_htmlfile.py +619 -0
- htmlgraph/repositories/track_repository_memory.py +508 -0
- htmlgraph/repositories/track_repository_sqlite.py +711 -0
- htmlgraph/routing.py +8 -19
- htmlgraph/scripts/deploy.py +1 -2
- htmlgraph/sdk/__init__.py +398 -0
- htmlgraph/sdk/__init__.pyi +14 -0
- htmlgraph/sdk/analytics/__init__.py +19 -0
- htmlgraph/sdk/analytics/engine.py +155 -0
- htmlgraph/sdk/analytics/helpers.py +178 -0
- htmlgraph/sdk/analytics/registry.py +109 -0
- htmlgraph/sdk/base.py +484 -0
- htmlgraph/sdk/constants.py +216 -0
- htmlgraph/sdk/core.pyi +308 -0
- htmlgraph/sdk/discovery.py +120 -0
- htmlgraph/sdk/help/__init__.py +12 -0
- htmlgraph/sdk/help/mixin.py +699 -0
- htmlgraph/sdk/mixins/__init__.py +15 -0
- htmlgraph/sdk/mixins/attribution.py +113 -0
- htmlgraph/sdk/mixins/mixin.py +410 -0
- htmlgraph/sdk/operations/__init__.py +12 -0
- htmlgraph/sdk/operations/mixin.py +427 -0
- htmlgraph/sdk/orchestration/__init__.py +17 -0
- htmlgraph/sdk/orchestration/coordinator.py +203 -0
- htmlgraph/sdk/orchestration/spawner.py +204 -0
- htmlgraph/sdk/planning/__init__.py +19 -0
- htmlgraph/sdk/planning/bottlenecks.py +93 -0
- htmlgraph/sdk/planning/mixin.py +211 -0
- htmlgraph/sdk/planning/parallel.py +186 -0
- htmlgraph/sdk/planning/queue.py +210 -0
- htmlgraph/sdk/planning/recommendations.py +87 -0
- htmlgraph/sdk/planning/smart_planning.py +319 -0
- htmlgraph/sdk/session/__init__.py +19 -0
- htmlgraph/sdk/session/continuity.py +57 -0
- htmlgraph/sdk/session/handoff.py +110 -0
- htmlgraph/sdk/session/info.py +309 -0
- htmlgraph/sdk/session/manager.py +103 -0
- htmlgraph/sdk/strategic/__init__.py +26 -0
- htmlgraph/sdk/strategic/mixin.py +563 -0
- htmlgraph/server.py +685 -180
- htmlgraph/services/__init__.py +10 -0
- htmlgraph/services/claiming.py +199 -0
- htmlgraph/session_hooks.py +300 -0
- htmlgraph/session_manager.py +1392 -175
- htmlgraph/session_registry.py +587 -0
- htmlgraph/session_state.py +436 -0
- htmlgraph/session_warning.py +201 -0
- htmlgraph/sessions/__init__.py +23 -0
- htmlgraph/sessions/handoff.py +756 -0
- htmlgraph/setup.py +34 -17
- htmlgraph/spike_index.py +143 -0
- htmlgraph/sync_docs.py +12 -15
- htmlgraph/system_prompts.py +450 -0
- htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph/templates/GEMINI.md.template +87 -0
- htmlgraph/templates/orchestration-view.html +350 -0
- htmlgraph/track_builder.py +146 -15
- htmlgraph/track_manager.py +69 -21
- htmlgraph/transcript.py +890 -0
- htmlgraph/transcript_analytics.py +699 -0
- htmlgraph/types.py +323 -0
- htmlgraph/validation.py +115 -0
- htmlgraph/watch.py +8 -5
- htmlgraph/work_type_utils.py +3 -2
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2406 -307
- htmlgraph-0.27.5.data/data/htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/GEMINI.md.template +87 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +97 -64
- htmlgraph-0.27.5.dist-info/RECORD +337 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -2688
- htmlgraph/sdk.py +0 -709
- htmlgraph-0.9.3.dist-info/RECORD +0 -61
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.9.3.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)
|