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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08b1ccbf26eade94ccc451962a789f73da5037aacd3fa3fba00d442a143c259c'
4
- data.tar.gz: 85521d6653832bdded1ce46cd951d6fff0c21521695bc4ab1eaf88523bc6c1fd
3
+ metadata.gz: 29a816be5fea64d709f477070a052b5b595a13f74c1f77507a17f7f175a87972
4
+ data.tar.gz: ca13bcf8795e23edb27c19c27f2b5f90355159f1688f5a40c05e88c45331afd9
5
5
  SHA512:
6
- metadata.gz: eb06abe8951876cfb9a29c3966bead575439daca52e3d5dab67a4cab97560e54fe67dd6cfbcb6bde3a7ec800108acc44ff6aa587b13ad549b394f87e8f35a177
7
- data.tar.gz: cc15e6fe802854c0ca427ae49a57a137d24f943a0b813a57ca809159b37215c37e1c5063ca54ff19b98740df5cb9b462f5cf597806ac4255f924fdf5b26c5e34
6
+ metadata.gz: fa098e5c74b48e50337278e7a6e8f59a37c4a26d916466d573426882e5aa8b139680d68d9e5d48e5975bfba36f016b6d684716cf829d910fdc85698469f6774a
7
+ data.tar.gz: 4951940f5dc9d20cd28f0dc648a2f004c69c7ec8bce406191c91819736e8faae92a51b6393d881fc9a1b511ef555fb77dc3181c65273aedaa866cdb8f731e535
data/CHANGELOG.md CHANGED
@@ -6,6 +6,358 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.5.9] - 2026-07-06
10
+
11
+ ### Security
12
+
13
+ - **audit:gem CI gate** — adds a standalone `audit:gem` job (allowlist,
14
+ denylist, PII scan, gitleaks) wired as a `needs:` dependency of
15
+ `publish:gem`. Closes the DAG gap that let v1.5.8 publish without any
16
+ security verification (WP#3248).
17
+
18
+ ### Added
19
+
20
+ - **Gem install smoke test** — new `package:gem-smoke-test` CI job installs
21
+ the built `.gem` in a clean Ruby container and verifies all 20 CLI
22
+ subcommands load without `LoadError` or `NameError`.
23
+
24
+ - **test:mutant:full** — full-suite mutant gate on `v*` tag pipelines;
25
+ `allow_failure:true` until surviving mutants are resolved (WP#3248 P1
26
+ baseline ~596 survivors).
27
+
28
+ - **sec_016 behaviour rule** — codifies the requirement that every publish
29
+ job targeting a public registry must declare both an artifact-audit gate
30
+ and an install-parity smoke test in its `needs:` block.
31
+
32
+ ### Changed
33
+
34
+ - **gemspec spec.files** — restores all intended runtime directories
35
+ (`conf/`, `locales/`, `packaging/`, `doc/man/`); removes stale globs
36
+ that produced a near-empty gem in v1.5.8.
37
+
38
+ - **Rakefile release:gem** — adds minimum-size floor, PII pattern scan,
39
+ gitleaks check, and positive-allowlist enforcement before any gem build.
40
+
41
+ ### Fixed
42
+
43
+ - **BackfillUserYml spec coverage** — adds 21 missing specs for the
44
+ `backfill_user_yml` Thor task (last uncovered file in
45
+ `lib/rosett_ai/thor/**`).
46
+
47
+ ## [1.5.8] - 2026-07-06
48
+
49
+ ### Changed
50
+
51
+ - **Automatic RubyGems publishing on tag** — `publish:gem` now runs
52
+ `when: on_success` on `v*` tags (previously a blocking manual gate), so a
53
+ tagged release publishes the `.gem` to rubygems.org alongside the `.deb` to
54
+ aptly. The job now reads the instance-level protected+masked variable
55
+ `NEATNERDS_RUBYGEMS_PUBLISH` (was the never-configured `RUBYGEMS_API_KEY`).
56
+ The `v*` tag pattern is a protected tag so the protected variable injects
57
+ into tag pipelines.
58
+
59
+ ### Fixed
60
+
61
+ - **Smoke-test embedded-Ruby ABI probe** — the CI smoke-test derived the Ruby
62
+ ABI version via `RbConfig::CONFIG['ruby_version']`, which fails in the
63
+ hermetic embedded Ruby (RubyGems/stdlib load path disabled): both
64
+ `RbConfig` (NameError) and an explicit `require 'rbconfig'` (LoadError) are
65
+ unavailable there. The probe now derives the ABI from the built-in
66
+ `RUBY_VERSION` constant (`RUBY_VERSION.split('.')[0,2].join('.') + '.0'`),
67
+ which needs no require and no load path. Regression from the postinst
68
+ engine-extraction test block added in v1.5.6.
69
+
70
+ - **Embedded bin shebangs rewritten at build time** — ruby-build compiles
71
+ with the staging directory as `--prefix`, so scripts in `embedded/bin/`
72
+ (gem, bundle, rake, irb, and others) carry the build-time staging path
73
+ (`…/tmp/staging/opt/rosett-ai/embedded/bin/ruby`) as their shebang.
74
+ That path does not exist at runtime, causing engine plugin gem installs
75
+ invoked from postinst to fail with `ENOENT`. A new `rewrite_shebangs!`
76
+ build stage runs after `:install_gems` (which needs the staging shebang
77
+ at build time) and rewrites every ruby-shebang script in `embedded/bin/`
78
+ to `#!/opt/rosett-ai/embedded/bin/ruby` before packaging.
79
+
80
+ - **Post-install `gem install` bypass staging shebang** — postinst now
81
+ invokes `"${EMBEDDED_RUBY}" "${EMBEDDED_GEM}" install` (passing the gem
82
+ script as an argument to the ruby binary) rather than calling
83
+ `"${EMBEDDED_GEM}" install` directly. Defence-in-depth against any
84
+ residual stale shebang on the installed gem binary. The postinst ABI
85
+ probe was also converted from `RbConfig::CONFIG['ruby_version']` to
86
+ `RUBY_VERSION.split('.')[0,2].join('.') + '.0'` for the same reason as
87
+ the smoke-test fix above.
88
+
89
+ - **Postinst engine-gem install: set RUBYLIB to runtime stdlib path** —
90
+ ruby-build compiles with the staging tree as `--prefix`, so the embedded
91
+ ruby's compiled-in `$LOAD_PATH` references the staging path (non-existent
92
+ at runtime). `require 'rubygems'` therefore fails when the gem binary is
93
+ invoked by postinst, silently skipping engine extraction. The postinst now
94
+ exports `RUBYLIB=${INSTALL_DIR}/embedded/lib/ruby/${RUBY_ABI}` for the gem
95
+ install invocation, prepending the correct runtime path so rubygems loads.
96
+ The CI smoke-test's test-gem build step now uses the system `gem` binary
97
+ (already present from the apt-installed ruby) rather than the embedded gem
98
+ binary, keeping the test focused on postinst extraction correctness.
99
+
100
+ ## [1.5.7] - 2026-07-05
101
+
102
+ ### Security
103
+
104
+ - **Scrub author contact from man page** — replaced the pre-release author
105
+ address in the `## AUTHORS` section of `doc/man/raictl.1.ronn` with the
106
+ public contact address (`query@neatnerds.be`). The address was present in
107
+ the installed man page and was detected by the Gate B post-publish PII scan
108
+ on v1.5.6. The `artifact-audit` CI gate allows standard man-page attribution;
109
+ Gate B requires zero pre-release-email hits in the shipped `.deb`.
110
+
111
+ ## [1.5.6] - 2026-07-05
112
+
113
+ ### Security
114
+
115
+ - **Redact internal tracker references from shipped files** — removed an
116
+ internal issue reference from `packaging/lib/systemd/rosett-ai-mcp.service.d/throttle.conf`
117
+ and rephrased the `CHANGELOG.md` v1.5.5 security note to avoid embedding
118
+ the pre-scrub email address in the changelog description itself. Both were
119
+ flagged by `artifact-audit` v2.10.1 on the v1.5.5 tag pipeline.
120
+
121
+ ### Fixed
122
+
123
+ - **Smoke-test embedded Ruby `LD_LIBRARY_PATH`** — the CI smoke-test invoked
124
+ `/opt/rosett-ai/embedded/bin/ruby` and `/opt/rosett-ai/embedded/bin/gem`
125
+ directly without setting `LD_LIBRARY_PATH`, causing `libruby.so.3.4: cannot
126
+ open shared object file` on the CI runner. Prefixed both invocations with
127
+ `LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib` so the dynamic linker finds
128
+ the hermetic library alongside the binary.
129
+
130
+ ## [1.5.5] - 2026-07-05
131
+
132
+ ### Security
133
+
134
+ - **PII scrub — personal email replaced with functional contact** — replaced
135
+ internal developer email addresses with the public contact address (`query@neatnerds.be`) in all YAML configuration files,
136
+ JSON schemas, locale files, and documentation that are shipped in the `.deb`
137
+ package. This covers SPDX copyright comment headers in `conf/` YAML files,
138
+ `conf/mcp/trust.yml`, `conf/schemas/*.json`, `locales/*.yml`, `AUTHORS`,
139
+ `GOVERNANCE.md`, and `README.md`.
140
+
141
+ - **Artifact audit upgraded to `@v2.10.1`** — the previous pin (`@v2.8.2`)
142
+ applied a blanket `.pem` extension denylist that flagged public CA certificates
143
+ bundled with the hermetic Ruby runtime as private-key leaks. The new release
144
+ uses content-aware detection: only files whose content contains a
145
+ `BEGIN ... PRIVATE KEY` header are rejected. This eliminates false positives
146
+ on public certificates while preserving detection of actual private key material.
147
+
148
+ ### Changed
149
+
150
+ - **`deb-push-aptly` upgraded to `@v2.10.0`** — adds the `http_port` input to
151
+ allow non-standard aptly API ports. Set `http_port: '8080'` to match the
152
+ host's aptly configuration.
153
+
154
+ - **Extended `.deb` exclusions** — the following paths are now excluded from the
155
+ Debian package staging tree: `.ai-provenance.yml` (AI provenance tracking file,
156
+ dev-only), `doc/audits/` (internal audit reports), `doc/operations/` (runbooks
157
+ with internal references), `doc/signing/` (signing scripts), and
158
+ `doc/rules-audit-*.md` (rule audit snapshots). These files are not runtime
159
+ requirements and must not appear in a published package.
160
+
161
+ ### Fixed
162
+
163
+ - **Smoke-test `dpkg --configure` failure on Debian Trixie** — the postinst
164
+ idempotency check previously called `dpkg --configure rosett-ai` on an
165
+ already-configured package. On Debian Trixie this fails with a non-zero exit
166
+ code because `dpkg` refuses to re-configure an already-installed package.
167
+ Replaced with a direct call to the postinst script:
168
+ `DEBIAN_FRONTEND=noninteractive /var/lib/dpkg/info/rosett-ai.postinst configure`
169
+ which exercises the postinst idempotency path without involving dpkg's
170
+ package-state machine.
171
+
172
+ ## [1.5.4] - 2026-07-05
173
+
174
+ ### Security
175
+
176
+ - **Artifact audit gate** — added `artifact-audit@v2.8.2` CI/CD catalog component
177
+ to the pipeline. The `audit:artifact` job runs in a new `audit` stage (between
178
+ `package` and `deploy`) and verifies the built `.deb` against the positive
179
+ allowlist, denylist, PII patterns, and gitleaks before publication. A failing
180
+ audit blocks the `publish:deb-push-aptly` job via a `needs:` override in the
181
+ pipeline. This closes the gap where a malformed packaging allowlist could have
182
+ shipped leak-class files to the aptly repository without CI-level detection.
183
+
184
+ ### Changed
185
+
186
+ - **deb-push-aptly upgraded to @v2.7.1** — bumped from `@v2.6.0`. Adds artifact
187
+ chain reliability improvements. See ci-components CHANGELOG.
188
+
189
+ - **Sanitize internal filesystem paths from audit docs and test fixtures** —
190
+ hardcoded `/home/user/` developer paths removed from `doc/audits/`, `doc/rules-audit-*`,
191
+ and `spec/` test fixtures. Spec paths replaced with `File.join(Dir.home, ...)` or
192
+ `/workspace/` placeholders so the `security:pre-tag` CI gate passes on tag pipelines.
193
+
194
+ ## [1.5.3] - 2026-07-04
195
+
196
+ ### Security
197
+
198
+ - **NNSA-2026-002 Phase B — deb packaging allowlist** — `conf/behaviour/`,
199
+ `conf/design/`, and `doc/security/` were absent from `APP_EXCLUDES` in
200
+ `lib/rosett_ai/thor/tasks/build.rb`, allowing user-authored behaviour rules,
201
+ design documents with internal WP references, and unpublished security
202
+ advisory drafts to be rsync'd into the `.deb` staging tree. All three
203
+ directories are now explicitly excluded. Documented in
204
+ `doc/operations/deb-publish-pipeline.md`.
205
+
206
+ - **Remove user-authored behaviour rules from HEAD** — `conf/behaviour/criticalthinking.yml`,
207
+ `conf/behaviour/orchestrator_loop.yml`, `conf/behaviour/session_retrospective.yml`,
208
+ and `conf/behaviour/tooling_idioms.yml` were tracked in the public repository
209
+ via `.gitignore` negation patterns (`!conf/behaviour/*.yml`). These are private
210
+ user rule files that must never ship in product repositories (rule_073). Removed
211
+ from index; negation lines removed from `.gitignore`. The `doc/security/NNSA-2026-002-draft.md`
212
+ draft advisory is also removed from HEAD.
213
+
214
+ - **Genericize `conf/schemas/autoqueue.schema.json`** — the schema `description`
215
+ field contained a private filesystem path (`~/.claude/projects/…/autoqueue.yml`)
216
+ and an internal issue tracker reference (``). Replaced with a generic
217
+ description that does not expose internal paths or issue IDs.
218
+
219
+ ### Changed
220
+
221
+ - **Gemspec: exclude `conf/design/**`** — design documents carry internal WP
222
+ references and session identifiers. They are not runtime-required and are no
223
+ longer shipped in the gem. Only `conf/schemas/`, `conf/targets/`, `conf/mcp/`,
224
+ `conf/packaging/`, `conf/tooling/`, `conf/compliance/`, `conf/policy/`,
225
+ `conf/review/`, and `conf/adopt_redactions.yml` remain in the gem allowlist.
226
+
227
+ - **Anchor `.gitignore` patterns** — `doc/claude-sessions/` and `doc/context/memory/`
228
+ patterns now use a leading `/` to match only root-level directories, as required
229
+ by `sec_012`.
230
+
231
+ ### Fixed
232
+
233
+ - **SPDX header on `.mdl_style.rb`** — the markdownlint style file was the sole
234
+ `.rb` file missing an SPDX header. Added `GPL-3.0-only` header to complete
235
+ full coverage.
236
+
237
+ ## [1.5.2] - 2026-07-02
238
+
239
+ ### Fixed
240
+
241
+ - **SimpleCov atomic write** — add `AtomicSimpleCov.install!` to
242
+ `spec/spec_helper.rb` and introduce `spec/support/atomic_simple_cov.rb`.
243
+ Prevents `refuse_coverage_drop` false positives caused by SimpleCov
244
+ persisting `.last_run.json` after partial/failed RSpec runs. Write is now
245
+ gated on a complete-green suite (`after(:suite)` hook) and performed
246
+ atomically via temp-file + `File.rename`. Harmonized from openproject-mcp across the full NeatNerds Ruby stack.
247
+
248
+ ## [1.5.1] - 2026-06-16
249
+
250
+ ### Fixed
251
+
252
+ - **CI: bump `deb-push-aptly` component to `@v2.6.0`** — the previous pin
253
+ (`@v2.2.0`) hardcoded `filesystem:neatnerds:` in the `aptly publish update`
254
+ invocation, mismatching the puppet-configured `filesystem:public:` endpoint
255
+ on `deb.neatnerds.be`. Every tag pipeline since v2.2.0 would have failed at
256
+ the publish step (none had reached it before — the smoke surfaced
257
+ this on rosett-ai v1.5.0). Bumped to `@v2.6.0`, which introduces a required `publish_endpoint`
258
+ input and replaces the hardcoded literal with that splat. Set `publish_endpoint:
259
+ 'filesystem:public:'` in this consumer to match the host's aptly config.
260
+ CI-only change; no runtime behavior shift in the gem.
261
+
262
+ ## [1.5.0] - 2026-06-12
263
+
264
+ ### Fixed
265
+
266
+ - **postinst engine gem extraction** — `postinst` now runs
267
+ `gem install --local` for any `rosett-ai-engine-*.gem` files found in the
268
+ embedded gem cache after a package install or upgrade. Previously, engine
269
+ `.gem` archives were present in `cache/` but the extracted `gems/<name>-<ver>/`
270
+ directory was absent, causing `raictl config compile` to fail with
271
+ "Engine 'claude' not found. No engine plugins installed."
272
+
273
+ ### Added
274
+
275
+ - **Systemd restart-throttle drop-in** — ships
276
+ `rosett-ai-mcp.service.d/throttle.conf` in the `.deb`, installed to
277
+ `/etc/systemd/system/rosett-ai-mcp.service.d/`. Sets `RestartSec=300`,
278
+ `StartLimitBurst=5`, `StartLimitIntervalSec=300` to prevent restart storms
279
+ (~9/min → ≤1/5min) during sustained MCP server crash loops. Mitigation for
280
+ the P0 issue tracked in ; see `doc/operations/systemd-throttle.md`
281
+ for rationale and rollback procedure
282
+
283
+ - **RubyGems publication pipeline** — `rake release:gem` build task with
284
+ sec_001 positive allowlist audit and sec_011 size monitoring; `build:gem`
285
+ and `publish:gem` CI jobs (manual trigger on tag) for rubygems.org
286
+ publication
287
+
288
+ - **Retrospective skip-to-rememberancer** — `behaviour-session_retrospective` rule_008
289
+ codifies the 60-second auto-skip default for `/retrospective` improvement proposals;
290
+ the skill body now routes proposals to `rememberancer/incoming-proposals/` without
291
+ blocking on user input. Autonomous sessions proceed immediately; interactive sessions
292
+ get a 60s override window
293
+
294
+ - **Merge-safe `raictl config compile`** — compiling now MERGES with the existing
295
+ target settings file by default, preserving entries not covered by any source YAML
296
+ scope and emitting a warning per preserved entry suggesting `raictl backfill-user-yml`.
297
+ Use `--strict` to restore the previous replace-all behaviour. Prevents accidental
298
+ destruction of manually-managed allow/deny/env entries during incremental adoption
299
+
300
+ - **`raictl backfill-user-yml` subcommand** — reads `~/.claude/settings.json` and
301
+ compares it to the engine's `user.yml` source file. Shows a diff of uncovered entries,
302
+ prompts for confirmation, and writes the merged YAML idempotently. Standalone
303
+ `scripts/backfill_user_yml.rb` also available for scripted use with `--yes`.
304
+ Supports `--target PATH` to specify a non-default user.yml
305
+
306
+ ## [1.4.1] - 2026-06-10
307
+
308
+ ### Fixed
309
+
310
+ #### fix(ci): Disable branch coverage to eliminate SimpleCov pathology
311
+
312
+ Applies the substrate fix proven on varuna (MR !165 / 8ea7674fc).
313
+ Disables SimpleCov branch coverage tracking; line coverage preserved.
314
+ CI post-test phase should drop substantially.
315
+
316
+ - `enable_coverage :line` (was `:branch`)
317
+ - `minimum_coverage` / `minimum_coverage_by_file`: drop `branch:` kwarg
318
+
319
+ Reference + varuna MR !165 for measurement.
320
+
321
+ ## [1.4.0] - 2026-06-07
322
+
323
+ ### Added
324
+
325
+ - **`SessionHooks::Installer`** — idempotent installer that wires a Ruby script
326
+ into Claude Code `settings.json` under both `SessionStart` and `PostToolUse`
327
+ hook sections. Reads existing settings, injects a new hook block if not already
328
+ present, and atomically writes the result via a tmp→rename strategy. A second
329
+ `install` call is a no-op; `installed?` reports whether both hook types are
330
+ wired. Raises `SessionHooksError` on JSON parse or filesystem errors.
331
+
332
+ ## [1.3.4] - 2026-04-24
333
+
334
+ ### Fixed
335
+
336
+ - **Compile double-load** — project-scope compile no longer loads rules
337
+ twice when both global and project behaviours exist
338
+ - **MCP tool specs** — specs are now self-contained with inline fixtures,
339
+ removing dependency on user-local configuration files in CI
340
+
341
+ ### Changed
342
+
343
+ - **Gemspec positive allowlist** — replaced `git ls-files` denylist with
344
+ explicit allowlist of runtime-necessary paths (lib/, bin/, conf/, dist/,
345
+ share/, locales/). Gem file count reduced from 525 to ~398, eliminating
346
+ dev configs, doc/, packaging/, and dotfiles from the published gem
347
+ - **CI component adoption** — migrated to shared CI/CD templates from
348
+ ci-components (lint, test, build, security stages)
349
+ - **.deb package size** — excluded 43 MB of dev-only files (doc/, spec/,
350
+ .yardoc/) from Debian package build
351
+
352
+ ### Added
353
+
354
+ - **YARD coverage** — pushed API documentation coverage from 67% to 99.89%
355
+ across 222 source files
356
+ - **SPDX header check** — CI now excludes `.gitkeep` files from SPDX
357
+ license header validation
358
+ - **Systemd service unit** — `dist/rosett-ai-mcp.service` for running the
359
+ MCP server as a systemd user service
360
+
9
361
  ## [1.3.3] - 2026-04-19
