core-runtime 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (962) hide show
  1. api/__init__.py +4 -0
  2. api/cli/__init__.py +10 -0
  3. api/cli/audit_client.py +92 -0
  4. api/cli/census_client.py +77 -0
  5. api/cli/client.py +508 -0
  6. api/cli/coverage_client.py +121 -0
  7. api/cli/daemon_client.py +42 -0
  8. api/cli/fix_client.py +101 -0
  9. api/cli/inspect_client.py +143 -0
  10. api/cli/integration_client.py +42 -0
  11. api/cli/integrity_client.py +45 -0
  12. api/cli/proposals_client.py +101 -0
  13. api/cli/quality_client.py +83 -0
  14. api/cli/refactor_client.py +82 -0
  15. api/cli/sync_client.py +106 -0
  16. api/dependencies.py +37 -0
  17. api/errors.py +74 -0
  18. api/main.py +88 -0
  19. api/v1/__init__.py +4 -0
  20. api/v1/audit_routes.py +302 -0
  21. api/v1/census_routes.py +207 -0
  22. api/v1/coverage_routes.py +352 -0
  23. api/v1/daemon_routes.py +86 -0
  24. api/v1/development_routes.py +70 -0
  25. api/v1/fix_routes.py +428 -0
  26. api/v1/inspect_routes.py +220 -0
  27. api/v1/integration_routes.py +56 -0
  28. api/v1/integrity_routes.py +72 -0
  29. api/v1/knowledge_routes.py +36 -0
  30. api/v1/lint_routes.py +40 -0
  31. api/v1/proposals_routes.py +267 -0
  32. api/v1/quality_routes.py +272 -0
  33. api/v1/refactor_routes.py +225 -0
  34. api/v1/sync_routes.py +261 -0
  35. body/__init__.py +4 -0
  36. body/analyzers/__init__.py +25 -0
  37. body/analyzers/base_analyzer.py +28 -0
  38. body/analyzers/constitutional_path_analyzer.py +63 -0
  39. body/analyzers/file_analyzer.py +211 -0
  40. body/analyzers/knowledge_graph_analyzer.py +86 -0
  41. body/analyzers/prompt_analyzer.py +155 -0
  42. body/analyzers/symbol_extractor.py +280 -0
  43. body/atomic/__init__.py +74 -0
  44. body/atomic/build_tests_action.py +354 -0
  45. body/atomic/check_actions.py +142 -0
  46. body/atomic/crate_ops.py +59 -0
  47. body/atomic/executor.py +470 -0
  48. body/atomic/file_ops.py +153 -0
  49. body/atomic/fix_actions.py +1142 -0
  50. body/atomic/import_resolver.py +200 -0
  51. body/atomic/metadata_ops.py +161 -0
  52. body/atomic/modularity_fix.py +839 -0
  53. body/atomic/modularity_splitter.py +521 -0
  54. body/atomic/proposal_lifecycle_actions.py +171 -0
  55. body/atomic/registry.py +326 -0
  56. body/atomic/remediate_cognitive_role.py +104 -0
  57. body/atomic/sandbox_lifecycle.py +252 -0
  58. body/atomic/split_plan.py +155 -0
  59. body/atomic/sync_actions/__init__.py +22 -0
  60. body/atomic/sync_actions/chunking_helpers.py +218 -0
  61. body/atomic/sync_actions/sync_actions.py +431 -0
  62. body/atomic/test_actions.py +47 -0
  63. body/autonomy/__init__.py +16 -0
  64. body/autonomy/audit_analyzer.py +343 -0
  65. body/autonomy/micro_proposal_executor.py +316 -0
  66. body/crate_processing/canary_executor.py +144 -0
  67. body/evaluators/__init__.py +27 -0
  68. body/evaluators/atomic_actions_evaluator.py +162 -0
  69. body/evaluators/atomic_actions_format.py +45 -0
  70. body/evaluators/atomic_actions_rules.py +278 -0
  71. body/evaluators/base_evaluator.py +67 -0
  72. body/evaluators/clarity_evaluator.py +83 -0
  73. body/evaluators/constitutional_evaluator.py +227 -0
  74. body/evaluators/failure_evaluator.py +136 -0
  75. body/evaluators/performance_evaluator.py +341 -0
  76. body/evaluators/security_evaluator.py +393 -0
  77. body/flows/__init__.py +33 -0
  78. body/flows/executor.py +275 -0
  79. body/flows/registry.py +272 -0
  80. body/flows/result.py +113 -0
  81. body/governance/__init__.py +29 -0
  82. body/governance/body_contracts_service.py +317 -0
  83. body/governance/code_validator.py +118 -0
  84. body/governance/engine_dispatcher.py +128 -0
  85. body/governance/intent_guard.py +592 -0
  86. body/governance/intent_pattern_validators.py +197 -0
  87. body/governance/key_management_service.py +100 -0
  88. body/governance/path_validator.py +187 -0
  89. body/governance/remediation_service.py +263 -0
  90. body/governance/runtime_validator.py +184 -0
  91. body/infrastructure/bootstrap.py +135 -0
  92. body/infrastructure/lifespan.py +85 -0
  93. body/infrastructure/repositories/__init__.py +1 -0
  94. body/infrastructure/repositories/decision_trace_repository.py +210 -0
  95. body/infrastructure/repositories/refusal_repository.py +294 -0
  96. body/introspection/__init__.py +4 -0
  97. body/introspection/capability_discovery_service.py +107 -0
  98. body/introspection/discovery/from_kgb.py +33 -0
  99. body/introspection/discovery/from_source_scan.py +40 -0
  100. body/introspection/discovery/loader.py +62 -0
  101. body/introspection/discovery/registry.py +22 -0
  102. body/introspection/discovery/semantics.py +21 -0
  103. body/introspection/discovery/sync.py +47 -0
  104. body/introspection/drift_detector.py +81 -0
  105. body/introspection/drift_service.py +48 -0
  106. body/introspection/export_vectors.py +133 -0
  107. body/introspection/generate_capability_docs.py +130 -0
  108. body/introspection/generate_correction_map.py +98 -0
  109. body/introspection/graph_analysis_service.py +66 -0
  110. body/introspection/knowledge_graph_service.py +170 -0
  111. body/introspection/semantic_clusterer.py +128 -0
  112. body/introspection/symbol_index_builder.py +244 -0
  113. body/introspection/sync/engine.py +92 -0
  114. body/introspection/sync/scanner.py +56 -0
  115. body/introspection/sync/visitor.py +83 -0
  116. body/introspection/sync_service.py +62 -0
  117. body/invokers/__init__.py +4 -0
  118. body/invokers/capability_invoker.py +4 -0
  119. body/maintenance/command_sync_service.py +73 -0
  120. body/maintenance/dotenv_sync_service.py +99 -0
  121. body/maintenance/idempotency_harness.py +70 -0
  122. body/maintenance/maintenance_service.py +123 -0
  123. body/maintenance/memory_cleanup_service.py +131 -0
  124. body/maintenance/refactor_settings_access.py +274 -0
  125. body/maintenance/scripts/__init__.py +5 -0
  126. body/maintenance/scripts/context_export.py +278 -0
  127. body/maintenance/scripts/vector_verify.py +73 -0
  128. body/maintenance/sync_vectors.py +338 -0
  129. body/models/__init__.py +4 -0
  130. body/project_lifecycle/__init__.py +4 -0
  131. body/project_lifecycle/bootstrap_service.py +157 -0
  132. body/project_lifecycle/definition_service.py +264 -0
  133. body/project_lifecycle/integration_service.py +113 -0
  134. body/project_lifecycle/scaffolding_service.py +187 -0
  135. body/quality/coverage_analyzer.py +177 -0
  136. body/repositories/__init__.py +4 -0
  137. body/self_healing/atomic_actions_fixer.py +113 -0
  138. body/self_healing/body_ui_fixer.py +193 -0
  139. body/self_healing/capability_parser.py +65 -0
  140. body/self_healing/code_style_service.py +51 -0
  141. body/self_healing/complexity_filter.py +70 -0
  142. body/self_healing/docstring_service.py +345 -0
  143. body/self_healing/duplicate_id_service.py +407 -0
  144. body/self_healing/duplicates_service.py +165 -0
  145. body/self_healing/handlers/__init__.py +1 -0
  146. body/self_healing/handlers/id_assignment_handler.py +201 -0
  147. body/self_healing/handlers/import_sorting_handler.py +181 -0
  148. body/self_healing/header_service.py +308 -0
  149. body/self_healing/id_tagging_service.py +227 -0
  150. body/self_healing/knowledge_consolidation_service.py +80 -0
  151. body/self_healing/logging_service.py +292 -0
  152. body/self_healing/owner_tagging_service.py +5 -0
  153. body/self_healing/placeholder_fixer_service.py +27 -0
  154. body/self_healing/prune_private_capabilities.py +144 -0
  155. body/self_healing/purge_legacy_tags_service.py +146 -0
  156. body/self_healing/remediation_models.py +238 -0
  157. body/self_healing/test_context/__init__.py +10 -0
  158. body/self_healing/test_context/detectors.py +74 -0
  159. body/self_healing/test_context/examples.py +53 -0
  160. body/self_healing/test_context/formatter.py +65 -0
  161. body/self_healing/test_context/metrics.py +62 -0
  162. body/self_healing/test_context/models.py +83 -0
  163. body/self_healing/test_context/parsers.py +70 -0
  164. body/self_healing/test_context_analyzer.py +79 -0
  165. body/self_healing/test_failure_analyzer.py +259 -0
  166. body/self_healing/test_target_analyzer.py +118 -0
  167. body/self_healing/vulture_healer.py +161 -0
  168. body/services/__init__.py +4 -0
  169. body/services/artifact_service.py +155 -0
  170. body/services/blackboard_service/__init__.py +22 -0
  171. body/services/blackboard_service/blackboard_claim_service.py +216 -0
  172. body/services/blackboard_service/blackboard_proposal_service.py +305 -0
  173. body/services/blackboard_service/blackboard_query_service.py +333 -0
  174. body/services/blackboard_service/blackboard_service.py +602 -0
  175. body/services/capabilities.py +51 -0
  176. body/services/cim/__init__.py +22 -0
  177. body/services/cim/baselines.py +102 -0
  178. body/services/cim/census_service.py +190 -0
  179. body/services/cim/cim_constants.py +116 -0
  180. body/services/cim/cim_path_utils.py +123 -0
  181. body/services/cim/diff.py +152 -0
  182. body/services/cim/history.py +94 -0
  183. body/services/cim/models.py +319 -0
  184. body/services/cim/policy.py +149 -0
  185. body/services/cim/scanners.py +332 -0
  186. body/services/coherence_service.py +552 -0
  187. body/services/consequence_log_service.py +189 -0
  188. body/services/constitutional_rule_loader.py +141 -0
  189. body/services/constitutional_validator.py +366 -0
  190. body/services/crate_creation_service.py +217 -0
  191. body/services/crate_processing_service.py +279 -0
  192. body/services/crawl_service/__init__.py +10 -0
  193. body/services/crawl_service/main_module.py +531 -0
  194. body/services/crawl_service/orchestrator.py +452 -0
  195. body/services/crawl_service/symbol_processing.py +279 -0
  196. body/services/database_service.py +242 -0
  197. body/services/doc_service.py +57 -0
  198. body/services/file_service.py +260 -0
  199. body/services/governance_claims_service.py +240 -0
  200. body/services/governance_init.py +41 -0
  201. body/services/health_log_service.py +167 -0
  202. body/services/intent_schema_validator.py +211 -0
  203. body/services/llm_client.py +87 -0
  204. body/services/mind_state_service.py +129 -0
  205. body/services/policy_expression_evaluator.py +154 -0
  206. body/services/proposal_supervision_service.py +187 -0
  207. body/services/representation_coherence_service.py +209 -0
  208. body/services/service_registry.py +431 -0
  209. body/services/session_attached_service.py +51 -0
  210. body/services/symbol_query_service.py +218 -0
  211. body/services/symbol_service.py +94 -0
  212. body/services/validation/__init__.py +14 -0
  213. body/services/validation/python_validator.py +89 -0
  214. body/services/validation/validation_policies.py +121 -0
  215. body/services/worker_registry_service.py +184 -0
  216. body/validators/__init__.py +1 -0
  217. body/validators/logic_conservation_validator.py +201 -0
  218. body/workers/call_site_rewriter.py +527 -0
  219. body/workers/prompt_artifact_writer.py +323 -0
  220. cli/__init__.py +4 -0
  221. cli/admin_cli.py +98 -0
  222. cli/cli_user.py +121 -0
  223. cli/commands/__init__.py +4 -0
  224. cli/commands/audit_reporter.py +272 -0
  225. cli/commands/check/__init__.py +115 -0
  226. cli/commands/check/audit.py +130 -0
  227. cli/commands/check/converters.py +129 -0
  228. cli/commands/check/diagnostics_commands.py +70 -0
  229. cli/commands/check/formatters.py +310 -0
  230. cli/commands/check/imports.py +73 -0
  231. cli/commands/check/quality.py +71 -0
  232. cli/commands/check/quality_gates.py +107 -0
  233. cli/commands/check/rule.py +136 -0
  234. cli/commands/check/utils.py +28 -0
  235. cli/commands/check_atomic_actions.py +167 -0
  236. cli/commands/components.py +66 -0
  237. cli/commands/coverage/__init__.py +22 -0
  238. cli/commands/coverage/analysis_commands.py +87 -0
  239. cli/commands/coverage/check_commands.py +173 -0
  240. cli/commands/coverage/generation_commands.py +155 -0
  241. cli/commands/coverage/services/__init__.py +15 -0
  242. cli/commands/coverage/services/coverage_checker.py +50 -0
  243. cli/commands/coverage/services/coverage_reporter.py +81 -0
  244. cli/commands/coverage/services/gaps_analyzer.py +114 -0
  245. cli/commands/daemon.py +908 -0
  246. cli/commands/develop.py +127 -0
  247. cli/commands/diagnostics.py +32 -0
  248. cli/commands/fix/__init__.py +84 -0
  249. cli/commands/fix/all_commands.py +94 -0
  250. cli/commands/fix/atomic_actions.py +48 -0
  251. cli/commands/fix/audit.py +146 -0
  252. cli/commands/fix/body_ui.py +93 -0
  253. cli/commands/fix/code_style.py +52 -0
  254. cli/commands/fix/db_tools.py +90 -0
  255. cli/commands/fix/fix_ir.py +79 -0
  256. cli/commands/fix/handler_discovery.py +54 -0
  257. cli/commands/fix/imports.py +55 -0
  258. cli/commands/fix/list_commands.py +54 -0
  259. cli/commands/fix/metadata.py +160 -0
  260. cli/commands/fix/modularity.py +88 -0
  261. cli/commands/fix/settings_access.py +65 -0
  262. cli/commands/fix_governed.py +103 -0
  263. cli/commands/fix_logging.py +24 -0
  264. cli/commands/governance.py +294 -0
  265. cli/commands/guard.py +125 -0
  266. cli/commands/inspect/__init__.py +79 -0
  267. cli/commands/inspect/_helpers.py +226 -0
  268. cli/commands/inspect/analysis.py +158 -0
  269. cli/commands/inspect/decisions.py +140 -0
  270. cli/commands/inspect/diagnostics.py +126 -0
  271. cli/commands/inspect/drift.py +100 -0
  272. cli/commands/inspect/patterns.py +102 -0
  273. cli/commands/inspect/refusals.py +211 -0
  274. cli/commands/inspect/repo_census.py +175 -0
  275. cli/commands/inspect/status.py +48 -0
  276. cli/commands/interactive_test.py +85 -0
  277. cli/commands/mind.py +49 -0
  278. cli/commands/refactor.py +234 -0
  279. cli/commands/refactor_support/__init__.py +7 -0
  280. cli/commands/refactor_support/analyzer.py +107 -0
  281. cli/commands/refactor_support/config.py +67 -0
  282. cli/commands/refactor_support/display.py +170 -0
  283. cli/commands/refactor_support/recommendations.py +55 -0
  284. cli/commands/run.py +60 -0
  285. cli/commands/search.py +103 -0
  286. cli/commands/status.py +86 -0
  287. cli/commands/submit.py +23 -0
  288. cli/interactive.py +177 -0
  289. cli/logic/__init__.py +7 -0
  290. cli/logic/agent.py +110 -0
  291. cli/logic/audit_capability_domains.py +106 -0
  292. cli/logic/audit_renderer.py +150 -0
  293. cli/logic/autonomy/actions.py +36 -0
  294. cli/logic/autonomy/views.py +116 -0
  295. cli/logic/body_contracts_checker.py +23 -0
  296. cli/logic/build.py +27 -0
  297. cli/logic/byor.py +148 -0
  298. cli/logic/capability.py +27 -0
  299. cli/logic/cli_utils.py +210 -0
  300. cli/logic/context.py +7 -0
  301. cli/logic/db.py +154 -0
  302. cli/logic/db_manage.py +22 -0
  303. cli/logic/decision_inspect_logic.py +62 -0
  304. cli/logic/diagnostics.py +148 -0
  305. cli/logic/diagnostics_policy.py +100 -0
  306. cli/logic/diagnostics_registry.py +165 -0
  307. cli/logic/duplicates.py +19 -0
  308. cli/logic/embeddings_cli.py +43 -0
  309. cli/logic/governance/__init__.py +16 -0
  310. cli/logic/governance/engine.py +216 -0
  311. cli/logic/governance/forensics_service.py +67 -0
  312. cli/logic/governance/limb_status_service.py +83 -0
  313. cli/logic/governance/renderer.py +115 -0
  314. cli/logic/governance/traceability_service.py +78 -0
  315. cli/logic/governance_logic.py +33 -0
  316. cli/logic/hub/__init__.py +14 -0
  317. cli/logic/hub/app.py +107 -0
  318. cli/logic/hub/formatter.py +29 -0
  319. cli/logic/hub/introspection.py +20 -0
  320. cli/logic/hub/repository.py +17 -0
  321. cli/logic/init.py +22 -0
  322. cli/logic/interactive_test/__init__.py +21 -0
  323. cli/logic/interactive_test/session.py +102 -0
  324. cli/logic/interactive_test/steps/__init__.py +23 -0
  325. cli/logic/interactive_test/steps/execution.py +53 -0
  326. cli/logic/interactive_test/steps/generation.py +88 -0
  327. cli/logic/interactive_test/steps/healing.py +79 -0
  328. cli/logic/interactive_test/steps/utils.py +31 -0
  329. cli/logic/interactive_test/steps/verification.py +71 -0
  330. cli/logic/interactive_test/ui.py +203 -0
  331. cli/logic/interactive_test/workflow.py +168 -0
  332. cli/logic/interactive_test_logic.py +41 -0
  333. cli/logic/knowledge.py +47 -0
  334. cli/logic/legacy_scan_logic.py +306 -0
  335. cli/logic/list_audits.py +49 -0
  336. cli/logic/log_audit.py +53 -0
  337. cli/logic/new.py +8 -0
  338. cli/logic/project_docs.py +28 -0
  339. cli/logic/reconcile.py +127 -0
  340. cli/logic/refusal_inspect_logic.py +208 -0
  341. cli/logic/report.py +47 -0
  342. cli/logic/status.py +47 -0
  343. cli/logic/symbol_drift.py +77 -0
  344. cli/logic/sync.py +48 -0
  345. cli/logic/sync_domains.py +72 -0
  346. cli/logic/sync_manifest.py +31 -0
  347. cli/logic/tools.py +133 -0
  348. cli/logic/utils_migration.py +43 -0
  349. cli/logic/validate.py +107 -0
  350. cli/logic/vector_drift.py +109 -0
  351. cli/logic/yaml_processor.py +5 -0
  352. cli/renderers/audit_detail.py +37 -0
  353. cli/renderers/audit_overview.py +39 -0
  354. cli/resources/__init__.py +27 -0
  355. cli/resources/admin/__init__.py +23 -0
  356. cli/resources/admin/coverage.py +63 -0
  357. cli/resources/admin/debt_scan.py +195 -0
  358. cli/resources/admin/forensics.py +97 -0
  359. cli/resources/admin/health.py +66 -0
  360. cli/resources/admin/hub.py +9 -0
  361. cli/resources/admin/meta.py +47 -0
  362. cli/resources/admin/patterns.py +28 -0
  363. cli/resources/admin/refusals.py +31 -0
  364. cli/resources/admin/self_check.py +175 -0
  365. cli/resources/admin/status.py +66 -0
  366. cli/resources/admin/summary.py +67 -0
  367. cli/resources/admin/traces.py +46 -0
  368. cli/resources/admin/validate_env.py +56 -0
  369. cli/resources/code/__init__.py +31 -0
  370. cli/resources/code/actions.py +48 -0
  371. cli/resources/code/audit.py +416 -0
  372. cli/resources/code/audit_duplicates.py +22 -0
  373. cli/resources/code/check_imports.py +75 -0
  374. cli/resources/code/check_ui.py +62 -0
  375. cli/resources/code/clarity.py +51 -0
  376. cli/resources/code/complexity.py +55 -0
  377. cli/resources/code/docstrings.py +51 -0
  378. cli/resources/code/fix_atomic.py +51 -0
  379. cli/resources/code/format.py +62 -0
  380. cli/resources/code/hub.py +10 -0
  381. cli/resources/code/integrity.py +75 -0
  382. cli/resources/code/lint.py +37 -0
  383. cli/resources/code/logging.py +49 -0
  384. cli/resources/code/refactor.py +32 -0
  385. cli/resources/code/test.py +30 -0
  386. cli/resources/coherence/__init__.py +13 -0
  387. cli/resources/coherence/check.py +111 -0
  388. cli/resources/coherence/hub.py +13 -0
  389. cli/resources/coherence/repair_counts.py +73 -0
  390. cli/resources/coherence/report.py +144 -0
  391. cli/resources/coherence/seed.py +297 -0
  392. cli/resources/coherence/supersede.py +124 -0
  393. cli/resources/coherence/triage.py +81 -0
  394. cli/resources/constitution/__init__.py +19 -0
  395. cli/resources/constitution/audit.py +49 -0
  396. cli/resources/constitution/query.py +45 -0
  397. cli/resources/constitution/status.py +34 -0
  398. cli/resources/constitution/validate.py +36 -0
  399. cli/resources/context/__init__.py +21 -0
  400. cli/resources/context/build.py +374 -0
  401. cli/resources/context/cache.py +156 -0
  402. cli/resources/context/explain.py +140 -0
  403. cli/resources/context/hub.py +11 -0
  404. cli/resources/context/search.py +114 -0
  405. cli/resources/database/__init__.py +13 -0
  406. cli/resources/database/cleanup.py +107 -0
  407. cli/resources/database/export.py +61 -0
  408. cli/resources/database/hub.py +11 -0
  409. cli/resources/database/migrate.py +57 -0
  410. cli/resources/database/status.py +101 -0
  411. cli/resources/database/sync.py +84 -0
  412. cli/resources/database/sync_env.py +76 -0
  413. cli/resources/database/sync_registry.py +48 -0
  414. cli/resources/dev/__init__.py +14 -0
  415. cli/resources/dev/hub.py +11 -0
  416. cli/resources/dev/refactor.py +92 -0
  417. cli/resources/dev/stability.py +60 -0
  418. cli/resources/dev/strategic_audit.py +113 -0
  419. cli/resources/dev/sync.py +51 -0
  420. cli/resources/dev/test.py +34 -0
  421. cli/resources/intent/__init__.py +11 -0
  422. cli/resources/intent/hub.py +9 -0
  423. cli/resources/intent/sync_vocabulary.py +396 -0
  424. cli/resources/project/__init__.py +19 -0
  425. cli/resources/project/docs.py +41 -0
  426. cli/resources/project/new.py +40 -0
  427. cli/resources/project/onboard.py +31 -0
  428. cli/resources/proposals/__init__.py +28 -0
  429. cli/resources/proposals/create.py +82 -0
  430. cli/resources/proposals/integrate.py +49 -0
  431. cli/resources/proposals/list.py +76 -0
  432. cli/resources/proposals/manage.py +117 -0
  433. cli/resources/runtime/__init__.py +9 -0
  434. cli/resources/runtime/health.py +925 -0
  435. cli/resources/secrets/__init__.py +10 -0
  436. cli/resources/secrets/hub.py +9 -0
  437. cli/resources/secrets/manage.py +309 -0
  438. cli/resources/symbols/__init__.py +13 -0
  439. cli/resources/symbols/audit.py +46 -0
  440. cli/resources/symbols/fix_ids.py +43 -0
  441. cli/resources/symbols/hub.py +11 -0
  442. cli/resources/symbols/resolve_duplicates.py +30 -0
  443. cli/resources/symbols/sync.py +39 -0
  444. cli/resources/symbols/tag.py +47 -0
  445. cli/resources/vectors/__init__.py +11 -0
  446. cli/resources/vectors/cleanup.py +95 -0
  447. cli/resources/vectors/hub.py +9 -0
  448. cli/resources/vectors/query.py +105 -0
  449. cli/resources/vectors/status.py +30 -0
  450. cli/resources/vectors/sync.py +57 -0
  451. cli/resources/vectors/sync_code.py +67 -0
  452. cli/resources/workers/__init__.py +13 -0
  453. cli/resources/workers/blackboard.py +253 -0
  454. cli/resources/workers/remediate.py +337 -0
  455. cli/resources/workers/run.py +140 -0
  456. cli/utils/__init__.py +32 -0
  457. cli/utils/annotation_formatter.py +154 -0
  458. cli/utils/decorators.py +184 -0
  459. cli/utils/display.py +79 -0
  460. cli/utils/exit_codes.py +59 -0
  461. cli/utils/helpers.py +34 -0
  462. cli/utils/prompts.py +21 -0
  463. core_runtime-0.1.1.dist-info/LICENSE +21 -0
  464. core_runtime-0.1.1.dist-info/METADATA +346 -0
  465. core_runtime-0.1.1.dist-info/RECORD +962 -0
  466. core_runtime-0.1.1.dist-info/WHEEL +4 -0
  467. core_runtime-0.1.1.dist-info/entry_points.txt +4 -0
  468. mind/__init__.py +4 -0
  469. mind/coherence/__init__.py +1 -0
  470. mind/coherence/checker.py +314 -0
  471. mind/coherence/checks/__init__.py +4 -0
  472. mind/coherence/checks/base.py +34 -0
  473. mind/coherence/checks/r1_scoped.py +228 -0
  474. mind/coherence/checks/row2_grounding.py +69 -0
  475. mind/coherence/checks/row3_citation.py +119 -0
  476. mind/coherence/checks/row4_naming.py +126 -0
  477. mind/coherence/checks/sameconcern.py +136 -0
  478. mind/coherence/checks/specgap.py +233 -0
  479. mind/coherence/checks/vocabulary.py +112 -0
  480. mind/coherence/llm_judge.py +207 -0
  481. mind/enforcement/audit.py +78 -0
  482. mind/governance/__init__.py +22 -0
  483. mind/governance/assumption_extractor.py +326 -0
  484. mind/governance/audit_context.py +520 -0
  485. mind/governance/audit_postprocessor.py +36 -0
  486. mind/governance/audit_report_writer.py +46 -0
  487. mind/governance/audit_types.py +98 -0
  488. mind/governance/auditor.py +179 -0
  489. mind/governance/authority_package_builder.py +502 -0
  490. mind/governance/constitutional_auditor_dynamic.py +362 -0
  491. mind/governance/enforcement/__init__.py +24 -0
  492. mind/governance/enforcement_loader.py +245 -0
  493. mind/governance/enforcement_methods.py +28 -0
  494. mind/governance/entry_point_policy.py +62 -0
  495. mind/governance/executable_rule.py +127 -0
  496. mind/governance/filtered_audit.py +272 -0
  497. mind/governance/finding_processor.py +76 -0
  498. mind/governance/meta_validator.py +259 -0
  499. mind/governance/micro_proposal_validator.py +169 -0
  500. mind/governance/policy_coverage_service.py +183 -0
  501. mind/governance/policy_rule.py +94 -0
  502. mind/governance/rule_conflict_detector.py +127 -0
  503. mind/governance/rule_executor.py +306 -0
  504. mind/governance/rule_extractor.py +376 -0
  505. mind/governance/stateless_audit.py +206 -0
  506. mind/governance/violation_report.py +136 -0
  507. mind/logic/engines/_knowledge_gate_duplication.py +117 -0
  508. mind/logic/engines/action_gate.py +76 -0
  509. mind/logic/engines/artifact_gate.py +1168 -0
  510. mind/logic/engines/ast_gate/__init__.py +9 -0
  511. mind/logic/engines/ast_gate/base.py +263 -0
  512. mind/logic/engines/ast_gate/checks/__init__.py +35 -0
  513. mind/logic/engines/ast_gate/checks/async_checks.py +276 -0
  514. mind/logic/engines/ast_gate/checks/capability_checks.py +197 -0
  515. mind/logic/engines/ast_gate/checks/conservation_checks.py +126 -0
  516. mind/logic/engines/ast_gate/checks/generic_checks.py +244 -0
  517. mind/logic/engines/ast_gate/checks/import_checks.py +164 -0
  518. mind/logic/engines/ast_gate/checks/knowledge_source_check.py +88 -0
  519. mind/logic/engines/ast_gate/checks/logging_checks.py +133 -0
  520. mind/logic/engines/ast_gate/checks/metadata_checks.py +242 -0
  521. mind/logic/engines/ast_gate/checks/modularity_checks.py +436 -0
  522. mind/logic/engines/ast_gate/checks/naming_checks.py +120 -0
  523. mind/logic/engines/ast_gate/checks/prompt_model_checks.py +83 -0
  524. mind/logic/engines/ast_gate/checks/protected_namespace_access_check.py +298 -0
  525. mind/logic/engines/ast_gate/checks/purity_checks.py +421 -0
  526. mind/logic/engines/ast_gate/checks/purity_enforcement_check.py +56 -0
  527. mind/logic/engines/ast_gate/checks/runtime_import_boundary.py +198 -0
  528. mind/logic/engines/ast_gate/checks/schema_conformance_checks.py +130 -0
  529. mind/logic/engines/ast_gate/engine.py +317 -0
  530. mind/logic/engines/ast_gate.py +19 -0
  531. mind/logic/engines/base.py +106 -0
  532. mind/logic/engines/cli_gate/__init__.py +25 -0
  533. mind/logic/engines/cli_gate/base_check.py +45 -0
  534. mind/logic/engines/cli_gate/checks/__init__.py +31 -0
  535. mind/logic/engines/cli_gate/checks/async_execution.py +65 -0
  536. mind/logic/engines/cli_gate/checks/dangerous_explicit.py +60 -0
  537. mind/logic/engines/cli_gate/checks/discovery_strict.py +167 -0
  538. mind/logic/engines/cli_gate/checks/help_required.py +43 -0
  539. mind/logic/engines/cli_gate/checks/no_duplicates.py +57 -0
  540. mind/logic/engines/cli_gate/checks/no_layer_exposure.py +48 -0
  541. mind/logic/engines/cli_gate/checks/resource_first.py +58 -0
  542. mind/logic/engines/cli_gate/checks/standard_verbs.py +50 -0
  543. mind/logic/engines/cli_gate/engine.py +211 -0
  544. mind/logic/engines/glob_gate.py +214 -0
  545. mind/logic/engines/knowledge_gate.py +410 -0
  546. mind/logic/engines/llm_gate.py +407 -0
  547. mind/logic/engines/llm_gate_stub.py +67 -0
  548. mind/logic/engines/passive_gate.py +45 -0
  549. mind/logic/engines/regex_gate.py +97 -0
  550. mind/logic/engines/registry.py +134 -0
  551. mind/logic/engines/runtime_gate.py +265 -0
  552. mind/logic/engines/taxonomy_gate.py +229 -0
  553. mind/logic/engines/workflow_gate/__init__.py +22 -0
  554. mind/logic/engines/workflow_gate/base_check.py +42 -0
  555. mind/logic/engines/workflow_gate/checks/__init__.py +32 -0
  556. mind/logic/engines/workflow_gate/checks/alignment.py +93 -0
  557. mind/logic/engines/workflow_gate/checks/audit.py +80 -0
  558. mind/logic/engines/workflow_gate/checks/canary.py +47 -0
  559. mind/logic/engines/workflow_gate/checks/coverage.py +74 -0
  560. mind/logic/engines/workflow_gate/checks/dead_code.py +53 -0
  561. mind/logic/engines/workflow_gate/checks/import_resolution.py +97 -0
  562. mind/logic/engines/workflow_gate/checks/linter.py +104 -0
  563. mind/logic/engines/workflow_gate/checks/quality.py +49 -0
  564. mind/logic/engines/workflow_gate/checks/ruff_format.py +99 -0
  565. mind/logic/engines/workflow_gate/checks/tests.py +81 -0
  566. mind/logic/engines/workflow_gate/engine.py +207 -0
  567. shared/__init__.py +32 -0
  568. shared/action_logger.py +61 -0
  569. shared/action_types.py +199 -0
  570. shared/activity_logging.py +149 -0
  571. shared/ai/constitutional_envelope.py +341 -0
  572. shared/ai/prompt_model.py +585 -0
  573. shared/ai/response_parser.py +191 -0
  574. shared/ast_utility.py +279 -0
  575. shared/atomic_action.py +117 -0
  576. shared/cli/__init__.py +6 -0
  577. shared/cli/app_introspection.py +134 -0
  578. shared/cli/command_meta.py +224 -0
  579. shared/cli_types.py +92 -0
  580. shared/component_primitive.py +216 -0
  581. shared/config.py +216 -0
  582. shared/config_loader.py +54 -0
  583. shared/context.py +113 -0
  584. shared/exceptions.py +100 -0
  585. shared/governance/__init__.py +9 -0
  586. shared/governance/coherence_harvester.py +258 -0
  587. shared/governance_token.py +77 -0
  588. shared/infrastructure/__init__.py +5 -0
  589. shared/infrastructure/adapters/__init__.py +5 -0
  590. shared/infrastructure/adapters/embedding_provider.py +66 -0
  591. shared/infrastructure/bootstrap_registry.py +57 -0
  592. shared/infrastructure/clients/__init__.py +5 -0
  593. shared/infrastructure/clients/qdrant_client.py +455 -0
  594. shared/infrastructure/config_service.py +382 -0
  595. shared/infrastructure/config_validator.py +70 -0
  596. shared/infrastructure/context/__init__.py +45 -0
  597. shared/infrastructure/context/builder.py +804 -0
  598. shared/infrastructure/context/cache.py +101 -0
  599. shared/infrastructure/context/database.py +205 -0
  600. shared/infrastructure/context/limb_workspace.py +134 -0
  601. shared/infrastructure/context/models.py +65 -0
  602. shared/infrastructure/context/providers/__init__.py +18 -0
  603. shared/infrastructure/context/providers/ast.py +211 -0
  604. shared/infrastructure/context/providers/db.py +165 -0
  605. shared/infrastructure/context/providers/vectors.py +195 -0
  606. shared/infrastructure/context/redactor.py +109 -0
  607. shared/infrastructure/context/serializers.py +144 -0
  608. shared/infrastructure/context/service.py +271 -0
  609. shared/infrastructure/context/validator.py +247 -0
  610. shared/infrastructure/database/models/__init__.py +80 -0
  611. shared/infrastructure/database/models/autonomous_proposals.py +83 -0
  612. shared/infrastructure/database/models/decision_traces.py +129 -0
  613. shared/infrastructure/database/models/governance.py +183 -0
  614. shared/infrastructure/database/models/knowledge.py +205 -0
  615. shared/infrastructure/database/models/learning.py +99 -0
  616. shared/infrastructure/database/models/llm_config.py +274 -0
  617. shared/infrastructure/database/models/operations.py +152 -0
  618. shared/infrastructure/database/models/refusals.py +147 -0
  619. shared/infrastructure/database/models/system.py +124 -0
  620. shared/infrastructure/database/models/vectors.py +113 -0
  621. shared/infrastructure/database/models/workers.py +96 -0
  622. shared/infrastructure/database/session_manager.py +166 -0
  623. shared/infrastructure/diagnostic_service.py +103 -0
  624. shared/infrastructure/events/__init__.py +5 -0
  625. shared/infrastructure/events/base.py +44 -0
  626. shared/infrastructure/events/bus.py +76 -0
  627. shared/infrastructure/git_service.py +385 -0
  628. shared/infrastructure/intent/action_risk.py +135 -0
  629. shared/infrastructure/intent/audit_verdict.py +131 -0
  630. shared/infrastructure/intent/autonomy_dirty_tree.py +104 -0
  631. shared/infrastructure/intent/canonical_enums.py +116 -0
  632. shared/infrastructure/intent/cognitive_roles.py +96 -0
  633. shared/infrastructure/intent/errors.py +13 -0
  634. shared/infrastructure/intent/filesystem_operations.py +359 -0
  635. shared/infrastructure/intent/intent_connector.py +157 -0
  636. shared/infrastructure/intent/intent_repository.py +707 -0
  637. shared/infrastructure/intent/intent_validator.py +248 -0
  638. shared/infrastructure/intent/operational_capabilities.py +470 -0
  639. shared/infrastructure/intent/operational_config.py +1343 -0
  640. shared/infrastructure/intent/operational_mode.py +66 -0
  641. shared/infrastructure/intent/task_type_phases.py +180 -0
  642. shared/infrastructure/intent/test_coverage_paths.py +181 -0
  643. shared/infrastructure/intent/vocabulary_projection.py +241 -0
  644. shared/infrastructure/knowledge/knowledge_service.py +155 -0
  645. shared/infrastructure/knowledge_graph_service.py +214 -0
  646. shared/infrastructure/llm/client.py +448 -0
  647. shared/infrastructure/llm/client_registry.py +153 -0
  648. shared/infrastructure/llm/fallback_client.py +144 -0
  649. shared/infrastructure/llm/providers/anthropic.py +113 -0
  650. shared/infrastructure/llm/providers/base.py +130 -0
  651. shared/infrastructure/llm/providers/ollama.py +265 -0
  652. shared/infrastructure/llm/providers/openai.py +168 -0
  653. shared/infrastructure/repositories/__init__.py +5 -0
  654. shared/infrastructure/repositories/db/__init__.py +5 -0
  655. shared/infrastructure/repositories/db/common.py +138 -0
  656. shared/infrastructure/repositories/db/engine.py +26 -0
  657. shared/infrastructure/repositories/db/migration_service.py +75 -0
  658. shared/infrastructure/repositories/db/status_service.py +61 -0
  659. shared/infrastructure/repositories/memory_repository.py +134 -0
  660. shared/infrastructure/repositories/symbol_definition_repository.py +170 -0
  661. shared/infrastructure/repositories/task_repository.py +59 -0
  662. shared/infrastructure/repositories/vector_link_repository.py +83 -0
  663. shared/infrastructure/rooted_repository.py +50 -0
  664. shared/infrastructure/secrets_service.py +317 -0
  665. shared/infrastructure/specs/__init__.py +9 -0
  666. shared/infrastructure/specs/specs_repository.py +100 -0
  667. shared/infrastructure/storage/file_classifier.py +32 -0
  668. shared/infrastructure/storage/file_handler.py +330 -0
  669. shared/infrastructure/storage/file_provider.py +233 -0
  670. shared/infrastructure/storage/integrity_service.py +108 -0
  671. shared/infrastructure/validation/black_formatter.py +41 -0
  672. shared/infrastructure/validation/quality.py +46 -0
  673. shared/infrastructure/validation/ruff_linter.py +104 -0
  674. shared/infrastructure/validation/syntax_checker.py +45 -0
  675. shared/infrastructure/validation/test_runner.py +167 -0
  676. shared/infrastructure/validation/yaml_validator.py +45 -0
  677. shared/infrastructure/vector/__init__.py +15 -0
  678. shared/infrastructure/vector/adapters/__init__.py +20 -0
  679. shared/infrastructure/vector/adapters/constitutional/__init__.py +26 -0
  680. shared/infrastructure/vector/adapters/constitutional/chunker.py +246 -0
  681. shared/infrastructure/vector/adapters/constitutional/doc_key_resolver.py +109 -0
  682. shared/infrastructure/vector/adapters/constitutional/item_builder.py +158 -0
  683. shared/infrastructure/vector/adapters/constitutional/utils.py +39 -0
  684. shared/infrastructure/vector/adapters/constitutional_adapter.py +309 -0
  685. shared/infrastructure/vector/adapters/specs_adapter.py +171 -0
  686. shared/infrastructure/vector/cognitive_adapter.py +119 -0
  687. shared/infrastructure/vector/vector_index_service.py +230 -0
  688. shared/logger.py +195 -0
  689. shared/models/__init__.py +47 -0
  690. shared/models/action_result.py +77 -0
  691. shared/models/audit_models.py +106 -0
  692. shared/models/audit_rendering.py +30 -0
  693. shared/models/capability_models.py +22 -0
  694. shared/models/constitutional_validation.py +185 -0
  695. shared/models/drift_models.py +24 -0
  696. shared/models/embedding_payload.py +45 -0
  697. shared/models/execution_models.py +71 -0
  698. shared/models/pattern_graph.py +62 -0
  699. shared/models/prompt_model.py +244 -0
  700. shared/models/refusal_result.py +294 -0
  701. shared/models/remediation.py +35 -0
  702. shared/models/validation_result.py +34 -0
  703. shared/models/vector_models.py +62 -0
  704. shared/models/workflow_models.py +242 -0
  705. shared/path_resolver.py +408 -0
  706. shared/path_utils.py +60 -0
  707. shared/processors/base_processor.py +171 -0
  708. shared/processors/yaml_processor.py +72 -0
  709. shared/protocols/__init__.py +21 -0
  710. shared/protocols/brain_services.py +35 -0
  711. shared/protocols/cognitive.py +35 -0
  712. shared/protocols/executor.py +47 -0
  713. shared/protocols/interpreter.py +24 -0
  714. shared/protocols/knowledge.py +21 -0
  715. shared/protocols/llm.py +25 -0
  716. shared/protocols/typer_protocols.py +37 -0
  717. shared/time.py +18 -0
  718. shared/universal.py +43 -0
  719. shared/utils/__init__.py +81 -0
  720. shared/utils/audit_grouping.py +50 -0
  721. shared/utils/common_knowledge.py +82 -0
  722. shared/utils/domain_mapper.py +61 -0
  723. shared/utils/embedding_utils.py +182 -0
  724. shared/utils/glob_match.py +93 -0
  725. shared/utils/header_tools.py +177 -0
  726. shared/utils/parallel_processor.py +60 -0
  727. shared/utils/parsing.py +189 -0
  728. shared/utils/path_utils.py +268 -0
  729. shared/utils/subprocess_utils.py +87 -0
  730. shared/workers/__init__.py +19 -0
  731. shared/workers/base.py +533 -0
  732. shared/workers/declaration_validator.py +124 -0
  733. shared/workers/loop_hold_telemetry.py +210 -0
  734. shared/workers/schedule.py +123 -0
  735. will/__init__.py +4 -0
  736. will/agents/__init__.py +4 -0
  737. will/agents/base_planner.py +133 -0
  738. will/agents/code_generation/__init__.py +15 -0
  739. will/agents/code_generation/code_generator.py +247 -0
  740. will/agents/code_generation/context_formatters.py +99 -0
  741. will/agents/code_generation/correction_engine.py +157 -0
  742. will/agents/code_generation/extraction.py +165 -0
  743. will/agents/code_generation/pattern_validator.py +264 -0
  744. will/agents/code_generation/prompt_builders.py +209 -0
  745. will/agents/coder_agent.py +229 -0
  746. will/agents/coder_agent_refusal_handler.py +168 -0
  747. will/agents/cognitive_orchestrator.py +152 -0
  748. will/agents/conversational/__init__.py +13 -0
  749. will/agents/conversational/agent.py +271 -0
  750. will/agents/conversational/factory.py +72 -0
  751. will/agents/conversational/helpers.py +116 -0
  752. will/agents/execution_agent.py +294 -0
  753. will/agents/governance_mixin.py +132 -0
  754. will/agents/planner_agent.py +261 -0
  755. will/agents/resource_selector.py +228 -0
  756. will/agents/strategic_auditor/__init__.py +15 -0
  757. will/agents/strategic_auditor/agent.py +199 -0
  758. will/agents/strategic_auditor/context_gatherer.py +586 -0
  759. will/agents/strategic_auditor/effects.py +136 -0
  760. will/agents/strategic_auditor/models.py +61 -0
  761. will/agents/strategic_auditor/reasoning.py +169 -0
  762. will/agents/tagger_agent.py +294 -0
  763. will/agents/traced_agent_mixin.py +33 -0
  764. will/autonomy/__init__.py +20 -0
  765. will/autonomy/autonomous_developer.py +127 -0
  766. will/autonomy/proposal.py +585 -0
  767. will/autonomy/proposal_execution_pipeline.py +264 -0
  768. will/autonomy/proposal_executor.py +410 -0
  769. will/autonomy/proposal_mapper.py +187 -0
  770. will/autonomy/proposal_repository.py +118 -0
  771. will/autonomy/proposal_service.py +251 -0
  772. will/autonomy/proposal_state_manager.py +239 -0
  773. will/deciders/__init__.py +9 -0
  774. will/deciders/governance_decider.py +207 -0
  775. will/governance/__init__.py +13 -0
  776. will/governance/audit_remediation_runner.py +197 -0
  777. will/governance/audit_runner.py +368 -0
  778. will/governance/census_runner.py +278 -0
  779. will/governance/coverage_runner.py +489 -0
  780. will/governance/daemon_runner.py +164 -0
  781. will/governance/fix_runner.py +693 -0
  782. will/governance/inspect_runner.py +521 -0
  783. will/governance/integrity_runner.py +66 -0
  784. will/governance/lint_runner.py +93 -0
  785. will/governance/refactor_runner.py +372 -0
  786. will/governance/sync_runner.py +186 -0
  787. will/interpreters/__init__.py +44 -0
  788. will/interpreters/cli_args_interpreter.py +106 -0
  789. will/interpreters/natural_language_interpreter.py +276 -0
  790. will/interpreters/request_interpreter.py +126 -0
  791. will/lifecycle/__init__.py +12 -0
  792. will/lifecycle/integration_runner.py +54 -0
  793. will/maintenance/metadata_scribe_service.py +64 -0
  794. will/orchestration/__init__.py +4 -0
  795. will/orchestration/cognitive_service.py +185 -0
  796. will/orchestration/decision_tracer.py +257 -0
  797. will/orchestration/intent_alignment.py +59 -0
  798. will/orchestration/intent_guard.py +20 -0
  799. will/orchestration/phase_registry.py +92 -0
  800. will/orchestration/process_orchestrator.py +270 -0
  801. will/orchestration/prompt_pipeline.py +174 -0
  802. will/orchestration/remediation_orchestrator.py +292 -0
  803. will/orchestration/self_correction_engine.py +154 -0
  804. will/orchestration/validation_pipeline.py +45 -0
  805. will/orchestration/workflow_orchestrator.py +277 -0
  806. will/phases/__init__.py +24 -0
  807. will/phases/audit_phase.py +152 -0
  808. will/phases/canary/pytest_runner.py +156 -0
  809. will/phases/canary/result_builder.py +130 -0
  810. will/phases/canary/test_discovery.py +104 -0
  811. will/phases/canary_validation_phase.py +188 -0
  812. will/phases/code_generation/artifact_saver.py +175 -0
  813. will/phases/code_generation/code_sensor.py +117 -0
  814. will/phases/code_generation/file_path_extractor.py +53 -0
  815. will/phases/code_generation/work_directory_manager.py +83 -0
  816. will/phases/code_generation_phase.py +480 -0
  817. will/phases/execution_phase.py +179 -0
  818. will/phases/interpret_phase.py +266 -0
  819. will/phases/load_phase.py +102 -0
  820. will/phases/parse_phase.py +117 -0
  821. will/phases/planning_phase.py +182 -0
  822. will/phases/runtime_phase.py +112 -0
  823. will/phases/sandbox_validation_phase.py +130 -0
  824. will/phases/style_check_phase.py +209 -0
  825. will/phases/test_generation_phase.py +159 -0
  826. will/self_healing/alignment/persistence.py +53 -0
  827. will/self_healing/alignment/sandbox.py +51 -0
  828. will/self_healing/alignment/specialists.py +165 -0
  829. will/self_healing/alignment_orchestrator.py +140 -0
  830. will/self_healing/audit_remediation_service.py +199 -0
  831. will/self_healing/batch_remediation_service.py +280 -0
  832. will/self_healing/capability_reconciliation_service.py +96 -0
  833. will/self_healing/capability_tagging_service.py +224 -0
  834. will/self_healing/clarity_service.py +204 -0
  835. will/self_healing/complexity_service.py +260 -0
  836. will/self_healing/context_aware_test_generator.py +298 -0
  837. will/self_healing/coverage_remediation_service.py +97 -0
  838. will/self_healing/coverage_watcher.py +192 -0
  839. will/self_healing/enrichment_service.py +211 -0
  840. will/self_healing/linelength_service.py +168 -0
  841. will/self_healing/modularity_remediation_service.py +203 -0
  842. will/self_healing/remediation_evidence_writer.py +144 -0
  843. will/self_healing/remediation_executor.py +113 -0
  844. will/self_healing/remediation_interpretation/__init__.py +1 -0
  845. will/self_healing/remediation_interpretation/file_context_assembler.py +383 -0
  846. will/self_healing/remediation_interpretation/file_role_detector.py +599 -0
  847. will/self_healing/remediation_interpretation/finding_normalizer.py +221 -0
  848. will/self_healing/remediation_interpretation/models.py +198 -0
  849. will/self_healing/remediation_interpretation/reasoning_brief_builder.py +235 -0
  850. will/self_healing/remediation_interpretation/responsibility_extractor.py +421 -0
  851. will/self_healing/remediation_interpretation/service.py +202 -0
  852. will/self_healing/remediation_interpretation/strategy_catalog.py +252 -0
  853. will/self_healing/remediation_interpretation/strategy_selector.py +395 -0
  854. will/self_healing/remediation_pattern_matcher.py +126 -0
  855. will/self_healing/simple_test_generator.py +252 -0
  856. will/self_healing/single_file_remediation.py +137 -0
  857. will/self_healing/test_generation/automatic_repair.py +377 -0
  858. will/self_healing/test_generation/code_extractor.py +238 -0
  859. will/self_healing/test_generation/context_builder.py +140 -0
  860. will/self_healing/test_generation/executor.py +64 -0
  861. will/self_healing/test_generation/failure_parser.py +37 -0
  862. will/self_healing/test_generation/generation_workflow.py +140 -0
  863. will/self_healing/test_generation/generator.py +283 -0
  864. will/self_healing/test_generation/llm_correction.py +160 -0
  865. will/self_healing/test_generation/repair_workflow.py +128 -0
  866. will/self_healing/test_generation/single_test_fixer.py +77 -0
  867. will/self_healing/test_generation/test_extractor.py +50 -0
  868. will/self_healing/test_generation/test_scorer.py +53 -0
  869. will/self_healing/test_generation/test_validator.py +64 -0
  870. will/self_healing/test_generator.py +12 -0
  871. will/strategists/__init__.py +46 -0
  872. will/strategists/base_strategist.py +29 -0
  873. will/strategists/clarity_strategist.py +55 -0
  874. will/strategists/complexity_strategist.py +55 -0
  875. will/strategists/fix_strategist.py +467 -0
  876. will/strategists/sync_strategist.py +369 -0
  877. will/strategists/test_strategist.py +140 -0
  878. will/strategists/validation_strategist.py +315 -0
  879. will/test_generation/__init__.py +46 -0
  880. will/test_generation/adaptive_test_generator.py +123 -0
  881. will/test_generation/artifacts.py +102 -0
  882. will/test_generation/harness_detection.py +103 -0
  883. will/test_generation/helpers/__init__.py +14 -0
  884. will/test_generation/helpers/context_extractor.py +100 -0
  885. will/test_generation/helpers/test_executor.py +230 -0
  886. will/test_generation/llm_output.py +62 -0
  887. will/test_generation/models.py +25 -0
  888. will/test_generation/persistence.py +248 -0
  889. will/test_generation/phases/__init__.py +16 -0
  890. will/test_generation/phases/generation_phase.py +150 -0
  891. will/test_generation/phases/load_phase.py +53 -0
  892. will/test_generation/phases/parse_phase.py +50 -0
  893. will/test_generation/prompt_engine.py +123 -0
  894. will/test_generation/result_aggregator.py +73 -0
  895. will/test_generation/sandbox.py +203 -0
  896. will/test_generation/strategy_link.py +56 -0
  897. will/test_generation/test_extractor.py +140 -0
  898. will/test_generation/validation.py +89 -0
  899. will/tools/__init__.py +13 -0
  900. will/tools/anchor_builder.py +111 -0
  901. will/tools/anchor_search.py +73 -0
  902. will/tools/anchors/discovery.py +55 -0
  903. will/tools/anchors/storage.py +32 -0
  904. will/tools/architectural_context_builder.py +94 -0
  905. will/tools/cognitive_toolbox.py +47 -0
  906. will/tools/context/code_snippet_extractor.py +83 -0
  907. will/tools/context/embedding_search.py +76 -0
  908. will/tools/context/formatter.py +87 -0
  909. will/tools/context/models.py +38 -0
  910. will/tools/context/query_builder.py +42 -0
  911. will/tools/context/retriever.py +182 -0
  912. will/tools/context/standards.py +53 -0
  913. will/tools/file_navigator.py +180 -0
  914. will/tools/layers.py +31 -0
  915. will/tools/module_anchor_generator.py +137 -0
  916. will/tools/module_descriptor.py +154 -0
  917. will/tools/policy_vectorizer.py +184 -0
  918. will/tools/symbol_finder.py +188 -0
  919. will/tools/tool_generator.py +103 -0
  920. will/workers/audit_ingest_worker.py +207 -0
  921. will/workers/audit_violation_filter.py +108 -0
  922. will/workers/audit_violation_normalizer.py +108 -0
  923. will/workers/audit_violation_sensor.py +370 -0
  924. will/workers/blackboard_shop_manager.py +280 -0
  925. will/workers/capability_tagger.py +153 -0
  926. will/workers/circuit_breaker.py +335 -0
  927. will/workers/coherence_sensor.py +212 -0
  928. will/workers/commit_reachability_auditor.py +135 -0
  929. will/workers/db_sync_worker.py +96 -0
  930. will/workers/governance_embedding/__init__.py +9 -0
  931. will/workers/governance_embedding/governance_embedder_worker.py +189 -0
  932. will/workers/intent_inspector.py +599 -0
  933. will/workers/observer_worker.py +158 -0
  934. will/workers/prompt_extractor_worker.py +241 -0
  935. will/workers/proposal_consumer_effects.py +216 -0
  936. will/workers/proposal_consumer_revival.py +131 -0
  937. will/workers/proposal_consumer_worker.py +271 -0
  938. will/workers/proposal_pipeline_shop_manager.py +273 -0
  939. will/workers/repo_crawler.py +171 -0
  940. will/workers/repo_embedding/__init__.py +18 -0
  941. will/workers/repo_embedding/helpers.py +245 -0
  942. will/workers/repo_embedding/repo_embedder_workers.py +163 -0
  943. will/workers/test_coverage_sensor.py +208 -0
  944. will/workers/test_remediator/__init__.py +12 -0
  945. will/workers/test_remediator/_operations.py +295 -0
  946. will/workers/test_remediator/worker.py +187 -0
  947. will/workers/test_runner_sensor.py +430 -0
  948. will/workers/violation_executor.py +496 -0
  949. will/workers/violation_remediator.py +394 -0
  950. will/workers/violation_remediator_blackboard.py +225 -0
  951. will/workers/violation_remediator_body/__init__.py +12 -0
  952. will/workers/violation_remediator_body/blackboard.py +139 -0
  953. will/workers/violation_remediator_body/ceremony.py +154 -0
  954. will/workers/violation_remediator_body/context.py +70 -0
  955. will/workers/violation_remediator_body/llm.py +112 -0
  956. will/workers/violation_remediator_body/models.py +35 -0
  957. will/workers/violation_remediator_body/worker.py +518 -0
  958. will/workers/violation_remediator_proposal.py +328 -0
  959. will/workers/worker_shop_manager.py +244 -0
  960. will/workflows/__init__.py +23 -0
  961. will/workflows/dev_sync_reporter.py +274 -0
  962. will/workflows/dev_sync_workflow.py +118 -0
