rosett-ai 1.3.3 → 1.5.9

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 (453) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +398 -22
  3. data/README.md +56 -42
  4. data/bin/raictl +13 -0
  5. data/conf/adopt_redactions.yml +2 -0
  6. data/conf/compliance/cra_rules.yml +2 -0
  7. data/conf/compliance/license_rules.yml +2 -0
  8. data/conf/mcp/server_defaults.yml +2 -0
  9. data/conf/mcp/trust.yml +1 -0
  10. data/conf/packaging/core.yml +2 -0
  11. data/conf/packaging/gtk4.yml +2 -0
  12. data/conf/packaging/qt6.yml +2 -0
  13. data/conf/policy/default_deny_list.yml +2 -0
  14. data/conf/review/cli-command-audit.yml +2 -0
  15. data/conf/review/design-docs.yml +2 -0
  16. data/conf/review/design-questionnaire.yml +2 -0
  17. data/conf/review/questionnaire.yml +2 -0
  18. data/conf/review/rosett-ai-core.yml +2 -0
  19. data/conf/schemas/ai_config_schema.json +14 -2
  20. data/conf/schemas/autoqueue.schema.json +153 -0
  21. data/conf/schemas/behaviour_schema.json +31 -7
  22. data/conf/schemas/compliance_rule_schema.json +17 -4
  23. data/conf/schemas/content_pack_manifest_schema.json +23 -4
  24. data/conf/schemas/design_schema.json +177 -42
  25. data/conf/schemas/engine_manifest_schema.json +22 -5
  26. data/conf/schemas/lockfile_schema.json +26 -4
  27. data/conf/schemas/mcp_server_schema.json +50 -9
  28. data/conf/schemas/packaging_schema.json +23 -5
  29. data/conf/schemas/policy_schema.json +35 -9
  30. data/conf/schemas/provenance_schema.json +33 -5
  31. data/conf/schemas/rai_config_schema.json +6 -2
  32. data/conf/schemas/rai_project_schema.json +8 -2
  33. data/conf/schemas/scope_hierarchy_schema.json +22 -5
  34. data/conf/schemas/target_schema.json +33 -6
  35. data/conf/schemas/tooling_schema.json +53 -12
  36. data/conf/schemas/workflow_schema.json +39 -9
  37. data/conf/targets/agents_md.yml +1 -0
  38. data/conf/targets/claude.yml +2 -0
  39. data/conf/tooling/tools.yml +2 -0
  40. data/lib/rosett_ai/adopter/local_analysis_collector.rb +5 -0
  41. data/lib/rosett_ai/adopter/rule_adopter.rb +40 -0
  42. data/lib/rosett_ai/ai_config/context_window.rb +3 -0
  43. data/lib/rosett_ai/ai_config/cost_controls.rb +1 -0
  44. data/lib/rosett_ai/ai_config/fallback_chain.rb +1 -0
  45. data/lib/rosett_ai/ai_config/model_router.rb +1 -0
  46. data/lib/rosett_ai/ai_config/validator.rb +2 -0
  47. data/lib/rosett_ai/authorship/attribution_compiler.rb +1 -0
  48. data/lib/rosett_ai/authorship/disclosure_policy.rb +2 -0
  49. data/lib/rosett_ai/authorship/review_validator.rb +1 -0
  50. data/lib/rosett_ai/authorship/trailer_generator.rb +1 -0
  51. data/lib/rosett_ai/backup/compressor.rb +3 -0
  52. data/lib/rosett_ai/backup/destination.rb +1 -0
  53. data/lib/rosett_ai/behaviour/manager.rb +1 -0
  54. data/lib/rosett_ai/compiler/backend.rb +3 -0
  55. data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +1 -0
  56. data/lib/rosett_ai/compiler/backends/claude_backend.rb +1 -0
  57. data/lib/rosett_ai/compiler/behaviour_compiler.rb +1 -0
  58. data/lib/rosett_ai/compiler/compilation_pipeline.rb +1 -7
  59. data/lib/rosett_ai/compiler/locale_compiler.rb +2 -0
  60. data/lib/rosett_ai/compiler/target_profile.rb +11 -0
  61. data/lib/rosett_ai/completion/generator.rb +2 -0
  62. data/lib/rosett_ai/completion/shells/zsh_generator.rb +1 -0
  63. data/lib/rosett_ai/comply/checkers/cra_checker.rb +1 -0
  64. data/lib/rosett_ai/comply/checkers/license_checker.rb +2 -0
  65. data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +4 -0
  66. data/lib/rosett_ai/comply/runner.rb +2 -0
  67. data/lib/rosett_ai/composition/composer.rb +1 -0
  68. data/lib/rosett_ai/composition/lockfile.rb +1 -0
  69. data/lib/rosett_ai/composition/merge_strategy.rb +1 -0
  70. data/lib/rosett_ai/config/masking_secret_resolver.rb +9 -0
  71. data/lib/rosett_ai/config/secret_resolver.rb +4 -0
  72. data/lib/rosett_ai/configuration.rb +4 -0
  73. data/lib/rosett_ai/content/content_client.rb +15 -0
  74. data/lib/rosett_ai/content/pack_installer.rb +1 -0
  75. data/lib/rosett_ai/content/pack_manifest.rb +21 -0
  76. data/lib/rosett_ai/content_packs/manager.rb +1 -0
  77. data/lib/rosett_ai/dbus/compositor_detector.rb +2 -0
  78. data/lib/rosett_ai/dbus/focus_adapters/base.rb +1 -0
  79. data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +5 -0
  80. data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +4 -0
  81. data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +4 -0
  82. data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +4 -0
  83. data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +4 -0
  84. data/lib/rosett_ai/dbus/focus_monitor_interface.rb +1 -0
  85. data/lib/rosett_ai/dbus/manager_interface.rb +1 -0
  86. data/lib/rosett_ai/dbus/plugin_manager_interface.rb +2 -0
  87. data/lib/rosett_ai/dbus/rate_limiter.rb +1 -0
  88. data/lib/rosett_ai/dbus/service.rb +3 -0
  89. data/lib/rosett_ai/dbus/status_notifier_interface.rb +14 -0
  90. data/lib/rosett_ai/desktop/dbus_client.rb +6 -0
  91. data/lib/rosett_ai/desktop/gtk4_app.rb +3 -0
  92. data/lib/rosett_ai/desktop/gtk4_preferences.rb +1 -0
  93. data/lib/rosett_ai/desktop/gui_logger.rb +2 -0
  94. data/lib/rosett_ai/doctor/check.rb +1 -1
  95. data/lib/rosett_ai/doctor/checks/cache_health_check.rb +1 -0
  96. data/lib/rosett_ai/doctor.rb +1 -0
  97. data/lib/rosett_ai/documentation/reference_compiler.rb +9 -0
  98. data/lib/rosett_ai/documentation/translator.rb +8 -0
  99. data/lib/rosett_ai/engines/base_config_compiler.rb +71 -1
  100. data/lib/rosett_ai/engines/detector.rb +5 -0
  101. data/lib/rosett_ai/engines/registry.rb +7 -0
  102. data/lib/rosett_ai/exit_codes.rb +6 -0
  103. data/lib/rosett_ai/formatting.rb +1 -0
  104. data/lib/rosett_ai/gem_consistency_checker.rb +6 -0
  105. data/lib/rosett_ai/git_hooks/chain_detector.rb +1 -0
  106. data/lib/rosett_ai/git_hooks/installer.rb +4 -0
  107. data/lib/rosett_ai/git_hooks/script_generator.rb +2 -0
  108. data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +6 -0
  109. data/lib/rosett_ai/i18n/utf8_checker.rb +1 -0
  110. data/lib/rosett_ai/init/config_file_writer.rb +4 -0
  111. data/lib/rosett_ai/init/directory_builder.rb +15 -0
  112. data/lib/rosett_ai/init/file_copier.rb +51 -0
  113. data/lib/rosett_ai/init/mcp_registrar.rb +1 -0
  114. data/lib/rosett_ai/init/project_initializer.rb +1 -0
  115. data/lib/rosett_ai/licensing/license_key.rb +4 -0
  116. data/lib/rosett_ai/licensing/license_store.rb +11 -0
  117. data/lib/rosett_ai/licensing/tier.rb +9 -0
  118. data/lib/rosett_ai/mcp/admin/auditor.rb +1 -0
  119. data/lib/rosett_ai/mcp/admin/health_checker.rb +1 -0
  120. data/lib/rosett_ai/mcp/admin/registry.rb +1 -0
  121. data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +27 -4
  122. data/lib/rosett_ai/mcp/enforcement/validator.rb +24 -3
  123. data/lib/rosett_ai/mcp/governance.rb +9 -0
  124. data/lib/rosett_ai/mcp/http_security_config.rb +22 -0
  125. data/lib/rosett_ai/mcp/key_hasher.rb +4 -2
  126. data/lib/rosett_ai/mcp/keyfile.rb +4 -0
  127. data/lib/rosett_ai/mcp/middleware/cors.rb +4 -0
  128. data/lib/rosett_ai/mcp/middleware/origin_validation.rb +1 -0
  129. data/lib/rosett_ai/mcp/middleware/rate_limit.rb +3 -0
  130. data/lib/rosett_ai/mcp/plugins.rb +1 -0
  131. data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +2 -0
  132. data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +3 -0
  133. data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +2 -0
  134. data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +2 -0
  135. data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +2 -0
  136. data/lib/rosett_ai/mcp/resources/config_resource.rb +2 -0
  137. data/lib/rosett_ai/mcp/resources/design_resource.rb +1 -0
  138. data/lib/rosett_ai/mcp/resources/hooks_resource.rb +3 -0
  139. data/lib/rosett_ai/mcp/resources/provenance_resource.rb +2 -0
  140. data/lib/rosett_ai/mcp/resources/rules_resource.rb +1 -0
  141. data/lib/rosett_ai/mcp/resources/schema_resource.rb +1 -0
  142. data/lib/rosett_ai/mcp/server.rb +7 -1
  143. data/lib/rosett_ai/mcp/settings/trust_manager.rb +3 -0
  144. data/lib/rosett_ai/mcp/tools/adopt_tool.rb +4 -0
  145. data/lib/rosett_ai/mcp/tools/backup_tool.rb +4 -0
  146. data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +4 -0
  147. data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +3 -0
  148. data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +5 -0
  149. data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +4 -0
  150. data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +4 -0
  151. data/lib/rosett_ai/mcp/tools/compile_tool.rb +4 -0
  152. data/lib/rosett_ai/mcp/tools/comply_tool.rb +4 -0
  153. data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +4 -0
  154. data/lib/rosett_ai/mcp/tools/config_status_tool.rb +3 -0
  155. data/lib/rosett_ai/mcp/tools/content_tool.rb +5 -0
  156. data/lib/rosett_ai/mcp/tools/context_query_tool.rb +4 -0
  157. data/lib/rosett_ai/mcp/tools/design_list_tool.rb +3 -0
  158. data/lib/rosett_ai/mcp/tools/design_show_tool.rb +4 -0
  159. data/lib/rosett_ai/mcp/tools/doctor_tool.rb +4 -0
  160. data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +3 -0
  161. data/lib/rosett_ai/mcp/tools/engines_tool.rb +5 -0
  162. data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +7 -0
  163. data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +33 -8
  164. data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +5 -0
  165. data/lib/rosett_ai/mcp/tools/init_tool.rb +5 -0
  166. data/lib/rosett_ai/mcp/tools/license_status_tool.rb +3 -0
  167. data/lib/rosett_ai/mcp/tools/project_tool.rb +5 -0
  168. data/lib/rosett_ai/mcp/tools/provenance_tool.rb +5 -0
  169. data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +3 -0
  170. data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +5 -0
  171. data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +4 -0
  172. data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +5 -0
  173. data/lib/rosett_ai/mcp/tools/tooling_tool.rb +5 -0
  174. data/lib/rosett_ai/mcp/tools/validate_tool.rb +4 -0
  175. data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +4 -0
  176. data/lib/rosett_ai/mcp/tools/workflow_tool.rb +5 -0
  177. data/lib/rosett_ai/migration/detector.rb +1 -0
  178. data/lib/rosett_ai/migration/nncc_config_migrator.rb +2 -0
  179. data/lib/rosett_ai/migration/xdg_migrator.rb +3 -1
  180. data/lib/rosett_ai/package_manager/apt.rb +5 -0
  181. data/lib/rosett_ai/package_manager/base.rb +1 -0
  182. data/lib/rosett_ai/package_manager/gem_backend.rb +1 -0
  183. data/lib/rosett_ai/packaging/variant_config.rb +12 -0
  184. data/lib/rosett_ai/plugins/contract.rb +1 -0
  185. data/lib/rosett_ai/plugins/engine_contract.rb +2 -0
  186. data/lib/rosett_ai/plugins/gui_contract.rb +2 -0
  187. data/lib/rosett_ai/plugins/mcp_contract.rb +2 -0
  188. data/lib/rosett_ai/plugins/registry.rb +10 -0
  189. data/lib/rosett_ai/policy/auditor.rb +1 -0
  190. data/lib/rosett_ai/policy/opt_out_scanner.rb +1 -0
  191. data/lib/rosett_ai/policy/tier_hierarchy.rb +2 -0
  192. data/lib/rosett_ai/policy/validator.rb +1 -0
  193. data/lib/rosett_ai/profiler.rb +7 -0
  194. data/lib/rosett_ai/project/drift_detector.rb +1 -0
  195. data/lib/rosett_ai/project/manager.rb +1 -0
  196. data/lib/rosett_ai/project/template_applier.rb +1 -0
  197. data/lib/rosett_ai/provenance/entry.rb +2 -0
  198. data/lib/rosett_ai/provenance/source.rb +1 -0
  199. data/lib/rosett_ai/provenance/store.rb +3 -0
  200. data/lib/rosett_ai/provenance/validator.rb +1 -0
  201. data/lib/rosett_ai/quorum/collector.rb +1 -0
  202. data/lib/rosett_ai/quorum/comparator.rb +2 -0
  203. data/lib/rosett_ai/quorum/strategies/adopt.rb +1 -0
  204. data/lib/rosett_ai/rai_config.rb +9 -0
  205. data/lib/rosett_ai/retrofit/engine.rb +2 -0
  206. data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +8 -0
  207. data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +10 -0
  208. data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +9 -0
  209. data/lib/rosett_ai/retrofit/secret_detector.rb +3 -0
  210. data/lib/rosett_ai/secrets_resolver.rb +1 -0
  211. data/lib/rosett_ai/session_hooks/installer.rb +130 -0
  212. data/lib/rosett_ai/smart_feedback/suggester.rb +4 -0
  213. data/lib/rosett_ai/smart_feedback/thor_middleware.rb +7 -0
  214. data/lib/rosett_ai/structured_logger.rb +1 -0
  215. data/lib/rosett_ai/telemetry/log_rotator.rb +1 -0
  216. data/lib/rosett_ai/telemetry.rb +1 -0
  217. data/lib/rosett_ai/thor/cli.rb +9 -0
  218. data/lib/rosett_ai/thor/tasks/adopt.rb +2 -0
  219. data/lib/rosett_ai/thor/tasks/backfill_user_yml.rb +207 -0
  220. data/lib/rosett_ai/thor/tasks/backup.rb +6 -0
  221. data/lib/rosett_ai/thor/tasks/behaviour.rb +12 -0
  222. data/lib/rosett_ai/thor/tasks/build.rb +87 -4
  223. data/lib/rosett_ai/thor/tasks/compile.rb +76 -32
  224. data/lib/rosett_ai/thor/tasks/completion.rb +9 -0
  225. data/lib/rosett_ai/thor/tasks/comply.rb +2 -0
  226. data/lib/rosett_ai/thor/tasks/config.rb +21 -5
  227. data/lib/rosett_ai/thor/tasks/content.rb +8 -0
  228. data/lib/rosett_ai/thor/tasks/dbus.rb +13 -0
  229. data/lib/rosett_ai/thor/tasks/design.rb +2 -0
  230. data/lib/rosett_ai/thor/tasks/desktop.rb +4 -0
  231. data/lib/rosett_ai/thor/tasks/doctor.rb +2 -0
  232. data/lib/rosett_ai/thor/tasks/documentation.rb +7 -0
  233. data/lib/rosett_ai/thor/tasks/engines.rb +8 -0
  234. data/lib/rosett_ai/thor/tasks/hooks.rb +8 -0
  235. data/lib/rosett_ai/thor/tasks/init.rb +1 -0
  236. data/lib/rosett_ai/thor/tasks/license.rb +8 -0
  237. data/lib/rosett_ai/thor/tasks/mcp.rb +40 -0
  238. data/lib/rosett_ai/thor/tasks/migrate.rb +2 -0
  239. data/lib/rosett_ai/thor/tasks/plugins.rb +15 -0
  240. data/lib/rosett_ai/thor/tasks/project.rb +8 -0
  241. data/lib/rosett_ai/thor/tasks/provenance.rb +8 -0
  242. data/lib/rosett_ai/thor/tasks/release.rb +8 -0
  243. data/lib/rosett_ai/thor/tasks/retrofit.rb +4 -0
  244. data/lib/rosett_ai/thor/tasks/validate.rb +1 -0
  245. data/lib/rosett_ai/thor/tasks/workflow.rb +14 -0
  246. data/lib/rosett_ai/tooling/version_checker.rb +1 -0
  247. data/lib/rosett_ai/ui/accessible_tui.rb +18 -0
  248. data/lib/rosett_ai/ui/base.rb +3 -0
  249. data/lib/rosett_ai/ui/gtk4.rb +19 -0
  250. data/lib/rosett_ai/ui/kde.rb +1 -0
  251. data/lib/rosett_ai/ui/qt6.rb +1 -0
  252. data/lib/rosett_ai/ui/registry.rb +15 -0
  253. data/lib/rosett_ai/ui/tui.rb +22 -0
  254. data/lib/rosett_ai/validators/behaviour_validator.rb +1 -0
  255. data/lib/rosett_ai/validators/design_validator.rb +2 -0
  256. data/lib/rosett_ai/validators/schema_validator.rb +4 -0
  257. data/lib/rosett_ai/validators/tooling_validator.rb +1 -0
  258. data/lib/rosett_ai/version.rb +2 -1
  259. data/lib/rosett_ai/version_consistency_checker.rb +6 -0
  260. data/lib/rosett_ai/workflow/engine.rb +1 -0
  261. data/lib/rosett_ai/workflow/manager.rb +1 -0
  262. data/lib/rosett_ai/workflow/schema_validator.rb +2 -0
  263. data/lib/rosett_ai/workflow/step_runner.rb +1 -0
  264. data/lib/rosett_ai/workflow/steps/rai_step.rb +1 -0
  265. data/lib/rosett_ai/yaml_loader.rb +2 -0
  266. data/lib/rosett_ai.rb +2 -0
  267. data/lib/scripts/generated/docker_hub_tags.rb +2 -0
  268. data/locales/ar.yml +2 -0
  269. data/locales/en.yml +5 -0
  270. data/locales/fr.yml +2 -0
  271. metadata +9 -189
  272. data/.ai-provenance.yml +0 -119
  273. data/.debride_whitelist +0 -186
  274. data/.fasterer.yml +0 -29
  275. data/.mdl_style.rb +0 -10
  276. data/.mdlrc +0 -3
  277. data/.mutant.yml +0 -49
  278. data/.namespace-allowlist +0 -42
  279. data/.reek.yml +0 -1040
  280. data/.rosett-ai/config.yml +0 -3
  281. data/.rspec +0 -5
  282. data/.rubocop.yml +0 -380
  283. data/.ruby-version +0 -1
  284. data/.yamllint +0 -51
  285. data/.yardopts +0 -12
  286. data/AI-DISCLOSURE.md +0 -48
  287. data/CLAUDE.md +0 -141
  288. data/CONTRIBUTING.md +0 -734
  289. data/INSTALL.md +0 -154
  290. data/LICENSE.md +0 -675
  291. data/QUICKSTART.md +0 -73
  292. data/Rakefile +0 -200
  293. data/SECURITY.md +0 -114
  294. data/cliff.toml +0 -52
  295. data/conf/behaviour/.gitkeep +0 -0
  296. data/conf/design/aaif_alignment.yml +0 -181
  297. data/conf/design/ab_testing.yml +0 -172
  298. data/conf/design/accessibility.yml +0 -84
  299. data/conf/design/ai_authorship.yml +0 -210
  300. data/conf/design/ai_provenance.yml +0 -224
  301. data/conf/design/ai_tool_configuration.yml +0 -207
  302. data/conf/design/architecture.yml +0 -139
  303. data/conf/design/autocompletion.yml +0 -115
  304. data/conf/design/backward_compatibility.yml +0 -112
  305. data/conf/design/behaviour_composition.yml +0 -246
  306. data/conf/design/build_rake_extraction.yml +0 -57
  307. data/conf/design/ci_pipeline.yml +0 -100
  308. data/conf/design/claude_code_configuration.yml +0 -157
  309. data/conf/design/compiler.yml +0 -128
  310. data/conf/design/comply.yml +0 -153
  311. data/conf/design/content_packs.yml +0 -84
  312. data/conf/design/desktop_integration.yml +0 -289
  313. data/conf/design/distribution.yml +0 -216
  314. data/conf/design/doctor.yml +0 -184
  315. data/conf/design/documentation.yml +0 -152
  316. data/conf/design/engine_architecture.yml +0 -257
  317. data/conf/design/error_handling.yml +0 -103
  318. data/conf/design/feature_flags.yml +0 -142
  319. data/conf/design/git_hooks.yml +0 -165
  320. data/conf/design/gui_plugins.yml +0 -475
  321. data/conf/design/i18n.yml +0 -84
  322. data/conf/design/integration_testing.yml +0 -56
  323. data/conf/design/licensing_system.yml +0 -88
  324. data/conf/design/lifecycle_management.yml +0 -208
  325. data/conf/design/mcp_integration.yml +0 -207
  326. data/conf/design/mcp_settings.yml +0 -126
  327. data/conf/design/migration.yml +0 -56
  328. data/conf/design/monitoring_observability.yml +0 -194
  329. data/conf/design/namespace_cleanup.yml +0 -145
  330. data/conf/design/plugin_test_segregation.yml +0 -145
  331. data/conf/design/policy_management.yml +0 -229
  332. data/conf/design/project_management.yml +0 -183
  333. data/conf/design/rai_mcp_asset_discovery.yml +0 -164
  334. data/conf/design/rai_mcp_server.yml +0 -605
  335. data/conf/design/release_management.yml +0 -117
  336. data/conf/design/retrofit.yml +0 -199
  337. data/conf/design/retrospective_analyzer.yml +0 -79
  338. data/conf/design/scope_hierarchy.yml +0 -352
  339. data/conf/design/security.yml +0 -115
  340. data/conf/design/session_retrospective.yml +0 -85
  341. data/conf/design/smart_ui_feedback.yml +0 -89
  342. data/conf/design/structured_logging.yml +0 -148
  343. data/conf/design/styles.yml +0 -123
  344. data/conf/design/test_peer_review.yml +0 -89
  345. data/conf/design/testing.yml +0 -136
  346. data/conf/design/threat_model.yml +0 -108
  347. data/conf/design/ui_framework.yml +0 -111
  348. data/conf/design/usage_optimization.yml +0 -122
  349. data/conf/design/version_management.yml +0 -60
  350. data/conf/design/workflow.yml +0 -227
  351. data/doc/AAIF_POSITIONING.md +0 -58
  352. data/doc/ADOPT.md +0 -224
  353. data/doc/AI_PROVENANCE.md +0 -139
  354. data/doc/ARCHITECTURE.md +0 -920
  355. data/doc/BEHAVIOUR.md +0 -409
  356. data/doc/BUILD.md +0 -138
  357. data/doc/CI_CD_RECIPES.md +0 -171
  358. data/doc/CLAUDE_SESSIONS_MOVED.md +0 -16
  359. data/doc/COMMAND_ANALYSIS.md +0 -229
  360. data/doc/CONFIGURATION.md +0 -281
  361. data/doc/DESIGN_AUDIT.md +0 -235
  362. data/doc/DESIGN_PEER_REVIEW.md +0 -771
  363. data/doc/DESKTOP.md +0 -447
  364. data/doc/ENGINES.md +0 -567
  365. data/doc/ENGINE_DEVELOPMENT_GUIDE.md +0 -417
  366. data/doc/FEATURE_AUDIT.md +0 -218
  367. data/doc/IMPLEMENTATION_PLAN.md +0 -669
  368. data/doc/INCIDENT_REPORT_2026-02-02.md +0 -251
  369. data/doc/MIGRATION_GUIDE.md +0 -88
  370. data/doc/PACKAGING.md +0 -232
  371. data/doc/PROJECT_DASHBOARD.md +0 -153
  372. data/doc/PULP_DEPLOYMENT.md +0 -164
  373. data/doc/QUALITY_FIX_SUMMARY.md +0 -110
  374. data/doc/QUICK_START.md +0 -162
  375. data/doc/REEK_CONFIGURATION.md +0 -166
  376. data/doc/REFERENCE.md +0 -253
  377. data/doc/REFERENCES.md +0 -324
  378. data/doc/SECURITY_REVIEW_CHECKLIST.md +0 -72
  379. data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +0 -359
  380. data/doc/SETUP.md +0 -202
  381. data/doc/TEST_PEER_REVIEW.md +0 -152
  382. data/doc/THREAT_MODEL.md +0 -230
  383. data/doc/USAGE.md +0 -545
  384. data/doc/USER_MANUAL.md +0 -585
  385. data/doc/ai_test_review_checklist.md +0 -110
  386. data/doc/changes/2026-02-18-packaging-fpm.md +0 -155
  387. data/doc/changes/2026-02-19-testing-infrastructure.md +0 -221
  388. data/doc/changes/2026-02-20-security-implementation.md +0 -281
  389. data/doc/changes/2026-02-20-styles-implementation.md +0 -220
  390. data/doc/changes/2026-02-21-architecture-completion.md +0 -95
  391. data/doc/changes/2026-02-21-architecture-ui-layer.md +0 -253
  392. data/doc/changes/2026-02-21-cc-config-implementation.md +0 -108
  393. data/doc/changes/2026-02-21-ci-pipeline-implementation.md +0 -214
  394. data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +0 -241
  395. data/doc/changes/2026-02-21-config-design-show-commands.md +0 -61
  396. data/doc/changes/2026-02-21-design-implementation-overview.md +0 -455
  397. data/doc/changes/2026-02-21-lifecycle-management.md +0 -196
  398. data/doc/changes/2026-02-21-path-resolver.md +0 -128
  399. data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +0 -45
  400. data/doc/changes/2026-03-01-ci-bundler-strategy.md +0 -120
  401. data/doc/changes/2026-03-20-security-hardening-phase2.md +0 -163
  402. data/doc/context/SESSION-HANDOFF.md +0 -69
  403. data/doc/context/ai-engine-usage-trends-2026.md +0 -80
  404. data/doc/context/plan-pluggable-engines.md +0 -590
  405. data/doc/decisions/001-flog-deferred.md +0 -32
  406. data/doc/decisions/002-path-resolution-strategy.md +0 -158
  407. data/doc/decisions/003-ui-adapter-selection.md +0 -193
  408. data/doc/decisions/004-design-document-validation.md +0 -179
  409. data/doc/decisions/005-package-splitting-strategy.md +0 -200
  410. data/doc/decisions/006-multi-engine-architecture.md +0 -147
  411. data/doc/decisions/007-engine-agnostic-pivot.md +0 -219
  412. data/doc/decisions/008-ci-bundler-strategy.md +0 -129
  413. data/doc/decisions/009-core-only-v1-release.md +0 -60
  414. data/doc/decisions/010-engine-debian-packaging.md +0 -66
  415. data/doc/decisions/011-context-aware-cli.md +0 -71
  416. data/doc/dependency_decisions.yml +0 -247
  417. data/doc/issues/001-wrapper-missing-environment-variables.md +0 -197
  418. data/doc/issues/002-embedded-ruby-wrong-prefix.md +0 -217
  419. data/doc/issues/003-smoke-test-false-positive.md +0 -127
  420. data/doc/issues/004-market-research-design-updates.md +0 -109
  421. data/doc/issues/005-compile-scope-coexistence.md +0 -161
  422. data/doc/locales/.gitkeep +0 -0
  423. data/doc/man/rai.1.ronn +0 -505
  424. data/doc/operations/packaging.md +0 -133
  425. data/doc/operations/rosett-ai-release.md +0 -65
  426. data/doc/reference/error-catalog.md +0 -107
  427. data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
  428. data/doc/reference/src/Pictures/cover.jpg +0 -0
  429. data/doc/reference/src/Pictures/head1.jpg +0 -0
  430. data/doc/reference/src/Pictures/head2.jpg +0 -0
  431. data/doc/reference/src/Pictures/head3.jpg +0 -0
  432. data/doc/reference/src/Pictures/head4.jpg +0 -0
  433. data/doc/reference/src/Pictures/head5.jpg +0 -0
  434. data/doc/reference/src/Pictures/head6.jpg +0 -0
  435. data/doc/reference/src/Pictures/head7.jpg +0 -0
  436. data/doc/reference/src/Pictures/head8.jpg +0 -0
  437. data/doc/reference/src/StyleInd.ist +0 -4
  438. data/doc/reference/src/bibliography.bib +0 -79
  439. data/doc/reference/src/main.tex +0 -1288
  440. data/doc/reference/src/structure.tex +0 -303
  441. data/doc/rosett-ai-bookmarks.html +0 -301
  442. data/kitchen.yml +0 -46
  443. data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
  444. data/locales/.gitkeep +0 -0
  445. data/packaging/build-engine-deb.sh +0 -81
  446. data/packaging/scripts/postinst +0 -17
  447. data/packaging/scripts/postrm +0 -19
  448. data/packaging/scripts/prerm +0 -10
  449. data/packaging/wrapper.sh.template +0 -38
  450. data/rosett-ai.gemspec +0 -63
  451. data/rules/.gitkeep +0 -0
  452. data/scripts/publish/pulp_upload.sh +0 -123
  453. data/settings.json +0 -29
