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,220 @@
1
+ # src/api/v1/inspect_routes.py
2
+
3
+ """
4
+ Inspect API endpoints (ADR-057 Phase 3, D3, D5).
5
+
6
+ Every endpoint here is read-only — no resource tables, no background
7
+ tasks. Endpoints live under six top-level namespaces (`/status`,
8
+ `/decisions`, `/refusals`, `/analysis`, `/components`, `/search`) so the
9
+ API surface mirrors the CLI command groups one-to-one. All six routers
10
+ are mounted under the `Inspect` OpenAPI tag — `inspect` is the logical
11
+ namespace name, not a URL prefix (per ADR-053 D4 amendment 2026-05-18).
12
+
13
+ CONSTITUTIONAL:
14
+ - Session access via api.dependencies.get_api_session only.
15
+ - CoreContext is read from request.app.state.core_context.
16
+ - body.* repositories / mind.* engines / will.* services are reached
17
+ through the will.governance.inspect_runner facade — no direct
18
+ imports here (architecture.api.no_body_bypass).
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from fastapi import APIRouter, Depends, Query, Request
24
+ from sqlalchemy.ext.asyncio import AsyncSession
25
+
26
+ from api.dependencies import get_api_session
27
+ from shared.context import CoreContext
28
+ from shared.logger import getLogger
29
+ from will.governance.inspect_runner import (
30
+ get_analysis_clusters,
31
+ get_analysis_command_tree,
32
+ get_analysis_common_knowledge,
33
+ get_analysis_duplicates,
34
+ get_analysis_test_targets,
35
+ get_components_list,
36
+ get_db_status,
37
+ get_decisions,
38
+ get_decisions_patterns,
39
+ get_drift_status,
40
+ get_refusals,
41
+ get_refusals_stats,
42
+ get_search_capabilities,
43
+ get_search_commands,
44
+ )
45
+
46
+
47
+ logger = getLogger(__name__)
48
+
49
+
50
+ # Each top-level namespace gets its own router. They are mounted together
51
+ # in api/main.py so the URL prefixes are preserved verbatim.
52
+ status_router = APIRouter(prefix="/status")
53
+ decisions_router = APIRouter(prefix="/decisions")
54
+ refusals_router = APIRouter(prefix="/refusals")
55
+ analysis_router = APIRouter(prefix="/analysis")
56
+ components_router = APIRouter(prefix="/components")
57
+ search_router = APIRouter(prefix="/search")
58
+
59
+
60
+ # ---------- /status ------------------------------------------------------
61
+
62
+
63
+ @status_router.get("/db")
64
+ # ID: 1c5d7e3f-4a6b-4c8d-9e0f-1a2b3c4d5e61
65
+ async def status_db(session: AsyncSession = Depends(get_api_session)) -> dict:
66
+ """Return DB connection and schema state."""
67
+ return await get_db_status(session)
68
+
69
+
70
+ @status_router.get("/drift")
71
+ # ID: 2d6e8f4a-5b7c-4d9e-0f1a-2b3c4d5e6f72
72
+ async def status_drift(
73
+ request: Request,
74
+ scope: str = Query(default="all"),
75
+ ) -> dict:
76
+ """Return consolidated drift snapshot for symbols and/or vectors."""
77
+ core_context: CoreContext = request.app.state.core_context
78
+ return await get_drift_status(core_context, scope=scope)
79
+
80
+
81
+ # ---------- /decisions ---------------------------------------------------
82
+
83
+
84
+ @decisions_router.get("")
85
+ # ID: 3e7f9a5b-6c8d-4e0f-1a2b-3c4d5e6f7a83
86
+ async def decisions_list(
87
+ session_id: str | None = Query(default=None),
88
+ agent: str | None = Query(default=None),
89
+ pattern: str | None = Query(default=None),
90
+ limit: int = Query(default=50, ge=1, le=500),
91
+ ) -> dict:
92
+ """Return recent decision traces with optional filters."""
93
+ return await get_decisions(
94
+ session_id=session_id,
95
+ agent=agent,
96
+ pattern=pattern,
97
+ limit=limit,
98
+ )
99
+
100
+
101
+ @decisions_router.get("/patterns")
102
+ # ID: 4f8a0b6c-7d9e-4f1a-2b3c-4d5e6f7a8b94
103
+ async def decisions_patterns(
104
+ days: int = Query(default=7, ge=1, le=365),
105
+ ) -> dict:
106
+ """Return pattern classification stats across the lookback window."""
107
+ return await get_decisions_patterns(days=days)
108
+
109
+
110
+ # ---------- /refusals ----------------------------------------------------
111
+
112
+
113
+ @refusals_router.get("")
114
+ # ID: 5a9b1c7d-8e0f-4a2b-3c4d-5e6f7a8b9ca5
115
+ async def refusals_list(
116
+ refusal_type: str | None = Query(default=None, alias="type"),
117
+ session_id: str | None = Query(default=None, alias="session"),
118
+ limit: int = Query(default=50, ge=1, le=500),
119
+ ) -> dict:
120
+ """Return recent constitutional refusal records."""
121
+ return await get_refusals(
122
+ refusal_type=refusal_type,
123
+ session_id=session_id,
124
+ limit=limit,
125
+ )
126
+
127
+
128
+ @refusals_router.get("/stats")
129
+ # ID: 6b0c2d8e-9f1a-4b3c-4d5e-6f7a8b9c0db6
130
+ async def refusals_stats(
131
+ days: int = Query(default=7, ge=1, le=365),
132
+ ) -> dict:
133
+ """Return refusal statistics grouped by type."""
134
+ return await get_refusals_stats(days=days)
135
+
136
+
137
+ # ---------- /analysis ----------------------------------------------------
138
+
139
+
140
+ @analysis_router.get("/clusters")
141
+ # ID: 7c1d3e9f-0a2b-4c4d-5e6f-7a8b9c0d1ec7
142
+ async def analysis_clusters(
143
+ limit: int = Query(default=25, ge=1, le=200),
144
+ ) -> dict:
145
+ """Return semantic capability clusters."""
146
+ return await get_analysis_clusters(limit=limit)
147
+
148
+
149
+ @analysis_router.get("/duplicates")
150
+ # ID: 8d2e4f0a-1b3c-4d5e-6f7a-8b9c0d1e2fd8
151
+ async def analysis_duplicates(
152
+ request: Request,
153
+ threshold: float = Query(default=0.85, ge=0.0, le=1.0),
154
+ ) -> dict:
155
+ """Return semantic code duplication candidates."""
156
+ core_context: CoreContext = request.app.state.core_context
157
+ return await get_analysis_duplicates(core_context, threshold=threshold)
158
+
159
+
160
+ @analysis_router.get("/common-knowledge")
161
+ # ID: 9e3f5a1b-2c4d-4e6f-7a8b-9c0d1e2f3ae9
162
+ async def analysis_common_knowledge(
163
+ limit: int = Query(default=25, ge=1, le=200),
164
+ ) -> dict:
165
+ """Return DRY-violation candidates."""
166
+ return await get_analysis_common_knowledge(limit=limit)
167
+
168
+
169
+ @analysis_router.get("/command-tree")
170
+ # ID: 0f4a6b2c-3d5e-4f7a-8b9c-0d1e2f3a4bf0
171
+ async def analysis_command_tree(request: Request) -> dict:
172
+ """Return the introspected CLI command hierarchy."""
173
+ core_context: CoreContext = request.app.state.core_context
174
+ return get_analysis_command_tree(core_context)
175
+
176
+
177
+ @analysis_router.get("/test-targets")
178
+ # ID: 1a5b7c3d-4e6f-4a8b-9c0d-1e2f3a4b5ce1
179
+ async def analysis_test_targets(request: Request) -> dict:
180
+ """Return SIMPLE / COMPLEX classification for in-scope source files."""
181
+ core_context: CoreContext = request.app.state.core_context
182
+ return get_analysis_test_targets(core_context)
183
+
184
+
185
+ # ---------- /components --------------------------------------------------
186
+
187
+
188
+ @components_router.get("")
189
+ # ID: 3b094d1e-e473-4044-9f46-16f6870f3946
190
+ async def components_list(
191
+ filter_type: str | None = Query(default=None, alias="type"),
192
+ ) -> dict:
193
+ """Return the registered V2 component inventory across Mind/Body/Will."""
194
+ return get_components_list(filter_type=filter_type)
195
+
196
+
197
+ # ---------- /search ------------------------------------------------------
198
+
199
+
200
+ @search_router.get("/capabilities")
201
+ # ID: 08ac8c57-ef92-4142-bf90-ba57bb0c6ce4
202
+ async def search_capabilities(
203
+ request: Request,
204
+ q: str = Query(..., min_length=1),
205
+ limit: int = Query(default=10, ge=1, le=200),
206
+ ) -> dict:
207
+ """Semantic capability search via the Will cognitive service."""
208
+ core_context: CoreContext = request.app.state.core_context
209
+ return await get_search_capabilities(core_context, q=q, limit=limit)
210
+
211
+
212
+ @search_router.get("/commands")
213
+ # ID: 5c26c235-e80d-4da5-a942-f027fa7a087a
214
+ async def search_commands(
215
+ q: str = Query(..., min_length=1),
216
+ limit: int = Query(default=25, ge=1, le=200),
217
+ session: AsyncSession = Depends(get_api_session),
218
+ ) -> dict:
219
+ """Fuzzy substring search over the CLI command registry (ADR-057 D5)."""
220
+ return await get_search_commands(session, q=q, limit=limit)
@@ -0,0 +1,56 @@
1
+ # src/api/v1/integration_routes.py
2
+
3
+ """
4
+ Integration API endpoint (ADR-054 Phase 1).
5
+
6
+ POST /v1/integrate stages, formats, lints, and commits the working
7
+ tree via will.lifecycle.integration_runner. Long-running but
8
+ synchronous from the caller's perspective — there is no run-id to
9
+ poll, so the CLI just awaits the response.
10
+
11
+ CONSTITUTIONAL:
12
+ - mind.* / body.* / shared.infrastructure.* are not imported here.
13
+ All work is delegated through will.lifecycle.integration_runner.
14
+ - CoreContext comes from request.app.state.core_context.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from fastapi import APIRouter, HTTPException, Request
20
+ from pydantic import BaseModel
21
+
22
+ from shared.context import CoreContext
23
+ from shared.logger import getLogger
24
+ from will.lifecycle.integration_runner import run_integration
25
+
26
+
27
+ logger = getLogger(__name__)
28
+
29
+
30
+ router = APIRouter(prefix="/integrate")
31
+
32
+
33
+ # ID: fd724178-3586-48bb-a519-280de29821a3
34
+ class IntegrateRequest(BaseModel):
35
+ """Body for POST /integrate."""
36
+
37
+ commit_message: str
38
+
39
+
40
+ @router.post("")
41
+ # ID: 578732cb-c976-4577-a6ef-3024e24d9833
42
+ async def integrate(
43
+ payload: IntegrateRequest,
44
+ request: Request,
45
+ ) -> dict:
46
+ """Run the integration workflow (stage → format/lint → commit).
47
+
48
+ Returns 200 on success. Translates a failed workflow into a 502
49
+ so the CLI can render a clear error; the underlying exit_code is
50
+ surfaced in the detail object.
51
+ """
52
+ core_context: CoreContext = request.app.state.core_context
53
+ result = await run_integration(core_context, payload.commit_message)
54
+ if not result["ok"]:
55
+ raise HTTPException(status_code=502, detail=result)
56
+ return result
@@ -0,0 +1,72 @@
1
+ # src/api/v1/integrity_routes.py
2
+
3
+ """
4
+ Integrity API endpoints (ADR-055 D6 follow-up — closes #353).
5
+
6
+ Two synchronous endpoints, both filesystem-only:
7
+
8
+ * POST /integrity/baseline — SHA256-fingerprint src/ and write a
9
+ baseline manifest under var/integrity/. Returns the relative
10
+ manifest path and file count.
11
+ * POST /integrity/verify — diff current src/ against a saved
12
+ baseline. Returns ok / errors / checked_at.
13
+
14
+ No core.integrity_runs persistence, no BackgroundTasks — operations
15
+ are fast (single-digit seconds) and self-contained. Closest precedent
16
+ is POST /fix/ir (also synchronous, also no persistence).
17
+
18
+ CONSTITUTIONAL:
19
+ - CoreContext is read from request.app.state.core_context.
20
+ - shared.infrastructure.* is reached through the
21
+ will.governance.integrity_runner facade — no direct imports here.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ from fastapi import APIRouter, Body, Request
27
+ from pydantic import BaseModel
28
+
29
+ from shared.context import CoreContext
30
+ from shared.logger import getLogger
31
+ from will.governance.integrity_runner import (
32
+ create_baseline,
33
+ verify_integrity,
34
+ )
35
+
36
+
37
+ logger = getLogger(__name__)
38
+
39
+
40
+ router = APIRouter(prefix="/integrity")
41
+
42
+
43
+ # ID: f3564baa-a7fb-4c21-a12d-25e06b416ea6
44
+ class IntegrityRequest(BaseModel):
45
+ """Body for POST /integrity/baseline and POST /integrity/verify.
46
+
47
+ Empty body is valid and equivalent to label='default'.
48
+ """
49
+
50
+ label: str = "default"
51
+
52
+
53
+ @router.post("/baseline")
54
+ # ID: d93ed634-a710-4e61-ad28-88a5a35e1a0d
55
+ async def integrity_baseline(
56
+ request: Request,
57
+ payload: IntegrityRequest = Body(default_factory=IntegrityRequest),
58
+ ) -> dict:
59
+ """Create a SHA256 baseline of src/ and return path + file count."""
60
+ core_context: CoreContext = request.app.state.core_context
61
+ return create_baseline(core_context, payload.label)
62
+
63
+
64
+ @router.post("/verify")
65
+ # ID: 804f2a54-a7c5-4900-afe2-f43e6702a6ee
66
+ async def integrity_verify(
67
+ request: Request,
68
+ payload: IntegrityRequest = Body(default_factory=IntegrityRequest),
69
+ ) -> dict:
70
+ """Verify src/ against the named baseline and return ok / errors."""
71
+ core_context: CoreContext = request.app.state.core_context
72
+ return verify_integrity(core_context, payload.label)
@@ -0,0 +1,36 @@
1
+ # src/api/v1/knowledge_routes.py
2
+
3
+ """
4
+ Knowledge API endpoints.
5
+
6
+ CONSTITUTIONAL FIX (architecture.api.no_direct_database_access):
7
+ Session dependency now routes through api.dependencies — the single
8
+ sanctioned provider for the API layer.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from fastapi import APIRouter, Depends
14
+ from sqlalchemy.ext.asyncio import AsyncSession
15
+
16
+ from api.dependencies import get_api_session
17
+ from shared.infrastructure.knowledge.knowledge_service import KnowledgeService
18
+
19
+
20
+ router = APIRouter(prefix="/knowledge")
21
+
22
+
23
+ @router.get("/capabilities")
24
+ # ID: 0016df93-d0e5-45b0-b5b8-8f4170de3d9d
25
+ async def list_capabilities(
26
+ session: AsyncSession = Depends(get_api_session),
27
+ ) -> dict:
28
+ """
29
+ Return known capabilities.
30
+
31
+ Tests expect a 200 on GET /v1/knowledge/capabilities and a JSON object
32
+ with a 'capabilities' key.
33
+ """
34
+ service = KnowledgeService(session=session)
35
+ caps = await service.list_capabilities()
36
+ return {"capabilities": caps}
api/v1/lint_routes.py ADDED
@@ -0,0 +1,40 @@
1
+ # src/api/v1/lint_routes.py
2
+
3
+ """
4
+ Lint API endpoint (ADR-054 Phase 1).
5
+
6
+ POST /v1/lint runs `black --check` + `ruff check` against src/ and
7
+ tests/ via will.governance.lint_runner. The response always carries
8
+ per-tool stdout/stderr so the CLI can render the actual findings
9
+ even when the workflow reports non-zero.
10
+
11
+ CONSTITUTIONAL: no mind.* / body.* / shared.infrastructure.* imports
12
+ here; the lint subprocess work lives behind a Will facade.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ from fastapi import APIRouter
18
+
19
+ from shared.logger import getLogger
20
+ from will.governance.lint_runner import run_lint
21
+
22
+
23
+ logger = getLogger(__name__)
24
+
25
+
26
+ router = APIRouter(prefix="/lint")
27
+
28
+
29
+ @router.post("")
30
+ # ID: 923355cf-ad6d-446a-865f-539025a11428
31
+ async def lint_endpoint() -> dict:
32
+ """Run black --check and ruff check on src/ and tests/.
33
+
34
+ Returns 200 with the structured result regardless of pass/fail —
35
+ the response's `ok` field carries the verdict, and `tools.*` carry
36
+ per-tool returncodes and captured output. This avoids the
37
+ "lint findings = HTTP error" anti-pattern; a clean lint and a
38
+ dirty lint are both successful API calls.
39
+ """
40
+ return await run_lint()
@@ -0,0 +1,267 @@
1
+ # src/api/v1/proposals_routes.py
2
+
3
+ """
4
+ Proposals API endpoints (ADR-054 Phase 1).
5
+
6
+ Surfaces the core.autonomous_proposals state machine over HTTP so the
7
+ CLI (and other governor-direct clients) can migrate off direct
8
+ `will.*` / `shared.*` imports. The semantics — approval authority
9
+ closed-set, claim sentinel, dry-run vs write — are unchanged from the
10
+ CLI path; this module is a thin translation layer over
11
+ ProposalService and ProposalExecutor.
12
+
13
+ CONSTITUTIONAL:
14
+ - Session access goes through api.dependencies.get_api_session only.
15
+ - ProposalService is the facade; ProposalRepository and
16
+ ProposalStateManager are not imported here.
17
+ - CoreContext is read from request.app.state.core_context — never
18
+ constructed in routes.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from typing import Final
24
+ from uuid import UUID
25
+
26
+ from fastapi import APIRouter, Depends, HTTPException, Query, Request
27
+ from pydantic import BaseModel
28
+ from sqlalchemy.ext.asyncio import AsyncSession
29
+
30
+ from api.dependencies import get_api_session
31
+ from shared.context import CoreContext
32
+ from shared.logger import getLogger
33
+ from will.autonomy.proposal import (
34
+ Proposal,
35
+ ProposalAction,
36
+ ProposalScope,
37
+ ProposalStatus,
38
+ )
39
+ from will.autonomy.proposal_executor import ProposalExecutor
40
+ from will.autonomy.proposal_service import ProposalService
41
+ from will.autonomy.proposal_state_manager import ProposalNotFoundError
42
+
43
+
44
+ logger = getLogger(__name__)
45
+
46
+
47
+ # API claimer sentinel — distinct from CLI_CLAIMER_UUID
48
+ # (cli/resources/proposals/manage.py uses ...0001). Mirrors the ADR-017
49
+ # D4 pattern: governor-direct execution paths get a stable sentinel so
50
+ # claimed_by lineage is queryable per surface.
51
+ API_CLAIMER_UUID: Final[UUID] = UUID("00000000-0000-0000-0000-000000000002")
52
+
53
+
54
+ router = APIRouter(prefix="/proposals")
55
+
56
+
57
+ # ID: 5103629b-96d2-4c2c-8217-df99555ed221
58
+ class ApproveRequest(BaseModel):
59
+ """Body for POST /proposals/{id}/approve."""
60
+
61
+ approved_by: str
62
+ approval_authority: str
63
+
64
+
65
+ # ID: 3a74ddce-87c2-4528-a2f4-5ec68d171ea0
66
+ class RejectRequest(BaseModel):
67
+ """Body for POST /proposals/{id}/reject."""
68
+
69
+ reason: str
70
+
71
+
72
+ # ID: 57020012-ad90-461f-98d3-50f565b65294
73
+ class ExecuteRequest(BaseModel):
74
+ """Body for POST /proposals/{id}/execute."""
75
+
76
+ write: bool = False
77
+
78
+
79
+ # ID: 71caa34a-1661-4178-b982-626bff254539
80
+ class CreateProposalRequest(BaseModel):
81
+ """Body for POST /proposals.
82
+
83
+ `write=False` is a dry-run: server builds the Proposal and computes
84
+ risk but does not persist. `write=True` persists via
85
+ ProposalService.create.
86
+ """
87
+
88
+ goal: str
89
+ actions: list[dict] = []
90
+ files: list[str] = []
91
+ created_by: str = "cli_operator"
92
+ write: bool = True
93
+
94
+
95
+ @router.post("", status_code=201)
96
+ # ID: 9704145a-25f5-460c-81a9-fe1fa0b47d68
97
+ async def create_proposal(
98
+ payload: CreateProposalRequest,
99
+ session: AsyncSession = Depends(get_api_session),
100
+ ) -> dict:
101
+ """Create a new proposal.
102
+
103
+ Validates the action sequence, computes risk, and (when write=True)
104
+ persists via ProposalService.create. Returns the proposal's
105
+ `to_dict()` representation either way; in dry-run mode the row
106
+ is not flushed to the database.
107
+ """
108
+ proposal_actions = [
109
+ ProposalAction(
110
+ action_id=a.get("action_id"),
111
+ flow_id=a.get("flow_id"),
112
+ parameters=a.get("parameters", {}),
113
+ order=a.get("order", i),
114
+ )
115
+ for i, a in enumerate(payload.actions)
116
+ ]
117
+ proposal = Proposal(
118
+ goal=payload.goal,
119
+ actions=proposal_actions,
120
+ scope=ProposalScope(files=payload.files),
121
+ created_by=payload.created_by,
122
+ )
123
+ proposal.compute_risk()
124
+
125
+ if payload.write:
126
+ service = ProposalService(session)
127
+ await service.create(proposal)
128
+ await session.commit()
129
+
130
+ return {
131
+ "ok": True,
132
+ "persisted": payload.write,
133
+ "proposal": proposal.to_dict(),
134
+ }
135
+
136
+
137
+ @router.get("")
138
+ # ID: b6575d68-b902-4071-8497-76b053430fec
139
+ async def list_proposals(
140
+ status: str | None = Query(None, description="ProposalStatus value to filter by."),
141
+ limit: int = Query(50, ge=1),
142
+ session: AsyncSession = Depends(get_api_session),
143
+ ) -> dict:
144
+ """List proposals, optionally filtered by status.
145
+
146
+ When `status` is omitted, returns proposals awaiting approval.
147
+ """
148
+ service = ProposalService(session)
149
+
150
+ if status is None:
151
+ proposals = await service.list_pending_approval(limit=limit)
152
+ else:
153
+ try:
154
+ parsed = ProposalStatus(status)
155
+ except ValueError as exc:
156
+ raise HTTPException(
157
+ status_code=400,
158
+ detail=(
159
+ f"Invalid status {status!r}; allowed: "
160
+ f"{[s.value for s in ProposalStatus]}"
161
+ ),
162
+ ) from exc
163
+ proposals = await service.list_by_status(parsed, limit=limit)
164
+
165
+ return {
166
+ "count": len(proposals),
167
+ "proposals": [p.to_dict() for p in proposals],
168
+ }
169
+
170
+
171
+ @router.get("/{proposal_id}")
172
+ # ID: f99b7ebf-5664-4642-9ac0-500b2fa56216
173
+ async def get_proposal(
174
+ proposal_id: str,
175
+ session: AsyncSession = Depends(get_api_session),
176
+ ) -> dict:
177
+ """Return a single proposal by id."""
178
+ service = ProposalService(session)
179
+ proposal = await service.get(proposal_id)
180
+ if proposal is None:
181
+ raise HTTPException(
182
+ status_code=404,
183
+ detail=f"Proposal not found: {proposal_id}",
184
+ )
185
+ return proposal.to_dict()
186
+
187
+
188
+ @router.post("/{proposal_id}/approve")
189
+ # ID: 499722f9-8c4c-4d04-99b2-aed56329c592
190
+ async def approve_proposal(
191
+ proposal_id: str,
192
+ payload: ApproveRequest,
193
+ session: AsyncSession = Depends(get_api_session),
194
+ ) -> dict:
195
+ """Approve a pending proposal.
196
+
197
+ `approval_authority` is non-omittable per URS NFR.5 and validated
198
+ against the proposal_approval_authority closed set inside
199
+ ProposalStateManager.approve.
200
+ """
201
+ service = ProposalService(session)
202
+ try:
203
+ await service.approve(
204
+ proposal_id,
205
+ approved_by=payload.approved_by,
206
+ approval_authority=payload.approval_authority,
207
+ )
208
+ except ProposalNotFoundError as exc:
209
+ raise HTTPException(status_code=404, detail=str(exc)) from exc
210
+ except ValueError as exc:
211
+ raise HTTPException(status_code=400, detail=str(exc)) from exc
212
+
213
+ return {
214
+ "ok": True,
215
+ "proposal_id": proposal_id,
216
+ "status": ProposalStatus.APPROVED.value,
217
+ "approved_by": payload.approved_by,
218
+ "approval_authority": payload.approval_authority,
219
+ }
220
+
221
+
222
+ @router.post("/{proposal_id}/reject")
223
+ # ID: 5c3091dd-b88f-4ebf-8de5-285f24f90ef8
224
+ async def reject_proposal(
225
+ proposal_id: str,
226
+ payload: RejectRequest,
227
+ session: AsyncSession = Depends(get_api_session),
228
+ ) -> dict:
229
+ """Reject a proposal with a reason.
230
+
231
+ Per ADR-010 §7a, rejection is symmetric with mark_failed: findings
232
+ parked at deferred_to_proposal must be revived so they reach the
233
+ audit sensor for re-adjudication, otherwise they strand. Revival
234
+ flips them to awaiting_reaudit per ADR-045; the AuditViolationSensor
235
+ decides on the next cycle whether to release to 'open' or resolve.
236
+ """
237
+ service = ProposalService(session)
238
+ try:
239
+ revived_count = await service.reject(proposal_id, reason=payload.reason)
240
+ except ProposalNotFoundError as exc:
241
+ raise HTTPException(status_code=404, detail=str(exc)) from exc
242
+
243
+ return {
244
+ "ok": True,
245
+ "proposal_id": proposal_id,
246
+ "status": ProposalStatus.REJECTED.value,
247
+ "reason": payload.reason,
248
+ "revived_count": revived_count,
249
+ }
250
+
251
+
252
+ @router.post("/{proposal_id}/execute")
253
+ # ID: aaa55146-21cc-4945-bb2e-d0e083dfd6ff
254
+ async def execute_proposal(
255
+ proposal_id: str,
256
+ payload: ExecuteRequest,
257
+ request: Request,
258
+ ) -> dict:
259
+ """Execute an approved proposal (governor-direct override).
260
+
261
+ Defaults to dry-run; pass `{"write": true}` to apply changes.
262
+ ProposalExecutor manages its own session via service_registry, so
263
+ no get_api_session dependency is required here.
264
+ """
265
+ core_context: CoreContext = request.app.state.core_context
266
+ executor = ProposalExecutor(core_context)
267
+ return await executor.execute(proposal_id, API_CLAIMER_UUID, write=payload.write)