@@ -0,0 +1,136 @@
1
+ # src/will/agents/strategic_auditor/effects.py
2
+
3
+ """
4
+ StrategicAuditor — campaign side effects on the world.
5
+
6
+ Two operations, both gated by StrategicAuditor.run()'s write /
7
+ execute_autonomous flags and both taking a finished StrategicCampaign:
8
+
9
+ - persist_campaign: write a parent Task plus one child Task per
10
+ autonomous cluster and one escalation Task per amendment-required
11
+ cluster, via TaskRepository. Two session commits.
12
+ - execute_autonomous_tasks: iterate the campaign's autonomous clusters,
13
+ gate on confidence >= 0.7, dispatch each to develop_from_goal.
14
+
15
+ Both share one reason to change: how a finished campaign acts on the
16
+ system. Splitting them apart would fragment that single answer.
17
+
18
+ LAYER: will/agents — collaborator of StrategicAuditor. Sessions and
19
+ context flow in from the caller; no service-registry session
20
+ construction here.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ from typing import TYPE_CHECKING
26
+
27
+ from shared.infrastructure.repositories.task_repository import TaskRepository
28
+ from shared.logger import getLogger
29
+ from will.agents.strategic_auditor.models import StrategicCampaign
30
+
31
+
32
+ if TYPE_CHECKING:
33
+ from sqlalchemy.ext.asyncio import AsyncSession
34
+
35
+ from shared.context import CoreContext
36
+
37
+
38
+ logger = getLogger(__name__)
39
+
40
+
41
+ # ID: f4d82377-ffce-4794-9bc3-754a48eed83d
42
+ async def persist_campaign(session: AsyncSession, campaign: StrategicCampaign) -> None:
43
+ """Store campaign as parent Task + child Tasks in PostgreSQL."""
44
+ repo = TaskRepository(session)
45
+
46
+ parent = await repo.create(
47
+ intent=f"[StrategicCampaign:{campaign.campaign_id}] {campaign.system_summary[:200]}",
48
+ assigned_role="StrategicAuditor",
49
+ status="campaign_ready",
50
+ )
51
+ parent.context = {
52
+ "campaign_id": campaign.campaign_id,
53
+ "total_findings": campaign.total_findings,
54
+ "autonomous_tasks": campaign.autonomous_task_count,
55
+ "escalations": campaign.escalation_count,
56
+ "system_summary": campaign.system_summary,
57
+ }
58
+ await session.commit()
59
+
60
+ for cluster in campaign.clusters:
61
+ child = await repo.create(
62
+ intent=cluster.proposed_fix,
63
+ assigned_role="AutonomousDeveloper",
64
+ status="pending",
65
+ )
66
+ child.parent_task_id = parent.id
67
+ child.requires_approval = False
68
+ child.context = {
69
+ "cluster_id": cluster.cluster_id,
70
+ "root_cause": cluster.root_cause,
71
+ "affected_files": cluster.affected_files,
72
+ "finding_ids": cluster.finding_ids,
73
+ "confidence": cluster.confidence,
74
+ "estimated_impact": cluster.estimated_impact,
75
+ }
76
+
77
+ for cluster in campaign.escalations:
78
+ child = await repo.create(
79
+ intent=f"[ESCALATION] {cluster.proposed_fix}",
80
+ assigned_role="Human",
81
+ status="awaiting_approval",
82
+ )
83
+ child.parent_task_id = parent.id
84
+ child.requires_approval = True
85
+ child.context = {
86
+ "cluster_id": cluster.cluster_id,
87
+ "root_cause": cluster.root_cause,
88
+ "constitutional_amendment_needed": cluster.proposed_fix,
89
+ "affected_files": cluster.affected_files,
90
+ }
91
+
92
+ await session.commit()
93
+ logger.info(
94
+ "Campaign persisted: parent=%s, %d tasks, %d escalations",
95
+ parent.id,
96
+ campaign.autonomous_task_count,
97
+ campaign.escalation_count,
98
+ )
99
+
100
+
101
+ # ID: b63d2bae-56c3-4f98-80e3-f1c9cc170ca3
102
+ async def execute_autonomous_tasks(
103
+ ctx: CoreContext, session: AsyncSession, campaign: StrategicCampaign
104
+ ) -> None:
105
+ """Execute non-escalation clusters via develop_from_goal.
106
+
107
+ Clusters below the 0.7 confidence threshold are skipped — they remain
108
+ persisted as pending Tasks for a human to review rather than being
109
+ autonomously executed.
110
+ """
111
+ from will.autonomy.autonomous_developer import develop_from_goal
112
+
113
+ logger.info("Executing %d autonomous tasks...", campaign.autonomous_task_count)
114
+
115
+ for i, cluster in enumerate(campaign.clusters, 1):
116
+ logger.info(
117
+ " [%d/%d] %s (impact=%s, confidence=%.2f)",
118
+ i,
119
+ campaign.autonomous_task_count,
120
+ cluster.root_cause[:80],
121
+ cluster.estimated_impact,
122
+ cluster.confidence,
123
+ )
124
+
125
+ if cluster.confidence < 0.7:
126
+ logger.info(" Skipping (confidence too low — staged for review)")
127
+ continue
128
+
129
+ success, message = await develop_from_goal(
130
+ context=ctx,
131
+ goal=cluster.proposed_fix,
132
+ workflow_type=cluster.workflow_type,
133
+ write=True,
134
+ session=session,
135
+ )
136
+ logger.info(" %s %s", "OK" if success else "FAIL", message)
@@ -0,0 +1,61 @@
1
+ # src/will/agents/strategic_auditor/models.py
2
+
3
+ """
4
+ Data structures for the StrategicAuditor campaign.
5
+
6
+ Pure data — no logic, no imports from CORE internals.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from dataclasses import dataclass, field
12
+ from datetime import datetime
13
+
14
+
15
+ @dataclass
16
+ # ID: 2ebdd1a6-3c94-4b49-8d61-00f8ed2ba976
17
+ class RootCauseCluster:
18
+ """
19
+ A group of audit findings that share a single root cause.
20
+
21
+ The LLM produces these — they are the core reasoning unit of the campaign.
22
+ """
23
+
24
+ cluster_id: str
25
+ root_cause: str
26
+ """Single sentence: why do all these findings exist?"""
27
+
28
+ affected_files: list[str]
29
+ finding_ids: list[str]
30
+ proposed_fix: str
31
+ """Concrete, actionable description of what needs to change."""
32
+
33
+ requires_constitution_change: bool = False
34
+ """True → escalate to human. False → CORE can fix autonomously."""
35
+
36
+ confidence: float = 0.8
37
+ estimated_impact: str = "medium"
38
+ """low / medium / high — how much does fixing this improve CORE?"""
39
+
40
+
41
+ @dataclass
42
+ # ID: 75de5708-f567-46e4-a350-bfadc21c6e19
43
+ class StrategicCampaign:
44
+ """
45
+ The full output of a StrategicAuditor run.
46
+
47
+ Stored as a parent Task in PostgreSQL with child Tasks per cluster.
48
+ """
49
+
50
+ campaign_id: str
51
+ created_at: datetime
52
+ system_summary: str
53
+ """LLM's one-paragraph assessment of CORE's current state."""
54
+
55
+ clusters: list[RootCauseCluster] = field(default_factory=list)
56
+ escalations: list[RootCauseCluster] = field(default_factory=list)
57
+ """Clusters that require human (.intent/) amendment."""
58
+
59
+ total_findings: int = 0
60
+ autonomous_task_count: int = 0
61
+ escalation_count: int = 0
@@ -0,0 +1,169 @@
1
+ # src/will/agents/strategic_auditor/reasoning.py
2
+
3
+ """
4
+ StrategicAuditor — campaign synthesis.
5
+
6
+ The LLM contract layer for StrategicAuditor. Takes a system_context dict
7
+ gathered by SystemContextGatherer and produces a StrategicCampaign by:
8
+
9
+ 1. Compacting findings into a per-rule summary (token-budget aware).
10
+ 2. Invoking the architect_threats_analysis_prompt PromptModel.
11
+ 3. Parsing the JSON response (fenced-block tolerant).
12
+ 4. Constructing RootCauseCluster instances and partitioning them into
13
+ autonomous-vs-escalation buckets per requires_constitution_change.
14
+
15
+ Fail-soft: on any LLM/parse error the function returns a campaign with an
16
+ empty cluster list and a diagnostic system_summary so the caller's
17
+ downstream effects (persist, execute, log) still have something coherent
18
+ to operate on.
19
+
20
+ LAYER: will/agents — collaborator of StrategicAuditor. No DB writes, no
21
+ file writes, no .intent/ access. The only side effect is the LLM call.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import json
27
+ import uuid
28
+ from datetime import UTC, datetime
29
+ from typing import TYPE_CHECKING, Any
30
+
31
+ from shared.ai.prompt_model import PromptModel
32
+ from shared.infrastructure.intent.operational_config import load_operational_config
33
+ from shared.logger import getLogger
34
+ from will.agents.strategic_auditor.models import RootCauseCluster, StrategicCampaign
35
+
36
+
37
+ if TYPE_CHECKING:
38
+ from will.orchestration.cognitive_service import CognitiveService
39
+
40
+
41
+ logger = getLogger(__name__)
42
+
43
+ _CFG_SA = load_operational_config().strategic_auditor
44
+
45
+ _VALID_WORKFLOW_TYPES = frozenset(
46
+ {
47
+ "refactor_modularity",
48
+ "coverage_remediation",
49
+ "full_feature_development",
50
+ }
51
+ )
52
+
53
+
54
+ def _resolve_workflow_type(value: str) -> str:
55
+ """Return value if it is a known workflow type, else the safe default."""
56
+ if isinstance(value, str) and value.strip() in _VALID_WORKFLOW_TYPES:
57
+ return value.strip()
58
+ logger.warning(
59
+ "Unknown or missing workflow_type '%s' from LLM — "
60
+ "defaulting to full_feature_development",
61
+ value,
62
+ )
63
+ return "full_feature_development"
64
+
65
+
66
+ # ID: b1f24560-023b-4482-819a-169708c7130f
67
+ async def synthesize_campaign(
68
+ cognitive: CognitiveService,
69
+ system_context: dict[str, Any],
70
+ ) -> StrategicCampaign:
71
+ """Send system context to the LLM and parse the strategic campaign.
72
+
73
+ The prompt name (architect_threats_analysis_prompt) and the expected
74
+ response schema (clusters list with root_cause / proposed_fix /
75
+ requires_constitution_change / workflow_type / confidence / impact)
76
+ are the LLM contract this function owns.
77
+ """
78
+ findings = system_context.get("audit_findings", [])
79
+
80
+ findings_by_rule: dict[str, list[str]] = {}
81
+ for f in findings:
82
+ rid = f.get("rule_id", "unknown")
83
+ ffile = f.get("file", "unknown")
84
+ findings_by_rule.setdefault(rid, []).append(ffile)
85
+
86
+ lines = []
87
+ for rid, files in sorted(findings_by_rule.items()):
88
+ unique = sorted(set(files))[:5]
89
+ suffix = f" (+{len(files) - 5} more)" if len(files) > 5 else ""
90
+ lines.append(
91
+ f" [{rid}] in {len(files)} locations: {', '.join(unique)}{suffix}"
92
+ )
93
+
94
+ def _compact(obj: Any, max_chars: int = _CFG_SA.compact_max_chars) -> str:
95
+ s = json.dumps(obj, indent=2, default=str)
96
+ return s[:max_chars] + "..." if len(s) > max_chars else s
97
+
98
+ logger.info("Reasoning about system state (LLM call)...")
99
+
100
+ try:
101
+ model = PromptModel.load("architect_threats_analysis_prompt")
102
+ client = await cognitive.aget_client_for_role(model.manifest.role)
103
+ response = await model.invoke(
104
+ context={
105
+ "finding_count": len(findings),
106
+ "audit_findings_summary": "\n".join(lines[:50]),
107
+ "semantic_landscape": _compact(
108
+ system_context.get("semantic_landscape", {})
109
+ ),
110
+ "knowledge_gaps": _compact(system_context.get("knowledge_gaps", {})),
111
+ "structural_health": _compact(
112
+ system_context.get("structural_health", {})
113
+ ),
114
+ "change_context": _compact(system_context.get("change_context", {})),
115
+ "intent_drift": _compact(system_context.get("intent_drift", {})),
116
+ "constitution_summary": _compact(
117
+ {
118
+ "policy_count": system_context.get(
119
+ "constitution_summary", {}
120
+ ).get("policy_count", 0),
121
+ "policies": system_context.get("constitution_summary", {}).get(
122
+ "policy_ids", []
123
+ )[:15],
124
+ }
125
+ ),
126
+ },
127
+ client=client,
128
+ user_id="StrategicAuditor",
129
+ )
130
+ raw = response.strip()
131
+ if raw.startswith("```"):
132
+ raw = raw.split("```")[1]
133
+ if raw.startswith("json"):
134
+ raw = raw[4:]
135
+ data = json.loads(raw.strip())
136
+ except Exception as e:
137
+ logger.error("LLM reasoning failed: %s", e)
138
+ data = {"system_summary": f"Strategic audit failed: {e}", "clusters": []}
139
+
140
+ campaign_id = str(uuid.uuid4())
141
+ clusters: list[RootCauseCluster] = []
142
+ escalations: list[RootCauseCluster] = []
143
+
144
+ for c in data.get("clusters", []):
145
+ cluster = RootCauseCluster(
146
+ cluster_id=c.get("cluster_id", str(uuid.uuid4())[:8]),
147
+ root_cause=c.get("root_cause", ""),
148
+ affected_files=c.get("affected_files", []),
149
+ finding_ids=c.get("finding_ids", []),
150
+ proposed_fix=c.get("proposed_fix", ""),
151
+ requires_constitution_change=c.get("requires_constitution_change", False),
152
+ confidence=float(c.get("confidence", 0.8)),
153
+ estimated_impact=c.get("estimated_impact", "medium"),
154
+ workflow_type=_resolve_workflow_type(c.get("workflow_type", "")),
155
+ )
156
+ (escalations if cluster.requires_constitution_change else clusters).append(
157
+ cluster
158
+ )
159
+
160
+ return StrategicCampaign(
161
+ campaign_id=campaign_id,
162
+ created_at=datetime.now(UTC),
163
+ system_summary=data.get("system_summary", ""),
164
+ clusters=clusters,
165
+ escalations=escalations,
166
+ total_findings=len(findings),
167
+ autonomous_task_count=len(clusters),
168
+ escalation_count=len(escalations),
169
+ )
@@ -0,0 +1,294 @@
1
+ # src/will/agents/tagger_agent.py
2
+
3
+ """
4
+ Implements the CapabilityTaggerAgent, which finds unassigned capabilities
5
+ and uses an LLM to suggest constitutionally-valid names for them.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import re
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from shared.ai.prompt_model import PromptModel
16
+ from shared.infrastructure.knowledge.knowledge_service import KnowledgeService
17
+ from shared.logger import getLogger
18
+ from shared.utils.parallel_processor import ThrottledParallelProcessor
19
+ from will.orchestration.cognitive_service import CognitiveService
20
+ from will.orchestration.decision_tracer import DecisionTracer
21
+
22
+
23
+ logger = getLogger(__name__)
24
+
25
+
26
+ # ID: fa3e820c-ed8c-4785-b94d-4cb5a1ae23b8
27
+ class CapabilityTaggerAgent:
28
+ """An agent that finds unassigned capabilities and suggests names."""
29
+
30
+ def __init__(
31
+ self,
32
+ cognitive_service: CognitiveService,
33
+ knowledge_service: KnowledgeService,
34
+ entry_point_patterns: list | None = None,
35
+ ):
36
+ """Initializes the agent with the tools it needs."""
37
+ self.cognitive_service = cognitive_service
38
+ self.knowledge_service = knowledge_service
39
+ self.tracer = DecisionTracer()
40
+ self.prompt_model = PromptModel.load("capability_definer")
41
+ self.tagger_client = None
42
+ self.entry_point_patterns = entry_point_patterns or []
43
+
44
+ def _is_entry_point(self, symbol_data: dict[str, Any]) -> bool:
45
+ """
46
+ Checks if a symbol matches any of the defined entry point patterns.
47
+ Copied directly from OrphanedLogicCheck.
48
+ """
49
+ for pattern in self.entry_point_patterns:
50
+ match_rules = pattern.get("match", {})
51
+ if not match_rules:
52
+ continue
53
+ is_a_match = all(
54
+ self._evaluate_match_rule(rule_key, rule_value, symbol_data)
55
+ for rule_key, rule_value in match_rules.items()
56
+ )
57
+ if is_a_match:
58
+ return True
59
+ return False
60
+
61
+ def _evaluate_match_rule(self, key: str, value: Any, data: dict) -> bool:
62
+ """
63
+ Evaluates a single criterion for the entry point pattern matching.
64
+ Copied directly from OrphanedLogicCheck.
65
+ """
66
+ if key == "type":
67
+ kind = data.get("type", "")
68
+ is_function_type = kind in ("function", "method")
69
+ return (value == "function" and is_function_type) or (value == kind)
70
+ if key == "name_regex":
71
+ return bool(re.search(value, data.get("name", "")))
72
+ if key == "module_path_contains":
73
+ file_path = data.get("file_path", "")
74
+ module_path = (
75
+ file_path.replace("src/", "").replace(".py", "").replace("/", ".")
76
+ )
77
+ return value in module_path
78
+ if key == "is_public_function":
79
+ return data.get("is_public", False) is value
80
+ if key == "has_capability_tag":
81
+ return (data.get("capability") is not None) == value
82
+ return data.get(key) == value
83
+
84
+ def _find_orphaned_symbols(self, all_symbols: list[dict]) -> list[dict]:
85
+ """
86
+ Finds truly orphaned symbols using the exact same logic as OrphanedLogicCheck.
87
+
88
+ A symbol is orphaned if it is:
89
+ 1. Public
90
+ 2. Has no capability assigned (capability is None)
91
+ 3. Is NOT an entry point
92
+ 4. Is NOT called by any other code
93
+ """
94
+ if not all_symbols:
95
+ return []
96
+
97
+ # Build call graph (same as OrphanedLogicCheck)
98
+ all_called_symbols = set()
99
+ for symbol_data in all_symbols:
100
+ called_list = symbol_data.get("calls") or []
101
+ for called_qualname in called_list:
102
+ all_called_symbols.add(called_qualname)
103
+
104
+ orphaned_symbols = []
105
+ for symbol_data in all_symbols:
106
+ is_public = symbol_data.get("is_public", False)
107
+ has_no_key = symbol_data.get("capability") is None
108
+
109
+ if not (is_public and has_no_key):
110
+ continue
111
+
112
+ if self._is_entry_point(symbol_data):
113
+ continue
114
+
115
+ qualname = symbol_data.get("name", "")
116
+ short_name = qualname.split(".")[-1]
117
+ is_called = (qualname in all_called_symbols) or (
118
+ short_name in all_called_symbols
119
+ )
120
+
121
+ if not is_called:
122
+ orphaned_symbols.append(symbol_data)
123
+
124
+ return orphaned_symbols
125
+
126
+ async def _get_existing_capabilities(self) -> list[str]:
127
+ """Fetches existing capabilities asynchronously."""
128
+ return await self.knowledge_service.list_capabilities()
129
+
130
+ def _extract_symbol_info(self, symbol: dict[str, Any]) -> dict[str, Any]:
131
+ """Extracts the relevant information for the prompt from a symbol entry."""
132
+ return {
133
+ "key": symbol.get("uuid"),
134
+ "name": symbol.get("name"),
135
+ "file": symbol.get("file_path"),
136
+ "domain": symbol.get("domain"),
137
+ "docstring": symbol.get("docstring"),
138
+ }
139
+
140
+ def _build_prompt_context(
141
+ self, symbol_info: dict[str, Any], existing_capabilities: list[str]
142
+ ) -> dict[str, str]:
143
+ """
144
+ Builds the PromptModel context dict for a single symbol invocation.
145
+
146
+ Returns a dict matching the input contract declared in model.yaml.
147
+ """
148
+ similar_caps_text = "\n".join(
149
+ [f"- {cap}" for cap in existing_capabilities[:20]]
150
+ )
151
+
152
+ code_snippet = f"# {symbol_info.get('name', 'unknown')}\n"
153
+ if symbol_info.get("docstring"):
154
+ code_snippet += f'"""{symbol_info["docstring"]}"""\n'
155
+ code_snippet += f"# Domain: {symbol_info.get('domain', 'unknown')}\n"
156
+ code_snippet += f"# File: {symbol_info.get('file', 'unknown')}"
157
+
158
+ return {
159
+ "similar_capabilities": similar_caps_text,
160
+ "code": code_snippet,
161
+ }
162
+
163
+ @staticmethod
164
+ def _strip_markdown(response: str) -> str:
165
+ """Strips markdown code fences from LLM response if present."""
166
+ clean = response.strip()
167
+ if clean.startswith("```"):
168
+ clean = re.sub(r"^```[a-z]*\n?", "", clean)
169
+ clean = re.sub(r"\n?```$", "", clean.strip())
170
+ return clean.strip()
171
+
172
+ async def _get_suggestion_for_symbol(
173
+ self, symbol: dict[str, Any], existing_capabilities: list[str]
174
+ ) -> dict[str, str] | None:
175
+ """
176
+ Async worker to get a single tag suggestion from the LLM via PromptModel.
177
+ """
178
+ symbol_info = self._extract_symbol_info(symbol)
179
+ context = self._build_prompt_context(symbol_info, existing_capabilities)
180
+
181
+ try:
182
+ response = await self.prompt_model.invoke(
183
+ context,
184
+ client=self.tagger_client,
185
+ user_id="tagger_agent",
186
+ )
187
+ parsed = json.loads(self._strip_markdown(response))
188
+ suggestion = parsed.get("suggested_capability")
189
+
190
+ # DECISION TRACING: record the LLM-driven capability suggestion.
191
+ # Satisfies autonomy.tracing.mandatory by recording the agent's
192
+ # core decision — what capability name to suggest for an
193
+ # orphaned symbol — at the point the LLM response is parsed.
194
+ self.tracer.record(
195
+ agent="CapabilityTaggerAgent",
196
+ decision_type="capability_suggestion",
197
+ rationale=(
198
+ f"LLM produced suggestion for orphaned symbol "
199
+ f"{symbol.get('name')!r} in {symbol_info.get('file')!r}"
200
+ ),
201
+ chosen_action=(
202
+ f"Suggest capability: {suggestion!r}"
203
+ if suggestion
204
+ else "Reject — LLM returned no suggestion"
205
+ ),
206
+ alternatives=existing_capabilities[:5],
207
+ context={
208
+ "symbol_uuid": symbol.get("uuid"),
209
+ "symbol_name": symbol.get("name"),
210
+ "file": symbol_info.get("file"),
211
+ "domain": symbol_info.get("domain"),
212
+ },
213
+ confidence=0.8 if suggestion else 0.0,
214
+ )
215
+
216
+ if not suggestion:
217
+ return None
218
+ return {
219
+ "key": symbol.get("uuid"),
220
+ "name": symbol.get("name"),
221
+ "file": symbol_info.get("file"),
222
+ "line_number": symbol.get("line_number", 1),
223
+ "suggestion": suggestion,
224
+ }
225
+ except (json.JSONDecodeError, AttributeError, ValueError):
226
+ logger.warning("Could not parse suggestion for %s.", symbol.get("name"))
227
+ return None
228
+
229
+ # ID: 02466161-a46e-4fc2-8011-ddd05ada4d1c
230
+ async def suggest_and_apply_tags(
231
+ self,
232
+ file_path: Path | None = None,
233
+ limit: int = 0,
234
+ ) -> dict[str, dict] | None:
235
+ """
236
+ Finds truly orphaned public symbols (using OrphanedLogicCheck logic),
237
+ gets AI-powered suggestions via PromptModel, and returns them.
238
+
239
+ Args:
240
+ file_path: Optional path to filter symbols by file.
241
+ limit: Max number of symbols to process (0 = all).
242
+
243
+ Returns:
244
+ Dict mapping symbol keys to suggestion dicts, or None if no suggestions.
245
+ """
246
+ if self.tagger_client is None:
247
+ self.tagger_client = await self.cognitive_service.aget_client_for_role(
248
+ self.prompt_model.manifest.role
249
+ )
250
+
251
+ logger.info("Searching for orphaned capabilities (using audit logic)...")
252
+
253
+ existing_capabilities = await self._get_existing_capabilities()
254
+ graph = await self.knowledge_service.get_graph()
255
+ all_symbols = list(graph.get("symbols", {}).values())
256
+
257
+ orphaned_symbols = self._find_orphaned_symbols(all_symbols)
258
+
259
+ if file_path:
260
+ orphaned_symbols = [
261
+ s
262
+ for s in orphaned_symbols
263
+ if s.get("file_path", "").endswith(str(file_path))
264
+ ]
265
+
266
+ if limit > 0:
267
+ orphaned_symbols = orphaned_symbols[:limit]
268
+
269
+ logger.info(
270
+ "Found %d truly orphaned symbols (same as audit).", len(orphaned_symbols)
271
+ )
272
+
273
+ if not orphaned_symbols:
274
+ return None
275
+
276
+ logger.info(
277
+ "Analyzing %d orphaned symbols for capability suggestions...",
278
+ len(orphaned_symbols),
279
+ )
280
+
281
+ processor = ThrottledParallelProcessor(description="Tagging capabilities...")
282
+
283
+ # ID: 00304bca-a84a-499c-b6ce-124cf6c24ad9
284
+ async def worker_fn(symbol: dict) -> dict | None:
285
+ return await self._get_suggestion_for_symbol(symbol, existing_capabilities)
286
+
287
+ results = await processor.run_async(
288
+ items=orphaned_symbols,
289
+ worker_fn=worker_fn,
290
+ )
291
+
292
+ suggestions = {r["key"]: r for r in results if r is not None}
293
+
294
+ return suggestions or None
@@ -0,0 +1,33 @@
1
+ # src/will/agents/traced_agent_mixin.py
2
+ """TracedAgentMixin - Shared decision trace interface.
3
+
4
+ Eliminates AST duplication between ExecutionAgent and SpecificationAgent.
5
+ Both hold self.tracer = DecisionTracer() and expose identical get_decision_trace
6
+ and save_decision_trace methods.
7
+
8
+ Usage:
9
+ # ID: c9a742bb-eb84-4a3a-86a2-a5f1faeeaa38
10
+ class MyAgent(TracedAgentMixin):
11
+ def __init__(self):
12
+ self.tracer = DecisionTracer()
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+
18
+ # ID: d2e3f4a5-b6c7-8901-defa-123456789012
19
+ class TracedAgentMixin:
20
+ """Mixin for Will agents that own a DecisionTracer instance.
21
+
22
+ Requires subclass to set self.tracer = DecisionTracer() in __init__.
23
+ """
24
+
25
+ # ID: e3f4a5b6-c7d8-9012-efab-234567890123
26
+ def get_decision_trace(self) -> str:
27
+ """Return formatted decision trace from this agent's tracer."""
28
+ return self.tracer.format_trace()
29
+
30
+ # ID: f4a5b6c7-d8e9-0123-fabc-345678901234
31
+ async def save_decision_trace(self) -> None:
32
+ """Persist the decision trace to disk via the tracer."""
33
+ await self.tracer.save_trace()