tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,304 +1,304 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Weight Distribution Algorithm for Industry Experts
|
|
3
|
-
|
|
4
|
-
Implements the 51% primary authority model:
|
|
5
|
-
- One expert has 51% authority per domain (PRIMARY)
|
|
6
|
-
- Other experts share remaining 49% equally
|
|
7
|
-
- N domains → N experts (1:1 primary mapping)
|
|
8
|
-
- Weights are fixed per domain
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from dataclasses import dataclass
|
|
12
|
-
from decimal import ROUND_HALF_UP, Decimal
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@dataclass
|
|
16
|
-
class ExpertWeightMatrix:
|
|
17
|
-
"""
|
|
18
|
-
Weight matrix for all experts across all domains.
|
|
19
|
-
|
|
20
|
-
Structure:
|
|
21
|
-
{
|
|
22
|
-
"expert-1": {
|
|
23
|
-
"domain-1": 0.51, # Primary
|
|
24
|
-
"domain-2": 0.245,
|
|
25
|
-
"domain-3": 0.245
|
|
26
|
-
},
|
|
27
|
-
"expert-2": {
|
|
28
|
-
"domain-1": 0.245,
|
|
29
|
-
"domain-2": 0.51, # Primary
|
|
30
|
-
"domain-3": 0.245
|
|
31
|
-
},
|
|
32
|
-
...
|
|
33
|
-
}
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
weights: dict[str, dict[str, float]]
|
|
37
|
-
domains: list[str]
|
|
38
|
-
experts: list[str]
|
|
39
|
-
|
|
40
|
-
def get_expert_weight(self, expert_id: str, domain: str) -> float:
|
|
41
|
-
"""Get weight for a specific expert-domain pair."""
|
|
42
|
-
return self.weights.get(expert_id, {}).get(domain, 0.0)
|
|
43
|
-
|
|
44
|
-
def get_primary_expert(self, domain: str) -> str | None:
|
|
45
|
-
"""Get the primary expert (51% or 100% for single expert) for a domain."""
|
|
46
|
-
for expert_id, domain_weights in self.weights.items():
|
|
47
|
-
weight = domain_weights.get(domain, 0.0)
|
|
48
|
-
# Primary is >= 0.51 for multiple experts, or == 1.0 for single expert
|
|
49
|
-
if weight >= 0.51 or (len(self.experts) == 1 and weight >= 0.99):
|
|
50
|
-
return expert_id
|
|
51
|
-
return None
|
|
52
|
-
|
|
53
|
-
def get_primary_expert_domain(self, expert_id: str) -> str | None:
|
|
54
|
-
"""Get the primary domain (51% or 100% for single expert) for an expert."""
|
|
55
|
-
expert_weights = self.weights.get(expert_id, {})
|
|
56
|
-
for domain, weight in expert_weights.items():
|
|
57
|
-
# Primary is >= 0.51 for multiple experts, or == 1.0 for single expert
|
|
58
|
-
if weight >= 0.51 or (len(self.experts) == 1 and weight >= 0.99):
|
|
59
|
-
return domain
|
|
60
|
-
return None
|
|
61
|
-
|
|
62
|
-
def validate(self) -> list[str]:
|
|
63
|
-
"""
|
|
64
|
-
Validate weight matrix against requirements.
|
|
65
|
-
|
|
66
|
-
Returns:
|
|
67
|
-
List of validation errors (empty if valid)
|
|
68
|
-
"""
|
|
69
|
-
errors = []
|
|
70
|
-
|
|
71
|
-
# Check: Each domain has exactly one primary (51% or 100% for single expert)
|
|
72
|
-
for domain in self.domains:
|
|
73
|
-
primaries = []
|
|
74
|
-
for expert_id, domain_weights in self.weights.items():
|
|
75
|
-
weight = domain_weights.get(domain, 0.0)
|
|
76
|
-
# Primary is >= 0.51 for multiple experts, or >= 0.99 for single expert
|
|
77
|
-
if weight >= 0.51 or (len(self.experts) == 1 and weight >= 0.99):
|
|
78
|
-
primaries.append(expert_id)
|
|
79
|
-
|
|
80
|
-
if len(primaries) == 0:
|
|
81
|
-
expected = "100%" if len(self.experts) == 1 else "51%"
|
|
82
|
-
errors.append(f"Domain '{domain}' has no primary expert ({expected})")
|
|
83
|
-
elif len(primaries) > 1:
|
|
84
|
-
errors.append(
|
|
85
|
-
f"Domain '{domain}' has multiple primary experts: {primaries}"
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
# Check: Each domain column sums to 100%
|
|
89
|
-
for domain in self.domains:
|
|
90
|
-
total = sum(
|
|
91
|
-
expert_weights.get(domain, 0.0)
|
|
92
|
-
for expert_weights in self.weights.values()
|
|
93
|
-
)
|
|
94
|
-
if abs(total - 1.0) > 0.001: # Allow small floating-point errors
|
|
95
|
-
errors.append(
|
|
96
|
-
f"Domain '{domain}' column sum is {total:.3f}, expected 1.000"
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
# Check: Primary weight is 51% (or 100% for single expert)
|
|
100
|
-
for domain in self.domains:
|
|
101
|
-
primary_expert = self.get_primary_expert(domain)
|
|
102
|
-
if primary_expert:
|
|
103
|
-
weight = self.weights[primary_expert][domain]
|
|
104
|
-
# Single expert case: weight should be 1.0
|
|
105
|
-
# Multiple experts case: weight should be 0.51
|
|
106
|
-
expected_weight = 1.0 if len(self.experts) == 1 else 0.51
|
|
107
|
-
if abs(weight - expected_weight) > 0.001:
|
|
108
|
-
errors.append(
|
|
109
|
-
f"Domain '{domain}' primary expert '{primary_expert}' "
|
|
110
|
-
f"has weight {weight:.3f}, expected {expected_weight:.3f}"
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
# Check: Number of domains equals number of experts
|
|
114
|
-
if len(self.domains) != len(self.experts):
|
|
115
|
-
errors.append(
|
|
116
|
-
f"Number of domains ({len(self.domains)}) "
|
|
117
|
-
f"does not equal number of experts ({len(self.experts)})"
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
return errors
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
class WeightDistributor:
|
|
124
|
-
"""
|
|
125
|
-
Calculates and manages expert weight distribution.
|
|
126
|
-
|
|
127
|
-
Formula:
|
|
128
|
-
- Primary Expert: 51%
|
|
129
|
-
- Each Other Expert: 49% / (N-1)
|
|
130
|
-
"""
|
|
131
|
-
|
|
132
|
-
PRIMARY_WEIGHT = 0.51
|
|
133
|
-
OTHER_WEIGHT = 0.49
|
|
134
|
-
|
|
135
|
-
@staticmethod
|
|
136
|
-
def calculate_weights(
|
|
137
|
-
domains: list[str], expert_primary_map: dict[str, str]
|
|
138
|
-
) -> ExpertWeightMatrix:
|
|
139
|
-
"""
|
|
140
|
-
Calculate weight matrix for experts and domains.
|
|
141
|
-
|
|
142
|
-
Args:
|
|
143
|
-
domains: List of domain names
|
|
144
|
-
expert_primary_map: Mapping of expert_id -> primary_domain
|
|
145
|
-
|
|
146
|
-
Returns:
|
|
147
|
-
ExpertWeightMatrix with calculated weights
|
|
148
|
-
|
|
149
|
-
Raises:
|
|
150
|
-
ValueError: If validation fails
|
|
151
|
-
"""
|
|
152
|
-
# Validate: Each domain has exactly one primary expert
|
|
153
|
-
domain_primaries: dict[str, str] = {}
|
|
154
|
-
for expert_id, primary_domain in expert_primary_map.items():
|
|
155
|
-
if primary_domain in domain_primaries:
|
|
156
|
-
raise ValueError(
|
|
157
|
-
f"Domain '{primary_domain}' has multiple primary experts: "
|
|
158
|
-
f"{domain_primaries[primary_domain]} and {expert_id}"
|
|
159
|
-
)
|
|
160
|
-
domain_primaries[primary_domain] = expert_id
|
|
161
|
-
|
|
162
|
-
# Validate: All domains have a primary expert
|
|
163
|
-
missing_domains = set(domains) - set(domain_primaries.keys())
|
|
164
|
-
if missing_domains:
|
|
165
|
-
raise ValueError(f"Domains without primary expert: {missing_domains}")
|
|
166
|
-
|
|
167
|
-
# Validate: All experts are accounted for
|
|
168
|
-
experts = list(expert_primary_map.keys())
|
|
169
|
-
if len(experts) != len(domains):
|
|
170
|
-
raise ValueError(
|
|
171
|
-
f"Number of experts ({len(experts)}) does not equal "
|
|
172
|
-
f"number of domains ({len(domains)})"
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
# Calculate weights
|
|
176
|
-
num_experts = len(experts)
|
|
177
|
-
|
|
178
|
-
# Special case: single expert gets 100% weight for their domain
|
|
179
|
-
if num_experts == 1:
|
|
180
|
-
primary_weight = 1.0
|
|
181
|
-
other_weight = 0.0
|
|
182
|
-
else:
|
|
183
|
-
primary_weight = WeightDistributor.PRIMARY_WEIGHT
|
|
184
|
-
other_weight = WeightDistributor.OTHER_WEIGHT / (num_experts - 1)
|
|
185
|
-
|
|
186
|
-
# Round to avoid floating-point issues
|
|
187
|
-
other_weight = float(
|
|
188
|
-
Decimal(str(other_weight)).quantize(
|
|
189
|
-
Decimal("0.001"), rounding=ROUND_HALF_UP
|
|
190
|
-
)
|
|
191
|
-
)
|
|
192
|
-
primary_weight = float(
|
|
193
|
-
Decimal(str(primary_weight)).quantize(
|
|
194
|
-
Decimal("0.001"), rounding=ROUND_HALF_UP
|
|
195
|
-
)
|
|
196
|
-
)
|
|
197
|
-
|
|
198
|
-
weights: dict[str, dict[str, float]] = {}
|
|
199
|
-
|
|
200
|
-
for expert_id in experts:
|
|
201
|
-
expert_weights: dict[str, float] = {}
|
|
202
|
-
|
|
203
|
-
for domain in domains:
|
|
204
|
-
if domain == expert_primary_map[expert_id]:
|
|
205
|
-
# Primary domain: 51% (or 100% for single expert)
|
|
206
|
-
expert_weights[domain] = primary_weight
|
|
207
|
-
else:
|
|
208
|
-
# Other domains: equal share of 49%
|
|
209
|
-
expert_weights[domain] = other_weight
|
|
210
|
-
|
|
211
|
-
weights[expert_id] = expert_weights
|
|
212
|
-
|
|
213
|
-
matrix = ExpertWeightMatrix(weights=weights, domains=domains, experts=experts)
|
|
214
|
-
|
|
215
|
-
# Validate the matrix
|
|
216
|
-
errors = matrix.validate()
|
|
217
|
-
if errors:
|
|
218
|
-
raise ValueError(
|
|
219
|
-
"Weight matrix validation failed:\n"
|
|
220
|
-
+ "\n".join(f" - {e}" for e in errors)
|
|
221
|
-
)
|
|
222
|
-
|
|
223
|
-
return matrix
|
|
224
|
-
|
|
225
|
-
@staticmethod
|
|
226
|
-
def recalculate_on_domain_add(
|
|
227
|
-
current_matrix: ExpertWeightMatrix, new_domain: str, new_expert_id: str
|
|
228
|
-
) -> ExpertWeightMatrix:
|
|
229
|
-
"""
|
|
230
|
-
Recalculate weights when a new domain/expert is added.
|
|
231
|
-
|
|
232
|
-
When adding a new domain:
|
|
233
|
-
1. Add new expert as primary for new domain (51%)
|
|
234
|
-
2. Recalculate all existing weights:
|
|
235
|
-
- Primary: Still 51%
|
|
236
|
-
- Others: 49% / (new_total_experts - 1)
|
|
237
|
-
|
|
238
|
-
Args:
|
|
239
|
-
current_matrix: Current weight matrix
|
|
240
|
-
new_domain: New domain to add
|
|
241
|
-
new_expert_id: New expert to add (primary for new domain)
|
|
242
|
-
|
|
243
|
-
Returns:
|
|
244
|
-
Updated ExpertWeightMatrix
|
|
245
|
-
"""
|
|
246
|
-
if new_domain in current_matrix.domains:
|
|
247
|
-
raise ValueError(f"Domain '{new_domain}' already exists")
|
|
248
|
-
|
|
249
|
-
if new_expert_id in current_matrix.experts:
|
|
250
|
-
raise ValueError(f"Expert '{new_expert_id}' already exists")
|
|
251
|
-
|
|
252
|
-
# Build new expert-primary mapping
|
|
253
|
-
expert_primary_map = {}
|
|
254
|
-
for expert_id in current_matrix.experts:
|
|
255
|
-
primary_domain = current_matrix.get_primary_expert_domain(expert_id)
|
|
256
|
-
if primary_domain:
|
|
257
|
-
expert_primary_map[expert_id] = primary_domain
|
|
258
|
-
|
|
259
|
-
# Add new expert-domain pair
|
|
260
|
-
expert_primary_map[new_expert_id] = new_domain
|
|
261
|
-
|
|
262
|
-
# Recalculate with all domains (including new one)
|
|
263
|
-
new_domains = current_matrix.domains + [new_domain]
|
|
264
|
-
|
|
265
|
-
return WeightDistributor.calculate_weights(new_domains, expert_primary_map)
|
|
266
|
-
|
|
267
|
-
@staticmethod
|
|
268
|
-
def format_matrix(matrix: ExpertWeightMatrix) -> str:
|
|
269
|
-
"""
|
|
270
|
-
Format weight matrix as a readable table.
|
|
271
|
-
|
|
272
|
-
Returns:
|
|
273
|
-
Formatted string representation
|
|
274
|
-
"""
|
|
275
|
-
lines = []
|
|
276
|
-
|
|
277
|
-
# Header
|
|
278
|
-
header = "Expert/Domain".ljust(25)
|
|
279
|
-
for domain in matrix.domains:
|
|
280
|
-
header += domain[:15].ljust(18)
|
|
281
|
-
lines.append(header)
|
|
282
|
-
lines.append("-" * len(header))
|
|
283
|
-
|
|
284
|
-
# Rows
|
|
285
|
-
for expert_id in matrix.experts:
|
|
286
|
-
row = expert_id[:24].ljust(25)
|
|
287
|
-
for domain in matrix.domains:
|
|
288
|
-
weight = matrix.get_expert_weight(expert_id, domain)
|
|
289
|
-
marker = "▲" if weight >= 0.51 else " "
|
|
290
|
-
row += f"{marker} {weight:.3f}".ljust(18)
|
|
291
|
-
lines.append(row)
|
|
292
|
-
|
|
293
|
-
# Column totals
|
|
294
|
-
totals_row = "TOTAL".ljust(25)
|
|
295
|
-
for domain in matrix.domains:
|
|
296
|
-
total = sum(
|
|
297
|
-
matrix.get_expert_weight(expert_id, domain)
|
|
298
|
-
for expert_id in matrix.experts
|
|
299
|
-
)
|
|
300
|
-
totals_row += f"{total:.3f}".ljust(18)
|
|
301
|
-
lines.append("-" * len(header))
|
|
302
|
-
lines.append(totals_row)
|
|
303
|
-
|
|
304
|
-
return "\n".join(lines)
|
|
1
|
+
"""
|
|
2
|
+
Weight Distribution Algorithm for Industry Experts
|
|
3
|
+
|
|
4
|
+
Implements the 51% primary authority model:
|
|
5
|
+
- One expert has 51% authority per domain (PRIMARY)
|
|
6
|
+
- Other experts share remaining 49% equally
|
|
7
|
+
- N domains → N experts (1:1 primary mapping)
|
|
8
|
+
- Weights are fixed per domain
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from decimal import ROUND_HALF_UP, Decimal
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class ExpertWeightMatrix:
|
|
17
|
+
"""
|
|
18
|
+
Weight matrix for all experts across all domains.
|
|
19
|
+
|
|
20
|
+
Structure:
|
|
21
|
+
{
|
|
22
|
+
"expert-1": {
|
|
23
|
+
"domain-1": 0.51, # Primary
|
|
24
|
+
"domain-2": 0.245,
|
|
25
|
+
"domain-3": 0.245
|
|
26
|
+
},
|
|
27
|
+
"expert-2": {
|
|
28
|
+
"domain-1": 0.245,
|
|
29
|
+
"domain-2": 0.51, # Primary
|
|
30
|
+
"domain-3": 0.245
|
|
31
|
+
},
|
|
32
|
+
...
|
|
33
|
+
}
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
weights: dict[str, dict[str, float]]
|
|
37
|
+
domains: list[str]
|
|
38
|
+
experts: list[str]
|
|
39
|
+
|
|
40
|
+
def get_expert_weight(self, expert_id: str, domain: str) -> float:
|
|
41
|
+
"""Get weight for a specific expert-domain pair."""
|
|
42
|
+
return self.weights.get(expert_id, {}).get(domain, 0.0)
|
|
43
|
+
|
|
44
|
+
def get_primary_expert(self, domain: str) -> str | None:
|
|
45
|
+
"""Get the primary expert (51% or 100% for single expert) for a domain."""
|
|
46
|
+
for expert_id, domain_weights in self.weights.items():
|
|
47
|
+
weight = domain_weights.get(domain, 0.0)
|
|
48
|
+
# Primary is >= 0.51 for multiple experts, or == 1.0 for single expert
|
|
49
|
+
if weight >= 0.51 or (len(self.experts) == 1 and weight >= 0.99):
|
|
50
|
+
return expert_id
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
def get_primary_expert_domain(self, expert_id: str) -> str | None:
|
|
54
|
+
"""Get the primary domain (51% or 100% for single expert) for an expert."""
|
|
55
|
+
expert_weights = self.weights.get(expert_id, {})
|
|
56
|
+
for domain, weight in expert_weights.items():
|
|
57
|
+
# Primary is >= 0.51 for multiple experts, or == 1.0 for single expert
|
|
58
|
+
if weight >= 0.51 or (len(self.experts) == 1 and weight >= 0.99):
|
|
59
|
+
return domain
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
def validate(self) -> list[str]:
|
|
63
|
+
"""
|
|
64
|
+
Validate weight matrix against requirements.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
List of validation errors (empty if valid)
|
|
68
|
+
"""
|
|
69
|
+
errors = []
|
|
70
|
+
|
|
71
|
+
# Check: Each domain has exactly one primary (51% or 100% for single expert)
|
|
72
|
+
for domain in self.domains:
|
|
73
|
+
primaries = []
|
|
74
|
+
for expert_id, domain_weights in self.weights.items():
|
|
75
|
+
weight = domain_weights.get(domain, 0.0)
|
|
76
|
+
# Primary is >= 0.51 for multiple experts, or >= 0.99 for single expert
|
|
77
|
+
if weight >= 0.51 or (len(self.experts) == 1 and weight >= 0.99):
|
|
78
|
+
primaries.append(expert_id)
|
|
79
|
+
|
|
80
|
+
if len(primaries) == 0:
|
|
81
|
+
expected = "100%" if len(self.experts) == 1 else "51%"
|
|
82
|
+
errors.append(f"Domain '{domain}' has no primary expert ({expected})")
|
|
83
|
+
elif len(primaries) > 1:
|
|
84
|
+
errors.append(
|
|
85
|
+
f"Domain '{domain}' has multiple primary experts: {primaries}"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Check: Each domain column sums to 100%
|
|
89
|
+
for domain in self.domains:
|
|
90
|
+
total = sum(
|
|
91
|
+
expert_weights.get(domain, 0.0)
|
|
92
|
+
for expert_weights in self.weights.values()
|
|
93
|
+
)
|
|
94
|
+
if abs(total - 1.0) > 0.001: # Allow small floating-point errors
|
|
95
|
+
errors.append(
|
|
96
|
+
f"Domain '{domain}' column sum is {total:.3f}, expected 1.000"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Check: Primary weight is 51% (or 100% for single expert)
|
|
100
|
+
for domain in self.domains:
|
|
101
|
+
primary_expert = self.get_primary_expert(domain)
|
|
102
|
+
if primary_expert:
|
|
103
|
+
weight = self.weights[primary_expert][domain]
|
|
104
|
+
# Single expert case: weight should be 1.0
|
|
105
|
+
# Multiple experts case: weight should be 0.51
|
|
106
|
+
expected_weight = 1.0 if len(self.experts) == 1 else 0.51
|
|
107
|
+
if abs(weight - expected_weight) > 0.001:
|
|
108
|
+
errors.append(
|
|
109
|
+
f"Domain '{domain}' primary expert '{primary_expert}' "
|
|
110
|
+
f"has weight {weight:.3f}, expected {expected_weight:.3f}"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Check: Number of domains equals number of experts
|
|
114
|
+
if len(self.domains) != len(self.experts):
|
|
115
|
+
errors.append(
|
|
116
|
+
f"Number of domains ({len(self.domains)}) "
|
|
117
|
+
f"does not equal number of experts ({len(self.experts)})"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
return errors
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class WeightDistributor:
|
|
124
|
+
"""
|
|
125
|
+
Calculates and manages expert weight distribution.
|
|
126
|
+
|
|
127
|
+
Formula:
|
|
128
|
+
- Primary Expert: 51%
|
|
129
|
+
- Each Other Expert: 49% / (N-1)
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
PRIMARY_WEIGHT = 0.51
|
|
133
|
+
OTHER_WEIGHT = 0.49
|
|
134
|
+
|
|
135
|
+
@staticmethod
|
|
136
|
+
def calculate_weights(
|
|
137
|
+
domains: list[str], expert_primary_map: dict[str, str]
|
|
138
|
+
) -> ExpertWeightMatrix:
|
|
139
|
+
"""
|
|
140
|
+
Calculate weight matrix for experts and domains.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
domains: List of domain names
|
|
144
|
+
expert_primary_map: Mapping of expert_id -> primary_domain
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
ExpertWeightMatrix with calculated weights
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
ValueError: If validation fails
|
|
151
|
+
"""
|
|
152
|
+
# Validate: Each domain has exactly one primary expert
|
|
153
|
+
domain_primaries: dict[str, str] = {}
|
|
154
|
+
for expert_id, primary_domain in expert_primary_map.items():
|
|
155
|
+
if primary_domain in domain_primaries:
|
|
156
|
+
raise ValueError(
|
|
157
|
+
f"Domain '{primary_domain}' has multiple primary experts: "
|
|
158
|
+
f"{domain_primaries[primary_domain]} and {expert_id}"
|
|
159
|
+
)
|
|
160
|
+
domain_primaries[primary_domain] = expert_id
|
|
161
|
+
|
|
162
|
+
# Validate: All domains have a primary expert
|
|
163
|
+
missing_domains = set(domains) - set(domain_primaries.keys())
|
|
164
|
+
if missing_domains:
|
|
165
|
+
raise ValueError(f"Domains without primary expert: {missing_domains}")
|
|
166
|
+
|
|
167
|
+
# Validate: All experts are accounted for
|
|
168
|
+
experts = list(expert_primary_map.keys())
|
|
169
|
+
if len(experts) != len(domains):
|
|
170
|
+
raise ValueError(
|
|
171
|
+
f"Number of experts ({len(experts)}) does not equal "
|
|
172
|
+
f"number of domains ({len(domains)})"
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# Calculate weights
|
|
176
|
+
num_experts = len(experts)
|
|
177
|
+
|
|
178
|
+
# Special case: single expert gets 100% weight for their domain
|
|
179
|
+
if num_experts == 1:
|
|
180
|
+
primary_weight = 1.0
|
|
181
|
+
other_weight = 0.0
|
|
182
|
+
else:
|
|
183
|
+
primary_weight = WeightDistributor.PRIMARY_WEIGHT
|
|
184
|
+
other_weight = WeightDistributor.OTHER_WEIGHT / (num_experts - 1)
|
|
185
|
+
|
|
186
|
+
# Round to avoid floating-point issues
|
|
187
|
+
other_weight = float(
|
|
188
|
+
Decimal(str(other_weight)).quantize(
|
|
189
|
+
Decimal("0.001"), rounding=ROUND_HALF_UP
|
|
190
|
+
)
|
|
191
|
+
)
|
|
192
|
+
primary_weight = float(
|
|
193
|
+
Decimal(str(primary_weight)).quantize(
|
|
194
|
+
Decimal("0.001"), rounding=ROUND_HALF_UP
|
|
195
|
+
)
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
weights: dict[str, dict[str, float]] = {}
|
|
199
|
+
|
|
200
|
+
for expert_id in experts:
|
|
201
|
+
expert_weights: dict[str, float] = {}
|
|
202
|
+
|
|
203
|
+
for domain in domains:
|
|
204
|
+
if domain == expert_primary_map[expert_id]:
|
|
205
|
+
# Primary domain: 51% (or 100% for single expert)
|
|
206
|
+
expert_weights[domain] = primary_weight
|
|
207
|
+
else:
|
|
208
|
+
# Other domains: equal share of 49%
|
|
209
|
+
expert_weights[domain] = other_weight
|
|
210
|
+
|
|
211
|
+
weights[expert_id] = expert_weights
|
|
212
|
+
|
|
213
|
+
matrix = ExpertWeightMatrix(weights=weights, domains=domains, experts=experts)
|
|
214
|
+
|
|
215
|
+
# Validate the matrix
|
|
216
|
+
errors = matrix.validate()
|
|
217
|
+
if errors:
|
|
218
|
+
raise ValueError(
|
|
219
|
+
"Weight matrix validation failed:\n"
|
|
220
|
+
+ "\n".join(f" - {e}" for e in errors)
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
return matrix
|
|
224
|
+
|
|
225
|
+
@staticmethod
|
|
226
|
+
def recalculate_on_domain_add(
|
|
227
|
+
current_matrix: ExpertWeightMatrix, new_domain: str, new_expert_id: str
|
|
228
|
+
) -> ExpertWeightMatrix:
|
|
229
|
+
"""
|
|
230
|
+
Recalculate weights when a new domain/expert is added.
|
|
231
|
+
|
|
232
|
+
When adding a new domain:
|
|
233
|
+
1. Add new expert as primary for new domain (51%)
|
|
234
|
+
2. Recalculate all existing weights:
|
|
235
|
+
- Primary: Still 51%
|
|
236
|
+
- Others: 49% / (new_total_experts - 1)
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
current_matrix: Current weight matrix
|
|
240
|
+
new_domain: New domain to add
|
|
241
|
+
new_expert_id: New expert to add (primary for new domain)
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
Updated ExpertWeightMatrix
|
|
245
|
+
"""
|
|
246
|
+
if new_domain in current_matrix.domains:
|
|
247
|
+
raise ValueError(f"Domain '{new_domain}' already exists")
|
|
248
|
+
|
|
249
|
+
if new_expert_id in current_matrix.experts:
|
|
250
|
+
raise ValueError(f"Expert '{new_expert_id}' already exists")
|
|
251
|
+
|
|
252
|
+
# Build new expert-primary mapping
|
|
253
|
+
expert_primary_map = {}
|
|
254
|
+
for expert_id in current_matrix.experts:
|
|
255
|
+
primary_domain = current_matrix.get_primary_expert_domain(expert_id)
|
|
256
|
+
if primary_domain:
|
|
257
|
+
expert_primary_map[expert_id] = primary_domain
|
|
258
|
+
|
|
259
|
+
# Add new expert-domain pair
|
|
260
|
+
expert_primary_map[new_expert_id] = new_domain
|
|
261
|
+
|
|
262
|
+
# Recalculate with all domains (including new one)
|
|
263
|
+
new_domains = current_matrix.domains + [new_domain]
|
|
264
|
+
|
|
265
|
+
return WeightDistributor.calculate_weights(new_domains, expert_primary_map)
|
|
266
|
+
|
|
267
|
+
@staticmethod
|
|
268
|
+
def format_matrix(matrix: ExpertWeightMatrix) -> str:
|
|
269
|
+
"""
|
|
270
|
+
Format weight matrix as a readable table.
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
Formatted string representation
|
|
274
|
+
"""
|
|
275
|
+
lines = []
|
|
276
|
+
|
|
277
|
+
# Header
|
|
278
|
+
header = "Expert/Domain".ljust(25)
|
|
279
|
+
for domain in matrix.domains:
|
|
280
|
+
header += domain[:15].ljust(18)
|
|
281
|
+
lines.append(header)
|
|
282
|
+
lines.append("-" * len(header))
|
|
283
|
+
|
|
284
|
+
# Rows
|
|
285
|
+
for expert_id in matrix.experts:
|
|
286
|
+
row = expert_id[:24].ljust(25)
|
|
287
|
+
for domain in matrix.domains:
|
|
288
|
+
weight = matrix.get_expert_weight(expert_id, domain)
|
|
289
|
+
marker = "▲" if weight >= 0.51 else " "
|
|
290
|
+
row += f"{marker} {weight:.3f}".ljust(18)
|
|
291
|
+
lines.append(row)
|
|
292
|
+
|
|
293
|
+
# Column totals
|
|
294
|
+
totals_row = "TOTAL".ljust(25)
|
|
295
|
+
for domain in matrix.domains:
|
|
296
|
+
total = sum(
|
|
297
|
+
matrix.get_expert_weight(expert_id, domain)
|
|
298
|
+
for expert_id in matrix.experts
|
|
299
|
+
)
|
|
300
|
+
totals_row += f"{total:.3f}".ljust(18)
|
|
301
|
+
lines.append("-" * len(header))
|
|
302
|
+
lines.append(totals_row)
|
|
303
|
+
|
|
304
|
+
return "\n".join(lines)
|
tapps_agents/health/__init__.py
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Health Check System for TappsCodingAgents.
|
|
3
|
-
|
|
4
|
-
Provides comprehensive health checks across environment, execution, cache,
|
|
5
|
-
knowledge base, governance, and outcome dimensions.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from .base import HealthCheck, HealthCheckResult
|
|
9
|
-
from .collector import HealthMetricsCollector
|
|
10
|
-
from .dashboard import HealthDashboard
|
|
11
|
-
from .metrics import HealthMetric
|
|
12
|
-
from .orchestrator import HealthOrchestrator
|
|
13
|
-
from .registry import HealthCheckRegistry
|
|
14
|
-
|
|
15
|
-
__all__ = [
|
|
16
|
-
"HealthCheck",
|
|
17
|
-
"HealthCheckResult",
|
|
18
|
-
"HealthMetric",
|
|
19
|
-
"HealthMetricsCollector",
|
|
20
|
-
"HealthDashboard",
|
|
21
|
-
"HealthOrchestrator",
|
|
22
|
-
"HealthCheckRegistry",
|
|
23
|
-
]
|
|
24
|
-
|
|
1
|
+
"""
|
|
2
|
+
Health Check System for TappsCodingAgents.
|
|
3
|
+
|
|
4
|
+
Provides comprehensive health checks across environment, execution, cache,
|
|
5
|
+
knowledge base, governance, and outcome dimensions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .base import HealthCheck, HealthCheckResult
|
|
9
|
+
from .collector import HealthMetricsCollector
|
|
10
|
+
from .dashboard import HealthDashboard
|
|
11
|
+
from .metrics import HealthMetric
|
|
12
|
+
from .orchestrator import HealthOrchestrator
|
|
13
|
+
from .registry import HealthCheckRegistry
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"HealthCheck",
|
|
17
|
+
"HealthCheckResult",
|
|
18
|
+
"HealthMetric",
|
|
19
|
+
"HealthMetricsCollector",
|
|
20
|
+
"HealthDashboard",
|
|
21
|
+
"HealthOrchestrator",
|
|
22
|
+
"HealthCheckRegistry",
|
|
23
|
+
]
|
|
24
|
+
|