10
362
 
11
363
  ### Fixed
@@ -13,21 +365,30 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
13
365
  - **MCP tool response type** — `Governance.register_tool` returned
14
366
  `JSON.generate(result)` (String) but MCP gem v0.9.2 calls `.to_h` on the
15
367
  return value (`server.rb:520`). Now returns `MCP::Tool::Response` with
16
- content type `text`. v1.3.2 yanked from RubyGems (WP#1627)
368
+ content type `text`. v1.3.2 yanked from RubyGems
17
369
 
18
370
  ## [1.3.2] - 2026-04-19 [YANKED]
19
371
 
372
+ ### Yanked
373
+
374
+ - Yanked from RubyGems on 2026-04-19 (primary reason: MCP dispatch bug, see
375
+ Fixed below — superseded by v1.3.3). The same gem also shipped
376
+ `doc/reference/` content embedding author PII (name, email, internal
377
+ GitLab URL) in PDF metadata and rendered title page; that secondary leak
378
+ is fixed forward in v1.3.4 which excludes `doc/reference/` from the gem
379
+ build via the positive-allowlist gemspec.
380
+
20
381
  ### Fixed
21
382
 
22
383
  - **MCP dispatch bug** — all 33 MCP tools were broken due to argument-passing
23
384
  mismatch in `governance.rb`. Block parameter `do |args|` (positional) changed
24
385
  to `do |**args|` (keyword splat) to match MCP gem v0.9.2 dispatch convention.
25
386
  Second bug: bare `build_kwargs` call changed to `Governance.build_kwargs`
26
- because `define_singleton_method` rebinds `self` (WP#1627)
387
+ because `define_singleton_method` rebinds `self`
27
388
  - **Empty tool schemas** — all 27 parameterised tools now declare `INPUT_SCHEMA`
28
389
  with proper JSON Schema definitions (types, descriptions, enum constraints,
29
390
  required flags). AI clients receive parameter guidance instead of empty
30
- `{"type": "object"}` (WP#1627)
391
+ `{"type": "object"}`
31
392
 
32
393
  ### Added
33
394
 
@@ -36,13 +397,22 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
36
397
  - **MCP integration tests** — 114 integration tests covering dispatch, schema
37
398
  presence, and schema-method parity for all 33 registered tools
38
399
 
39
- ## [1.3.1] - 2026-04-18
400
+ ## [1.3.1] - 2026-04-18 [YANKED]
401
+
402
+ ### Yanked
403
+
404
+ - Yanked from RubyGems on 2026-05-02. The published gem included
405
+ `doc/reference/` content (PDF + LaTeX source) that embedded author
406
+ contact info (name, email) and an internal GitLab URL in PDF metadata
407
+ and the rendered title page. No credentials, tokens, or session paths
408
+ were leaked. Fixed forward in v1.3.4, which excludes `doc/reference/`
409
+ from the gem build via the positive-allowlist gemspec.
40
410
 
41
411
  ### Fixed
42
412
 
43
413
  - **Backup XDG path** — `raictl backup create --global` no longer writes to
44
414
  read-only `/opt/rosett-ai/app/`. Default destination is now
45
- `~/.config/rosett-ai/backups/` (XDG-compliant) (WP#1580)
415
+ `~/.config/rosett-ai/backups/` (XDG-compliant)
46
416
  - **MCP registrar path** — `resolve_command` now checks `/usr/local/bin/raictl`
47
417
  first (where .deb installs the wrapper), then `/usr/bin/raictl`, then
48
418
  falls back to `which raictl` for absolute path discovery
@@ -60,17 +430,25 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
60
430
  - **Session transcript removal** — stripped 125MB of Claude session transcripts
61
431
  (`doc/claude-sessions/`) and context memory files (`doc/context/memory/`)
62
432
  from git history using `git filter-repo`. Updated `.gitignore` and hardened
63
- gemspec reject block to prevent future leaks (WP#1581)
433
+ gemspec reject block to prevent future leaks
64
434
  - **Gem yank** — yanked `rosett-ai v1.2.0` from RubyGems (contained 122
65
435
  session transcript files)
66
436
 
67
- ## [1.3.0] - 2026-04-18
437
+ ## [1.3.0] - 2026-04-18 [YANKED]
438
+
439
+ ### Yanked
440
+
441
+ - Yanked from RubyGems on 2026-05-02. Same root cause as v1.3.1 —
442
+ the published gem included `doc/reference/` content (PDF + LaTeX
443
+ source) that embedded author PII and an internal GitLab URL in
444
+ PDF metadata and the rendered title page. No credentials, tokens,
445
+ or session paths were leaked. Fixed forward in v1.3.4.
68
446
 
69
447
  ### Added
70
448
 
71
449
  - **MCP server (rai-mcp)** — Model Context Protocol server with 33 tools,
72
450
  8 resources, 4 prompts, and instructions field. Start with
73
- `raictl mcp serve` (WP#1557)
451
+ `raictl mcp serve`
74
452
  - **MCP tool categories** — Behaviour management (list, show, display,
75
453
  manage), design documents (list, show), compilation (compile,
76
454
  compile_status), validation, configuration (config_status,
@@ -92,7 +470,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
92
470
  enforcement blocks in behaviour rules with pattern safety checks
93
471
  (no path traversal, no shell metacharacters, bounded globs).
94
472
  `HookGenerator` generates overcommit hook scripts from enforcement
95
- definitions (WP#1559)
473
+ definitions
96
474
  - **Schema v1.3.0** — Behaviour schema updated with optional
97
475
  `enforcement` block supporting file_patterns, commands, and
98
476
  hook_phase definitions
@@ -110,16 +488,14 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
110
488
 
111
489
  - **Integration test: scope isolation** — Verifies project-scope compile
112
490
  writes to `<project>/.claude/rules/` and does not modify global rules
113
- (WP#1490)
114
491
  - **Integration test: BehaviourCompiler production mode** — Verifies
115
492
  BehaviourCompiler works without engine gems or stub registrations
116
- (WP#1491)
117
493
  - **Integration test: end-to-end compile** — Full pipeline test from YAML
118
494
  source to compiled output for each builtin engine (claude, agents_md),
119
- including scope isolation (WP#1492)
495
+ including scope isolation
120
496
  - **Integration test: engine registration** — Verifies builtin backends
121
497
  resolve via `Backend.for()` without plugin registry, and that unknown
122
- engines raise `CompileError` (WP#1492)
498
+ engines raise `CompileError`
123
499
 
124
500
  ### Fixed
125
501
 
@@ -127,18 +503,18 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
127
503
  always returned `~/.claude/rules/` regardless of compile scope. Split
128
504
  into `resolve_target_dir` (explicit output_dir) and `default_target_dir`
129
505
  (scope-based routing). Project scope now writes to
130
- `<project_root>/.claude/rules/` (WP#1490)
506
+ `<project_root>/.claude/rules/`
131
507
  - **BehaviourCompiler failed without engine gem** — `BehaviourCompiler`
132
508
  queried the plugin registry directly for the claude engine, which fails
133
509
  when no engine gem is installed. Now uses `Backend.for('claude')` which
134
510
  checks `BUILTIN_BACKENDS` first, matching the Thor compile task
135
- resolution path (WP#1491)
511
+ resolution path
136
512
 
137
513
  ## [1.1.0] - 2026-04-01
138
514
 
139
515
  ### Added
140
516
 
141
- - **Doctor check: stale ~/.rosett-ai/ directory** — New `stale_home_nncc` diagnostic warns when `.rosett-ai/` exists at `$HOME` level, which causes scope resolution confusion by shadowing XDG-path behaviour files (WP#1123)
517
+ - **Doctor check: stale ~/.rosett-ai/ directory** — New `stale_home_nncc` diagnostic warns when `.rosett-ai/` exists at `$HOME` level, which causes scope resolution confusion by shadowing XDG-path behaviour files
142
518
  - **Commit hook behaviour** — OpenProject work package integration via branch naming conventions (`<type>/<id>-<subject>`) and overcommit CommitMsg hook for automatic `OP#<id>` injection
143
519
  - **XDG auto-migration** — Automatic migration of behaviour files from legacy `~/.claude/conf/` to XDG-compliant `~/.config/rosett-ai/conf/` path
144
520
  - **Duplicate rule ID detection** — Compiler now warns when rule IDs collide across behaviour files
@@ -178,12 +554,12 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
178
554
 
179
555
  - **Duplicate rule ID warnings scoped per-file** — Compiler now only
180
556
  warns about duplicate rule IDs within a single behaviour file, not
181
- across files. Rule IDs are scoped by behaviour name (WP#1130)
557
+ across files. Rule IDs are scoped by behaviour name
182
558
  - **Removed dead compiler cache code** — `RosettAi::Cache::CompilerCache`
183
559
  and `RosettAi::Cache::Manifest` were implemented but never wired into
184
560
  the compilation pipeline. Removed until cache is properly
185
- integrated (WP#768)
186
- - **Pre-push hook segfault on GTK4 specs** — Switched pre-push RSpec from full suite to core-only (`RspecCore`) hook that excludes desktop/dbus specs matching CI's `--exclude-pattern`, preventing Ruby segfault in gobject-introspection gem (WP#1122)
561
+ integrated
562
+ - **Pre-push hook segfault on GTK4 specs** — Switched pre-push RSpec from full suite to core-only (`RspecCore`) hook that excludes desktop/dbus specs matching CI's `--exclude-pattern`, preventing Ruby segfault in gobject-introspection gem
187
563
  - **Wrapper breaks project context (RC1)** — `.deb` wrapper `cd /opt/rosett-ai/app` made `ProjectContext` resolve to the rosett-ai internal tree instead of the user's project. Now preserves `RAI_ORIGINAL_PWD` before `cd`
188
564
  - **Engine discovery fails on ABI mismatch (RC2)** — Embedded Ruby 3.3.0 could not find engine gems installed under 3.3.10 `GEM_PATH`. Added version-agnostic fallback scan of `/opt/rosett-ai/embedded/lib/ruby/gems/*/`
189
565
  - **Target profiles not found after extraction (RC3)** — `TargetProfile.load` now checks the plugin registry first (engine's `target_profile_path`) before falling back to file-based lookup
@@ -201,10 +577,10 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
201
577
 
202
578
  ### Fixed
203
579
 
204
- - **38 audit bugs** — Comprehensive audit campaign fixing remote contamination, XDG migration, worktree issues, and CI divergence (Epic WP#726)
580
+ - **38 audit bugs** — Comprehensive audit campaign fixing remote contamination, XDG migration, worktree issues, and CI divergence (Epic )
205
581
  - **CVE-2026-33946** — Updated mcp gem to patched version
206
- - **Compile scope coexistence** — Global and project behaviours now merge correctly in project scope (Issue 005, WP#711/712)
207
- - **Global scope source resolution** — Compile task now uses XDG-compliant path for global behaviour source (WP#943)
582
+ - **Compile scope coexistence** — Global and project behaviours now merge correctly in project scope (Issue 005, /712)
583
+ - **Global scope source resolution** — Compile task now uses XDG-compliant path for global behaviour source
208
584
 
209
585
  ### Changed
210
586