rosett-ai 1.3.3

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 (527) hide show
  1. checksums.yaml +7 -0
  2. data/.ai-provenance.yml +119 -0
  3. data/.debride_whitelist +186 -0
  4. data/.fasterer.yml +29 -0
  5. data/.mdl_style.rb +10 -0
  6. data/.mdlrc +3 -0
  7. data/.mutant.yml +49 -0
  8. data/.namespace-allowlist +42 -0
  9. data/.reek.yml +1040 -0
  10. data/.rosett-ai/config.yml +3 -0
  11. data/.rspec +5 -0
  12. data/.rubocop.yml +380 -0
  13. data/.ruby-version +1 -0
  14. data/.yamllint +51 -0
  15. data/.yardopts +12 -0
  16. data/AI-DISCLOSURE.md +48 -0
  17. data/CHANGELOG.md +519 -0
  18. data/CLAUDE.md +141 -0
  19. data/CONTRIBUTING.md +734 -0
  20. data/INSTALL.md +154 -0
  21. data/LICENSE +674 -0
  22. data/LICENSE.md +675 -0
  23. data/QUICKSTART.md +73 -0
  24. data/README.md +366 -0
  25. data/Rakefile +200 -0
  26. data/SECURITY.md +114 -0
  27. data/bin/rai +1 -0
  28. data/cliff.toml +52 -0
  29. data/conf/adopt_redactions.yml +8 -0
  30. data/conf/behaviour/.gitkeep +0 -0
  31. data/conf/compliance/cra_rules.yml +25 -0
  32. data/conf/compliance/license_rules.yml +20 -0
  33. data/conf/design/aaif_alignment.yml +181 -0
  34. data/conf/design/ab_testing.yml +172 -0
  35. data/conf/design/accessibility.yml +84 -0
  36. data/conf/design/ai_authorship.yml +210 -0
  37. data/conf/design/ai_provenance.yml +224 -0
  38. data/conf/design/ai_tool_configuration.yml +207 -0
  39. data/conf/design/architecture.yml +139 -0
  40. data/conf/design/autocompletion.yml +115 -0
  41. data/conf/design/backward_compatibility.yml +112 -0
  42. data/conf/design/behaviour_composition.yml +246 -0
  43. data/conf/design/build_rake_extraction.yml +57 -0
  44. data/conf/design/ci_pipeline.yml +100 -0
  45. data/conf/design/claude_code_configuration.yml +157 -0
  46. data/conf/design/compiler.yml +128 -0
  47. data/conf/design/comply.yml +153 -0
  48. data/conf/design/content_packs.yml +84 -0
  49. data/conf/design/desktop_integration.yml +289 -0
  50. data/conf/design/distribution.yml +216 -0
  51. data/conf/design/doctor.yml +184 -0
  52. data/conf/design/documentation.yml +152 -0
  53. data/conf/design/engine_architecture.yml +257 -0
  54. data/conf/design/error_handling.yml +103 -0
  55. data/conf/design/feature_flags.yml +142 -0
  56. data/conf/design/git_hooks.yml +165 -0
  57. data/conf/design/gui_plugins.yml +475 -0
  58. data/conf/design/i18n.yml +84 -0
  59. data/conf/design/integration_testing.yml +56 -0
  60. data/conf/design/licensing_system.yml +88 -0
  61. data/conf/design/lifecycle_management.yml +208 -0
  62. data/conf/design/mcp_integration.yml +207 -0
  63. data/conf/design/mcp_settings.yml +126 -0
  64. data/conf/design/migration.yml +56 -0
  65. data/conf/design/monitoring_observability.yml +194 -0
  66. data/conf/design/namespace_cleanup.yml +145 -0
  67. data/conf/design/plugin_test_segregation.yml +145 -0
  68. data/conf/design/policy_management.yml +229 -0
  69. data/conf/design/project_management.yml +183 -0
  70. data/conf/design/rai_mcp_asset_discovery.yml +164 -0
  71. data/conf/design/rai_mcp_server.yml +605 -0
  72. data/conf/design/release_management.yml +117 -0
  73. data/conf/design/retrofit.yml +199 -0
  74. data/conf/design/retrospective_analyzer.yml +79 -0
  75. data/conf/design/scope_hierarchy.yml +352 -0
  76. data/conf/design/security.yml +115 -0
  77. data/conf/design/session_retrospective.yml +85 -0
  78. data/conf/design/smart_ui_feedback.yml +89 -0
  79. data/conf/design/structured_logging.yml +148 -0
  80. data/conf/design/styles.yml +123 -0
  81. data/conf/design/test_peer_review.yml +89 -0
  82. data/conf/design/testing.yml +136 -0
  83. data/conf/design/threat_model.yml +108 -0
  84. data/conf/design/ui_framework.yml +111 -0
  85. data/conf/design/usage_optimization.yml +122 -0
  86. data/conf/design/version_management.yml +60 -0
  87. data/conf/design/workflow.yml +227 -0
  88. data/conf/mcp/server_defaults.yml +42 -0
  89. data/conf/mcp/trust.yml +21 -0
  90. data/conf/packaging/core.yml +12 -0
  91. data/conf/packaging/gtk4.yml +11 -0
  92. data/conf/packaging/qt6.yml +11 -0
  93. data/conf/policy/default_deny_list.yml +197 -0
  94. data/conf/review/cli-command-audit.yml +857 -0
  95. data/conf/review/design-docs.yml +1064 -0
  96. data/conf/review/design-questionnaire.yml +153 -0
  97. data/conf/review/questionnaire.yml +146 -0
  98. data/conf/review/rosett-ai-core.yml +2919 -0
  99. data/conf/schemas/ai_config_schema.json +73 -0
  100. data/conf/schemas/behaviour_schema.json +132 -0
  101. data/conf/schemas/compliance_rule_schema.json +63 -0
  102. data/conf/schemas/content_pack_manifest_schema.json +51 -0
  103. data/conf/schemas/design_schema.json +210 -0
  104. data/conf/schemas/engine_manifest_schema.json +144 -0
  105. data/conf/schemas/lockfile_schema.json +74 -0
  106. data/conf/schemas/mcp_server_schema.json +48 -0
  107. data/conf/schemas/packaging_schema.json +70 -0
  108. data/conf/schemas/policy_schema.json +85 -0
  109. data/conf/schemas/provenance_schema.json +84 -0
  110. data/conf/schemas/rai_config_schema.json +56 -0
  111. data/conf/schemas/rai_project_schema.json +20 -0
  112. data/conf/schemas/scope_hierarchy_schema.json +49 -0
  113. data/conf/schemas/target_schema.json +67 -0
  114. data/conf/schemas/tooling_schema.json +65 -0
  115. data/conf/schemas/workflow_schema.json +112 -0
  116. data/conf/targets/agents_md.yml +17 -0
  117. data/conf/targets/claude.yml +12 -0
  118. data/conf/tooling/tools.yml +58 -0
  119. data/dist/rosett-ai-mcp.service +48 -0
  120. data/dist/rosett-ai-mcp.yml.default +45 -0
  121. data/doc/AAIF_POSITIONING.md +58 -0
  122. data/doc/ADOPT.md +224 -0
  123. data/doc/AI_PROVENANCE.md +139 -0
  124. data/doc/ARCHITECTURE.md +920 -0
  125. data/doc/BEHAVIOUR.md +409 -0
  126. data/doc/BUILD.md +138 -0
  127. data/doc/CI_CD_RECIPES.md +171 -0
  128. data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
  129. data/doc/COMMAND_ANALYSIS.md +229 -0
  130. data/doc/CONFIGURATION.md +281 -0
  131. data/doc/DESIGN_AUDIT.md +235 -0
  132. data/doc/DESIGN_PEER_REVIEW.md +771 -0
  133. data/doc/DESKTOP.md +447 -0
  134. data/doc/ENGINES.md +567 -0
  135. data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
  136. data/doc/FEATURE_AUDIT.md +218 -0
  137. data/doc/IMPLEMENTATION_PLAN.md +669 -0
  138. data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
  139. data/doc/MIGRATION_GUIDE.md +88 -0
  140. data/doc/PACKAGING.md +232 -0
  141. data/doc/PROJECT_DASHBOARD.md +153 -0
  142. data/doc/PULP_DEPLOYMENT.md +164 -0
  143. data/doc/QUALITY_FIX_SUMMARY.md +110 -0
  144. data/doc/QUICK_START.md +162 -0
  145. data/doc/REEK_CONFIGURATION.md +166 -0
  146. data/doc/REFERENCE.md +253 -0
  147. data/doc/REFERENCES.md +324 -0
  148. data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
  149. data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
  150. data/doc/SETUP.md +202 -0
  151. data/doc/TEST_PEER_REVIEW.md +152 -0
  152. data/doc/THREAT_MODEL.md +230 -0
  153. data/doc/USAGE.md +545 -0
  154. data/doc/USER_MANUAL.md +585 -0
  155. data/doc/ai_test_review_checklist.md +110 -0
  156. data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
  157. data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
  158. data/doc/changes/2026-02-20-security-implementation.md +281 -0
  159. data/doc/changes/2026-02-20-styles-implementation.md +220 -0
  160. data/doc/changes/2026-02-21-architecture-completion.md +95 -0
  161. data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
  162. data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
  163. data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
  164. data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
  165. data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
  166. data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
  167. data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
  168. data/doc/changes/2026-02-21-path-resolver.md +128 -0
  169. data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
  170. data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
  171. data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
  172. data/doc/context/SESSION-HANDOFF.md +69 -0
  173. data/doc/context/ai-engine-usage-trends-2026.md +80 -0
  174. data/doc/context/plan-pluggable-engines.md +590 -0
  175. data/doc/decisions/001-flog-deferred.md +32 -0
  176. data/doc/decisions/002-path-resolution-strategy.md +158 -0
  177. data/doc/decisions/003-ui-adapter-selection.md +193 -0
  178. data/doc/decisions/004-design-document-validation.md +179 -0
  179. data/doc/decisions/005-package-splitting-strategy.md +200 -0
  180. data/doc/decisions/006-multi-engine-architecture.md +147 -0
  181. data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
  182. data/doc/decisions/008-ci-bundler-strategy.md +129 -0
  183. data/doc/decisions/009-core-only-v1-release.md +60 -0
  184. data/doc/decisions/010-engine-debian-packaging.md +66 -0
  185. data/doc/decisions/011-context-aware-cli.md +71 -0
  186. data/doc/dependency_decisions.yml +247 -0
  187. data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
  188. data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
  189. data/doc/issues/003-smoke-test-false-positive.md +127 -0
  190. data/doc/issues/004-market-research-design-updates.md +109 -0
  191. data/doc/issues/005-compile-scope-coexistence.md +161 -0
  192. data/doc/locales/.gitkeep +0 -0
  193. data/doc/man/rai.1.ronn +505 -0
  194. data/doc/operations/packaging.md +133 -0
  195. data/doc/operations/rosett-ai-release.md +65 -0
  196. data/doc/reference/error-catalog.md +107 -0
  197. data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
  198. data/doc/reference/src/Pictures/cover.jpg +0 -0
  199. data/doc/reference/src/Pictures/head1.jpg +0 -0
  200. data/doc/reference/src/Pictures/head2.jpg +0 -0
  201. data/doc/reference/src/Pictures/head3.jpg +0 -0
  202. data/doc/reference/src/Pictures/head4.jpg +0 -0
  203. data/doc/reference/src/Pictures/head5.jpg +0 -0
  204. data/doc/reference/src/Pictures/head6.jpg +0 -0
  205. data/doc/reference/src/Pictures/head7.jpg +0 -0
  206. data/doc/reference/src/Pictures/head8.jpg +0 -0
  207. data/doc/reference/src/StyleInd.ist +4 -0
  208. data/doc/reference/src/bibliography.bib +79 -0
  209. data/doc/reference/src/main.tex +1288 -0
  210. data/doc/reference/src/structure.tex +303 -0
  211. data/doc/rosett-ai-bookmarks.html +301 -0
  212. data/kitchen.yml +46 -0
  213. data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
  214. data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
  215. data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
  216. data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
  217. data/lib/rosett_ai/ai_config/context_window.rb +55 -0
  218. data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
  219. data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
  220. data/lib/rosett_ai/ai_config/model_router.rb +121 -0
  221. data/lib/rosett_ai/ai_config/validator.rb +45 -0
  222. data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
  223. data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
  224. data/lib/rosett_ai/authorship/review_validator.rb +39 -0
  225. data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
  226. data/lib/rosett_ai/backup/compressor.rb +180 -0
  227. data/lib/rosett_ai/backup/destination.rb +91 -0
  228. data/lib/rosett_ai/behaviour/manager.rb +156 -0
  229. data/lib/rosett_ai/compiler/backend.rb +86 -0
  230. data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
  231. data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
  232. data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
  233. data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
  234. data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
  235. data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
  236. data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
  237. data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
  238. data/lib/rosett_ai/compiler/target_profile.rb +112 -0
  239. data/lib/rosett_ai/completion/generator.rb +101 -0
  240. data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
  241. data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
  242. data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
  243. data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
  244. data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
  245. data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
  246. data/lib/rosett_ai/comply/reporter.rb +113 -0
  247. data/lib/rosett_ai/comply/runner.rb +50 -0
  248. data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
  249. data/lib/rosett_ai/composition/composer.rb +158 -0
  250. data/lib/rosett_ai/composition/composition_result.rb +64 -0
  251. data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
  252. data/lib/rosett_ai/composition/lockfile.rb +103 -0
  253. data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
  254. data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
  255. data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
  256. data/lib/rosett_ai/config/compile_result.rb +37 -0
  257. data/lib/rosett_ai/config/compiler.rb +13 -0
  258. data/lib/rosett_ai/config/domain_transformer.rb +13 -0
  259. data/lib/rosett_ai/config/key_map.rb +13 -0
  260. data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
  261. data/lib/rosett_ai/config/scope_router.rb +13 -0
  262. data/lib/rosett_ai/config/secret_resolver.rb +125 -0
  263. data/lib/rosett_ai/configuration.rb +119 -0
  264. data/lib/rosett_ai/content/content_client.rb +60 -0
  265. data/lib/rosett_ai/content/pack_installer.rb +117 -0
  266. data/lib/rosett_ai/content/pack_manifest.rb +50 -0
  267. data/lib/rosett_ai/content/pack_registry.rb +68 -0
  268. data/lib/rosett_ai/content_packs/manager.rb +50 -0
  269. data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
  270. data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
  271. data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
  272. data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
  273. data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
  274. data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
  275. data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
  276. data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
  277. data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
  278. data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
  279. data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
  280. data/lib/rosett_ai/dbus/service.rb +121 -0
  281. data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
  282. data/lib/rosett_ai/deprecation.rb +79 -0
  283. data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
  284. data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
  285. data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
  286. data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
  287. data/lib/rosett_ai/doctor/check.rb +92 -0
  288. data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
  289. data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
  290. data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
  291. data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
  292. data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
  293. data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
  294. data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
  295. data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
  296. data/lib/rosett_ai/doctor.rb +81 -0
  297. data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
  298. data/lib/rosett_ai/documentation/translator.rb +62 -0
  299. data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
  300. data/lib/rosett_ai/engines/detector.rb +63 -0
  301. data/lib/rosett_ai/engines/registry.rb +50 -0
  302. data/lib/rosett_ai/error_handler.rb +139 -0
  303. data/lib/rosett_ai/exit_codes.rb +76 -0
  304. data/lib/rosett_ai/feature_flags.rb +102 -0
  305. data/lib/rosett_ai/formatting.rb +33 -0
  306. data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
  307. data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
  308. data/lib/rosett_ai/git_hooks/installer.rb +175 -0
  309. data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
  310. data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
  311. data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
  312. data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
  313. data/lib/rosett_ai/init/config_file_writer.rb +24 -0
  314. data/lib/rosett_ai/init/directory_builder.rb +38 -0
  315. data/lib/rosett_ai/init/file_copier.rb +95 -0
  316. data/lib/rosett_ai/init/global_initializer.rb +28 -0
  317. data/lib/rosett_ai/init/local_initializer.rb +27 -0
  318. data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
  319. data/lib/rosett_ai/init/project_initializer.rb +38 -0
  320. data/lib/rosett_ai/licensing/license_key.rb +139 -0
  321. data/lib/rosett_ai/licensing/license_store.rb +64 -0
  322. data/lib/rosett_ai/licensing/license_validator.rb +60 -0
  323. data/lib/rosett_ai/licensing/tier.rb +42 -0
  324. data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
  325. data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
  326. data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
  327. data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
  328. data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
  329. data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
  330. data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
  331. data/lib/rosett_ai/mcp/governance.rb +160 -0
  332. data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
  333. data/lib/rosett_ai/mcp/instructions.rb +266 -0
  334. data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
  335. data/lib/rosett_ai/mcp/keyfile.rb +221 -0
  336. data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
  337. data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
  338. data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
  339. data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
  340. data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
  341. data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
  342. data/lib/rosett_ai/mcp/plugins.rb +143 -0
  343. data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
  344. data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
  345. data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
  346. data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
  347. data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
  348. data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
  349. data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
  350. data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
  351. data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
  352. data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
  353. data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
  354. data/lib/rosett_ai/mcp/response_helper.rb +46 -0
  355. data/lib/rosett_ai/mcp/security_logger.rb +60 -0
  356. data/lib/rosett_ai/mcp/server.rb +212 -0
  357. data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
  358. data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
  359. data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
  360. data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
  361. data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
  362. data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
  363. data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
  364. data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
  365. data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
  366. data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
  367. data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
  368. data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
  369. data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
  370. data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
  371. data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
  372. data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
  373. data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
  374. data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
  375. data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
  376. data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
  377. data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
  378. data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
  379. data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
  380. data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
  381. data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
  382. data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
  383. data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
  384. data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
  385. data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
  386. data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
  387. data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
  388. data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
  389. data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
  390. data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
  391. data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
  392. data/lib/rosett_ai/migration/detector.rb +117 -0
  393. data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
  394. data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
  395. data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
  396. data/lib/rosett_ai/package_manager/apt.rb +108 -0
  397. data/lib/rosett_ai/package_manager/base.rb +68 -0
  398. data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
  399. data/lib/rosett_ai/packaging/variant_config.rb +92 -0
  400. data/lib/rosett_ai/path_resolver.rb +115 -0
  401. data/lib/rosett_ai/plugins/contract.rb +43 -0
  402. data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
  403. data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
  404. data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
  405. data/lib/rosett_ai/plugins/registry.rb +150 -0
  406. data/lib/rosett_ai/policy/auditor.rb +41 -0
  407. data/lib/rosett_ai/policy/deny_list.rb +71 -0
  408. data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
  409. data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
  410. data/lib/rosett_ai/policy/protected_files.rb +47 -0
  411. data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
  412. data/lib/rosett_ai/policy/validator.rb +35 -0
  413. data/lib/rosett_ai/profiler.rb +79 -0
  414. data/lib/rosett_ai/project/drift_detector.rb +126 -0
  415. data/lib/rosett_ai/project/manager.rb +115 -0
  416. data/lib/rosett_ai/project/sync_manager.rb +138 -0
  417. data/lib/rosett_ai/project/template_applier.rb +105 -0
  418. data/lib/rosett_ai/project_context.rb +82 -0
  419. data/lib/rosett_ai/provenance/entry.rb +63 -0
  420. data/lib/rosett_ai/provenance/file_source.rb +32 -0
  421. data/lib/rosett_ai/provenance/source.rb +62 -0
  422. data/lib/rosett_ai/provenance/store.rb +153 -0
  423. data/lib/rosett_ai/provenance/tracker.rb +62 -0
  424. data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
  425. data/lib/rosett_ai/provenance/validator.rb +45 -0
  426. data/lib/rosett_ai/quorum/collector.rb +59 -0
  427. data/lib/rosett_ai/quorum/comparator.rb +81 -0
  428. data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
  429. data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
  430. data/lib/rosett_ai/rai_config.rb +107 -0
  431. data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
  432. data/lib/rosett_ai/retrofit/engine.rb +171 -0
  433. data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
  434. data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
  435. data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
  436. data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
  437. data/lib/rosett_ai/retrofit/scanner.rb +47 -0
  438. data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
  439. data/lib/rosett_ai/secrets_resolver.rb +71 -0
  440. data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
  441. data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
  442. data/lib/rosett_ai/structured_logger.rb +110 -0
  443. data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
  444. data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
  445. data/lib/rosett_ai/telemetry/provider.rb +26 -0
  446. data/lib/rosett_ai/telemetry/reporter.rb +144 -0
  447. data/lib/rosett_ai/telemetry.rb +47 -0
  448. data/lib/rosett_ai/text_sanitizer.rb +62 -0
  449. data/lib/rosett_ai/thor/cli.rb +269 -0
  450. data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
  451. data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
  452. data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
  453. data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
  454. data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
  455. data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
  456. data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
  457. data/lib/rosett_ai/thor/tasks/config.rb +265 -0
  458. data/lib/rosett_ai/thor/tasks/content.rb +193 -0
  459. data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
  460. data/lib/rosett_ai/thor/tasks/design.rb +258 -0
  461. data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
  462. data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
  463. data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
  464. data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
  465. data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
  466. data/lib/rosett_ai/thor/tasks/init.rb +259 -0
  467. data/lib/rosett_ai/thor/tasks/license.rb +120 -0
  468. data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
  469. data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
  470. data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
  471. data/lib/rosett_ai/thor/tasks/project.rb +260 -0
  472. data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
  473. data/lib/rosett_ai/thor/tasks/release.rb +314 -0
  474. data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
  475. data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
  476. data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
  477. data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
  478. data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
  479. data/lib/rosett_ai/tooling/version_checker.rb +35 -0
  480. data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
  481. data/lib/rosett_ai/ui/base.rb +46 -0
  482. data/lib/rosett_ai/ui/gtk4.rb +98 -0
  483. data/lib/rosett_ai/ui/kde.rb +40 -0
  484. data/lib/rosett_ai/ui/qt6.rb +40 -0
  485. data/lib/rosett_ai/ui/registry.rb +60 -0
  486. data/lib/rosett_ai/ui/tty_helper.rb +74 -0
  487. data/lib/rosett_ai/ui/tui.rb +59 -0
  488. data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
  489. data/lib/rosett_ai/validators/design_validator.rb +17 -0
  490. data/lib/rosett_ai/validators/schema_validator.rb +84 -0
  491. data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
  492. data/lib/rosett_ai/version.rb +8 -0
  493. data/lib/rosett_ai/version_consistency_checker.rb +129 -0
  494. data/lib/rosett_ai/workflow/audit_log.rb +86 -0
  495. data/lib/rosett_ai/workflow/engine.rb +142 -0
  496. data/lib/rosett_ai/workflow/manager.rb +82 -0
  497. data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
  498. data/lib/rosett_ai/workflow/step_runner.rb +61 -0
  499. data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
  500. data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
  501. data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
  502. data/lib/rosett_ai/yaml_loader.rb +78 -0
  503. data/lib/rosett_ai.rb +221 -0
  504. data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
  505. data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
  506. data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
  507. data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
  508. data/lib/rubocop/rosett_ai.rb +9 -0
  509. data/lib/scripts/generated/docker_hub_tags.rb +126 -0
  510. data/locales/.gitkeep +0 -0
  511. data/locales/ar.yml +579 -0
  512. data/locales/en.yml +571 -0
  513. data/locales/fr.yml +567 -0
  514. data/packaging/build-engine-deb.sh +81 -0
  515. data/packaging/scripts/postinst +17 -0
  516. data/packaging/scripts/postrm +19 -0
  517. data/packaging/scripts/prerm +10 -0
  518. data/packaging/wrapper.sh.template +38 -0
  519. data/rosett-ai.gemspec +63 -0
  520. data/rules/.gitkeep +0 -0
  521. data/scripts/publish/pulp_upload.sh +123 -0
  522. data/settings.json +29 -0
  523. data/share/applications/be.neatnerds.rosettai.desktop +29 -0
  524. data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
  525. data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
  526. data/share/templates/behaviour/criticalthinking.yml +69 -0
  527. metadata +810 -0
