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,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 1.9.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ core=cli.cli_user:app
3
+ core-admin=cli.admin_cli:app
4
+
mind/__init__.py ADDED
@@ -0,0 +1,4 @@
1
+ # src/mind/__init__.py
2
+ """Provides functionality for the __init__ module."""
3
+
4
+ from __future__ import annotations
@@ -0,0 +1 @@
1
+ # src/mind/coherence/__init__.py
@@ -0,0 +1,314 @@
1
+ # src/mind/coherence/checker.py
2
+
3
+ """
4
+ CoherenceChecker — Mind-layer orchestrator for the Constitutional Coherence Checker.
5
+
6
+ Governing paper: .specs/papers/CORE-Governance-Topology.md (the directional grid)
7
+ Governing ADR: .specs/decisions/ADR-073-ccc-scanner-redesign.md
8
+ Preserves: ADR-067 D1 (storage), D2 (CLI), D4 (scheduling), D5 (dashboard).
9
+
10
+ Per ADR-073 D3, the scanner dispatches to seven check classes covering the
11
+ topology paper §10.2 enabled checks and the §10.3 retained/scoped R1. The
12
+ legacy R1/R2/R3 emission paths are removed.
13
+
14
+ Constitutional Compliance:
15
+ - Mind layer cognitive instrument; reads constitutional documents and invokes
16
+ the LLM judge only for SAMECONCERN and R1_SCOPED.
17
+ - LLM has no enforcement power — every output is a candidate for human triage.
18
+ - No direct database access from this module: writes route through
19
+ CoherenceService (body layer).
20
+ - Per ADR-073 D4: vector-dependent checks (SAMECONCERN, R1_SCOPED) refuse
21
+ when the governance_claims collection is not seeded by the governor's
22
+ `core-admin coherence seed bootstrap` operation. Structural checks operate
23
+ independently and are unaffected.
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ import hashlib
29
+ from pathlib import Path
30
+ from typing import TYPE_CHECKING, Any
31
+
32
+ from shared.logger import getLogger
33
+
34
+
35
+ if TYPE_CHECKING:
36
+ from body.services.coherence_service import CoherenceService
37
+ from body.services.governance_claims_service import GovernanceClaimsService
38
+
39
+ from .checks.base import CheckClass
40
+
41
+
42
+ logger = getLogger(__name__)
43
+
44
+ __all__ = ["CoherenceChecker"]
45
+
46
+
47
+ # ID: 73a23100-c107-4205-9313-0318dca1143b
48
+ class CoherenceChecker:
49
+ """Orchestrator for the seven ADR-073 D3 check classes.
50
+
51
+ Produces candidates only — no verdicts, no enforcement actions, no
52
+ constitutional amendments. All human triage runs through
53
+ ``core-admin coherence triage``.
54
+ """
55
+
56
+ # ID: 5ae048c9-f6c7-4200-a4f1-193cbc82f1b9
57
+ def __init__(
58
+ self,
59
+ cognitive_service: Any,
60
+ coherence_service: CoherenceService,
61
+ repo_root: Path,
62
+ claims_service: GovernanceClaimsService | None = None,
63
+ ):
64
+ self._cognitive_service = cognitive_service
65
+ self._coherence_service = coherence_service
66
+ self._repo_root = Path(repo_root)
67
+ self._claims_service = claims_service
68
+
69
+ # ID: 2e4a95a7-fdac-427a-94eb-ed20ce2930c9
70
+ async def run(self, full: bool = False, sample_rules: int | None = None) -> str:
71
+ """Execute one CCC pass over the seven D3 check classes. Returns the new run_id.
72
+
73
+ ``sample_rules`` is accepted for back-compat with the ADR-067-era CLI but
74
+ is no longer meaningful — rule-scoped relations (R2, R3) were retired
75
+ per topology §10.3. Set values are logged and ignored.
76
+ """
77
+ if sample_rules is not None:
78
+ logger.info(
79
+ "CCC: sample_rules=%d ignored — R2/R3 retired per ADR-073 D1",
80
+ sample_rules,
81
+ )
82
+
83
+ trigger = await self._detect_trigger(full=full)
84
+ manifest = self._build_input_manifest()
85
+ run_id = await self._coherence_service.create_run(trigger)
86
+
87
+ check_status = await self._dispatch_checks(run_id)
88
+ manifest.append(
89
+ {
90
+ "domain": "_meta",
91
+ "path": None,
92
+ "type": "check_classes_run",
93
+ "check_status": check_status,
94
+ }
95
+ )
96
+ await self._coherence_service.update_manifest(run_id, manifest)
97
+ # Self-guarded close for zero-candidate scans — the triage-driven
98
+ # auto-close never fires when no candidates exist (issue #458). The
99
+ # service method's WHERE clause makes this a no-op when candidates
100
+ # were added, so the call is unconditional here.
101
+ await self._coherence_service.close_run_if_empty(run_id)
102
+
103
+ emitted_total = sum(s.get("emitted", 0) for s in check_status.values())
104
+ logger.info(
105
+ "CCC run %s complete (trigger=%s, %d candidates from %d check classes)",
106
+ run_id,
107
+ trigger,
108
+ emitted_total,
109
+ len(check_status),
110
+ )
111
+ return run_id
112
+
113
+ # ------------------------------------------------------------------ #
114
+ # Check-class dispatch
115
+ # ------------------------------------------------------------------ #
116
+
117
+ # ID: 43725b56-2fcb-4746-a414-dc57428ff02f
118
+ async def _dispatch_checks(self, run_id: str) -> dict[str, dict]:
119
+ from shared.governance.coherence_harvester import NormativeMarkerRegister
120
+ from shared.infrastructure.intent.intent_repository import get_intent_repository
121
+
122
+ from .checks.r1_scoped import R1ScopedCheck
123
+ from .checks.row2_grounding import Row2GroundingCheck
124
+ from .checks.row3_citation import Row3CitationCheck
125
+ from .checks.row4_naming import Row4NamingCheck
126
+ from .checks.sameconcern import SameConcernCheck
127
+ from .checks.specgap import SpecGapCheck
128
+ from .checks.vocabulary import VocabularyCheck
129
+
130
+ register = NormativeMarkerRegister.from_intent(get_intent_repository())
131
+
132
+ if self._claims_service is None:
133
+ logger.info(
134
+ "CCC: claims_service not injected; SAMECONCERN/R1_SCOPED will skip"
135
+ )
136
+
137
+ checks: list[CheckClass] = [
138
+ Row2GroundingCheck(self._repo_root),
139
+ Row3CitationCheck(self._repo_root, register),
140
+ Row4NamingCheck(self._repo_root),
141
+ VocabularyCheck(self._repo_root),
142
+ SpecGapCheck(self._repo_root, register),
143
+ ]
144
+ if self._claims_service is not None:
145
+ checks.append(
146
+ SameConcernCheck(
147
+ self._repo_root,
148
+ register,
149
+ self._claims_service,
150
+ self._cognitive_service,
151
+ )
152
+ )
153
+ checks.append(
154
+ R1ScopedCheck(
155
+ self._repo_root,
156
+ register,
157
+ self._claims_service,
158
+ self._cognitive_service,
159
+ )
160
+ )
161
+
162
+ status: dict[str, dict] = {}
163
+ for check in checks:
164
+ try:
165
+ candidates = await check.run()
166
+ except Exception as exc:
167
+ logger.warning(
168
+ "CCC: check %s failed: %s", check.relation, exc, exc_info=True
169
+ )
170
+ status[check.relation] = {
171
+ "status": "error",
172
+ "error": str(exc),
173
+ "emitted": 0,
174
+ }
175
+ continue
176
+ for candidate in candidates:
177
+ await self._coherence_service.add_candidate(
178
+ run_id=run_id,
179
+ relation=candidate.relation,
180
+ documents=candidate.documents,
181
+ claim=candidate.claim,
182
+ rationale=candidate.rationale,
183
+ )
184
+ status[check.relation] = {"status": "ok", "emitted": len(candidates)}
185
+ logger.info(
186
+ "CCC: %s emitted %d candidates", check.relation, len(candidates)
187
+ )
188
+ return status
189
+
190
+ # ------------------------------------------------------------------ #
191
+ # Trigger detection (preserved from ADR-067 implementation)
192
+ # ------------------------------------------------------------------ #
193
+
194
+ async def _detect_trigger(self, full: bool) -> str:
195
+ if full:
196
+ return "manual"
197
+
198
+ latest = await self._coherence_service.get_latest_run()
199
+ if latest is None:
200
+ return "manual"
201
+
202
+ last_manifest = latest.get("input_manifest") or []
203
+
204
+ last_adr_count = sum(
205
+ 1 for entry in last_manifest if entry.get("domain") == "adr"
206
+ )
207
+ current_adr_count = len(self._adr_paths())
208
+ if current_adr_count > last_adr_count:
209
+ return "adr_added"
210
+
211
+ last_northstar_hashes = {
212
+ entry.get("path"): entry.get("sha256")
213
+ for entry in last_manifest
214
+ if entry.get("domain") == "northstar"
215
+ }
216
+ for path in self._northstar_paths():
217
+ try:
218
+ current_hash = _sha256(path)
219
+ except OSError:
220
+ return "northstar_changed"
221
+ rel = self._rel(path)
222
+ if last_northstar_hashes.get(rel) != current_hash:
223
+ return "northstar_changed"
224
+
225
+ return "manual"
226
+
227
+ # ------------------------------------------------------------------ #
228
+ # Manifest construction
229
+ # ------------------------------------------------------------------ #
230
+
231
+ # ID: c44f8192-948c-4671-82a1-445dc657ee59
232
+ def _build_input_manifest(self) -> list[dict]:
233
+ """Document the governance inputs consumed by the redesigned scanner.
234
+
235
+ ADR-067-era 'rule' entries are no longer emitted — rule-scoped relations
236
+ (R2, R3) were retired per topology §10.3. The new scanner consumes
237
+ ADRs, papers, northstar, phases, and the vocabulary projection.
238
+ """
239
+ manifest: list[dict] = []
240
+ for path in self._adr_paths():
241
+ manifest.append(self._manifest_entry(path, "adr"))
242
+ for path in self._paper_paths():
243
+ manifest.append(self._manifest_entry(path, "paper"))
244
+ for path in self._northstar_paths():
245
+ manifest.append(self._manifest_entry(path, "northstar"))
246
+ for path in self._phase_paths():
247
+ manifest.append(self._manifest_entry(path, "phase"))
248
+ vocab = self._repo_root / ".intent" / "META" / "vocabulary.json"
249
+ if vocab.exists():
250
+ manifest.append(self._manifest_entry(vocab, "vocabulary"))
251
+ return manifest
252
+
253
+ # ID: f6ffc21f-e4ef-477c-9bb7-2cdd2d4599c5
254
+ def _manifest_entry(self, path: Path, domain: str) -> dict:
255
+ rel = self._rel(path)
256
+ try:
257
+ sha = _sha256(path)
258
+ except OSError:
259
+ return {
260
+ "path": rel,
261
+ "domain": domain,
262
+ "status": "skipped",
263
+ "skipped_reason": "file_read_failure",
264
+ "sha256": None,
265
+ }
266
+ return {
267
+ "path": rel,
268
+ "domain": domain,
269
+ "status": "checked",
270
+ "skipped_reason": None,
271
+ "sha256": sha,
272
+ }
273
+
274
+ # ------------------------------------------------------------------ #
275
+ # Input enumeration
276
+ # ------------------------------------------------------------------ #
277
+
278
+ def _adr_paths(self) -> list[Path]:
279
+ decisions = self._repo_root / ".specs" / "decisions"
280
+ if not decisions.exists():
281
+ return []
282
+ return sorted(decisions.glob("ADR-*.md"))
283
+
284
+ def _paper_paths(self) -> list[Path]:
285
+ papers = self._repo_root / ".specs" / "papers"
286
+ if not papers.exists():
287
+ return []
288
+ return sorted(papers.glob("*.md"))
289
+
290
+ def _northstar_paths(self) -> list[Path]:
291
+ northstar = self._repo_root / ".specs" / "northstar"
292
+ if not northstar.exists():
293
+ return []
294
+ return sorted(northstar.glob("*.md"))
295
+
296
+ def _phase_paths(self) -> list[Path]:
297
+ phases = self._repo_root / ".intent" / "phases"
298
+ if not phases.exists():
299
+ return []
300
+ return sorted(phases.glob("*.yaml"))
301
+
302
+ # ------------------------------------------------------------------ #
303
+ # Helpers
304
+ # ------------------------------------------------------------------ #
305
+
306
+ def _rel(self, path: Path) -> str:
307
+ try:
308
+ return str(path.relative_to(self._repo_root))
309
+ except ValueError:
310
+ return str(path)
311
+
312
+
313
+ def _sha256(path: Path) -> str:
314
+ return hashlib.sha256(path.read_bytes()).hexdigest()
@@ -0,0 +1,4 @@
1
+ # src/mind/coherence/checks/__init__.py
2
+ """CCC check classes per ADR-073 D3 taxonomy."""
3
+
4
+ from __future__ import annotations
@@ -0,0 +1,34 @@
1
+ # src/mind/coherence/checks/base.py
2
+ """Shared types for CCC check classes per ADR-073 D3."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass
7
+ from typing import Protocol
8
+
9
+
10
+ @dataclass(frozen=True)
11
+ # ID: f65b81c3-fff5-41e2-9c9a-58db1d4eeb6b
12
+ class CoherenceCandidate:
13
+ """One emitted candidate row, persisted via CoherenceService.add_candidate."""
14
+
15
+ relation: str
16
+ documents: list[str]
17
+ claim: str
18
+ rationale: str
19
+
20
+
21
+ # ID: 5641414f-99ba-42d9-bf53-d0e41d4d4291
22
+ class CheckClass(Protocol):
23
+ """Common shape for every check class in the ADR-073 D3 taxonomy.
24
+
25
+ Implementations are constructed by the CoherenceChecker orchestrator
26
+ with the resources each class needs (repo_root, harvester, claims
27
+ service, etc.) and yield CoherenceCandidate instances. Persistence
28
+ and manifest book-keeping is the orchestrator's responsibility.
29
+ """
30
+
31
+ relation: str
32
+
33
+ # ID: a8967c42-38a3-4161-bb66-bf03f1fe5a35
34
+ async def run(self) -> list[CoherenceCandidate]: ...
@@ -0,0 +1,228 @@
1
+ # src/mind/coherence/checks/r1_scoped.py
2
+ """R1_SCOPED — same-concern contradiction over ADR pairs declared via `Relates:`.
3
+
4
+ Per ADR-073 D2. Subset of SAMECONCERN constrained at the pair-membership step.
5
+ One-directional citation is sufficient: if ADR-X cites ADR-Y, pair (X, Y) is
6
+ checked regardless of whether ADR-Y cites ADR-X.
7
+
8
+ Mechanism: parse `Relates:` frontmatter, for each declared pair run kNN with
9
+ filter restricting hits to the partner ADR, then LLM-judge with the same
10
+ tiered policy as SAMECONCERN.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import re
16
+ from pathlib import Path
17
+ from typing import TYPE_CHECKING, Any
18
+
19
+ from shared.logger import getLogger
20
+
21
+ from ..llm_judge import judge_contradiction_pair
22
+ from .base import CoherenceCandidate
23
+
24
+
25
+ if TYPE_CHECKING:
26
+ from body.services.governance_claims_service import GovernanceClaimsService
27
+ from shared.governance.coherence_harvester import NormativeMarkerRegister
28
+
29
+
30
+ logger = getLogger(__name__)
31
+
32
+
33
+ _RELATES_FRONTMATTER = re.compile(
34
+ r"^\*\*Relates:\*\*\s*(.+?)\s*$", re.IGNORECASE | re.MULTILINE
35
+ )
36
+ _ADR_TOKEN = re.compile(r"ADR-\d{3}")
37
+
38
+ # Body-level reconciliation prefix: `**Compatibility with ADR-NNN**`,
39
+ # `**Supersedes:** ADR-NNN`, `**Supersedes (partial):** ADR-NNN`, etc.
40
+ # Used to filter out R1_SCOPED pairs where the author has explicitly
41
+ # reconciled the relationship — the LLM judge cannot see the reconciliation
42
+ # when only chunked claims reach the prompt, and routinely emits
43
+ # false-positive contradiction verdicts on reconciled pairs. See #474.
44
+ _RECONCILIATION_PREFIX = re.compile(
45
+ r"\*\*\s*(?:Compatibility\s+with|Supersedes)\b",
46
+ re.IGNORECASE,
47
+ )
48
+
49
+
50
+ def _declared_compatibility_partners(text: str) -> set[str]:
51
+ """Return ADR-NNN tokens this document explicitly reconciles with.
52
+
53
+ Scans for body-level patterns: `**Compatibility with ADR-NNN**`,
54
+ `**Supersedes:** ADR-NNN`, `**Supersedes (partial):** ADR-NNN`.
55
+ The returned set is treated as authoritative for skipping R1_SCOPED
56
+ pairs — if the author declares reconciliation, the judge does not get
57
+ to override it (per #474). Line-level scan; multi-line declarations
58
+ capture only ADRs cited on the prefix line.
59
+ """
60
+ partners: set[str] = set()
61
+ for line in text.splitlines():
62
+ if not _RECONCILIATION_PREFIX.search(line):
63
+ continue
64
+ partners.update(_ADR_TOKEN.findall(line))
65
+ return partners
66
+
67
+
68
+ _HIGH_CONFIDENCE_COSINE = 0.78
69
+ _AMBIGUOUS_COSINE = 0.74
70
+ _KNN_LIMIT = 10
71
+
72
+
73
+ # ID: 411d5a1f-0a88-4a34-b1bc-4a64143daf09
74
+ class R1ScopedCheck:
75
+ """Emit R1_SCOPED candidates for contradicting claims across declared ADR pairs."""
76
+
77
+ relation = "R1_SCOPED"
78
+
79
+ # ID: f24bd798-1f30-461e-9038-b791751970bc
80
+ def __init__(
81
+ self,
82
+ repo_root: Path,
83
+ register: NormativeMarkerRegister,
84
+ claims_service: GovernanceClaimsService,
85
+ cognitive_service: Any,
86
+ ) -> None:
87
+ self._repo_root = Path(repo_root)
88
+ self._register = register
89
+ self._claims_service = claims_service
90
+ self._cognitive_service = cognitive_service
91
+
92
+ # ID: 9208e1dc-5108-45b7-a2e1-514cc9df6af9
93
+ async def run(self) -> list[CoherenceCandidate]:
94
+ from shared.governance.coherence_harvester import GovernanceClaimHarvester
95
+ from shared.infrastructure.vector.cognitive_adapter import (
96
+ CognitiveEmbedderAdapter,
97
+ )
98
+
99
+ pairs = self._declared_pairs()
100
+ if not pairs:
101
+ logger.info(
102
+ "R1_SCOPED: no ADRs declare `Relates:` frontmatter — emitting zero (expected per D2)"
103
+ )
104
+ return []
105
+
106
+ if not await self._claims_service.is_seeded():
107
+ logger.info("R1_SCOPED: governance_claims not seeded; skipping (D4)")
108
+ return []
109
+
110
+ harvester = GovernanceClaimHarvester(self._repo_root, self._register)
111
+ claims_by_path: dict[str, list] = {}
112
+ for claim in harvester.harvest():
113
+ claims_by_path.setdefault(claim.source_path, []).append(claim)
114
+
115
+ embedder = CognitiveEmbedderAdapter(self._cognitive_service)
116
+ seen: set[frozenset[tuple[str, str]]] = set()
117
+ candidates: list[CoherenceCandidate] = []
118
+
119
+ for source_path, partner_path in pairs:
120
+ source_claims = claims_by_path.get(source_path, [])
121
+ if not source_claims:
122
+ continue
123
+ for claim in source_claims:
124
+ try:
125
+ vector = await embedder.get_embedding(claim.text)
126
+ except Exception as exc:
127
+ logger.warning("R1_SCOPED: embed failed: %s", exc)
128
+ continue
129
+ hits = await self._claims_service.search(
130
+ query_vector=vector,
131
+ limit=_KNN_LIMIT,
132
+ score_threshold=_AMBIGUOUS_COSINE,
133
+ source_path_in=[partner_path],
134
+ )
135
+ for hit in hits:
136
+ if (
137
+ hit.source_path == claim.source_path
138
+ and hit.content_sha == claim.content_sha
139
+ ):
140
+ continue
141
+ tier = (
142
+ "high_confidence"
143
+ if hit.cosine >= _HIGH_CONFIDENCE_COSINE
144
+ else "ambiguous"
145
+ )
146
+ pair_key: frozenset[tuple[str, str]] = frozenset(
147
+ {
148
+ (claim.source_path, claim.content_sha),
149
+ (hit.source_path, hit.content_sha),
150
+ }
151
+ )
152
+ if pair_key in seen:
153
+ continue
154
+ seen.add(pair_key)
155
+
156
+ verdict = await judge_contradiction_pair(
157
+ cognitive_service=self._cognitive_service,
158
+ text_a=claim.text,
159
+ source_a=claim.source_path,
160
+ text_b=hit.text,
161
+ source_b=hit.source_path,
162
+ tier=tier,
163
+ relation=self.relation,
164
+ category_a=claim.category,
165
+ category_b=hit.category,
166
+ )
167
+ if verdict is not None:
168
+ candidates.append(verdict)
169
+ return candidates
170
+
171
+ # ID: 7939908b-6686-4b35-b3e6-a74f6ae1fbaf
172
+ def _declared_pairs(self) -> list[tuple[str, str]]:
173
+ """Parse Relates: frontmatter across all accepted ADRs.
174
+
175
+ Returns a list of (source_adr_path, partner_adr_path) tuples — one
176
+ per declared link. One-directional sufficient per D2.
177
+
178
+ Per #474: pairs where either ADR reconciles with the other via a
179
+ body-level `**Compatibility with ADR-NNN**` or `**Supersedes**`
180
+ declaration are filtered out. The LLM judge cannot see the
181
+ reconciliation when only chunked claims reach the prompt and
182
+ routinely emits false-positive contradictions on reconciled pairs.
183
+ """
184
+ decisions = self._repo_root / ".specs" / "decisions"
185
+ if not decisions.is_dir():
186
+ return []
187
+ # Map ADR-NNN → relative path, used to resolve cited tokens to files.
188
+ adr_path_by_id: dict[str, str] = {}
189
+ for path in sorted(decisions.glob("ADR-*.md")):
190
+ m = _ADR_TOKEN.match(path.stem)
191
+ if m:
192
+ adr_path_by_id[m.group(0)] = str(path.relative_to(self._repo_root))
193
+
194
+ # Single read per ADR — extract Relates: partners and reconciliation set.
195
+ relates_by_id: dict[str, list[str]] = {}
196
+ reconciled_by_id: dict[str, set[str]] = {}
197
+ for source_id, source_rel in adr_path_by_id.items():
198
+ content = (self._repo_root / source_rel).read_text(
199
+ encoding="utf-8", errors="replace"
200
+ )
201
+ match = _RELATES_FRONTMATTER.search(content)
202
+ if match:
203
+ relates_by_id[source_id] = _ADR_TOKEN.findall(match.group(1))
204
+ reconciled_by_id[source_id] = _declared_compatibility_partners(content)
205
+
206
+ pairs: list[tuple[str, str]] = []
207
+ reconciled_skips = 0
208
+ for source_id, source_rel in adr_path_by_id.items():
209
+ partners = relates_by_id.get(source_id, [])
210
+ for partner_id in partners:
211
+ if partner_id == source_id:
212
+ continue
213
+ partner_rel = adr_path_by_id.get(partner_id)
214
+ if partner_rel is None:
215
+ continue
216
+ if partner_id in reconciled_by_id.get(
217
+ source_id, set()
218
+ ) or source_id in reconciled_by_id.get(partner_id, set()):
219
+ reconciled_skips += 1
220
+ continue
221
+ pairs.append((source_rel, partner_rel))
222
+
223
+ if reconciled_skips:
224
+ logger.info(
225
+ "R1_SCOPED: skipped %d Relates: pair(s) due to declared compatibility/supersedes (per #474)",
226
+ reconciled_skips,
227
+ )
228
+ return pairs
@@ -0,0 +1,69 @@
1
+ # src/mind/coherence/checks/row2_grounding.py
2
+ """ROW2_GROUNDING — every accepted ADR cites at least one grounding paper.
3
+
4
+ Per ADR-073 D6 / topology §10.2 row 2.
5
+
6
+ Mechanism: structural grep over ADR References / Relates / Supersedes blocks.
7
+ No LLM, no embeddings.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import re
13
+ from pathlib import Path
14
+
15
+ from .base import CoherenceCandidate
16
+
17
+
18
+ _PAPERS_CITE = re.compile(r"\.specs/papers/[\w\-./]+\.md", re.IGNORECASE)
19
+ _SUPERSEDES_FRONTMATTER = re.compile(r"^\*\*Supersedes", re.IGNORECASE | re.MULTILINE)
20
+ _STATUS_ACCEPTED = re.compile(
21
+ r"^\*\*Status:\*\*\s*Accepted", re.IGNORECASE | re.MULTILINE
22
+ )
23
+
24
+
25
+ # ID: d89bcb64-5a44-42a9-af06-ba730a70cf10
26
+ class Row2GroundingCheck:
27
+ """Emit ROW2_GROUNDING for accepted ADRs missing a grounding paper citation."""
28
+
29
+ relation = "ROW2_GROUNDING"
30
+
31
+ # ID: 21f65c05-2345-4135-a581-b68b8000de23
32
+ def __init__(self, repo_root: Path) -> None:
33
+ self._repo_root = Path(repo_root)
34
+
35
+ # ID: 460370e4-9d2d-479e-967c-df37f7e7ab9e
36
+ async def run(self) -> list[CoherenceCandidate]:
37
+ decisions = self._repo_root / ".specs" / "decisions"
38
+ if not decisions.is_dir():
39
+ return []
40
+ candidates: list[CoherenceCandidate] = []
41
+ for adr_path in sorted(decisions.glob("ADR-*.md")):
42
+ content = adr_path.read_text(encoding="utf-8", errors="replace")
43
+ if not _STATUS_ACCEPTED.search(content):
44
+ continue
45
+ if _SUPERSEDES_FRONTMATTER.search(content):
46
+ continue
47
+ if _PAPERS_CITE.search(content):
48
+ continue
49
+ rel = str(adr_path.relative_to(self._repo_root))
50
+ candidates.append(
51
+ CoherenceCandidate(
52
+ relation=self.relation,
53
+ documents=[rel],
54
+ claim=(
55
+ f"ADR {adr_path.stem} cites no grounding paper "
56
+ "(.specs/papers/...) and carries no Supersedes: declaration."
57
+ ),
58
+ rationale=(
59
+ "Topology paper §3 row 2 requires every accepted ADR to "
60
+ "either cite at least one grounding paper or declare "
61
+ "supersession of a predecessor (which inherits its "
62
+ "predecessor's grounding). Neither was found in this "
63
+ "ADR's text. Either backfill the References block with "
64
+ "the operationalized paper, or — if no grounding paper "
65
+ "exists — author the missing paper first per §11.3."
66
+ ),
67
+ )
68
+ )
69
+ return candidates