@@ -1,224 +0,0 @@
1
- ---
2
- name: ai_provenance
3
- domain: security
4
- version: 0.1.0
5
- status: implemented
6
- priority: 2
7
- author: hugo
8
- created_at: "2026-03-10"
9
- modified_at: "2026-03-16"
10
- modified_by: claude
11
- depends_on:
12
- - security
13
- - engine_architecture
14
- - compiler
15
- - error_handling
16
- - ai_authorship
17
- #
18
- intent: |
19
- Establish structured, machine-readable provenance tracking for AI involvement
20
- in code contributions managed by Rosett-AI. Record which AI tools contributed to
21
- which files, what role the AI played, and what external sources it drew from.
22
-
23
- raictl already manages rules for multiple AI engines. This design extends
24
- that to track provenance — the "who did what with which AI" metadata that
25
- enables compliance auditing, license verification, and transparent
26
- attribution in open-source projects.
27
-
28
- Inspired by the OpenVox MCP Server's .ai-provenance.yml format (B3),
29
- adapted for Rosett-AI's engine-agnostic, multi-tool architecture. Where
30
- openvox-mcp tracks provenance for a single project, rosett-ai manages it
31
- across all projects the user works on, compiling provenance metadata
32
- alongside behaviour rules.
33
-
34
- Provenance is the recording layer — it creates an audit trail of what
35
- each AI tool did, per commit, with file-level granularity. The related
36
- ai_authorship.yml design handles attribution and crediting — how AI
37
- contributions are presented in commit trailers, AGENTS.md, and other
38
- public-facing outputs. Policy management (policy_management.yml)
39
- governs the requirements — which projects require provenance, at what
40
- level, and what happens when provenance is missing.
41
-
42
- Key capabilities:
43
- - Per-commit AI provenance entries with file-level granularity
44
- - Source type classification (library_api, project_code, documentation,
45
- pattern, external_source) for license traceability
46
- - Commit trailer generation (AI-Generated-By, AI-Co-Author,
47
- AI-Assisted-By, AI-Reviewed-By) across all supported engines
48
- - Engine-specific provenance: each engine records its own identity
49
- - Compilation target: provenance YAML compiles to commit hooks,
50
- CI validation rules, or AGENTS.md attribution sections
51
- - A single commit may have provenance entries from multiple engines
52
- (e.g. Ollama for local analysis, Claude for generation)
53
- #
54
- constraints:
55
- - "Provenance file (.ai-provenance.yml) must use YAML.safe_load only"
56
- - "Provenance entries are append-only — existing entries must never be
57
- modified or deleted"
58
- - "Each provenance entry must include a SHA-256 hash of the previous
59
- entry (hash chain), creating a tamper-evident append-only log.
60
- The first entry uses a zero hash. Validation checks the chain
61
- integrity"
62
- - "Source URLs for external_source type must reference specific pages,
63
- not bare domains"
64
- - "All provenance data must be storable offline — no mandatory network calls"
65
- - "Commit trailers must follow the format: Trailer — Tool Version
66
- (Provider) <email>"
67
- - "Provenance validation must work without any engine installed (core feature)"
68
- - "File paths in provenance entries must be relative to project root"
69
- - "Provenance schema must be versioned independently from rosett-ai version"
70
- - "No personally identifiable information beyond what git already stores
71
- (name + email)"
72
- - "Provenance entries must be validated before being written to disk"
73
- - "When a provenance file exceeds a configurable size threshold (default
74
- 1 MB), rosett-ai must offer archival: move older entries to a dated archive
75
- file (.ai-provenance.YYYY.yml) and start a new active file with the
76
- last entry's hash as the chain root"
77
- - "This design governs provenance recording (audit trail of AI involvement).
78
- Attribution and crediting of AI contributions is governed by
79
- ai_authorship.yml. Policy requirements for provenance (which projects
80
- require it, at what level) are governed by policy_management.yml"
81
- #
82
- acceptance_criteria:
83
- - "bin/raictl provenance init creates .ai-provenance.yml in project root
84
- with version header and zero-hash chain root"
85
- - "bin/raictl provenance add creates a new entry with commit, contributor,
86
- ai_tool, ai_role, files, and hash chain link"
87
- - "bin/raictl provenance validate checks all entries against the provenance
88
- schema and verifies hash chain integrity"
89
- - "bin/raictl provenance show COMMIT displays provenance for a specific commit"
90
- - "bin/raictl provenance show --file PATH displays all provenance entries
91
- for a file"
92
- - "bin/raictl provenance log shows all entries in reverse chronological order
93
- using TTY-aware output (table when interactive, plain text when piped)"
94
- - "bin/raictl provenance log --role AI-Co-Author filters entries by AI role"
95
- - "Commit trailers (AI-Generated-By etc.) are generated from provenance
96
- entries during compile"
97
- - "Engine name and version are automatically populated from the active
98
- engine's manifest"
99
- - "Source type is validated against the allowed list (library_api,
100
- project_code, documentation, pattern, external_source)"
101
- - "External sources with bare domain URLs are rejected with a clear
102
- error message"
103
- - "Provenance file exceeding the size threshold triggers archival
104
- recommendation"
105
- - "All provenance operations work without network access"
106
- - "Provenance entries survive round-trip (load → save produces identical YAML)"
107
- - "Exit code 0 on success, 1 on write failure, 2 on validation error,
108
- 3 on hash chain integrity failure, 5 on missing provenance file"
109
- #
110
- examples:
111
- - scenario: "Developer uses Claude to write a new module, runs bin/raictl provenance add"
112
- expected: |
113
- Entry created with ai_tool: "Claude Opus 4.6 (Anthropic)",
114
- ai_role: "AI-Co-Author", commit SHA from HEAD, contributor from
115
- git config. File paths listed with source references. Hash chain
116
- links to previous entry's SHA-256.
117
- not: "Entry silently created without validation. AI tool name guessed incorrectly."
118
- - scenario: "CI pipeline validates provenance on a pull request"
119
- expected: |
120
- bin/raictl provenance validate checks every commit in the PR has a
121
- matching provenance entry. Missing entries produce warnings at
122
- advisory level or errors at strict level. Hash chain is verified.
123
- not: "Validation requires network access. Missing provenance silently passes."
124
- - scenario: "Developer uses Ollama locally, no internet access"
125
- expected: |
126
- bin/raictl provenance add --engine ollama records provenance with
127
- ai_tool from ollama engine manifest. Works completely offline.
128
- not: "Provenance recording fails because it cannot reach an API."
129
- - scenario: "A provenance entry references a StackOverflow answer"
130
- expected: |
131
- Source type: external_source, reference: "Answer by user123 on
132
- handling thread safety in Ruby", url: specific answer URL.
133
- Validated successfully.
134
- not: "URL is just https://stackoverflow.com/ — rejected as too vague."
135
- - scenario: "Developer views provenance history for a project"
136
- expected: |
137
- `rai provenance log` shows reverse chronological entries:
138
- ┌───────────┬─────────────────┬───────────────┬──────────────┐
139
- │ Commit │ AI Tool │ Role │ Files │
140
- ├───────────┼─────────────────┼───────────────┼──────────────┤
141
- │ abc1234 │ Claude Opus 4.6 │ AI-Co-Author │ lib/foo.rb │
142
- │ def5678 │ Ollama llama3.3 │ AI-Assisted │ spec/bar.rb │
143
- └───────────┴─────────────────┴───────────────┴──────────────┘
144
- Piped output: tab-separated, no box drawing.
145
- not: "No way to see provenance history. Must read YAML file manually."
146
- - scenario: "Provenance file is corrupted — hash chain broken"
147
- expected: |
148
- `rai provenance validate` detects the break: 'Hash chain integrity
149
- failure at entry #7: expected abc123..., got def456...'. Exit code 3.
150
- Identifies the exact entry where tampering occurred.
151
- not: "Corruption goes undetected. Provenance file accepted as valid."
152
- - scenario: "Provenance file exceeds 1 MB after months of development"
153
- expected: |
154
- `rai provenance add` warns: 'Provenance file exceeds 1 MB — run
155
- `rai provenance archive` to move older entries to a dated archive'.
156
- Archive creates .ai-provenance.2026.yml with entries before cutoff.
157
- New active file starts with the last archived entry's hash as root.
158
- not: "File grows unbounded. No archival mechanism. Parsing slows down."
159
- #
160
- anti_patterns:
161
- - "Storing provenance in a database instead of a versionable YAML file"
162
- - "Requiring API calls to record provenance"
163
- - "Allowing modification of existing provenance entries (append-only)"
164
- - "Storing full file contents in provenance (only paths and line references)"
165
- - "Using provenance to block contributions (it records, does not gate)"
166
- - "Hardcoding AI tool names instead of reading from engine manifests"
167
- - "Storing provenance per-engine instead of per-project"
168
- - "Provenance entries without hash chain links (unverifiable integrity)"
169
- #
170
- gui_notes: |
171
- Document interactions (cross-references):
172
-
173
- 1. ai_authorship.yml: provenance records what AI did; authorship handles
174
- how contributions are attributed and credited in public outputs.
175
-
176
- 2. policy_management.yml: policies govern provenance requirements — which
177
- projects require provenance, at what strictness level, and what happens
178
- when provenance is missing.
179
-
180
- 3. security.yml: YAML.safe_load, PII constraints, offline-first.
181
-
182
- 4. engine_architecture.yml: engine manifests provide AI tool identity
183
- (name, version, provider) for provenance entries.
184
-
185
- 5. compiler.yml: provenance compiles to commit hooks, CI validation
186
- rules, and AGENTS.md attribution sections.
187
-
188
- 6. error_handling.yml: exit codes and structured error messages follow
189
- the error hierarchy (what/why/fix format).
190
-
191
- Provenance entry schema outline:
192
- version: string (schema version, e.g. "1.0.0")
193
- entries:
194
- - commit: string (git SHA)
195
- timestamp: string (ISO 8601)
196
- contributor:
197
- name: string (from git config)
198
- email: string (from git config)
199
- ai_tool:
200
- name: string (from engine manifest)
201
- version: string
202
- provider: string
203
- engine: string (rosett-ai engine name)
204
- ai_role: AI-Generated-By | AI-Co-Author | AI-Assisted-By | AI-Reviewed-By
205
- files:
206
- - path: string (relative to project root)
207
- source_type: library_api | project_code | documentation | pattern | external_source
208
- reference: string (description of source)
209
- url: string (optional, must be specific)
210
- hash: string (SHA-256 of previous entry, zero-hash for first)
211
- #
212
- preferences:
213
- language: ruby
214
- patterns:
215
- - "Append-only log with hash chain integrity"
216
- - "Schema-validated entries before write"
217
- - "Engine manifest integration for AI tool identity"
218
- - "Offline-first recording"
219
- - "TTY-aware output (TtyHelper)"
220
- testing: rspec with provenance fixtures, round-trip tests, hash chain
221
- validation, archival scenarios, and multi-engine provenance entries
222
- gems:
223
- - json_schemer
224
- - thor
@@ -1,207 +0,0 @@
1
- ---
2
- name: ai_tool_configuration
3
- domain: core
4
- version: 0.1.0
5
- status: implemented
6
- priority: 2
7
- author: hugo
8
- created_at: "2026-03-10"
9
- modified_at: "2026-03-16"
10
- modified_by: claude
11
- depends_on:
12
- - engine_architecture
13
- - security
14
- - claude_code_configuration
15
- - error_handling
16
- - compiler
17
- #
18
- intent: |
19
- Establish the engine-agnostic AI tool configuration and asset management
20
- layer for Rosett-AI — model selection, context window settings, token budgets,
21
- API routing, operational parameters, and AI tool assets (skills, hooks,
22
- memory files, keybindings) that apply across all AI tools.
23
-
24
- Relationship to claude_code_configuration.yml: that document is the Claude
25
- engine's implementation of the contracts defined here. It handles Claude
26
- Code's specific settings.json format, target paths, and scope routing.
27
- This document defines the universal configuration and asset schema that
28
- all engines implement. As rosett-ai matures, Claude-specific settings migrate
29
- from claude_code_configuration into engine-specific config compiled from
30
- this generic layer.
31
-
32
- As developers use multiple AI tools simultaneously (Claude for complex
33
- tasks, Ollama for quick local queries, Cursor for inline completions),
34
- they need a single place to configure model routing, cost controls,
35
- operational parameters, and reusable assets (skills, hooks, memory).
36
- raictl compiles these preferences and assets into each tool's native
37
- configuration format via the engine capability manifest contract.
38
- #
39
- constraints:
40
- - This document defines the generic configuration and asset schema.
41
- claude_code_configuration.yml documents the Claude engine's specific
42
- implementation (target paths, JSON format, scope routing). Engine-specific
43
- docs are implementation of the contracts defined here, not independent designs
44
- - Configuration must be expressible in YAML without engine-specific keys in the generic layer
45
- - Engine-specific overrides live in .rosett-ai/conf/engines/<name>/config.yml
46
- - API keys and secrets must never appear in configuration YAML (reference ENV vars or keyring)
47
- - Model names in generic config use canonical identifiers mapped per engine
48
- - Cost controls are advisory — rosett-ai does not enforce runtime token limits
49
- - Configuration validation must work without any engine installed
50
- - Compiled configuration must respect security.yml constraints (no secret leakage)
51
- - Fallback chains must not silently switch from local to remote models
52
- - Temperature and sampling parameters are only set when the engine supports them
53
- - Configuration changes must be diffable (YAML format, no binary blobs)
54
- - AI tool asset types (skills, hooks, memory, keybindings, and others) are
55
- declared by each engine's capability manifest as a contract. Core defines
56
- the generic asset schema; engines declare which asset types they support,
57
- their target paths, and compilation formats
58
- - Asset content (skills, hooks) must be validated against ANSI and control
59
- character stripping (per security.yml). Hook assets must use array-form
60
- execution only — no shell expansion or string interpolation
61
- - Skills and hooks are potential attack vectors (jailbreaking, shell expansion,
62
- privilege escalation) and must undergo content validation during compilation.
63
- Engines must reject asset content containing shell metacharacters in hook
64
- definitions or prompt injection patterns in skill definitions
65
- - Skill content must not contain secret references or literal API keys
66
- - Asset compilation for unsupported asset types must produce warnings
67
- (errors in --strict mode), consistent with unsupported parameter handling
68
- #
69
- acceptance_criteria:
70
- - .rosett-ai/conf/ai_config.yml defines model routing, context, cost, and operational settings
71
- - bin/raictl compile translates generic AI config to Claude Code settings.json model preferences
72
- - bin/raictl compile --engine ollama translates to Ollama-specific model configuration
73
- - bin/raictl compile --engine cursor translates to Cursor settings where applicable
74
- - Model routing maps canonical names to engine-specific identifiers (e.g. "best" -> "claude-opus-4-6" for Claude, "llama3.3:70b" for Ollama)
75
- - API key references use ENV variable names only — never literal values
76
- - Context window settings compile to engine-native max_tokens or equivalent
77
- - Fallback chain compilation warns when a fallback switches from local to remote
78
- - bin/raictl config validate checks AI tool configuration against schema
79
- - Engine capability manifest determines which settings are compilable for each engine
80
- - Unsupported settings for a given engine produce warnings (errors in --strict mode)
81
- - Cost tier preferences (economy/standard/premium) map to concrete models per engine
82
- - Generic skill definition compiles to engine-native skill format (e.g.
83
- .claude/skills/ for Claude, .cursor/rules/ for Cursor)
84
- - Asset type not supported by an engine produces a warning listing the
85
- unsupported type and the engine name (error in --strict mode)
86
- - Engine manifest declares supported asset types with target paths and
87
- compilation formats, verifiable by bin/raictl engines detect
88
- #
89
- examples:
90
- - scenario: "Developer configures model routing for a mixed local/cloud workflow"
91
- expected: |
92
- .rosett-ai/conf/ai_config.yml defines: generation: premium, review: standard,
93
- completion: economy. bin/raictl compile maps premium->opus for Claude,
94
- premium->llama3.3:70b for Ollama. Each engine's compiled config uses
95
- native model identifiers.
96
- not: "Generic config contains claude-opus-4-6 directly. Ollama compilation fails."
97
- - scenario: "Organisation sets a monthly token budget across all AI tools"
98
- expected: |
99
- ai_config.yml sets cost.monthly_budget: advisory with a note.
100
- Compiled Claude Code config includes maxTokens hints. Compiled
101
- AGENTS.md includes cost awareness instructions. Budget is advisory
102
- — rosett-ai does not enforce at runtime.
103
- not: "rosett-ai attempts to enforce token limits at runtime. Budget stored as hard limit."
104
- - scenario: "Developer uses Ollama locally but wants Claude API as fallback"
105
- expected: |
106
- Fallback chain: [ollama, claude]. During compile, a warning is emitted:
107
- 'Fallback from local (ollama) to remote (claude) — network required'.
108
- Both engine configs are generated. User acknowledges the trade-off.
109
- not: "Silent fallback from local to cloud. No network warning."
110
- - scenario: "Compiling for Cursor which does not support temperature settings"
111
- expected: |
112
- Temperature setting in generic config is skipped for Cursor.
113
- Warning: 'Cursor engine does not support temperature parameter — skipped'.
114
- In --strict mode, this becomes an error.
115
- not: "Invalid temperature setting written to .cursorrules. No warning."
116
- - scenario: "Developer authors a reusable skill and compiles for Claude and Cursor"
117
- expected: |
118
- Generic skill definition in .rosett-ai/conf/assets/skills/code_review.yml
119
- compiles to .claude/skills/code_review.md for Claude engine (markdown
120
- format) and .cursor/rules/code_review.mdc for Cursor engine (Cursor
121
- rules format). Each engine's manifest declares the target path and format.
122
- not: |
123
- Skill is hardcoded to .claude/skills/ only. Cursor users get nothing.
124
- Skill format assumes Claude-specific prompt structure.
125
- - scenario: "Compiling hook assets for an engine that does not support hooks"
126
- expected: |
127
- Warning: 'Ollama engine does not support hook assets — skipped 2
128
- hook definitions'. In --strict mode, this becomes an error.
129
- Compilation continues for other asset types.
130
- not: |
131
- Hook definitions are silently dropped with no warning. Or worse,
132
- raictl attempts to write hook config to a non-existent Ollama path.
133
- - scenario: "Engine manifest declares supported asset types"
134
- expected: |
135
- Claude engine manifest includes:
136
- supported_assets:
137
- skills: { target: ".claude/skills/", format: "markdown" }
138
- hooks: { target: ".claude/settings.json#hooks", format: "json" }
139
- memory: { target: ".claude/memory/", format: "markdown" }
140
- bin/raictl engines detect lists all declared asset types per engine.
141
- not: |
142
- Asset types are hardcoded in core rosett-ai. Adding a new asset type
143
- requires modifying core code instead of updating the engine manifest.
144
- - scenario: "A skill definition contains a prompt injection attempt"
145
- expected: |
146
- Compilation validates skill content. Suspicious patterns (e.g.
147
- 'ignore previous instructions', 'system prompt override', shell
148
- metacharacters in hook commands) are flagged as warnings. In --strict
149
- mode, compilation fails with a security error.
150
- not: |
151
- Malicious skill content is compiled and deployed without review.
152
- Hook definitions with shell expansion are written to native config.
153
- #
154
- anti_patterns:
155
- - Storing API keys in configuration YAML (use ENV references)
156
- - Engine-specific model names in generic configuration layer
157
- - Hardcoding model mappings instead of deriving from engine manifests
158
- - Runtime token enforcement (rosett-ai is a compiler, not a runtime)
159
- - Silent local-to-remote fallback without user awareness
160
- - Binary configuration formats that cannot be diffed
161
- - Assuming all engines support all parameters (capability-aware compilation)
162
- - Designing the generic asset schema to match Claude Code's model too
163
- closely — other engines have asset types that may not map to Claude's
164
- categories (e.g. Cursor has .mdc rules, GitHub Copilot has instructions)
165
- - Hardcoding asset types in core instead of declaring them in engine manifests
166
- - Compiling skill or hook content without security validation
167
- - Allowing shell metacharacters or string interpolation in hook definitions
168
- #
169
- gui_notes: |
170
- Document interactions (cross-references):
171
-
172
- 1. engine_architecture.yml: engines declare capability manifests including
173
- supported asset types, target paths, and compilation formats. This doc
174
- defines the generic schema that manifests implement.
175
-
176
- 2. claude_code_configuration.yml: the Claude engine's implementation of
177
- the contracts defined here. Handles settings.json format, skill paths,
178
- hook configuration, and scope routing specific to Claude Code.
179
-
180
- 3. security.yml: asset content validation (ANSI stripping, no secrets,
181
- array-form hooks). Skills and hooks are attack surfaces requiring
182
- audit for jailbreak, shell expansion, and privilege escalation.
183
-
184
- 4. compiler.yml: asset compilation follows the same pipeline as behaviour
185
- and configuration compilation. Assets are a new compilation target type.
186
-
187
- 5. error_handling.yml: unsupported assets and validation failures use the
188
- structured error hierarchy (exit codes, what/why/fix format).
189
-
190
- 6. backward_compatibility.yml: the asset schema and manifest contract are
191
- public API surfaces. Changes to supported asset types are breaking.
192
- #
193
- preferences:
194
- language: ruby
195
- patterns:
196
- - canonical_model_identifiers
197
- - engine_manifest_capability_mapping
198
- - engine_manifest_asset_contract
199
- - advisory_not_enforcement
200
- - env_var_secret_references
201
- - compile_time_validation
202
- - asset_content_security_audit
203
- testing: rspec with multi-engine compilation fixtures, capability gap tests,
204
- and asset compilation round-trip tests
205
- gems:
206
- - json_schemer
207
- - thor
@@ -1,139 +0,0 @@
1
- ---
2
- name: architecture
3
- domain: core
4
- version: 2.0.0
5
- status: draft
6
- priority: 2
7
- author: hugo
8
- created_at: "2026-02-18"
9
- modified_at: "2026-03-23"
10
- modified_by: claude
11
- depends_on:
12
- - security
13
- - testing
14
- - ci_pipeline
15
- - scope_hierarchy
16
-
17
- intent: |
18
- Define the overall system architecture of Rosett-AI as a TUI-first, pluggable
19
- application with optional GUI layers delivered as separate Debian packages.
20
- The core must run on headless servers (CLI/TUI only) while desktop users
21
- can install GUI packages for their environment. All UI variants share the
22
- same backend logic. The architecture must support multi-target AI model
23
- compilation, licensing, i18n, and accessibility from the ground up —
24
- informed by the security constraints established in Priority 1.
25
-
26
- A foundational architectural principle is scope-first: all commands resolve
27
- their working context from the three-level scope hierarchy (global, local,
28
- project) before operating. Configuration sources are discovered from the
29
- user's working directory, merged according to configurable strategies, and
30
- compiled to scope-appropriate output locations. See scope_hierarchy.yml for
31
- the full scope specification.
32
-
33
- constraints:
34
- - Core package (rai) must be fully functional without any GUI package installed
35
- - GUI packages must not introduce dependencies on TUI-specific libraries
36
- - All UI variants share the same backend logic in lib/rosett_ai/
37
- - Only Linux is supported; Debian is the target distribution
38
- - Ruby is the implementation language; version managed via rbenv
39
- - Thor is the CLI framework
40
- - All configuration files are YAML (validated by JSON Schema)
41
- - Abstract UI interface (lib/rosett_ai/ui/base.rb) defines the contract all GUI plugins implement
42
- - GUI plugins are discovered at runtime via a registry pattern
43
- - Security constraints from security.yml apply to all architectural layers
44
- - "Scope-first: all commands resolve their working context from the
45
- three-level scope hierarchy (global, local, project) before operating
46
- (see scope_hierarchy.yml)"
47
- - Commands must never assume a single fixed source directory — source
48
- directories are resolved from the active scope
49
-
50
- acceptance_criteria:
51
- - bin/raictl runs without errors on a headless Debian server (no X11/Wayland)
52
- - Installing rosett-ai-gtk4 adds GTK4 UI option without modifying core
53
- - lib/rosett_ai/ui/base.rb defines the abstract interface with documented methods
54
- - lib/rosett_ai/ui/registry.rb discovers installed UI plugins automatically
55
- - All business logic is in lib/rosett_ai/ (not in TUI or GUI code)
56
- - conf/design/ documents are validated against conf/schemas/design_schema.json
57
- - conf/behaviour/ documents are validated against conf/schemas/behaviour_schema.json
58
- - Package dependencies are correctly declared (rosett-ai-gtk4 depends on rosett-ai)
59
- - "Configuration sources are resolved from the three-level scope hierarchy:
60
- global (~/.config/rosett-ai/conf/), local (<group>/.rosett-ai/conf/), project
61
- (<project>/.rosett-ai/conf/) — see scope_hierarchy.yml"
62
- - All scope-aware commands (compile, validate, design, behaviour) resolve
63
- source directories from the active scope before operating
64
-
65
- examples:
66
- - scenario: "User installs only the Rosett-AI core package on a server"
67
- expected: "All CLI commands work. TUI mode is available. No GUI-related errors or warnings."
68
- not: "Application crashes due to missing GTK4 or Qt6 libraries."
69
- - scenario: "User installs rosett-ai-gtk4 alongside rosett-ai on a GNOME desktop"
70
- expected: "bin/raictl --ui gtk4 launches GTK4 interface. bin/raictl (no flag) uses TUI as default."
71
- not: "GTK4 becomes the default. TUI mode breaks. Core behaviour changes."
72
- - scenario: "Developer adds a new feature to the compiler"
73
- expected: "Feature is implemented in lib/rosett_ai/compiler/. Both TUI and GUI see the feature without changes."
74
- not: "Feature requires separate implementation in TUI and GUI code."
75
- - scenario: "New AI model (e.g. Gemma) needs to be supported as compilation target"
76
- expected: "Add conf/targets/gemma.yml with model profile. No code changes needed."
77
- not: "Requires modifying compiler source code or adding conditional logic."
78
-
79
- anti_patterns:
80
- - Business logic in UI layer (TUI or GUI code making domain decisions)
81
- - GUI-specific dependencies in core package
82
- - Hardcoded paths instead of XDG-compliant directory resolution
83
- - Assuming a single fixed source directory for all commands regardless of
84
- working directory (see scope_hierarchy.yml)
85
- - Monolithic package that bundles all UI toolkits
86
- - Plugin discovery that requires editing a config file instead of auto-detection
87
-
88
- gui_notes: |
89
- Implicit Assumptions (documented per DESIGN_AUDIT.md recommendation #6):
90
-
91
- 1. Linux-only: rosett-ai targets Linux exclusively. macOS and Windows are not
92
- supported. This is stated in constraints but deserves explicit callout
93
- as it affects all design documents.
94
-
95
- 2. Debian-first: Primary packaging is .deb for Debian/Ubuntu. RPM support
96
- (Fedora/RHEL) is Phase 2 of the distribution design. Other packaging
97
- formats (AppImage, Homebrew, Winget) are Phase 3+.
98
-
99
- 3. Single-user: XDG paths (~/.config/rosett-ai/, ~/.cache/rosett-ai/) assume a
100
- single user per HOME directory. Multi-user installations with shared
101
- system-wide config are not designed for. Root-level managed settings
102
- (/etc/claude-code/) are the exception for enterprise deployment.
103
-
104
- 4. Ruby 3.3.10: The project targets Ruby 3.3.10 managed via rbenv. This
105
- is scattered across design documents but should be understood as a
106
- hard constraint. Version bumps require updating rbenv, CI, and the
107
- .ruby-version file.
108
-
109
- 5. Zeitwerk lazy loading: All module autoloading uses Zeitwerk. No
110
- eager_load calls outside of test/CI. This affects startup time and
111
- memory usage (see usage_optimization.yml).
112
-
113
- 6. UTF-8 everywhere: All text processing assumes UTF-8 encoding. YAML
114
- files, CLI output, log files, and configuration all use UTF-8. No
115
- other encodings are supported for configuration files.
116
-
117
- 7. Three-level scope hierarchy: The architecture supports three distinct
118
- configuration scopes resolved from the user's working directory:
119
- - Global: ~/.config/rosett-ai/conf/ (XDG user config, applied everywhere)
120
- - Local: <group-dir>/.rosett-ai/conf/ (workspace-level, multi-project groups)
121
- - Project: <project-dir>/.rosett-ai/conf/ (project-specific overrides)
122
- Each scope has its own conf/ subtree with the same structure as the
123
- raictl source directory. Commands auto-detect the active scope from the
124
- working directory. See scope_hierarchy.yml for the full specification.
125
-
126
- preferences:
127
- language: ruby
128
- patterns:
129
- - hexagonal_architecture
130
- - plugin_registry
131
- - dependency_injection
132
- - interface_contracts_via_shared_examples
133
- testing: rspec with shared examples for interface contracts
134
- gems:
135
- - thor
136
- - json_schemer
137
- - tty-prompt
138
- - tty-table
139
- - pastel