rosett-ai 1.3.3 → 1.5.10

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