@@ -0,0 +1,455 @@
1
+ # Design Implementation Overview (P1 + P2 in progress)
2
+
3
+ **Branch**: `design_implementation`
4
+ **Date range**: 2026-02-19 to 2026-02-21
5
+ **Commits**: 20+
6
+ **Design docs addressed**: 8 (all P1 + all P2 fully implemented)
7
+ **ADRs**: 6 (4 accepted, 1 accepted-deferred, 1 proposed-deferred) — ADR-002 now implemented
8
+
9
+ ## Motivation
10
+
11
+ The rai project follows a "guardrails before features" principle. Before any
12
+ feature code can merge, the P1 foundation must exist: security constraints that
13
+ are enforced (not suggested), a testing strategy that validates test quality
14
+ (not just coverage), style rules that are automated (not optional), and a CI
15
+ pipeline that turns all of this into merge-blocking gates.
16
+
17
+ This branch implements 4 P1 design documents fully, plus initial work on 2
18
+ P2/P3 documents (architecture UI layer and lifecycle management). The result
19
+ is a codebase where every future commit is automatically validated against
20
+ security, quality, and style constraints.
21
+
22
+ ## Implementation timeline
23
+
24
+ ```mermaid
25
+ gantt
26
+ title design_implementation branch — 18 commits
27
+ dateFormat YYYY-MM-DD
28
+ axisFormat %b %d
29
+
30
+ section Security
31
+ fix(gitlab-ci) ruby-build PATH :done, dc42, 2026-02-19, 1d
32
+ feat(security) ruby_audit + flog gems :done, 7423, 2026-02-19, 1d
33
+ fix(security) Ruby 3.3.8→3.3.10 :done, fdb7, 2026-02-19, 1d
34
+ fix(security) shell injection + perms :done, 9fc7, 2026-02-19, 1d
35
+ feat(security) cops + YAML + ANSI + NFC :done, 46aa, 2026-02-19, 1d
36
+
37
+ section Testing
38
+ feat(testing) all 9 criteria :done, 5f35, 2026-02-19, 1d
39
+ test(mutant) 97.83% coverage :done, 5470, 2026-02-19, 1d
40
+
41
+ section Styles + Design Docs
42
+ feat(design) lifecycle + styles docs :done, 59f4, 2026-02-19, 1d
43
+ feat(design) security v1.1 + styles :done, ff3d, 2026-02-19, 1d
44
+
45
+ section CI + Lifecycle + Architecture
46
+ feat(design) lifecycle + ci_pipeline :done, bf9f, 2026-02-21, 1d
47
+ feat(design) security gaps + UI layer :done, 1d0b, 2026-02-21, 1d
48
+ feat(ui) accessibility methods :done, 6a8b, 2026-02-21, 1d
49
+
50
+ section P2 Architecture ADRs
51
+ docs accept ADR-002 + ADR-006 :done, a96f, 2026-02-21, 1d
52
+ docs accept ADR-003 UI cascade :done, 44e8, 2026-02-21, 1d
53
+ docs accept ADR-004 validators :done, d12b, 2026-02-21, 1d
54
+ docs accept ADR-005 package split :done, 95ca, 2026-02-21, 1d
55
+ feat SchemaValidator + Design + Tooling :done, c33c, 2026-02-21, 1d
56
+ feat unified rai validate :done, 95e6, 2026-02-21, 1d
57
+
58
+ section P2 PathResolver (ADR-002)
59
+ feat PathResolver + refactor 6 files :done, ph3, 2026-02-21, 1d
60
+ ```
61
+
62
+ ## Design document dependency graph
63
+
64
+ ```mermaid
65
+ flowchart TB
66
+ subgraph P1["P1 Foundation"]
67
+ direction TB
68
+ SEC[security v1.1.0<br/>IMPLEMENTED]
69
+ TEST[testing v1.0.0<br/>IMPLEMENTED]
70
+ STY[styles v1.0.0<br/>IMPLEMENTED]
71
+ CI[ci_pipeline v1.0.0<br/>IMPLEMENTED]
72
+ end
73
+
74
+ subgraph P2["P2 Structure"]
75
+ direction TB
76
+ ARCH[architecture v1.0.0<br/>IMPLEMENTED — 8/8 criteria]
77
+ COMP[compiler v1.0.0<br/>IMPLEMENTED]
78
+ CC[cc_configuration v0.1.0<br/>IMPLEMENTED — 17/17 criteria]
79
+ end
80
+
81
+ subgraph P3["P3 Interface"]
82
+ direction TB
83
+ UI[ui_framework v1.0.0<br/>NOT STARTED]
84
+ A11Y[accessibility v1.0.0<br/>NOT STARTED]
85
+ I18N[i18n v1.0.0<br/>NOT STARTED]
86
+ end
87
+
88
+ subgraph P4["P4 Business"]
89
+ direction TB
90
+ LIC[licensing_system v1.0.0<br/>NOT STARTED]
91
+ PACK[content_packs v1.0.0<br/>NOT STARTED]
92
+ end
93
+
94
+ subgraph P1_OP["P1 Operational"]
95
+ direction TB
96
+ LCM[lifecycle_management v1.0.0<br/>IMPLEMENTED]
97
+ end
98
+
99
+ SEC --> TEST
100
+ SEC --> STY
101
+ TEST --> STY
102
+ STY --> CI
103
+ SEC --> CI
104
+ TEST --> CI
105
+ SEC --> ARCH
106
+ TEST --> ARCH
107
+ CI --> ARCH
108
+ SEC --> COMP
109
+ ARCH --> COMP
110
+ ARCH --> CC
111
+ SEC --> CC
112
+ COMP --> CC
113
+ ARCH --> UI
114
+ A11Y --> UI
115
+ I18N --> UI
116
+ ARCH --> A11Y
117
+ ARCH --> I18N
118
+ COMP --> I18N
119
+ SEC --> LIC
120
+ ARCH --> LIC
121
+ SEC --> PACK
122
+ COMP --> PACK
123
+ LIC --> PACK
124
+ SEC --> LCM
125
+ TEST --> LCM
126
+ CI --> LCM
127
+
128
+ style SEC fill:#2d6a2d,color:#fff
129
+ style TEST fill:#2d6a2d,color:#fff
130
+ style STY fill:#2d6a2d,color:#fff
131
+ style CI fill:#2d6a2d,color:#fff
132
+ style LCM fill:#2d6a2d,color:#fff
133
+ style ARCH fill:#2d6a2d,color:#fff
134
+ style COMP fill:#2d6a2d,color:#fff
135
+ style CC fill:#2d6a2d,color:#fff
136
+ style UI fill:#666,color:#fff
137
+ style A11Y fill:#666,color:#fff
138
+ style I18N fill:#666,color:#fff
139
+ style LIC fill:#666,color:#fff
140
+ style PACK fill:#666,color:#fff
141
+ ```
142
+
143
+ Legend: green = implemented, amber = partial, grey = not started.
144
+
145
+ ## Domain summary
146
+
147
+ | Domain | Version | Impl% | Criteria met | Commits | Key files |
148
+ |--------|---------|-------|--------------|---------|-----------|
149
+ | security | 1.1.0 | 100% | 12/12 | dc42c3c, 7423856, fdb73e0, 9fc7e55, 46aa519, 1d0bfb9 | 17 new/modified |
150
+ | testing | 1.0.0 | 100% | 9/9 | 5f352e6, 5470cd4 | 23 new/modified |
151
+ | styles | 1.0.0 | 100% | 10/10 | ff3d81e, bf9f15e | 10 new/modified |
152
+ | ci_pipeline | 1.0.0 | 100% | 11/12 | bf9f15e | 7 new/modified |
153
+ | lifecycle_management | 1.0.0 | 100% | 7/7 | bf9f15e | 6 new/modified |
154
+ | compiler | 1.0.0 | 100% | 9/9 | (phase 4) | 19 new, 8 modified |
155
+ | claude_code_config | 0.1.0 | 100% | 17/17 | (phase 5) | 19 new, 10 modified |
156
+ | architecture | 1.0.0 | 100% | 8/8 | 1d0bfb9, 6a8b27e, c33ce5d, 95e636b | 26 new/modified |
157
+
158
+ ## P2 Architecture — ADR decisions and SchemaValidator
159
+
160
+ ### Architecture Decision Records
161
+
162
+ | ADR | Title | Status | Implementation |
163
+ |-----|-------|--------|---------------|
164
+ | 002 | Path Resolution Strategy | Accepted | Phase 3 (next) |
165
+ | 003 | UI Adapter Selection (5-level cascade) | Accepted — deferred to P3 | P3 |
166
+ | 004 | Design Document Validation (SchemaValidator) | Accepted | Phase 2 (done) |
167
+ | 005 | Package Splitting Strategy (plugin gems) | Accepted — deferred to P3/P4 | P3/P4 |
168
+ | 006 | Multi-Engine Architecture | Proposed — deferred | P2 compiler phase |
169
+
170
+ ### Phase 2 implementation: SchemaValidator + unified validate
171
+
172
+ Extracted shared validation logic from `BehaviourValidator` into a generic
173
+ `SchemaValidator` base class. All three schema validators (behaviour, design,
174
+ tooling) are now thin wrappers. A unified `bin/raictl validate` command runs
175
+ all validators sequentially and reports per-category results.
176
+
177
+ | Component | Description |
178
+ |-----------|-------------|
179
+ | `SchemaValidator` | Generic base class; accepts `schema:` keyword; API: `valid?`, `validate`, `errors` |
180
+ | `BehaviourValidator` | Thin wrapper (80 lines to 15 lines); 21 existing specs pass unchanged |
181
+ | `DesignValidator` | Validates 13 design docs against `design_schema.json` |
182
+ | `ToolingValidator` | Validates tooling files against `tooling_schema.json` |
183
+ | `bin/raictl validate` | Unified command — aggregates all validators, summary table |
184
+ | `bin/raictl design validate` | Per-category command for design docs |
185
+ | `bin/raictl tooling validate` | Per-category command for tooling files |
186
+ | CI: `validate:schemas` | Single CI job replacing per-category jobs |
187
+
188
+ ### Architecture criteria progress
189
+
190
+ | # | Criterion | Status | Evidence |
191
+ |---|-----------|--------|----------|
192
+ | 1 | Headless Debian | Met | TTY gems; no GUI deps in gemspec |
193
+ | 2 | rosett-ai-gtk4 additive | Met | Registry.register auto-discovery (ADR-005) |
194
+ | 3 | base.rb abstract interface | Met | 7 methods + accessibility (commit 6a8b27e) |
195
+ | 4 | registry.rb auto-discovery | Met | register/resolve/available (commit 1d0bfb9) |
196
+ | 5 | Business logic in lib/rosett_ai/ | Met | Thor tasks are orchestration only |
197
+ | 6 | Design docs validated | Met | DesignValidator + CLI + CI (Phase 2) |
198
+ | 7 | Behaviour docs validated | Met | BehaviourValidator (pre-existing) |
199
+ | 8 | Package dependencies | Met | VariantConfig + packaging schema + variant YAML configs |
200
+
201
+ All 8 architecture criteria are now met. The `architecture.yml` status
202
+ has been changed from `draft` to `approved`.
203
+
204
+ ## Security enforcement architecture
205
+
206
+ ```mermaid
207
+ flowchart LR
208
+ subgraph PRE["Pre-commit (overcommit)"]
209
+ direction TB
210
+ RC[RuboCop<br/>+ custom cops]
211
+ RK[Reek]
212
+ BA[bundler-audit]
213
+ RA[ruby-audit]
214
+ FL[Flay]
215
+ MDL[mdl]
216
+ YL[yamllint]
217
+ end
218
+
219
+ subgraph CI_STAGES["CI Pipeline Stages"]
220
+ direction TB
221
+ V[validate]
222
+ CQ[code_quality]
223
+ SS[security_scan]
224
+ T[test]
225
+ B[build]
226
+ end
227
+
228
+ subgraph RUNTIME["Runtime Bounds"]
229
+ direction TB
230
+ YAML[YamlLoader<br/>1MB / 10 depth / 1K keys]
231
+ ANSI[TextSanitizer<br/>ANSI strip + NFC]
232
+ SEC2[SecretsResolver<br/>ENV → file 0600]
233
+ end
234
+
235
+ PRE --> CI_STAGES
236
+ V --> CQ --> SS --> T --> B
237
+ RUNTIME -.->|enforced at| T
238
+ ```
239
+
240
+ ## Three-party testing model
241
+
242
+ ```mermaid
243
+ flowchart LR
244
+ DEV["Developer / AI<br/>writes code + tests"]
245
+ RSPEC["RSpec<br/>437 examples<br/>93% line coverage"]
246
+ MUTANT["Mutant<br/>555 mutations<br/>97.83% kill rate"]
247
+
248
+ DEV -->|code + tests| RSPEC
249
+ RSPEC -->|passes| MUTANT
250
+ MUTANT -->|validates test quality| DEV
251
+
252
+ style MUTANT fill:#8b0000,color:#fff
253
+ ```
254
+
255
+ The three-party model ensures that when AI writes both the code and the tests,
256
+ an independent validator (Mutant) mechanically confirms the tests catch real
257
+ faults. Without this, AI-generated test suites can be perfectly consistent yet
258
+ semantically hollow.
259
+
260
+ ## Cross-cutting achievements
261
+
262
+ | Metric | Value |
263
+ |--------|-------|
264
+ | RSpec examples | 729 |
265
+ | Line coverage | 92.38% (2532/2741) |
266
+ | Mutant mutations | 555 total, 543 killed |
267
+ | Mutant kill rate | 97.83% |
268
+ | Equivalent survivors | 12 |
269
+ | RuboCop offenses | 0 |
270
+ | Reek warnings | 0 |
271
+ | Security CVEs | 0 (3 resolved by Ruby upgrade) |
272
+ | Files with SPDX headers | 115+ |
273
+ | New files | 76 |
274
+ | Modified files | 85 |
275
+ | ADRs accepted | 4 (002, 003, 004, 005) |
276
+ | ADRs proposed | 1 (006) |
277
+
278
+ ## Commit log
279
+
280
+ | Hash | Type | Scope | Summary | Date |
281
+ |------|------|-------|---------|------|
282
+ | dc42c3c | fix | gitlab-ci | install ruby-build to PATH for package builds | 2026-02-19 |
283
+ | 7423856 | feat | security | add ruby_audit + flog gems and audit all config exclusions | 2026-02-19 |
284
+ | fdb73e0 | fix | security | upgrade Ruby 3.3.8 to 3.3.10 (CVE fixes) | 2026-02-19 |
285
+ | 59f43d4 | feat | design | add lifecycle management doc and fix styles.yml | 2026-02-19 |
286
+ | ff3d81e | feat | design | update security.yml to v1.1.0 and add styles domain | 2026-02-19 |
287
+ | 9fc7e55 | fix | security | eliminate shell injection vectors and add file permissions | 2026-02-19 |
288
+ | 46aa519 | feat | security | implement criteria 8-11 (cops, YAML bounds, ANSI, NFC) | 2026-02-19 |
289
+ | 5f352e6 | feat | testing | implement testing.yml design document (all 9 criteria) | 2026-02-19 |
290
+ | 5470cd4 | test | mutant | kill 99 surviving mutations, raise coverage to 97.83% | 2026-02-19 |
291
+ | bf9f15e | feat | design | implement lifecycle_management.yml and fix ci_pipeline gaps | 2026-02-21 |
292
+ | 1d0bfb9 | feat | design | fix security.yml gaps and implement architecture UI layer | 2026-02-21 |
293
+ | 6a8b27e | feat | ui | add accessibility methods to UI base and TUI adapter | 2026-02-21 |
294
+ | c2b7cf9 | fix | design | reconcile design doc inconsistencies and add ADRs 002-005 | 2026-02-21 |
295
+ | 5af8ac3 | docs | changes | archive design implementation documentation | 2026-02-21 |
296
+ | a96f327 | docs | architecture | accept ADR-002, add ADR-006 multi-engine | 2026-02-21 |
297
+ | 44e8a34 | docs | architecture | accept ADR-003 revised UI adapter cascade | 2026-02-21 |
298
+ | d12b827 | docs | architecture | accept ADR-004 with ToolingValidator and bidirectional invariant | 2026-02-21 |
299
+ | 95caf1c | docs | architecture | accept ADR-005 with variant packaging and GUI testing | 2026-02-21 |
300
+ | c33ce5d | feat | architecture | implement ADR-004 SchemaValidator with Design and Tooling validators | 2026-02-21 |
301
+ | 95e636b | feat | cli | add unified rai validate command | 2026-02-21 |
302
+
303
+ ## New files by category (45 total)
304
+
305
+ ### Library code (11)
306
+
307
+ | File | Purpose |
308
+ |------|---------|
309
+ | `lib/rosett_ai/yaml_loader.rb` | Centralized YAML loading with bounds checking |
310
+ | `lib/rosett_ai/text_sanitizer.rb` | ANSI stripping and NFC normalization |
311
+ | `lib/rosett_ai/secrets_resolver.rb` | Multi-source secret resolution (ENV, file) |
312
+ | `lib/rosett_ai/version_consistency_checker.rb` | Cross-codebase version reference validation |
313
+ | `lib/rosett_ai/ui/base.rb` | Abstract UI interface with accessibility methods |
314
+ | `lib/rosett_ai/ui/registry.rb` | Plugin discovery and adapter management |
315
+ | `lib/rosett_ai/ui/tui.rb` | Terminal UI adapter using TTY gems |
316
+ | `lib/rubocop/cop/rosett-ai/shell_interpolation.rb` | Custom cop: flags shell injection patterns |
317
+ | `lib/rubocop/cop/rosett-ai/unsafe_yaml_load.rb` | Custom cop: flags unsafe YAML.load |
318
+ | `lib/rubocop/rosett_ai.rb` | Cop loader |
319
+ | `LICENSE.md` | GPL-3.0-only full text (675 lines) |
320
+
321
+ ### Test code (16)
322
+
323
+ | File | Purpose |
324
+ |------|---------|
325
+ | `spec/rosett_ai/yaml_loader_spec.rb` | YamlLoader unit tests |
326
+ | `spec/rosett_ai/yaml_loader_property_spec.rb` | Property-based tests for YamlLoader (Rantly) |
327
+ | `spec/rosett_ai/text_sanitizer_spec.rb` | TextSanitizer unit tests |
328
+ | `spec/rosett_ai/secrets_resolver_spec.rb` | SecretsResolver unit tests |
329
+ | `spec/rosett_ai/version_consistency_checker_spec.rb` | VersionConsistencyChecker unit tests (214 lines) |
330
+ | `spec/rosett_ai/ui/base_spec.rb` | UI Base abstract interface tests |
331
+ | `spec/rosett_ai/ui/registry_spec.rb` | UI Registry tests |
332
+ | `spec/rosett_ai/ui/tui_spec.rb` | TUI adapter tests |
333
+ | `spec/rubocop/cop/rosett-ai/shell_interpolation_spec.rb` | ShellInterpolation cop tests |
334
+ | `spec/rubocop/cop/rosett-ai/unsafe_yaml_load_spec.rb` | UnsafeYamlLoad cop tests |
335
+ | `spec/support/factories/behaviours.rb` | factory_bot behaviour hash factory |
336
+ | `spec/support/factories/rules.rb` | factory_bot rule hash factory |
337
+ | `spec/support/factory_bot.rb` | factory_bot RSpec configuration |
338
+ | `spec/support/shared_examples/ui_implementation.rb` | UI interface contract (7 methods) |
339
+ | `spec/fixtures/behaviours/*.yml` | 7 fixture files (valid, invalid, malicious, unicode) |
340
+
341
+ ### CI/CD (4)
342
+
343
+ | File | Purpose |
344
+ |------|---------|
345
+ | `.gitlab-ci-files/validate/ci-yaml.yml` | CI YAML validation job |
346
+ | `.gitlab-ci-files/validate/version-consistency.yml` | Version consistency check job |
347
+ | `.gitlab-ci-files/security_scan/ruby-audit.yml` | Ruby stdlib CVE scanning job |
348
+ | `.gitlab-ci-files/test/mutant.yml` | Mutation testing job (MR only) |
349
+
350
+ ### P2 Library code (4)
351
+
352
+ | File | Purpose |
353
+ |------|---------|
354
+ | `lib/rosett_ai/validators/schema_validator.rb` | Generic JSON Schema validator base class |
355
+ | `lib/rosett_ai/validators/design_validator.rb` | Design document validator (thin wrapper) |
356
+ | `lib/rosett_ai/validators/tooling_validator.rb` | Tooling configuration validator (thin wrapper) |
357
+ | `lib/rosett_ai/thor/tasks/design.rb` | Design document management CLI task |
358
+ | `lib/rosett_ai/thor/tasks/validate.rb` | Unified validation aggregator CLI task |
359
+
360
+ ### P2 Test code (4)
361
+
362
+ | File | Purpose |
363
+ |------|---------|
364
+ | `spec/rosett_ai/validators/schema_validator_spec.rb` | SchemaValidator base class tests |
365
+ | `spec/rosett_ai/validators/design_validator_spec.rb` | DesignValidator tests (incl. all 13 real docs) |
366
+ | `spec/rosett_ai/validators/tooling_validator_spec.rb` | ToolingValidator tests (incl. real tooling files) |
367
+ | `spec/rosett_ai/thor/tasks/design_spec.rb` | Design CLI task tests |
368
+ | `spec/rosett_ai/thor/tasks/validate_spec.rb` | Unified validate CLI task tests |
369
+
370
+ ### P2 CI/CD (3)
371
+
372
+ | File | Purpose |
373
+ |------|---------|
374
+ | `.gitlab-ci-files/validate/design-docs.yml` | Design document validation job (superseded) |
375
+ | `.gitlab-ci-files/validate/tooling-docs.yml` | Tooling validation job (superseded) |
376
+ | `.gitlab-ci-files/validate/schema-validation.yml` | Unified schema validation job |
377
+
378
+ ### P2 Documentation (7)
379
+
380
+ | File | Purpose |
381
+ |------|---------|
382
+ | `doc/decisions/002-path-resolution-strategy.md` | ADR: PathResolver for centralised paths |
383
+ | `doc/decisions/003-ui-adapter-selection.md` | ADR: 5-level UI adapter cascade |
384
+ | `doc/decisions/004-design-document-validation.md` | ADR: SchemaValidator with bidirectional invariant |
385
+ | `doc/decisions/005-package-splitting-strategy.md` | ADR: Plugin gems within core repository |
386
+ | `doc/decisions/006-multi-engine-architecture.md` | ADR: Engine-aware PathResolver + compiler adapters |
387
+
388
+ ### P2 CC Config Library (6)
389
+
390
+ | File | Purpose |
391
+ |------|---------|
392
+ | `lib/rosett_ai/config/compiler.rb` | Main CC config orchestrator (YAML→JSON pipeline) |
393
+ | `lib/rosett_ai/config/domain_transformer.rb` | Domain key mapping, env routing, validate-only checking |
394
+ | `lib/rosett_ai/config/key_map.rb` | Explicit snake_case → camelCase mapping table (90+ entries) |
395
+ | `lib/rosett_ai/config/scope_router.rb` | Scope → target path resolution |
396
+ | `lib/rosett_ai/config/secret_resolver.rb` | `${secret:backend:key}` deterministic parser (NO regex) |
397
+ | `lib/rosett_ai/config/compile_result.rb` | Structured compilation result |
398
+
399
+ ### P2 CC Config Tests (6)
400
+
401
+ | File | Purpose |
402
+ |------|---------|
403
+ | `spec/rosett_ai/config/compiler_spec.rb` | Compiler integration tests |
404
+ | `spec/rosett_ai/config/key_map_spec.rb` | KeyMap mapping tests |
405
+ | `spec/rosett_ai/config/scope_router_spec.rb` | ScopeRouter tests |
406
+ | `spec/rosett_ai/config/secret_resolver_spec.rb` | SecretResolver tests (3 backends, security) |
407
+ | `spec/rosett_ai/config/compile_result_spec.rb` | CompileResult struct tests |
408
+ | `spec/rosett_ai/thor/tasks/config_spec.rb` | Thor config task tests |
409
+
410
+ ### P2 CC Config Scope Files + Schema (5)
411
+
412
+ | File | Purpose |
413
+ |------|---------|
414
+ | `conf/claude_code/managed.yml` | Enterprise managed scope config |
415
+ | `conf/claude_code/user.yml` | User-level scope config |
416
+ | `conf/claude_code/project.yml` | Project-level scope config |
417
+ | `conf/claude_code/local.yml` | Local overrides scope config |
418
+ | `conf/schemas/claude_code_config_schema.json` | JSON Schema draft 2020-12 |
419
+
420
+ ### P2 CC Config CLI + Docs (2)
421
+
422
+ | File | Purpose |
423
+ |------|---------|
424
+ | `lib/rosett_ai/thor/tasks/config.rb` | Thor task: `rai config compile` |
425
+ | `doc/changes/2026-02-21-cc-config-implementation.md` | Change document |
426
+
427
+ ### Configuration (5)
428
+
429
+ | File | Purpose |
430
+ |------|---------|
431
+ | `.mutant.yml` | Mutant configuration |
432
+ | `.mdlrc` | Markdownlint configuration |
433
+ | `.mdl_style.rb` | Markdownlint style rules |
434
+ | `conf/design/lifecycle_management.yml` | Lifecycle management design document |
435
+ | `conf/design/styles.yml` | Styles design document |
436
+
437
+ ### Documentation (4)
438
+
439
+ | File | Purpose |
440
+ |------|---------|
441
+ | `doc/ai_test_review_checklist.md` | 11-point AI test review checklist |
442
+ | `doc/changes/2026-02-19-testing-infrastructure.md` | Testing implementation change doc |
443
+ | `doc/decisions/001-flog-deferred.md` | ADR: Flog deferred in favour of RuboCop Metrics |
444
+ | `conf/design/claude_code_configuration.yml` | CC configuration design document (P2) |
445
+
446
+ ## Related documentation
447
+
448
+ - [CC config compiler](2026-02-21-cc-config-implementation.md)
449
+ - [Compiler multi-target pipeline](2026-02-21-compiler-multi-target-pipeline.md)
450
+ - [Security implementation](2026-02-20-security-implementation.md)
451
+ - [Testing infrastructure](2026-02-19-testing-infrastructure.md) (pre-existing)
452
+ - [Styles implementation](2026-02-20-styles-implementation.md)
453
+ - [CI pipeline implementation](2026-02-21-ci-pipeline-implementation.md)
454
+ - [Lifecycle management](2026-02-21-lifecycle-management.md)
455
+ - [Architecture UI layer](2026-02-21-architecture-ui-layer.md)
@@ -0,0 +1,196 @@
1
+ # Implement lifecycle_management.yml design document (P1)
2
+
3
+ **Branch**: `design_implementation`
4
+ **Date**: 2026-02-21
5
+ **Design doc**: `conf/design/lifecycle_management.yml` v1.0.0
6
+ **Commit**: bf9f15e
7
+
8
+ ## Motivation
9
+
10
+ Upgrades are security-critical operations — a missed CVE fix is a vulnerability,
11
+ a botched upgrade is downtime. Without lifecycle management:
12
+
13
+ - Version references drift across files (.ruby-version says one thing, CLAUDE.md another)
14
+ - Security patches are applied late or inconsistently
15
+ - Upgrades break things because verification was incomplete
16
+ - Knowledge about how to upgrade is tribal, not documented
17
+
18
+ The lifecycle management design document captures a repeatable, auditable
19
+ upgrade methodology with 5 phases (discovery, research, scope, execute, verify)
20
+ and automated tooling to detect version drift. It was validated against the
21
+ concrete Ruby 3.3.8 to 3.3.10 upgrade performed earlier in this branch.
22
+
23
+ ## Acceptance criteria
24
+
25
+ All 7 acceptance criteria from `lifecycle_management.yml` are satisfied:
26
+
27
+ | # | Criterion | Evidence |
28
+ |---|-----------|----------|
29
+ | 1 | All version references consistent after upgrade | `VersionConsistencyChecker` validates; CI job enforces |
30
+ | 2 | ruby-audit reports 0 vulnerabilities after Ruby upgrade | fdb73e0: Ruby 3.3.10 resolves 3 CVEs |
31
+ | 3 | bundler-audit reports 0 vulnerabilities after gem upgrade | Verified: 0 vulnerabilities |
32
+ | 4 | RuboCop, Reek, Flay run without regressions (Flog deferred) | All pass with 0 findings; ADR-001 documents Flog deferral |
33
+ | 5 | Full RSpec suite passes with 0 failures | 437 examples, 0 failures |
34
+ | 6 | Commit message includes CVE identifiers or rationale | fdb73e0: "upgrade Ruby 3.3.8 -> 3.3.10 (CVE fixes)" |
35
+ | 7 | No stale version references (verified by grep) | `VersionConsistencyChecker` automates this verification |
36
+
37
+ ## Changes by area
38
+
39
+ ### VersionConsistencyChecker class
40
+
41
+ **File**: `lib/rosett_ai/version_consistency_checker.rb` (117 lines)
42
+
43
+ Reads the canonical Ruby version from `.ruby-version`, then scans every
44
+ non-binary file in the project for version strings matching the same
45
+ MAJOR.MINOR series. Reports mismatches where a file references an older
46
+ PATCH level.
47
+
48
+ **Design decisions**:
49
+
50
+ - **Exclusions**: `vendor/`, `tmp/`, `coverage/`, `.git/`, `.bundle/` (generated),
51
+ `CHANGELOG.md` (historical), `Gemfile.lock` (managed by bundler),
52
+ `doc/changes/` and `doc/INCIDENT_REPORT*` (archival), `conf/design/`
53
+ (reference execution examples), and its own spec file
54
+ - **Constraint line detection**: Lines containing version operators (`>=`, `~>`,
55
+ `<=`, `!=`) are skipped (gemspec/CI constraints reference ranges, not pins)
56
+ - **Binary detection**: Reads first 512 bytes; skips files containing null bytes
57
+ - **Encoding safety**: Catches `ArgumentError` and `Encoding::InvalidByteSequenceError`
58
+
59
+ Key code excerpt:
60
+
61
+ ```ruby
62
+ def build_version_pattern(version)
63
+ major, minor = version.split('.')[0..1]
64
+ /\b#{Regexp.escape(major)}\.#{Regexp.escape(minor)}\.\d+\b/
65
+ end
66
+
67
+ def scan_file(file, expected, pattern)
68
+ File.readlines(file, encoding: 'UTF-8').each_with_index do |line, index|
69
+ line.scan(pattern).each do |found|
70
+ next if constraint_line?(line)
71
+ reference = { file: relative, line: index + 1, found: found, expected: expected }
72
+ @results[:references] << reference
73
+ @results[:mismatches] << reference unless found == expected
74
+ end
75
+ end
76
+ end
77
+ ```
78
+
79
+ ### `rai tooling check-versions` CLI command
80
+
81
+ **File**: `lib/rosett_ai/thor/tasks/tooling.rb` (new command)
82
+
83
+ ```text
84
+ Usage: bin/raictl tooling check-versions [--verbose] [--project-dir DIR]
85
+
86
+ Options:
87
+ --verbose Show all version references, not just mismatches
88
+ --project-dir Project directory (defaults to current directory)
89
+ ```
90
+
91
+ Output: Unicode-bordered table showing expected version, total references,
92
+ and mismatch count. Exits non-zero if mismatches are found.
93
+
94
+ ### CI validation job
95
+
96
+ **File**: `.gitlab-ci-files/validate/version-consistency.yml`
97
+
98
+ Runs `bundle exec bin/raictl tooling check-versions` in the validate stage.
99
+ Catches version drift before code quality or test stages run.
100
+
101
+ ### Upgrade methodology
102
+
103
+ The design document codifies a 5-phase upgrade process:
104
+
105
+ 1. **Discovery** — Run security audit tools, record CVE identifiers and severity
106
+ 2. **Research** — Check official releases, verify version manager availability, read release notes
107
+ 3. **Scope** — Grep codebase for all references to current version, categorize by file type
108
+ 4. **Execute** — Install new version, update pin, reinstall dependencies, update all references
109
+ 5. **Verify** — Run full suite: ruby-audit, bundler-audit, rubocop, reek, flay, rspec
110
+
111
+ ### Reference execution: Ruby 3.3.8 to 3.3.10
112
+
113
+ The Ruby upgrade (commit fdb73e0) served as the concrete validation of this
114
+ methodology:
115
+
116
+ | Phase | Action | Result |
117
+ |-------|--------|--------|
118
+ | Discovery | ruby-audit flagged CVE-2025-24294, CVE-2025-58767, CVE-2025-61594 | 3 CVEs identified |
119
+ | Research | ruby-lang.org confirmed 3.3.10 resolves all 3 | Target version selected |
120
+ | Scope | grep found 6 files with "3.3.8" references | Scope bounded |
121
+ | Execute | rbenv install 3.3.10, bundle install, 6 files updated | Atomic update |
122
+ | Verify | ruby-audit 0, rubocop 0, reek 0, rspec 277/0 | All gates passed |
123
+
124
+ ## Upgrade process sequence
125
+
126
+ ```mermaid
127
+ sequenceDiagram
128
+ participant A as Audit Tool
129
+ participant D as Developer/AI
130
+ participant R as Official Docs
131
+ participant C as Codebase
132
+ participant V as Verification Suite
133
+
134
+ A->>D: CVE found (ruby-audit / bundler-audit)
135
+ D->>R: Check latest patched version
136
+ R-->>D: Version confirmed (e.g. 3.3.10)
137
+ D->>C: grep for current version references
138
+ C-->>D: File list with line numbers
139
+ D->>C: Install new version + update all references
140
+ D->>V: Run full verification suite
141
+ V-->>D: ruby-audit: 0 vulns
142
+ V-->>D: bundler-audit: 0 vulns
143
+ V-->>D: rubocop: 0 offenses
144
+ V-->>D: reek: 0 warnings
145
+ V-->>D: rspec: 0 failures
146
+ D->>C: Commit with CVE references in message
147
+ ```
148
+
149
+ ## VersionConsistencyChecker flow
150
+
151
+ ```mermaid
152
+ flowchart TD
153
+ START[Read .ruby-version] --> PATTERN[Build version pattern<br/>e.g. /3\.3\.\d+/]
154
+ PATTERN --> SCAN[Scan all project files]
155
+ SCAN --> EXCLUDE{Excluded<br/>dir/file?}
156
+ EXCLUDE -->|yes| SKIP[Skip file]
157
+ EXCLUDE -->|no| BINARY{Binary<br/>file?}
158
+ BINARY -->|yes| SKIP
159
+ BINARY -->|no| MATCH[Find version pattern matches]
160
+ MATCH --> CONSTRAINT{Constraint<br/>line?}
161
+ CONSTRAINT -->|yes| SKIP2[Skip match]
162
+ CONSTRAINT -->|no| COMPARE{Matches<br/>expected?}
163
+ COMPARE -->|yes| REF[Record reference]
164
+ COMPARE -->|no| MISMATCH[Record mismatch]
165
+ SKIP --> NEXT[Next file]
166
+ SKIP2 --> NEXT
167
+ REF --> NEXT
168
+ MISMATCH --> NEXT
169
+ NEXT --> SCAN
170
+ SCAN -->|done| REPORT[Report: consistent or mismatches]
171
+ ```
172
+
173
+ ## Files created
174
+
175
+ | File | Purpose |
176
+ |------|---------|
177
+ | `lib/rosett_ai/version_consistency_checker.rb` | Cross-codebase version reference validator |
178
+ | `spec/rosett_ai/version_consistency_checker_spec.rb` | Unit tests (214 lines, 24 examples) |
179
+ | `.gitlab-ci-files/validate/version-consistency.yml` | CI validation job |
180
+
181
+ ## Files modified
182
+
183
+ | File | Change |
184
+ |------|--------|
185
+ | `lib/rosett_ai/thor/tasks/tooling.rb` | Added `check-versions` command with `--verbose` and `--project-dir` options |
186
+ | `spec/rosett_ai/thor/tasks/tooling_spec.rb` | Added tests for new command |
187
+ | `conf/design/lifecycle_management.yml` | Minor wording updates, Flog deferral annotation |
188
+
189
+ ## Verification
190
+
191
+ - [x] `bundle exec bin/raictl tooling check-versions` — all references consistent
192
+ - [x] `bundle exec rspec spec/rosett_ai/version_consistency_checker_spec.rb` — 24 examples, 0 failures
193
+ - [x] `bundle exec rubocop lib/rosett_ai/version_consistency_checker.rb` — 0 offenses
194
+ - [x] `bundle exec reek lib/rosett_ai/version_consistency_checker.rb` — 0 warnings
195
+ - [x] Ruby 3.3.8 to 3.3.10 upgrade followed all 5 phases
196
+ - [x] Commit fdb73e0 references 3 CVE identifiers