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,394 @@
1
+ # src/will/workers/violation_remediator.py
2
+ """
3
+ ViolationRemediatorWorker — closes the autonomous audit loop by converting
4
+ open audit.violation findings into Proposals and transitioning each
5
+ consumed entry to its appropriate terminal state.
6
+
7
+ Constitutional role: acting worker, remediation phase.
8
+ Declaration: .intent/workers/violation_remediator.yaml
9
+
10
+ Loop position:
11
+ AuditViolationSensor → Blackboard
12
+ → ViolationRemediatorWorker (THIS)
13
+ → Proposal (one per (action, file) — ADR-035 D1)
14
+ → ProposalConsumerWorker → ProposalExecutor
15
+ → on failure: ProposalStateManager.mark_failed
16
+ revives the deferred findings (§7a)
17
+
18
+ Design constraints: no LLM, no file writes, dedup against active proposals
19
+ on the (ref_id, file_path) key (ADR-035 D2). Findings are deferred AFTER
20
+ the proposal is persisted. Safe (approval_required=False) proposals are
21
+ created in APPROVED status so the consumer worker can execute without a
22
+ separate approval step.
23
+
24
+ Terminal-state semantics are documented on each collaborator function:
25
+ - Proposal creation and active-proposal indexing — see
26
+ violation_remediator_proposal.py (ADR-035, ADR-010, ADR-038).
27
+ - Blackboard transitions (resolve / defer / release / release_unmappable /
28
+ mark_delegated) — see violation_remediator_blackboard.py
29
+ (ADR-010, ADR-015 D4).
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ from typing import Any
35
+
36
+ from shared.infrastructure.intent.vocabulary_projection import (
37
+ VocabularyProjectionError,
38
+ load_vocabulary_projection,
39
+ )
40
+ from shared.logger import getLogger
41
+ from shared.workers.base import Worker
42
+ from will.workers.circuit_breaker import load_circuit_breaker_config, trip
43
+ from will.workers.violation_remediator_blackboard import (
44
+ defer_to_proposal,
45
+ load_open_findings,
46
+ mark_delegated,
47
+ release_entries,
48
+ release_unmappable,
49
+ resolve_entries,
50
+ )
51
+ from will.workers.violation_remediator_proposal import (
52
+ check_circuit_breaker,
53
+ create_proposal,
54
+ get_active_proposal_id_by_action_file,
55
+ )
56
+
57
+
58
+ logger = getLogger(__name__)
59
+
60
+ _FINDING_SUBJECT_PREFIX = "audit.violation::"
61
+
62
+
63
+ def _entry_id(finding: dict[str, Any]) -> str:
64
+ """Extract blackboard entry id ('id' or 'entry_id'); raise on contract violation."""
65
+ value = finding.get("id") or finding.get("entry_id")
66
+ if value is None:
67
+ raise ValueError(f"Finding has neither 'id' nor 'entry_id': {finding!r}")
68
+ return str(value)
69
+
70
+
71
+ def _rules_of(findings: list[dict[str, Any]]) -> list[str]:
72
+ """Deduplicated rule list from findings — used in completion report."""
73
+ return list(
74
+ {
75
+ f["payload"].get("check_id") or f["payload"].get("rule", "unknown")
76
+ for f in findings
77
+ }
78
+ )
79
+
80
+
81
+ # ID: b4c5d6e7-f8a9-0123-bcde-f12345678904
82
+ class ViolationRemediatorWorker(Worker):
83
+ """
84
+ Acting worker that converts Blackboard violation findings into proposals.
85
+
86
+ Reads open audit.violation findings, maps each rule to a remediation
87
+ action via .intent/ remediation map, groups by (action, file) per
88
+ ADR-035 D1, deduplicates against active proposals on the same
89
+ (action, file) unit, creates per-finding proposals, transitions the
90
+ consumed entries to 'deferred_to_proposal' with the proposal_id
91
+ stored in their payload (per CORE-Finding.md §7).
92
+
93
+ Safe proposals (approval_required=False) are created in APPROVED status
94
+ so ProposalConsumerWorker can execute them without a separate approval step.
95
+ """
96
+
97
+ declaration_name = "violation_remediator"
98
+
99
+ def __init__(
100
+ self, core_context: Any = None, declaration_name: str = "", **kwargs: Any
101
+ ) -> None:
102
+ """Accept daemon kwargs — stores core_context for repo path resolution."""
103
+ super().__init__(declaration_name=declaration_name)
104
+ self._core_context = core_context
105
+
106
+ def _get_remediation_map(self) -> dict:
107
+ """Load rule-to-action mappings from .intent/ via PathResolver."""
108
+ from body.autonomy.audit_analyzer import _load_remediation_map
109
+ from shared.path_resolver import PathResolver
110
+
111
+ path_resolver = PathResolver(self._core_context.git_service.repo_path)
112
+ return _load_remediation_map(path_resolver)
113
+
114
+ # ID: c5d6e7f8-a9b0-1234-cdef-123456789014
115
+ async def run(self) -> None:
116
+ """One audit-loop cycle: load → group → dedup → propose → transition → report."""
117
+ projection = load_vocabulary_projection()
118
+ if isinstance(projection, VocabularyProjectionError):
119
+ logger.error(
120
+ "ViolationRemediatorWorker: skipping cycle — vocabulary projection broken: %s",
121
+ projection.reason,
122
+ )
123
+ await self.post_finding(
124
+ "governance.instrument_degraded",
125
+ {
126
+ "instrument": "vocabulary_projection",
127
+ "reason": projection.reason,
128
+ "worker": self.declaration_name,
129
+ },
130
+ )
131
+ return
132
+
133
+ open_findings = await self._load_open_findings()
134
+
135
+ if not open_findings:
136
+ await self.post_heartbeat()
137
+ logger.info("ViolationRemediatorWorker: no open violation findings")
138
+ return
139
+
140
+ logger.info(
141
+ "ViolationRemediatorWorker: %d open findings to process",
142
+ len(open_findings),
143
+ )
144
+
145
+ remediation_map = self._get_remediation_map()
146
+
147
+ action_groups: dict[tuple[str, str | None], list[dict[str, Any]]] = {}
148
+ ref_kinds: dict[str, str] = {}
149
+ unmappable: list[dict[str, Any]] = []
150
+ delegate: list[dict[str, Any]] = []
151
+
152
+ for finding in open_findings:
153
+ rule = finding["payload"].get("check_id") or finding["payload"].get(
154
+ "rule", ""
155
+ )
156
+ entry = remediation_map.get(rule)
157
+
158
+ if entry and entry.get("status") == "DELEGATE":
159
+ finding["_map_entry"] = entry
160
+ delegate.append(finding)
161
+ elif entry:
162
+ ref_id = entry["ref_id"]
163
+ ref_kind = entry["ref_kind"]
164
+ if ref_kind == "flow":
165
+ key = (ref_id, None)
166
+ else:
167
+ file_path = finding["payload"].get("file_path") or None
168
+ key = (ref_id, file_path)
169
+ action_groups.setdefault(key, []).append(finding)
170
+ ref_kinds[ref_id] = ref_kind
171
+ else:
172
+ unmappable.append(finding)
173
+ logger.debug(
174
+ "ViolationRemediatorWorker: no remediation mapping for rule '%s'",
175
+ rule,
176
+ )
177
+
178
+ active_proposal_ids = await self._get_active_proposal_id_by_action_file()
179
+ cb_config = load_circuit_breaker_config()
180
+
181
+ proposals_created: list[str] = []
182
+ proposals_skipped: list[str] = []
183
+ proposals_circuit_broken: list[str] = []
184
+ entries_deferred: int = 0
185
+ entries_resolved_dedup: int = 0
186
+ entries_released_after_failure: int = 0
187
+ entries_circuit_broken: int = 0
188
+
189
+ for (ref_id, file_path), findings in action_groups.items():
190
+ ref_kind = ref_kinds[ref_id]
191
+ entry_ids = [_entry_id(f) for f in findings]
192
+ group_label = f"{ref_id}::{file_path or '<no-file>'}"
193
+
194
+ subsuming_proposal_id = active_proposal_ids.get((ref_id, file_path))
195
+ if subsuming_proposal_id:
196
+ resolved = await self._resolve_entries(entry_ids, subsuming_proposal_id)
197
+ entries_resolved_dedup += resolved
198
+ proposals_skipped.append(group_label)
199
+ logger.info(
200
+ "ViolationRemediatorWorker: skipping '%s' — active proposal "
201
+ "%s exists; resolved %d subsumed finding(s) with proposal_id "
202
+ "linkage",
203
+ group_label,
204
+ subsuming_proposal_id,
205
+ resolved,
206
+ )
207
+ continue
208
+
209
+ (
210
+ cb_count,
211
+ cb_signature,
212
+ cb_last_pid,
213
+ cb_last_reason,
214
+ ) = await self._check_circuit_breaker(
215
+ ref_id=ref_id,
216
+ ref_kind=ref_kind,
217
+ file_path=file_path,
218
+ config=cb_config,
219
+ )
220
+ if cb_count >= cb_config.threshold_n:
221
+ await trip(
222
+ worker=self,
223
+ ref_id=ref_id,
224
+ ref_kind=ref_kind,
225
+ file_path=file_path,
226
+ findings=findings,
227
+ count=cb_count,
228
+ signature=cb_signature,
229
+ last_proposal_id=cb_last_pid,
230
+ last_failure_reason=cb_last_reason,
231
+ mark_delegated=self._mark_delegated,
232
+ )
233
+ proposals_circuit_broken.append(group_label)
234
+ entries_circuit_broken += len(entry_ids)
235
+ continue
236
+
237
+ proposal_id = await self._create_proposal(ref_id, ref_kind, findings)
238
+
239
+ if proposal_id:
240
+ proposals_created.append(group_label)
241
+ deferred = await self._defer_to_proposal(entry_ids, proposal_id)
242
+ entries_deferred += deferred
243
+ logger.info(
244
+ "ViolationRemediatorWorker: created proposal '%s' for %s "
245
+ "'%s' (%d findings, %d entries deferred to proposal)",
246
+ proposal_id,
247
+ ref_kind,
248
+ group_label,
249
+ len(findings),
250
+ deferred,
251
+ )
252
+ else:
253
+ released = await self._release_entries(entry_ids)
254
+ entries_released_after_failure += released
255
+ logger.warning(
256
+ "ViolationRemediatorWorker: proposal for '%s' not created; "
257
+ "released %d finding(s) back to open",
258
+ group_label,
259
+ released,
260
+ )
261
+
262
+ entries_released = await self._release_unmappable(unmappable)
263
+ if entries_released:
264
+ logger.info(
265
+ "ViolationRemediatorWorker: released %d unmappable findings back to open",
266
+ entries_released,
267
+ )
268
+
269
+ entries_delegated = await self._mark_delegated(delegate)
270
+ for finding in delegate:
271
+ rule = finding["payload"].get("check_id") or finding["payload"].get(
272
+ "rule", "unknown"
273
+ )
274
+ file_path = finding["payload"].get("file_path", "unknown")
275
+ map_entry = finding.get("_map_entry", {})
276
+ description = map_entry.get("description", "")
277
+ logger.info(
278
+ "[DELEGATE] %s -> HUMAN REQUIRED\n"
279
+ " File: %s\n"
280
+ " Decision needed: %s\n"
281
+ " Resolve with: core-admin workers blackboard --reopen %s",
282
+ rule,
283
+ file_path,
284
+ description,
285
+ finding.get("id") or finding.get("entry_id"),
286
+ )
287
+
288
+ await self.post_report(
289
+ subject="violation_remediator.completed",
290
+ payload={
291
+ "open_findings": len(open_findings),
292
+ "unmappable": len(unmappable),
293
+ "action_groups": len(action_groups),
294
+ "proposals_created": len(proposals_created),
295
+ "proposals_skipped_dedup": len(proposals_skipped),
296
+ "proposals_circuit_broken": len(proposals_circuit_broken),
297
+ "entries_deferred": entries_deferred,
298
+ "entries_resolved_dedup": entries_resolved_dedup,
299
+ "entries_released_after_failure": entries_released_after_failure,
300
+ "entries_released": entries_released,
301
+ "entries_delegated": entries_delegated,
302
+ "entries_circuit_broken": entries_circuit_broken,
303
+ "created_actions": proposals_created,
304
+ "skipped_actions": proposals_skipped,
305
+ "circuit_broken_actions": proposals_circuit_broken,
306
+ "unmappable_rules": _rules_of(unmappable),
307
+ "delegated": len(delegate),
308
+ "delegated_rules": _rules_of(delegate),
309
+ },
310
+ )
311
+
312
+ logger.info(
313
+ "ViolationRemediatorWorker: done — %d proposals created "
314
+ "(%d entries deferred), %d skipped (dedup, %d subsumed entries "
315
+ "resolved), %d circuit-broken (%d entries delegated), "
316
+ "%d unmappable findings, %d entries released after failure",
317
+ len(proposals_created),
318
+ entries_deferred,
319
+ len(proposals_skipped),
320
+ entries_resolved_dedup,
321
+ len(proposals_circuit_broken),
322
+ entries_circuit_broken,
323
+ len(unmappable),
324
+ entries_released_after_failure,
325
+ )
326
+
327
+ # -------------------------------------------------------------------------
328
+ # Private helpers — collaborator-module shims. Kept as bound methods on
329
+ # the class so tests can patch/call them (worker._create_proposal etc.);
330
+ # they are one-line delegations to the corresponding free functions.
331
+ # -------------------------------------------------------------------------
332
+
333
+ async def _blackboard_service(self) -> Any:
334
+ from body.services.service_registry import service_registry
335
+
336
+ return await service_registry.get_blackboard_service()
337
+
338
+ # ID: d6e7f8a9-b0c1-2345-defa-234567890125
339
+ async def _load_open_findings(self) -> list[dict[str, Any]]:
340
+ return await load_open_findings(
341
+ await self._blackboard_service(),
342
+ prefix=f"{_FINDING_SUBJECT_PREFIX}%",
343
+ claimed_by=self._worker_uuid,
344
+ remediation_map=self._get_remediation_map(),
345
+ )
346
+
347
+ # ID: 8a7c5e91-2b4f-4d63-9e07-1a3c5d8b2f04
348
+ async def _get_active_proposal_id_by_action_file(
349
+ self,
350
+ ) -> dict[tuple[str, str | None], str]:
351
+ return await get_active_proposal_id_by_action_file()
352
+
353
+ # ID: f8a9b0c1-d2e3-4567-fabc-456789012347
354
+ async def _create_proposal(
355
+ self, ref_id: str, ref_kind: str, findings: list[dict[str, Any]]
356
+ ) -> str | None:
357
+ return await create_proposal(ref_id, ref_kind, findings)
358
+
359
+ # ID: a9b0c1d2-e3f4-5678-abcd-567890123458
360
+ async def _resolve_entries(self, entry_ids: list[str], proposal_id: str) -> int:
361
+ return await resolve_entries(
362
+ await self._blackboard_service(), entry_ids, proposal_id
363
+ )
364
+
365
+ # ID: 2f8b4e71-c950-4a6d-b3e8-7f1a5c2d906e
366
+ async def _defer_to_proposal(self, entry_ids: list[str], proposal_id: str) -> int:
367
+ return await defer_to_proposal(
368
+ await self._blackboard_service(), entry_ids, proposal_id
369
+ )
370
+
371
+ # ID: d2e3f4a5-b6c7-8901-defa-890123456781
372
+ async def _release_entries(self, entry_ids: list[str]) -> int:
373
+ return await release_entries(await self._blackboard_service(), entry_ids)
374
+
375
+ # ID: b0c1d2e3-f4a5-6789-bcde-678901234569
376
+ async def _release_unmappable(self, findings: list[dict[str, Any]]) -> int:
377
+ return await release_unmappable(await self._blackboard_service(), findings)
378
+
379
+ # ID: e16afa44-6fde-4782-9879-e4953b997e74
380
+ async def _check_circuit_breaker(
381
+ self,
382
+ *,
383
+ ref_id: str,
384
+ ref_kind: str,
385
+ file_path: str | None,
386
+ config: Any,
387
+ ) -> tuple[int, str | None, str | None, str | None]:
388
+ return await check_circuit_breaker(
389
+ ref_id=ref_id, ref_kind=ref_kind, file_path=file_path, config=config
390
+ )
391
+
392
+ # ID: c1d2e3f4-a5b6-7890-cdef-789012345670
393
+ async def _mark_delegated(self, findings: list[dict[str, Any]]) -> int:
394
+ return await mark_delegated(await self._blackboard_service(), findings)
@@ -0,0 +1,225 @@
1
+ # src/will/workers/violation_remediator_blackboard.py
2
+ """
3
+ Blackboard operations for ViolationRemediatorWorker.
4
+
5
+ Collaborator module. Owns the claim-time loader and the five terminal
6
+ transitions for findings:
7
+
8
+ - load_open_findings: claim open audit.violation findings; immediately
9
+ release any whose rule has no remediation mapping so they don't stay
10
+ parked at 'claimed'.
11
+ - resolve_entries: dedup-subsume path. Mark subsumed entries 'resolved'
12
+ with the subsuming proposal_id on payload (URS Q1.F / ADR-015 D4).
13
+ Status is 'resolved' rather than 'deferred_to_proposal' because the
14
+ subsuming proposal does not track the subsumed entries in its scope,
15
+ so the §7a revival contract does not apply.
16
+ - defer_to_proposal: happy path (ADR-010 / CORE-Finding.md §7 row 4).
17
+ Transition entries to 'deferred_to_proposal' with proposal_id on
18
+ payload — the linkage ProposalStateManager.mark_failed reads to
19
+ revive findings if the proposal later fails.
20
+ - release_entries: rollback when proposal creation fails. Returns
21
+ claimed entries to 'open' so the next cycle can retry cleanly.
22
+ - release_unmappable: same release path, driven from a list of finding
23
+ dicts whose rule has no remediation map entry.
24
+ - mark_delegated: terminal 'indeterminate' for entries whose rule is
25
+ DELEGATE — non-automatable, awaiting governor decision.
26
+
27
+ Implements:
28
+ ADR-010 — Finding→Proposal linkage and the §7/§7a revival contract
29
+ ADR-015 D4 — dedup-subsume payload pointer (audit linkage)
30
+
31
+ Every function takes the BlackboardService instance as its first
32
+ argument so the module is unit-testable against a stub service without
33
+ monkeypatching service_registry, and service-acquisition (and any
34
+ caching) lives on the caller side. Each transition is fail-soft: a
35
+ service-call exception is logged and the function returns 0 — a
36
+ service hiccup never reverses the worker's upstream accounting.
37
+
38
+ LAYER: will/workers — internal collaborator of ViolationRemediatorWorker.
39
+ No database access, no file writes, no LLM calls.
40
+ """
41
+
42
+ from __future__ import annotations
43
+
44
+ from typing import Any
45
+
46
+ from shared.logger import getLogger
47
+
48
+
49
+ logger = getLogger(__name__)
50
+
51
+
52
+ def _entry_id(finding: dict[str, Any]) -> str:
53
+ """Extract the blackboard-entry id from a finding dict.
54
+
55
+ Mirrors the helper in violation_remediator_proposal so this module is
56
+ self-contained; both raise ValueError on a contract violation rather
57
+ than silently propagating None to the SQL layer.
58
+ """
59
+ value = finding.get("id") or finding.get("entry_id")
60
+ if value is None:
61
+ raise ValueError(f"Finding has neither 'id' nor 'entry_id': {finding!r}")
62
+ return str(value)
63
+
64
+
65
+ # ID: 87787044-a1a2-4e07-b2dc-197c8e9598c7
66
+ async def load_open_findings(
67
+ service: Any,
68
+ *,
69
+ prefix: str,
70
+ claimed_by: Any,
71
+ remediation_map: dict[str, Any],
72
+ limit: int = 200,
73
+ ) -> list[dict[str, Any]]:
74
+ """Claim open audit.violation findings and filter to those with a remediation mapping.
75
+
76
+ Atomically claims up to *limit* findings whose subject starts with
77
+ *prefix*, then partitions them by whether *remediation_map* has an
78
+ entry for the rule. Mappable findings are returned. Unmappable ids
79
+ are released back to 'open' inside this call so they don't stay
80
+ parked at 'claimed' across cycles.
81
+
82
+ Fail-soft: a claim-time exception returns an empty list; a release-
83
+ time exception is logged but does not propagate (the mappable
84
+ findings the caller will work on are unaffected).
85
+ """
86
+ try:
87
+ claimed = await service.claim_violation_findings(
88
+ prefix=prefix,
89
+ limit=limit,
90
+ claimed_by=claimed_by,
91
+ )
92
+ except Exception as e:
93
+ logger.error("ViolationRemediatorWorker: failed to load findings: %s", e)
94
+ return []
95
+
96
+ if not claimed:
97
+ return []
98
+
99
+ mappable: list[dict[str, Any]] = []
100
+ unmappable_ids: list[str] = []
101
+ for finding in claimed:
102
+ rule = finding["payload"].get("check_id") or finding["payload"].get("rule", "")
103
+ if remediation_map.get(rule):
104
+ mappable.append(finding)
105
+ else:
106
+ unmappable_ids.append(_entry_id(finding))
107
+
108
+ if unmappable_ids:
109
+ try:
110
+ released = await service.release_claimed_entries(unmappable_ids)
111
+ logger.info(
112
+ "ViolationRemediatorWorker: released %d/%d unmappable findings "
113
+ "at claim time",
114
+ released,
115
+ len(unmappable_ids),
116
+ )
117
+ except Exception as e:
118
+ logger.error(
119
+ "ViolationRemediatorWorker: failed to release unmappable "
120
+ "findings at claim time: %s",
121
+ e,
122
+ )
123
+
124
+ return mappable
125
+
126
+
127
+ # ID: 270f785d-0bab-418f-8c0d-2a919de92e9b
128
+ async def resolve_entries(
129
+ service: Any,
130
+ entry_ids: list[str],
131
+ proposal_id: str,
132
+ ) -> int:
133
+ """Mark subsumed entries 'resolved' with the subsuming proposal_id on payload.
134
+
135
+ Used by the dedup-subsume branch — see ADR-015 D4. Routes to
136
+ BlackboardService.resolve_entries_for_proposal, the dedicated mirror of
137
+ defer_entries_to_proposal for this path.
138
+
139
+ Returns count of entries resolved. Fail-soft on service error.
140
+ """
141
+ if not entry_ids:
142
+ return 0
143
+ try:
144
+ return await service.resolve_entries_for_proposal(entry_ids, proposal_id)
145
+ except Exception as e:
146
+ logger.error("ViolationRemediatorWorker: failed to resolve entries: %s", e)
147
+ return 0
148
+
149
+
150
+ # ID: 145f905f-b1ac-4616-9bcc-6a4f0159afda
151
+ async def defer_to_proposal(
152
+ service: Any,
153
+ entry_ids: list[str],
154
+ proposal_id: str,
155
+ ) -> int:
156
+ """Transition entries to 'deferred_to_proposal' with proposal_id on payload.
157
+
158
+ Happy-path terminal transition for findings consumed into a newly-
159
+ created proposal — CORE-Finding.md §7 row 4 and ADR-010. The §7a
160
+ revival contract in ProposalStateManager.mark_failed depends on this
161
+ linkage.
162
+
163
+ Returns count of entries deferred. Fail-soft: a revival-layer failure
164
+ here does not reverse the caller's proposal_created accounting.
165
+ """
166
+ if not entry_ids:
167
+ return 0
168
+ try:
169
+ return await service.defer_entries_to_proposal(entry_ids, proposal_id)
170
+ except Exception as e:
171
+ logger.error(
172
+ "ViolationRemediatorWorker: failed to defer entries to proposal %s: %s",
173
+ proposal_id,
174
+ e,
175
+ )
176
+ return 0
177
+
178
+
179
+ # ID: 2f3a6a63-bb19-410a-9497-1433e0811bf9
180
+ async def release_entries(service: Any, entry_ids: list[str]) -> int:
181
+ """Release claimed entries back to 'open' by id.
182
+
183
+ Used when proposal creation fails and findings need to be retry-
184
+ eligible on the next run. Returns count of entries released.
185
+ Fail-soft on service error.
186
+ """
187
+ if not entry_ids:
188
+ return 0
189
+ try:
190
+ return await service.release_claimed_entries(entry_ids)
191
+ except Exception as e:
192
+ logger.error("ViolationRemediatorWorker: failed to release entries: %s", e)
193
+ return 0
194
+
195
+
196
+ # ID: 75f8df09-f542-43fc-8506-85b7a1059be1
197
+ async def release_unmappable(service: Any, findings: list[dict[str, Any]]) -> int:
198
+ """Release claimed findings whose rule has no remediation mapping.
199
+
200
+ Resolves entry ids and delegates to release_entries — same release
201
+ path, different driver (list of finding dicts rather than ids).
202
+ """
203
+ if not findings:
204
+ return 0
205
+ entry_ids = [_entry_id(f) for f in findings]
206
+ return await release_entries(service, entry_ids)
207
+
208
+
209
+ # ID: 3a2edb4b-98c1-4ab5-ad7e-8f4c31d6bcdd
210
+ async def mark_delegated(service: Any, findings: list[dict[str, Any]]) -> int:
211
+ """Mark DELEGATE findings 'indeterminate' — awaiting governor decision.
212
+
213
+ Terminal transition for non-automatable findings. Returns count of
214
+ entries marked. Fail-soft on service error.
215
+ """
216
+ if not findings:
217
+ return 0
218
+ entry_ids = [_entry_id(f) for f in findings]
219
+ try:
220
+ return await service.mark_indeterminate(entry_ids)
221
+ except Exception as e:
222
+ logger.error(
223
+ "ViolationRemediatorWorker: failed to mark delegated entries: %s", e
224
+ )
225
+ return 0
@@ -0,0 +1,12 @@
1
+ # src/will/workers/violation_remediator_body/__init__.py
2
+ """
3
+ ViolationRemediator package.
4
+
5
+ Split from body/workers/violation_remediator.py.
6
+ Re-exports ViolationRemediator for backward compatibility.
7
+ """
8
+
9
+ from .worker import ViolationRemediator
10
+
11
+
12
+ __all__ = ["ViolationRemediator"]