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,707 @@
1
+ # src/shared/infrastructure/intent/intent_repository.py
2
+
3
+ """
4
+ IntentRepository - Canonical read-only interface to CORE's Mind (.intent).
5
+
6
+ CONSTITUTIONAL FIX (V2.3.0):
7
+ - Corrected search paths to match actual tree: ['rules', 'constitution', 'phases', 'workflows'].
8
+ - Removed hallucinated 'charter/' logic.
9
+ - Maintains modularity by delegating to _IntentScanner and _RuleExtractor.
10
+
11
+ CONSTITUTIONAL FIX (V2.4.0):
12
+ - Removed hardcoded search_roots list in _build_policy_index.
13
+ - IntentRepository now reads active directories from META/intent_tree.yaml.
14
+ - Adding a new .intent/ directory is now a constitutional act, not a Python change.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import hashlib
20
+ import json
21
+ from collections.abc import Iterable, Iterator
22
+ from dataclasses import dataclass
23
+ from pathlib import Path
24
+ from threading import Lock
25
+ from typing import Any
26
+
27
+ from shared.config import settings
28
+ from shared.infrastructure.intent.errors import GovernanceError
29
+ from shared.infrastructure.intent.intent_validator import validate_intent_tree
30
+ from shared.infrastructure.rooted_repository import RootedRepository
31
+ from shared.logger import getLogger
32
+ from shared.processors.yaml_processor import strict_yaml_processor
33
+
34
+
35
+ logger = getLogger(__name__)
36
+
37
+
38
+ @dataclass(frozen=True)
39
+ # ID: cfe1ab6c-7706-41e1-bf99-18359a12849c
40
+ class PolicyRef:
41
+ policy_id: str
42
+ path: Path
43
+
44
+
45
+ @dataclass(frozen=True)
46
+ # ID: a1b079ad-ce37-4efb-8558-57ce7995362a
47
+ class RuleRef:
48
+ rule_id: str
49
+ policy_id: str
50
+ source_path: Path
51
+ content: dict[str, Any]
52
+ rule_content_hash: str
53
+
54
+
55
+ # ID: 7c4e8b2f-1d6a-49f3-b0e8-3a5c8d4e9f1b
56
+ def compute_rule_content_hash(content: dict[str, Any]) -> str:
57
+ """SHA-256 over a canonicalised rule body, for ADR-044 cache keying.
58
+
59
+ JSON serialisation with ``sort_keys=True`` + compact separators is
60
+ deterministic: identical rule semantics produce identical bytes
61
+ regardless of YAML cosmetic differences (key reordering, comment
62
+ reformatting, blank lines). The YAML→dict load step already strips
63
+ comments and normalises scalar representation, so the JSON re-encode
64
+ is sufficient to capture every governance-meaningful field.
65
+ """
66
+ canonical = json.dumps(
67
+ content,
68
+ sort_keys=True,
69
+ separators=(",", ":"),
70
+ ensure_ascii=False,
71
+ )
72
+ return hashlib.sha256(canonical.encode("utf-8")).hexdigest()
73
+
74
+
75
+ # ID: 698141bd-6440-4ffa-950b-a547ecee4699
76
+ class IntentRepository(RootedRepository):
77
+ """
78
+ The canonical read-only repository for .intent.
79
+
80
+ Contract:
81
+ - Root is derived from settings only.
82
+ - All parsing is deterministic.
83
+ - No write operations are exposed.
84
+ - Active directory list is read from META/intent_tree.yaml — never hardcoded.
85
+ - root + resolve_rel come from RootedRepository (issue #128 dedup).
86
+ """
87
+
88
+ _INDEX_LOCK = Lock()
89
+
90
+ def __init__(
91
+ self,
92
+ *,
93
+ strict: bool = True,
94
+ allow_writable_root: bool = True,
95
+ ) -> None:
96
+ self._root: Path = settings.MIND.resolve()
97
+ self._strict = strict
98
+ self._allow_writable_root = allow_writable_root
99
+
100
+ self._policy_index: dict[str, PolicyRef] | None = None
101
+ self._rule_index: dict[str, RuleRef] | None = None
102
+ self._hierarchy: dict[str, list[str]] | None = None
103
+
104
+ self._check_root_safety()
105
+ validate_intent_tree(self._root, strict=self._strict)
106
+
107
+ # ID: ab9383d3-df49-4565-856b-c3d8846b405d
108
+ def initialize(self) -> None:
109
+ self._ensure_index()
110
+
111
+ # ID: 4a91e5f0-2d8c-4b3e-91a7-c5b8d3e9f2a1
112
+ def reload(self) -> None:
113
+ """Drop the cached index and rebuild from disk.
114
+
115
+ Called once per audit-sensor cycle (ADR-039) so policies and
116
+ rules added to .intent/ after daemon boot become enforceable
117
+ without a process restart. Re-emits the "indexed N policies and
118
+ M rules" log line so cycle-to-cycle drift is visible in journald.
119
+ """
120
+ with self._INDEX_LOCK:
121
+ self._policy_index = None
122
+ self._rule_index = None
123
+ self._hierarchy = None
124
+ self._ensure_index()
125
+
126
+ # ID: 57f50f3a-fc99-4e47-9ddf-24da5f105863
127
+ def load_document(self, path: Path) -> dict[str, Any]:
128
+ if not path.exists():
129
+ raise GovernanceError(f"Intent artifact not found: {path}")
130
+
131
+ if path.suffix in (".yaml", ".yml"):
132
+ return strict_yaml_processor.load_strict(path)
133
+
134
+ if path.suffix == ".json":
135
+ try:
136
+ return json.loads(path.read_text("utf-8")) or {}
137
+ except (OSError, ValueError) as e:
138
+ raise GovernanceError(f"Failed to parse JSON: {path}: {e}") from e
139
+
140
+ raise GovernanceError(
141
+ f"Unsupported intent artifact type: {path.suffix} ({path})"
142
+ )
143
+
144
+ # ID: 1d4f9c2a-7e83-4b15-9a6e-3c8d5f0a1b27
145
+ def iter_documents(
146
+ self,
147
+ *,
148
+ skip_components: Iterable[str] = (),
149
+ ) -> Iterator[tuple[Path, dict[str, Any]]]:
150
+ """Yield (absolute_path, parsed_dict) for every .yaml/.yml/.json under .intent/.
151
+
152
+ Canonical gateway for corpus-walking callers (e.g. the governance
153
+ claim harvester) that previously did `intent_root.rglob(...)` —
154
+ replaces direct Path access per architecture.namespace.no_direct_protected_access
155
+ (renamed #490; formerly architecture.intent.non_gateway_no_direct_resolution).
156
+
157
+ skip_components filters by path component name (e.g. {"META"} to
158
+ exclude .intent/META/**). Parse failures are logged and skipped so
159
+ a single bad file does not abort the walk.
160
+ """
161
+ skip = frozenset(skip_components)
162
+ for path in self._iter_policy_files(self._root):
163
+ if skip and any(part in skip for part in path.parts):
164
+ continue
165
+ try:
166
+ yield path, self.load_document(path)
167
+ except GovernanceError as exc:
168
+ logger.warning("iter_documents: skipping %s: %s", path, exc)
169
+
170
+ # ID: a2b3c4d5-e6f7-8901-abcd-ef1234567890
171
+ def load_text(self, rel: str | Path) -> str:
172
+ """
173
+ Load a raw text artifact from .intent/ (e.g. markdown files).
174
+ Enforces boundary — path must be within intent root.
175
+ Read-only. No parsing.
176
+ """
177
+ abs_path = self.resolve_rel(rel)
178
+ if not abs_path.exists():
179
+ raise GovernanceError(f"Intent text artifact not found: {abs_path}")
180
+ try:
181
+ return abs_path.read_text(encoding="utf-8", errors="ignore")
182
+ except Exception as e:
183
+ raise GovernanceError(
184
+ f"Failed to read text artifact {abs_path}: {e}"
185
+ ) from e
186
+
187
+ # ID: 352c67ce-9d90-4ab2-944c-e6ef3622b411
188
+ def load_policy(self, logical_path_or_id: str) -> dict[str, Any]:
189
+ if "." in logical_path_or_id and "/" not in logical_path_or_id:
190
+ path = settings.get_path(logical_path_or_id)
191
+ return self.load_document(path)
192
+
193
+ policy_id = logical_path_or_id.strip().lstrip("/")
194
+ candidates = self._candidate_paths_for_id(policy_id)
195
+ for p in candidates:
196
+ if p.exists():
197
+ return self.load_document(p)
198
+
199
+ raise GovernanceError(f"Policy not found for id: {policy_id}")
200
+
201
+ # ID: 375428ca-11be-4c31-b12b-9e0f7c11b766
202
+ def list_workflows(self) -> list[str]:
203
+ base = self.resolve_rel("workflows/definitions")
204
+ if not base.exists():
205
+ return []
206
+
207
+ out: list[str] = []
208
+ for path in self._iter_policy_files(base):
209
+ try:
210
+ rel = path.relative_to(self._root)
211
+ out.append(str(rel.with_suffix("")).replace("\\", "/"))
212
+ except ValueError:
213
+ continue
214
+
215
+ return sorted(out)
216
+
217
+ # ID: 06c6ab43-78ba-4ab0-8bf1-fb21c68a86e4
218
+ def load_workflow(self, workflow_id: str) -> dict[str, Any]:
219
+ workflow_id = workflow_id.strip().lstrip("/")
220
+
221
+ candidates: list[Path] = []
222
+ if "/" in workflow_id:
223
+ candidates.extend(self._candidate_paths_for_id(workflow_id))
224
+ else:
225
+ candidates.extend(
226
+ self._candidate_paths_for_id(f"workflows/definitions/{workflow_id}")
227
+ )
228
+
229
+ for path in candidates:
230
+ if path.exists():
231
+ return self.load_document(path)
232
+
233
+ raise GovernanceError(f"Workflow not found: {workflow_id}")
234
+
235
+ # ID: 6b7f77ac-6504-4740-bd99-de389c76a46c
236
+ def list_workers(self) -> list[str]:
237
+ """List all constitutionally declared worker IDs from .intent/workers/."""
238
+ base = self.resolve_rel("workers")
239
+ if not base.exists():
240
+ return []
241
+ out: list[str] = []
242
+ for path in self._iter_policy_files(base):
243
+ try:
244
+ rel = path.relative_to(self._root)
245
+ out.append(str(rel.with_suffix("")).replace("\\", "/"))
246
+ except ValueError:
247
+ continue
248
+ return sorted(out)
249
+
250
+ # ID: 3ce78dc7-6090-42b3-97ca-ec7c61b0d7f4
251
+ def load_worker(self, worker_id: str) -> dict[str, Any]:
252
+ """Load a worker declaration by its canonical ID (e.g. 'workers/my_worker')."""
253
+ worker_id = worker_id.strip().lstrip("/")
254
+ candidates = self._candidate_paths_for_id(worker_id)
255
+ for path in candidates:
256
+ if path.exists():
257
+ return self.load_document(path)
258
+ raise GovernanceError(f"Worker declaration not found: {worker_id}")
259
+
260
+ # ID: de413c80-9e66-4d70-89e7-8f81a522aac5
261
+ def list_phases(self) -> list[str]:
262
+ base = self.resolve_rel("phases")
263
+ if not base.exists():
264
+ return []
265
+
266
+ out: list[str] = []
267
+ for path in self._iter_policy_files(base):
268
+ try:
269
+ rel = path.relative_to(self._root)
270
+ out.append(str(rel.with_suffix("")).replace("\\", "/"))
271
+ except ValueError:
272
+ continue
273
+
274
+ return sorted(out)
275
+
276
+ # ID: d800d3eb-f2b2-405e-9aa3-103f3522bec1
277
+ def load_phase(self, phase_id: str) -> dict[str, Any]:
278
+ phase_id = phase_id.strip().lstrip("/")
279
+
280
+ candidates: list[Path] = []
281
+ if "/" in phase_id:
282
+ candidates.extend(self._candidate_paths_for_id(phase_id))
283
+ else:
284
+ candidates.extend(self._candidate_paths_for_id(f"phases/{phase_id}"))
285
+
286
+ for path in candidates:
287
+ if path.exists():
288
+ return self.load_document(path)
289
+
290
+ raise GovernanceError(f"Phase not found: {phase_id}")
291
+
292
+ # ID: fbf369e2-222a-4961-867f-eca2bec01232
293
+ def get_precedence_map(self) -> dict[str, int]:
294
+ def _norm(name: str) -> str:
295
+ return (
296
+ name.replace(".json", "")
297
+ .replace(".yaml", "")
298
+ .replace(".yml", "")
299
+ .strip()
300
+ )
301
+
302
+ candidates = [
303
+ self.resolve_rel("constitution/precedence_rules.yaml"),
304
+ self.resolve_rel("constitution/precedence_rules.yml"),
305
+ self.resolve_rel("constitution/precedence_rules.json"),
306
+ ]
307
+
308
+ chosen = next((p for p in candidates if p.exists()), None)
309
+ if not chosen:
310
+ return {}
311
+
312
+ data = self.load_document(chosen)
313
+ hierarchy = data.get("policy_hierarchy", [])
314
+ if not isinstance(hierarchy, list):
315
+ if self._strict:
316
+ raise GovernanceError(
317
+ f"Invalid precedence_rules format (policy_hierarchy not a list): {chosen}"
318
+ )
319
+ logger.warning(
320
+ "Invalid precedence_rules format (policy_hierarchy not a list): %s",
321
+ chosen,
322
+ )
323
+ return {}
324
+
325
+ mapping: dict[str, int] = {}
326
+ for entry in hierarchy:
327
+ if not isinstance(entry, dict):
328
+ continue
329
+
330
+ level_raw = entry.get("level", 999)
331
+ try:
332
+ level = int(level_raw)
333
+ except Exception:
334
+ level = 999
335
+
336
+ if isinstance(entry.get("policy"), str):
337
+ mapping[_norm(entry["policy"])] = level
338
+
339
+ if isinstance(entry.get("policies"), list):
340
+ for p in entry["policies"]:
341
+ if isinstance(p, str):
342
+ mapping[_norm(p)] = level
343
+
344
+ return mapping
345
+
346
+ # ID: e0bffd8f-e87a-40bb-927e-97ec69dfc7e7
347
+ def list_policy_rules(self) -> list[dict[str, Any]]:
348
+ out: list[dict[str, Any]] = []
349
+ for pref in self.list_policies():
350
+ doc = self.load_document(pref.path)
351
+ policy_name = Path(pref.policy_id).name
352
+
353
+ for section in ("rules", "safety_rules", "agent_rules", "principles"):
354
+ block = doc.get(section)
355
+ if isinstance(block, list):
356
+ for item in block:
357
+ if isinstance(item, dict):
358
+ out.append(
359
+ {
360
+ "policy_name": policy_name,
361
+ "policy_id": pref.policy_id,
362
+ "section": section,
363
+ "rule": item,
364
+ }
365
+ )
366
+ elif isinstance(block, dict):
367
+ for rid, item in block.items():
368
+ if isinstance(item, dict):
369
+ rule_copy = {**item, "id": rid}
370
+ out.append(
371
+ {
372
+ "policy_name": policy_name,
373
+ "policy_id": pref.policy_id,
374
+ "section": section,
375
+ "rule": rule_copy,
376
+ }
377
+ )
378
+ return out
379
+
380
+ # ID: 4f068efb-842b-4555-9201-820c9617a90c
381
+ def find_rules(
382
+ self,
383
+ *,
384
+ phase: str | None = None,
385
+ authority: str | None = None,
386
+ policy_ids: list[str] | None = None,
387
+ sections: list[str] | None = None,
388
+ ) -> list[dict[str, Any]]:
389
+ """
390
+ Return normalized rules filtered by constitutional selectors.
391
+
392
+ Notes:
393
+ - phase/authority matching is case-insensitive
394
+ - policy_ids may be full ids or leaf names
395
+ - rules without explicit phase/authority can still be included when the
396
+ corresponding filter is not requested
397
+ """
398
+ requested_policy_ids = {p.strip().strip("/") for p in (policy_ids or []) if p}
399
+ requested_policy_names = {Path(p).name for p in requested_policy_ids}
400
+ requested_sections = set(sections or [])
401
+
402
+ phase_norm = phase.lower() if phase else None
403
+ authority_norm = authority.lower() if authority else None
404
+
405
+ matches: list[dict[str, Any]] = []
406
+ seen: set[tuple[str, str, str]] = set()
407
+
408
+ for entry in self.list_policy_rules():
409
+ entry_policy_id = str(entry.get("policy_id", "")).strip("/")
410
+ entry_policy_name = str(entry.get("policy_name", "")).strip()
411
+ entry_section = str(entry.get("section", "")).strip()
412
+ raw_rule = entry.get("rule", {})
413
+
414
+ if not isinstance(raw_rule, dict):
415
+ continue
416
+
417
+ if requested_sections and entry_section not in requested_sections:
418
+ continue
419
+
420
+ if requested_policy_ids:
421
+ if (
422
+ entry_policy_id not in requested_policy_ids
423
+ and entry_policy_name not in requested_policy_names
424
+ ):
425
+ continue
426
+
427
+ normalized = dict(raw_rule)
428
+ normalized.setdefault("id", normalized.get("rule_id"))
429
+ normalized.setdefault("policy_id", entry_policy_id)
430
+ normalized.setdefault("policy_name", entry_policy_name)
431
+ normalized.setdefault("section", entry_section)
432
+
433
+ rule_phase = self._extract_rule_phase(normalized)
434
+ rule_authority = self._extract_rule_authority(normalized)
435
+
436
+ if phase_norm and rule_phase and rule_phase.lower() != phase_norm:
437
+ continue
438
+
439
+ if (
440
+ authority_norm
441
+ and rule_authority
442
+ and rule_authority.lower() != authority_norm
443
+ ):
444
+ continue
445
+
446
+ if rule_phase:
447
+ normalized["phase"] = rule_phase
448
+ if rule_authority:
449
+ normalized["authority"] = rule_authority
450
+
451
+ identity = (
452
+ str(normalized.get("id") or ""),
453
+ str(normalized.get("policy_id") or ""),
454
+ str(normalized.get("section") or ""),
455
+ )
456
+ if identity in seen:
457
+ continue
458
+
459
+ seen.add(identity)
460
+ matches.append(normalized)
461
+
462
+ return matches
463
+
464
+ # ID: fd0975cb-d854-4491-8268-2c9a3f3595e6
465
+ def get_rule(self, rule_id: str) -> RuleRef:
466
+ self._ensure_index()
467
+ assert self._rule_index is not None
468
+
469
+ ref = self._rule_index.get(rule_id)
470
+ if not ref:
471
+ raise GovernanceError(f"Rule ID not found: {rule_id}")
472
+ return ref
473
+
474
+ # ID: cb11d848-d66e-4b2b-b076-7489c4670059
475
+ def list_policies(self) -> list[PolicyRef]:
476
+ self._ensure_index()
477
+ assert self._policy_index is not None
478
+ return sorted(self._policy_index.values(), key=lambda r: r.policy_id)
479
+
480
+ # ID: 67cb646c-80dc-417e-a0b7-efcc7b626a92
481
+ def list_governance_map(self) -> dict[str, list[str]]:
482
+ self._ensure_index()
483
+ assert self._hierarchy is not None
484
+ return {k: list(v) for k, v in self._hierarchy.items()}
485
+
486
+ def _ensure_index(self) -> None:
487
+ if (
488
+ self._policy_index is not None
489
+ and self._rule_index is not None
490
+ and self._hierarchy is not None
491
+ ):
492
+ return
493
+
494
+ with self._INDEX_LOCK:
495
+ if (
496
+ self._policy_index is not None
497
+ and self._rule_index is not None
498
+ and self._hierarchy is not None
499
+ ):
500
+ return
501
+
502
+ policy_index, hierarchy = self._build_policy_index()
503
+ rule_index = self._build_rule_index(policy_index)
504
+
505
+ self._policy_index = policy_index
506
+ self._rule_index = rule_index
507
+ self._hierarchy = hierarchy
508
+
509
+ logger.info(
510
+ "IntentRepository indexed %s policies and %s rules.",
511
+ len(self._policy_index),
512
+ len(self._rule_index),
513
+ )
514
+
515
+ def _build_policy_index(self) -> tuple[dict[str, PolicyRef], dict[str, list[str]]]:
516
+ search_roots = self._load_active_folders()
517
+
518
+ index: dict[str, PolicyRef] = {}
519
+ hierarchy: dict[str, list[str]] = {}
520
+
521
+ for root_name in search_roots:
522
+ root_dir = self._root / root_name
523
+ if not root_dir.exists():
524
+ continue
525
+
526
+ for path in self._iter_policy_files(root_dir):
527
+ policy_id = self._policy_id_from_path(path)
528
+ if policy_id in index:
529
+ msg = (
530
+ f"Duplicate policy_id detected: {policy_id} "
531
+ f"({index[policy_id].path} vs {path})"
532
+ )
533
+ if self._strict:
534
+ raise GovernanceError(msg)
535
+ logger.warning(msg)
536
+ continue
537
+
538
+ index[policy_id] = PolicyRef(policy_id=policy_id, path=path)
539
+
540
+ category = self._category_from_policy_id(policy_id)
541
+ hierarchy.setdefault(category, []).append(policy_id)
542
+
543
+ for cat in hierarchy:
544
+ hierarchy[cat].sort()
545
+
546
+ return index, hierarchy
547
+
548
+ def _build_rule_index(
549
+ self, policy_index: dict[str, PolicyRef]
550
+ ) -> dict[str, RuleRef]:
551
+ rule_index: dict[str, RuleRef] = {}
552
+
553
+ for policy_id, ref in policy_index.items():
554
+ try:
555
+ data = self.load_document(ref.path)
556
+ except GovernanceError as e:
557
+ if self._strict:
558
+ raise
559
+ logger.warning("Skipping unreadable policy %s: %s", policy_id, e)
560
+ continue
561
+
562
+ sections = ["rules", "safety_rules", "agent_rules", "principles"]
563
+ for section in sections:
564
+ rules = data.get(section, [])
565
+ for rid, content in self._extract_rules(rules):
566
+ if rid in rule_index:
567
+ msg = (
568
+ f"Duplicate rule_id detected: {rid} "
569
+ f"({rule_index[rid].source_path} vs {ref.path})"
570
+ )
571
+ if self._strict:
572
+ raise GovernanceError(msg)
573
+ logger.warning(msg)
574
+ continue
575
+
576
+ rule_index[rid] = RuleRef(
577
+ rule_id=rid,
578
+ policy_id=policy_id,
579
+ source_path=ref.path,
580
+ content={**content},
581
+ rule_content_hash=compute_rule_content_hash(content),
582
+ )
583
+
584
+ return rule_index
585
+
586
+ def _check_root_safety(self) -> None:
587
+ if self._allow_writable_root:
588
+ return
589
+
590
+ try:
591
+ writable = self._root.exists() and self._root.is_dir()
592
+ except OSError:
593
+ writable = False
594
+
595
+ if writable:
596
+ raise GovernanceError(
597
+ f".intent root is writable but allow_writable_root=False: {self._root}"
598
+ )
599
+
600
+ def _load_active_folders(self) -> list[str]:
601
+ tree_path = self._root / "META" / "intent_tree.yaml"
602
+
603
+ if not tree_path.exists():
604
+ logger.warning(
605
+ "META/intent_tree.yaml not found at %s — falling back to minimal required set. "
606
+ "This is a governance gap: intent_tree.yaml must declare the Mind structure.",
607
+ tree_path,
608
+ )
609
+ return ["META", "constitution", "rules"]
610
+
611
+ try:
612
+ data = strict_yaml_processor.load_strict(tree_path)
613
+ required = data.get("required_directories", [])
614
+ optional = data.get("optional_directories", [])
615
+ active = list(dict.fromkeys(required + optional))
616
+ logger.debug(
617
+ "Loaded %d active folders from META/intent_tree.yaml", len(active)
618
+ )
619
+ return active
620
+ except Exception as e:
621
+ logger.error(
622
+ "Failed to load META/intent_tree.yaml: %s — falling back to minimal required set.",
623
+ e,
624
+ )
625
+ return ["META", "constitution", "rules"]
626
+
627
+ def _iter_policy_files(self, policies_dir: Path) -> Iterable[Path]:
628
+ for suffix in ("*.yaml", "*.yml", "*.json"):
629
+ yield from policies_dir.rglob(suffix)
630
+
631
+ def _policy_id_from_path(self, path: Path) -> str:
632
+ try:
633
+ rel = path.relative_to(self._root)
634
+ return str(rel.with_suffix("")).replace("\\", "/")
635
+ except ValueError:
636
+ return path.stem
637
+
638
+ def _category_from_policy_id(self, policy_id: str) -> str:
639
+ parts = policy_id.split("/")
640
+ if len(parts) >= 2 and parts[0] in ("policies", "standards"):
641
+ return parts[1]
642
+ return "uncategorized"
643
+
644
+ def _candidate_paths_for_id(self, policy_id: str) -> list[Path]:
645
+ base = self.resolve_rel(policy_id)
646
+ return [
647
+ Path(str(base) + ".yaml"),
648
+ Path(str(base) + ".yml"),
649
+ Path(str(base) + ".json"),
650
+ ]
651
+
652
+ def _extract_rules(self, rules: Any) -> Iterable[tuple[str, dict[str, Any]]]:
653
+ if isinstance(rules, list):
654
+ for rule in rules:
655
+ if not isinstance(rule, dict):
656
+ continue
657
+ rid = rule.get("id") or rule.get("rule_id")
658
+ if isinstance(rid, str) and rid.strip():
659
+ yield rid, rule
660
+ return
661
+
662
+ if isinstance(rules, dict):
663
+ for rid, content in rules.items():
664
+ if isinstance(rid, str) and isinstance(content, dict):
665
+ yield rid, content
666
+ return
667
+
668
+ def _extract_rule_phase(self, rule: dict[str, Any]) -> str | None:
669
+ phase = rule.get("phase")
670
+ if isinstance(phase, str) and phase.strip():
671
+ return phase.strip()
672
+
673
+ applies_in = rule.get("applies_in")
674
+ if isinstance(applies_in, str) and applies_in.strip():
675
+ return applies_in.strip()
676
+
677
+ phases = rule.get("phases")
678
+ if isinstance(phases, list) and phases:
679
+ first = phases[0]
680
+ if isinstance(first, str) and first.strip():
681
+ return first.strip()
682
+
683
+ return None
684
+
685
+ def _extract_rule_authority(self, rule: dict[str, Any]) -> str | None:
686
+ authority = rule.get("authority")
687
+ if isinstance(authority, str) and authority.strip():
688
+ return authority.strip()
689
+
690
+ owner = rule.get("owner")
691
+ if isinstance(owner, str) and owner.strip():
692
+ return owner.strip()
693
+
694
+ return None
695
+
696
+
697
+ _INTENT_REPO: IntentRepository | None = None
698
+ _INTENT_REPO_LOCK = Lock()
699
+
700
+
701
+ # ID: 607b0d6e-c24a-4adb-899e-f15f2312fb0d
702
+ def get_intent_repository() -> IntentRepository:
703
+ global _INTENT_REPO
704
+ with _INTENT_REPO_LOCK:
705
+ if _INTENT_REPO is None:
706
+ _INTENT_REPO = IntentRepository(strict=True)
707
+ return _INTENT_REPO