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,66 @@
1
+ # src/shared/infrastructure/intent/operational_mode.py
2
+ """
3
+ Operational-mode accessor (ADR-079 D4 placeholder).
4
+
5
+ The chokepoint reads ``current_mode()`` once per ``check_transaction``
6
+ call to decide whether mode-conditional capability entries authorize
7
+ a write. The interface this module declares is stable; the implementation
8
+ in this file is the **placeholder** ADR-079 D4 documents — env-var
9
+ sourced, default-on-uncertainty=`live`.
10
+
11
+ Issue #492 will replace the body with provenance-guaranteed source
12
+ resolution (signed manifest, bootstrap config, conflict-resolution rules).
13
+ Consumers depend on the *interface*, not the *implementation* — the
14
+ accessor's signature does not change when #492 lands.
15
+
16
+ Paper §6's "default on uncertainty is *live*" semantics fail closed: a
17
+ forged dev signal requires successfully setting ``CORE_OPERATIONAL_MODE``
18
+ to the exact string ``"dev"``, not merely being in the absence of
19
+ provenance. Any other value — missing, empty, mistyped, mixed-case —
20
+ collapses to ``"live"``.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import os
26
+ from typing import Literal
27
+
28
+ from shared.logger import getLogger
29
+
30
+
31
+ logger = getLogger(__name__)
32
+
33
+ _MODE_ENV_VAR = "CORE_OPERATIONAL_MODE"
34
+ _VALID_MODES: frozenset[str] = frozenset({"dev", "live"})
35
+
36
+ _first_call_logged = False
37
+
38
+
39
+ # ID: 50389c43-7c80-4e9a-a8cc-01b27535ca8a
40
+ def current_mode() -> Literal["dev", "live"]:
41
+ """
42
+ Return the current operational mode.
43
+
44
+ Reads ``CORE_OPERATIONAL_MODE``. Returns ``"dev"`` only when the env
45
+ var holds the exact string ``"dev"``; returns ``"live"`` for the
46
+ exact string ``"live"`` and for every other case (missing, empty,
47
+ mistyped) per paper §6.
48
+
49
+ Logs at INFO on first call only — the resolved value and the source
50
+ consulted — so the operational signal is observable without
51
+ per-call noise.
52
+ """
53
+ global _first_call_logged
54
+ raw = os.environ.get(_MODE_ENV_VAR)
55
+ if raw in _VALID_MODES:
56
+ resolved: Literal["dev", "live"] = "dev" if raw == "dev" else "live"
57
+ source = _MODE_ENV_VAR
58
+ else:
59
+ resolved = "live"
60
+ source = "default" if raw is None else f"{_MODE_ENV_VAR}=<rejected:{raw!r}>"
61
+
62
+ if not _first_call_logged:
63
+ logger.info("Operational mode resolved: %s (source: %s).", resolved, source)
64
+ _first_call_logged = True
65
+
66
+ return resolved
@@ -0,0 +1,180 @@
1
+ # src/shared/infrastructure/intent/task_type_phases.py
2
+ """
3
+ Task-type to governance-phase mapping helper.
4
+
5
+ Single source of truth for the ExecutionTask.task_type vocabulary and
6
+ its mapping to the governance PhaseType. Both the mapping and the
7
+ closed vocabulary are owned by
8
+ .intent/enforcement/config/task_type_phases.yaml.
9
+
10
+ Authority: policy. The governing document is
11
+ .intent/enforcement/config/task_type_phases.yaml, accessed exclusively
12
+ via IntentRepository. No other module may hardcode the task_type ->
13
+ phase mapping — all call sites route through this helper. See ADR-004.
14
+
15
+ The _FALLBACK_* constants below are last-resort graceful degradation
16
+ for the narrow case where the policy document cannot be loaded (e.g.
17
+ bootstrap races, corrupt YAML). They MUST NOT be treated as
18
+ defaults-in-logic — when the policy loads successfully, it always wins.
19
+
20
+ LAYER: shared/infrastructure/intent — pure helper. No imports from
21
+ will/, body/, or cli/.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ from typing import TYPE_CHECKING, Any
27
+
28
+ from shared.infrastructure.intent.errors import GovernanceError
29
+ from shared.logger import getLogger
30
+
31
+
32
+ if TYPE_CHECKING:
33
+ from shared.infrastructure.context.models import PhaseType
34
+
35
+
36
+ logger = getLogger(__name__)
37
+
38
+
39
+ _FALLBACK_DEFAULT_PHASE = "execution"
40
+ _FALLBACK_MAPPING: dict[str, str] = {
41
+ "code_generation": "execution",
42
+ "code_modification": "execution",
43
+ "test_generation": "audit",
44
+ "test.generate": "audit",
45
+ "conversational": "runtime",
46
+ }
47
+
48
+
49
+ def _valid_phases() -> frozenset[str]:
50
+ """Canonical `component_phase` membership from .intent/META/enums.json.
51
+
52
+ Sourced from the canonical enum store rather than inlined here so the
53
+ Python and JSON schema sides cannot drift (closed-enum discipline,
54
+ issue #460). Lazy so callers reaching this module at import time of
55
+ other modules do not force IntentRepository construction.
56
+ """
57
+ from shared.infrastructure.intent.canonical_enums import get_enum_members
58
+
59
+ return get_enum_members("component_phase")
60
+
61
+
62
+ def _validate_config(config: dict[str, Any]) -> None:
63
+ """
64
+ Validate at load time that every phase value in the config is a
65
+ member of the canonical `component_phase` enum. Raises ValueError
66
+ with a clear message on the first offending key/value encountered.
67
+ """
68
+ valid = _valid_phases()
69
+ default_phase = config.get("default_phase")
70
+ if default_phase is None or default_phase not in valid:
71
+ raise ValueError(
72
+ f"task_type_phases: default_phase {default_phase!r} is not a "
73
+ f"valid PhaseType; allowed values are {sorted(valid)}"
74
+ )
75
+
76
+ mapping = config.get("mapping")
77
+ if not isinstance(mapping, dict):
78
+ raise ValueError(
79
+ "task_type_phases: 'mapping' must be a dict of task_type -> phase"
80
+ )
81
+
82
+ for task_type, phase in mapping.items():
83
+ if phase not in valid:
84
+ raise ValueError(
85
+ f"task_type_phases: mapping[{task_type!r}] = {phase!r} is not "
86
+ f"a valid PhaseType; allowed values are {sorted(valid)}"
87
+ )
88
+
89
+
90
+ # ID: c1d2e3f4-a5b6-4708-9c1d-2e3f4a5b6c7d
91
+ def load_task_type_phases() -> dict[str, Any]:
92
+ """
93
+ Load .intent/enforcement/config/task_type_phases.yaml via IntentRepository.
94
+
95
+ Returns the parsed policy dict on success. On any failure — missing
96
+ file, parse error, unexpected top-level type — returns fallback
97
+ defaults and logs a warning so callers degrade gracefully rather
98
+ than halting.
99
+
100
+ The loader validates every phase value against the canonical
101
+ `component_phase` enum (sourced from `.intent/META/enums.json`)
102
+ before returning. A YAML that maps a task_type to a phase outside
103
+ that enum raises ValueError at load time, not at the call site.
104
+ If the canonical enum is unreachable or empty, GovernanceError
105
+ propagates (no silent fallback — closed-enum discipline, #460).
106
+ """
107
+ try:
108
+ from shared.infrastructure.intent.intent_repository import (
109
+ get_intent_repository,
110
+ )
111
+
112
+ repo = get_intent_repository()
113
+ config_path = repo.resolve_rel("enforcement/config/task_type_phases.yaml")
114
+ config = repo.load_document(config_path)
115
+ if isinstance(config, dict):
116
+ _validate_config(config)
117
+ return config
118
+ logger.warning(
119
+ "task_type_phases: task_type_phases.yaml did not parse as a dict "
120
+ "— using fallback defaults."
121
+ )
122
+ except ValueError:
123
+ raise
124
+ except GovernanceError:
125
+ # Canonical enum store unreachable or empty — propagate per
126
+ # closed-enum discipline (issue #460). Falling back here would
127
+ # silently mask a META authoring failure.
128
+ raise
129
+ except Exception as exc:
130
+ logger.warning(
131
+ "task_type_phases: could not load .intent/enforcement/config/"
132
+ "task_type_phases.yaml (%s) — using fallback defaults.",
133
+ exc,
134
+ )
135
+ return {
136
+ "default_phase": _FALLBACK_DEFAULT_PHASE,
137
+ "mapping": dict(_FALLBACK_MAPPING),
138
+ }
139
+
140
+
141
+ # ID: d2e3f4a5-b6c7-4819-ad2e-3f4a5b6c7d8e
142
+ def resolve_phase(
143
+ task_type: str,
144
+ config: dict[str, Any] | None = None,
145
+ ) -> PhaseType:
146
+ """
147
+ Return the governance phase for a task_type.
148
+
149
+ Falls back to config['default_phase'] when task_type is not in the
150
+ mapping. If config is None, load_task_type_phases() is called.
151
+
152
+ The returned value is typed as PhaseType: the loader has already
153
+ validated that every phase value is a member of the PhaseType
154
+ Literal set, so callers may pass the result directly to
155
+ ContextBuildRequest(phase=...) without a type: ignore.
156
+ """
157
+ if config is None:
158
+ config = load_task_type_phases()
159
+
160
+ mapping = config.get("mapping", {})
161
+ default_phase: str = config.get("default_phase", _FALLBACK_DEFAULT_PHASE)
162
+ phase: str = mapping.get(task_type, default_phase)
163
+ return phase # type: ignore[return-value]
164
+
165
+
166
+ # ID: e3f4a5b6-c7d8-491a-be3f-4a5b6c7d8e9f
167
+ def allowed_task_types(
168
+ config: dict[str, Any] | None = None,
169
+ ) -> frozenset[str]:
170
+ """
171
+ Return the closed vocabulary — the keys of config['mapping'].
172
+
173
+ Used by shared.models.execution_models at import time to populate
174
+ the ExecutionTask.task_type field_validator's allowed set. If
175
+ config is None, load_task_type_phases() is called.
176
+ """
177
+ if config is None:
178
+ config = load_task_type_phases()
179
+ mapping = config.get("mapping", {})
180
+ return frozenset(mapping.keys())
@@ -0,0 +1,181 @@
1
+ # src/shared/infrastructure/intent/test_coverage_paths.py
2
+ """
3
+ Source-to-test path mapping helper.
4
+
5
+ Single source of truth for mapping repo-relative source paths to their
6
+ governed repo-relative test paths. Both the mapping rule and the
7
+ filename conventions are owned by
8
+ .intent/enforcement/config/test_coverage.yaml.
9
+
10
+ Authority: policy. The governing document is
11
+ .intent/enforcement/config/test_coverage.yaml, accessed exclusively via
12
+ IntentRepository. No other module may hardcode the source->test
13
+ mapping — all call sites route through this helper.
14
+
15
+ The _FALLBACK_* constants below are last-resort graceful degradation
16
+ for the narrow case where the policy document cannot be loaded (e.g.
17
+ bootstrap races, corrupt YAML). They MUST NOT be treated as
18
+ defaults-in-logic — when the policy loads successfully, it always wins.
19
+
20
+ LAYER: shared/infrastructure/intent — pure helper. No imports from
21
+ will/, body/, or cli/.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ from pathlib import Path
27
+ from typing import Any
28
+
29
+ from shared.logger import getLogger
30
+
31
+
32
+ logger = getLogger(__name__)
33
+
34
+ _FALLBACK_SOURCE_ROOT = "src"
35
+ _FALLBACK_TEST_ROOT = "tests"
36
+ _FALLBACK_TEST_FILE_SUFFIX = "/test_generated.py"
37
+ _FALLBACK_EXCLUDED_FILENAMES: list[str] = ["__init__.py"]
38
+
39
+
40
+ # ID: 6d7e2c9a-4b5f-4801-9e13-a2b3c4d5e6f7
41
+ def load_test_coverage_config() -> dict[str, Any]:
42
+ """
43
+ Load .intent/enforcement/config/test_coverage.yaml via IntentRepository.
44
+
45
+ Returns the parsed policy dict on success. On any failure — missing
46
+ file, parse error, unexpected top-level type — returns fallback
47
+ defaults and logs a warning so callers degrade gracefully rather
48
+ than halting.
49
+ """
50
+ try:
51
+ from shared.infrastructure.intent.intent_repository import (
52
+ get_intent_repository,
53
+ )
54
+
55
+ repo = get_intent_repository()
56
+ config_path = repo.resolve_rel("enforcement/config/test_coverage.yaml")
57
+ config = repo.load_document(config_path)
58
+ if isinstance(config, dict):
59
+ return config
60
+ logger.warning(
61
+ "test_coverage_paths: test_coverage.yaml did not parse as a dict "
62
+ "— using fallback defaults."
63
+ )
64
+ except Exception as exc:
65
+ logger.warning(
66
+ "test_coverage_paths: could not load .intent/enforcement/config/"
67
+ "test_coverage.yaml (%s) — using fallback defaults.",
68
+ exc,
69
+ )
70
+ return {
71
+ "source_root": _FALLBACK_SOURCE_ROOT,
72
+ "test_root": _FALLBACK_TEST_ROOT,
73
+ "test_file_suffix": _FALLBACK_TEST_FILE_SUFFIX,
74
+ "excluded_filenames": list(_FALLBACK_EXCLUDED_FILENAMES),
75
+ }
76
+
77
+
78
+ # ID: 7e8f3d0b-5c6a-4912-af24-b3c4d5e6f708
79
+ def source_to_test_path(
80
+ source_file: str,
81
+ config: dict[str, Any] | None = None,
82
+ ) -> str:
83
+ """
84
+ Map a repo-relative source path to its governed repo-relative test path.
85
+
86
+ Mapping:
87
+ {source_root}/foo/bar.py
88
+ -> {test_root}/foo/bar{test_file_suffix}
89
+
90
+ Args:
91
+ source_file: repo-relative path to a Python source file, e.g.
92
+ "src/foo/bar.py". Callers must pass repo-relative paths.
93
+ config: optional pre-loaded policy dict. If None,
94
+ load_test_coverage_config() is invoked.
95
+
96
+ Returns:
97
+ Repo-relative path to the governed test file, e.g.
98
+ "tests/foo/bar/test_generated.py".
99
+
100
+ Raises:
101
+ ValueError: if source_file does not start with "{source_root}/".
102
+ """
103
+ if config is None:
104
+ config = load_test_coverage_config()
105
+
106
+ source_root: str = config.get("source_root", _FALLBACK_SOURCE_ROOT)
107
+ test_root: str = config.get("test_root", _FALLBACK_TEST_ROOT)
108
+ test_file_suffix: str = config.get("test_file_suffix", _FALLBACK_TEST_FILE_SUFFIX)
109
+
110
+ prefix = f"{source_root}/"
111
+ if not source_file.startswith(prefix):
112
+ raise ValueError(
113
+ f"source_file {source_file!r} does not start with configured "
114
+ f"source_root prefix {prefix!r}"
115
+ )
116
+
117
+ return (
118
+ source_file.replace(prefix, f"{test_root}/", 1).removesuffix(".py")
119
+ + test_file_suffix
120
+ )
121
+
122
+
123
+ # ID: 8f9a4e1c-6d7b-4a23-be35-c4d5e6f7a819
124
+ def uncovered_source_files(
125
+ repo_root: Path,
126
+ config: dict[str, Any] | None = None,
127
+ ) -> list[str]:
128
+ """
129
+ Walk source_root and return repo-relative paths for in-scope Python
130
+ source files that have no corresponding test file.
131
+
132
+ Shared between TestCoverageSensor (which posts test.run_required for
133
+ these sources) and TestRunnerSensor (which uses the same set as
134
+ current_subjects for the test.missing quarantine drain — ADR-072 D5).
135
+
136
+ The mapping and scoping rules are entirely owned by
137
+ .intent/enforcement/config/test_coverage.yaml:
138
+ - source_root, test_root, test_file_suffix
139
+ - excluded_filenames (skip-list)
140
+ - include_files (scope limiter; if non-empty, only these are scanned)
141
+ """
142
+ if config is None:
143
+ config = load_test_coverage_config()
144
+
145
+ source_root_rel: str = config.get("source_root", _FALLBACK_SOURCE_ROOT)
146
+ excluded: frozenset[str] = frozenset(
147
+ config.get("excluded_filenames", _FALLBACK_EXCLUDED_FILENAMES)
148
+ )
149
+ include_files: frozenset[str] = frozenset(config.get("include_files") or [])
150
+
151
+ src_root = repo_root / source_root_rel
152
+ if not src_root.exists():
153
+ logger.warning(
154
+ "test_coverage_paths.uncovered_source_files: source root not found at %s",
155
+ src_root,
156
+ )
157
+ return []
158
+
159
+ uncovered: list[str] = []
160
+
161
+ for py_file in src_root.rglob("*.py"):
162
+ if py_file.name in excluded:
163
+ continue
164
+
165
+ rel = py_file.relative_to(repo_root)
166
+ source_file = str(rel)
167
+
168
+ if include_files and source_file not in include_files:
169
+ continue
170
+
171
+ try:
172
+ test_rel = source_to_test_path(source_file, config)
173
+ except ValueError:
174
+ continue
175
+
176
+ test_path = repo_root / test_rel
177
+
178
+ if not test_path.exists():
179
+ uncovered.append(source_file)
180
+
181
+ return uncovered
@@ -0,0 +1,241 @@
1
+ # src/shared/infrastructure/intent/vocabulary_projection.py
2
+ """
3
+ Vocabulary projection loader (ADR-023 D4).
4
+
5
+ Sole sanctioned reader of .intent/META/vocabulary.json. Returns one of:
6
+
7
+ - VocabularyProjection(state="healthy")
8
+ - VocabularyProjection(state="drift", drift_detected=True)
9
+ - VocabularyProjectionError(state="broken", reason=...)
10
+
11
+ The loader does not fall back to defaults on broken state — that is
12
+ instrument failure and callers must enter governance-DEGRADED mode.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import hashlib
18
+ import json
19
+ import warnings
20
+ from dataclasses import dataclass
21
+ from pathlib import Path
22
+ from typing import Literal
23
+
24
+ import jsonschema
25
+ from jsonschema import RefResolver
26
+
27
+ from shared.logger import getLogger
28
+
29
+
30
+ logger = getLogger(__name__)
31
+
32
+ CANONICAL_HEADING = "## Canonical Vocabulary (Machine Section)"
33
+ VOCABULARY_PAPER_REL = ".specs/papers/CORE-Vocabulary.md"
34
+ VOCABULARY_JSON_REL = ".intent/META/vocabulary.json"
35
+ VOCABULARY_SCHEMA_REL = ".intent/META/vocabulary.schema.json"
36
+
37
+ # src/shared/infrastructure/intent/vocabulary_projection.py
38
+ # parents[0] = intent
39
+ # parents[1] = infrastructure
40
+ # parents[2] = shared
41
+ # parents[3] = src
42
+ # parents[4] = repo root
43
+ _REPO_ROOT_DEFAULT = Path(__file__).resolve().parents[4]
44
+
45
+
46
+ @dataclass(frozen=True)
47
+ # ID: 4d8c2e7a-9b3f-4a1c-b6d2-7e8f3c1a5b06
48
+ class VocabularyTerm:
49
+ """A single vocabulary entry, projection-shape (frozen)."""
50
+
51
+ term: str
52
+ definition: str
53
+ not_: str
54
+ authoritative_paper: str
55
+ aliases: tuple[str, ...] = ()
56
+ see_also: tuple[str, ...] = ()
57
+
58
+
59
+ @dataclass(frozen=True)
60
+ # ID: 6c1f3a8e-2d7b-4f9c-a4e1-8b9c2d5f1e07
61
+ class VocabularyProjection:
62
+ """A successfully loaded projection. state is 'healthy' or 'drift'."""
63
+
64
+ terms: tuple[VocabularyTerm, ...]
65
+ drift_detected: bool
66
+ state: Literal["healthy", "drift"]
67
+ source_hash: str
68
+
69
+
70
+ @dataclass(frozen=True)
71
+ # ID: 8a4d2e6c-1f9b-4c3d-b8e2-5d7f1a4c9e08
72
+ class VocabularyProjectionError:
73
+ """A broken projection. Sentinel — not an exception."""
74
+
75
+ state: Literal["broken"]
76
+ reason: str
77
+
78
+
79
+ # ID: fcc64fd7-f36e-41b8-be7a-2b1062946287
80
+ def normalize_vocabulary_cell(value: str) -> str:
81
+ """
82
+ Produce the identity form of a canonical-vocabulary-table cell.
83
+
84
+ The canonical section in CORE-Vocabulary.md is a markdown table; cells
85
+ routinely carry presentation decoration that is not part of the value's
86
+ identity. Today the only such decoration is a surrounding pair of
87
+ backticks (markdown inline-code formatting) around path-shaped cells, plus
88
+ leading/trailing whitespace. Both the sync writer (producing
89
+ vocabulary.json) and the audit gate (validating canonical paths) must
90
+ parse the same identity, so this normalization is the single shared
91
+ contract.
92
+
93
+ Behavior: strip leading/trailing whitespace; if the trimmed value is
94
+ wrapped in a single pair of backticks, drop them and strip again.
95
+ """
96
+ v = value.strip()
97
+ if v.startswith("`") and v.endswith("`") and len(v) >= 2:
98
+ return v[1:-1].strip()
99
+ return v
100
+
101
+
102
+ # ID: 3f8c1b4a-7d2e-4f9b-a6c1-9d3e2b5f8a09
103
+ def locate_canonical_section(text: str) -> tuple[int, int] | None:
104
+ """
105
+ Return (start_idx, end_idx) of the canonical-section line range, or None.
106
+
107
+ The slice text.splitlines()[start_idx:end_idx] spans the heading line
108
+ through the last line before the terminating '---' separator or next
109
+ '## ' heading.
110
+ """
111
+ lines = text.splitlines()
112
+ start = next(
113
+ (i for i, line in enumerate(lines) if line.rstrip() == CANONICAL_HEADING),
114
+ None,
115
+ )
116
+ if start is None:
117
+ return None
118
+ end = len(lines)
119
+ for i in range(start + 1, len(lines)):
120
+ if lines[i].strip() == "---" or lines[i].startswith("## "):
121
+ end = i
122
+ break
123
+ return start, end
124
+
125
+
126
+ # ID: 2c9e1f7b-4d8a-4e3c-b9f2-6a8c3e1d4b0a
127
+ def compute_canonical_section_hash(repo_root: Path) -> str | None:
128
+ """
129
+ SHA-256 hex of the canonical section in CORE-Vocabulary.md.
130
+
131
+ Returns None if the paper is missing or the section heading cannot be
132
+ located. Bytes hashed are exactly text.splitlines()[start:end] joined
133
+ by '\\n', matching the regen command in sync_vocabulary.py.
134
+ """
135
+ paper = repo_root / VOCABULARY_PAPER_REL
136
+ if not paper.is_file():
137
+ return None
138
+ try:
139
+ text = paper.read_text(encoding="utf-8")
140
+ except OSError:
141
+ return None
142
+ rng = locate_canonical_section(text)
143
+ if rng is None:
144
+ return None
145
+ start, end = rng
146
+ section = "\n".join(text.splitlines()[start:end])
147
+ return hashlib.sha256(section.encode("utf-8")).hexdigest()
148
+
149
+
150
+ # ID: 9d3a5c1e-7b2f-4a8d-b1c3-4e7f8a2d5c0b
151
+ def _validate_schema(instance: dict, schema_path: Path, schema: dict) -> str | None:
152
+ """Validate instance against schema with $ref resolution. Returns error string or None."""
153
+ base_uri = schema_path.parent.as_uri() + "/"
154
+ with warnings.catch_warnings():
155
+ warnings.simplefilter("ignore", category=DeprecationWarning)
156
+ resolver = RefResolver(base_uri=base_uri, referrer=schema)
157
+ try:
158
+ jsonschema.validate(instance, schema, resolver=resolver)
159
+ except jsonschema.ValidationError as e:
160
+ path = "/".join(str(p) for p in e.absolute_path) or "<root>"
161
+ return f"schema validation failed at {path}: {e.message}"
162
+ return None
163
+
164
+
165
+ # ID: 1b8e4c2f-9a3d-4f7c-b2e8-6c1d4f9a3e0c
166
+ def load_vocabulary_projection(
167
+ repo_root: Path | None = None,
168
+ ) -> VocabularyProjection | VocabularyProjectionError:
169
+ """
170
+ Load and validate the vocabulary projection.
171
+
172
+ Returns VocabularyProjection on healthy/drift; VocabularyProjectionError
173
+ on broken (missing file, malformed JSON, schema validation failure, or
174
+ canonical source paper not parseable).
175
+ """
176
+ root = (repo_root or _REPO_ROOT_DEFAULT).resolve()
177
+ json_path = root / VOCABULARY_JSON_REL
178
+ schema_path = root / VOCABULARY_SCHEMA_REL
179
+
180
+ if not json_path.is_file():
181
+ return VocabularyProjectionError(
182
+ state="broken", reason=f"projection missing: {VOCABULARY_JSON_REL}"
183
+ )
184
+ if not schema_path.is_file():
185
+ return VocabularyProjectionError(
186
+ state="broken", reason=f"schema missing: {VOCABULARY_SCHEMA_REL}"
187
+ )
188
+
189
+ try:
190
+ instance = json.loads(json_path.read_text(encoding="utf-8"))
191
+ except json.JSONDecodeError as e:
192
+ return VocabularyProjectionError(
193
+ state="broken", reason=f"malformed JSON in {VOCABULARY_JSON_REL}: {e.msg}"
194
+ )
195
+ except OSError as e:
196
+ return VocabularyProjectionError(
197
+ state="broken", reason=f"unreadable projection: {e}"
198
+ )
199
+
200
+ try:
201
+ schema = json.loads(schema_path.read_text(encoding="utf-8"))
202
+ except (json.JSONDecodeError, OSError) as e:
203
+ return VocabularyProjectionError(
204
+ state="broken", reason=f"unreadable schema: {e}"
205
+ )
206
+
207
+ schema_error = _validate_schema(instance, schema_path, schema)
208
+ if schema_error is not None:
209
+ return VocabularyProjectionError(state="broken", reason=schema_error)
210
+
211
+ recomputed_hash = compute_canonical_section_hash(root)
212
+ if recomputed_hash is None:
213
+ return VocabularyProjectionError(
214
+ state="broken",
215
+ reason=(
216
+ f"cannot recompute hash: canonical section not found in "
217
+ f"{VOCABULARY_PAPER_REL}"
218
+ ),
219
+ )
220
+
221
+ stored_hash = instance["metadata"].get("source_hash", "")
222
+ drift = stored_hash != recomputed_hash
223
+
224
+ terms = tuple(
225
+ VocabularyTerm(
226
+ term=t["term"],
227
+ definition=t["definition"],
228
+ not_=t["not"],
229
+ authoritative_paper=t["authoritative_paper"],
230
+ aliases=tuple(t.get("aliases") or ()),
231
+ see_also=tuple(t.get("see_also") or ()),
232
+ )
233
+ for t in instance["terms"]
234
+ )
235
+
236
+ return VocabularyProjection(
237
+ terms=terms,
238
+ drift_detected=drift,
239
+ state="drift" if drift else "healthy",
240
+ source_hash=stored_hash,
241
+ )