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,359 @@
1
+ # Session Documentation: GTK4 Application Hardening & GUI Logging
2
+
3
+ **Date:** 2026-02-28
4
+ **Branch:** `engine/1-agents-md` (to be merged or rebased)
5
+ **Status:** In Progress - Paused for breakfast
6
+
7
+ ## Executive Summary
8
+
9
+ This session focused on making the GTK4 desktop application crash-proof and adding
10
+ comprehensive debugging capabilities through structured GUI action logging.
11
+
12
+ ## Work Completed
13
+
14
+ ### 1. GTK4 Application Hardening
15
+
16
+ The GTK4 application was completely rewritten with defensive programming principles
17
+ to ensure it **never crashes** on user interaction.
18
+
19
+ #### Files Modified
20
+
21
+ | File | Purpose |
22
+ |------|---------|
23
+ | `lib/rosett_ai/desktop/dbus_client.rb` | D-Bus client with safe defaults |
24
+ | `lib/rosett_ai/desktop/gtk4_app.rb` | Main GTK4 app with safe_action wrapper |
25
+ | `lib/rosett_ai/desktop/gtk4_preferences.rb` | Preferences dialog with graceful degradation |
26
+ | `lib/rosett_ai/desktop/gui_logger.rb` | **NEW** - Structured JSON logging for debugging |
27
+
28
+ ### 2. Safety Architecture
29
+
30
+ ```mermaid
31
+ flowchart TB
32
+ subgraph UserAction["User Action"]
33
+ click["Button Click / Menu Selection"]
34
+ end
35
+
36
+ subgraph SafetyLayer["Safety Layer"]
37
+ safe_action["safe_action()"]
38
+ safe_callback["safe_callback()"]
39
+ end
40
+
41
+ subgraph Logging["Logging Layer"]
42
+ gui_logger["GuiLogger.action()"]
43
+ json_output["JSON Lines Output"]
44
+ end
45
+
46
+ subgraph ErrorHandling["Error Handling"]
47
+ rescue["rescue StandardError"]
48
+ dialog["show_error_dialog()"]
49
+ toast["show_toast()"]
50
+ end
51
+
52
+ subgraph BusinessLogic["Business Logic"]
53
+ dbus["DbusClient"]
54
+ safe_defaults["Safe Defaults"]
55
+ end
56
+
57
+ click --> safe_action
58
+ safe_action --> gui_logger
59
+ gui_logger --> rescue
60
+ rescue -->|success| BusinessLogic
61
+ rescue -->|error| dialog
62
+ dialog --> toast
63
+
64
+ dbus -->|always returns| safe_defaults
65
+ ```
66
+
67
+ ### 3. Design Principles Applied
68
+
69
+ ```mermaid
70
+ mindmap
71
+ root((GTK4 Safety))
72
+ Never Crash
73
+ Wrap all handlers
74
+ Catch StandardError
75
+ Show error dialog
76
+ Safe Defaults
77
+ D-Bus returns defaults
78
+ Never raise to GUI
79
+ Graceful degradation
80
+ Logging
81
+ JSON Lines format
82
+ Action tracking
83
+ Full backtraces
84
+ Version Compatibility
85
+ Check defined?
86
+ Fallback widgets
87
+ PreferencesWindow fallback
88
+ ```
89
+
90
+ ## Decision Log
91
+
92
+ ### Decision 1: Error Handling Strategy
93
+
94
+ **Context:** Application crashed when clicking Preferences menu.
95
+
96
+ **Options Considered:**
97
+
98
+ 1. Fix specific crash only
99
+ 2. Add targeted try/catch blocks
100
+ 3. Comprehensive safety wrapper architecture
101
+
102
+ **Decision:** Option 3 - Wrap ALL event handlers with `safe_action()` pattern.
103
+
104
+ **Rationale:** User explicitly stated: *"It is imperative that the application is
105
+ robust and does not crash under any circumstances of usage."*
106
+
107
+ ```mermaid
108
+ flowchart LR
109
+ A[User Action] --> B{safe_action wrapper}
110
+ B -->|Success| C[Complete normally]
111
+ B -->|Error| D[Log error]
112
+ D --> E[Show error dialog]
113
+ E --> F[Continue running]
114
+ ```
115
+
116
+ ### Decision 2: D-Bus Client Safety
117
+
118
+ **Context:** D-Bus operations can fail (service unavailable, method not found).
119
+
120
+ **Decision:** D-Bus client NEVER raises exceptions. All methods return safe defaults.
121
+
122
+ ```ruby
123
+ # Safe defaults defined as constants
124
+ SAFE_STATUS = { 'error' => 'Service not available', 'version' => 'unknown' }.freeze
125
+ SAFE_FOCUS = ['', ''].freeze
126
+ SAFE_COMPILE_RESULT = 'Error: D-Bus service not available'
127
+ ```
128
+
129
+ ### Decision 3: GUI Logging System
130
+
131
+ **Context:** Need to debug GUI issues without attaching debugger.
132
+
133
+ **Decision:** Implement structured JSON Lines logging controlled by environment
134
+ variables.
135
+
136
+ ```mermaid
137
+ flowchart TB
138
+ subgraph Environment["Environment Variables"]
139
+ RAI_GUI_LOG["RAI_GUI_LOG=1"]
140
+ RAI_GUI_LOG_FILE["RAI_GUI_LOG_FILE=/path"]
141
+ RAI_GUI_LOG_LEVEL["RAI_GUI_LOG_LEVEL=debug"]
142
+ end
143
+
144
+ subgraph Logger["GuiLogger"]
145
+ action["action()"]
146
+ callback["callback()"]
147
+ dbus_call["dbus_call()"]
148
+ error["error()"]
149
+ end
150
+
151
+ subgraph Output["Output"]
152
+ stderr["stderr"]
153
+ file["Log File"]
154
+ json["JSON Lines Format"]
155
+ end
156
+
157
+ Environment --> Logger
158
+ Logger --> json
159
+ json --> stderr
160
+ json --> file
161
+ ```
162
+
163
+ **Usage:**
164
+
165
+ ```bash
166
+ RAI_GUI_LOG=1 RAI_GUI_LOG_FILE=/tmp/rosett-ai-gui.log bin/raictl desktop gtk4
167
+ ```
168
+
169
+ **Log Format:**
170
+
171
+ ```json
172
+ {"timestamp":"2026-02-28T06:21:05.991Z","level":"info","event":"action_start"}
173
+ ```
174
+
175
+ ### Decision 4: libadwaita Version Compatibility
176
+
177
+ **Context:** System has two libadwaita versions:
178
+
179
+ - Linuxbrew: 1.8.4 (newer)
180
+ - Debian: 1.2.2-1 (GIR typelib source)
181
+
182
+ **Decision:** Use `defined?` checks and graceful fallbacks.
183
+
184
+ ```mermaid
185
+ flowchart TD
186
+ A[Create Preferences Dialog] --> B{defined? PreferencesDialog}
187
+ B -->|Yes| C[Use PreferencesDialog]
188
+ B -->|No| D{defined? PreferencesWindow}
189
+ D -->|Yes| E[Use PreferencesWindow]
190
+ D -->|No| F[Return nil, log error]
191
+
192
+ C --> G[present with parent arg]
193
+ E --> H[set transient_for]
194
+ H --> I[present without args]
195
+ ```
196
+
197
+ ## Library Version Status
198
+
199
+ ### Ruby Gems (Latest)
200
+
201
+ | Gem | Installed | Latest | Status |
202
+ |-----|-----------|--------|--------|
203
+ | adwaita | 4.3.5 | 4.3.5 | Current |
204
+ | gtk4 | 4.3.5 | 4.3.5 | Current |
205
+ | glib2 | 4.3.5 | 4.3.5 | Current |
206
+ | ruby-dbus | 0.25.0 | 0.25.0 | Current |
207
+
208
+ ### System Libraries
209
+
210
+ | Library | Version | Source | Notes |
211
+ |---------|---------|--------|-------|
212
+ | libadwaita | 1.8.4 | Linuxbrew | Used by pkg-config |
213
+ | libadwaita | 1.2.2-1 | Debian | Provides GIR typelib |
214
+ | GIR typelib | 1.2.2 | Debian | Limits available classes |
215
+
216
+ **Impact:** `PreferencesDialog` (added in libadwaita 1.4) is not available to Ruby
217
+ bindings. Code gracefully falls back to `PreferencesWindow`.
218
+
219
+ ## Architecture Overview
220
+
221
+ ```mermaid
222
+ graph TB
223
+ subgraph Desktop["Desktop Layer"]
224
+ GTK4["Gtk4App"]
225
+ Prefs["Gtk4Preferences"]
226
+ Logger["GuiLogger"]
227
+ end
228
+
229
+ subgraph IPC["IPC Layer"]
230
+ DBus["DbusClient"]
231
+ end
232
+
233
+ subgraph Service["D-Bus Service"]
234
+ Manager["Manager Interface"]
235
+ Focus["FocusMonitor Interface"]
236
+ end
237
+
238
+ GTK4 --> Logger
239
+ GTK4 --> DBus
240
+ GTK4 --> Prefs
241
+ Prefs --> Logger
242
+ Prefs --> DBus
243
+ DBus --> Manager
244
+ DBus --> Focus
245
+
246
+ Logger -->|JSON Lines| File["Log File"]
247
+ Logger -->|JSON Lines| Stderr["stderr"]
248
+ ```
249
+
250
+ ## Testing Results
251
+
252
+ ### Manual Testing Performed
253
+
254
+ | Test | Result | Notes |
255
+ |------|--------|-------|
256
+ | App launch | Pass | Starts without crash |
257
+ | Hamburger - Preferences | Pass | Opens dialog (uses fallback PreferencesWindow) |
258
+ | Hamburger - About | Pass | Opens about window |
259
+ | Compile Rules action | Pass | Shows toast with error (D-Bus service not running) |
260
+ | Ctrl+Q quit | Pass | Clean shutdown |
261
+ | Error logging | Pass | JSON Lines captured in log file |
262
+
263
+ ### Log Analysis
264
+
265
+ Sample log showing successful action tracking:
266
+
267
+ ```text
268
+ action_start: on_activate (599ms)
269
+ action_start: show_preferences (17ms)
270
+ action_start: show_about (39ms)
271
+ action_start: on_compile_clicked (9ms)
272
+ info: Application shutdown
273
+ ```
274
+
275
+ ## Pending Work
276
+
277
+ ### Immediate (Next Session)
278
+
279
+ 1. **Commit Changes** - All hardened files need to be committed
280
+ 2. **Integration Tests** - Add automated tests for GUI resilience
281
+ 3. **GIR Version** - Consider upgrading gir1.2-adw-1 for PreferencesDialog
282
+
283
+ ### Future Considerations
284
+
285
+ ```mermaid
286
+ gantt
287
+ title Remaining GTK4 Work
288
+ dateFormat YYYY-MM-DD
289
+ section Hardening
290
+ Commit current changes :done, 2026-02-28, 1d
291
+ Add integration tests :active, 2026-02-28, 2d
292
+ section Compatibility
293
+ Investigate GIR upgrade :2026-03-01, 1d
294
+ Test on other systems :2026-03-01, 2d
295
+ section Features
296
+ Implement D-Bus methods :2026-03-02, 3d
297
+ Add preference persistence :2026-03-03, 2d
298
+ ```
299
+
300
+ ## How to Resume
301
+
302
+ ### On This Workstation
303
+
304
+ ```bash
305
+ cd /home/hugo/git/Neatnerds/Anthropic/rosett-ai
306
+ git status # Check uncommitted changes
307
+ ```
308
+
309
+ ### On Another Workstation
310
+
311
+ ```bash
312
+ git clone <repo-url>
313
+ cd rosett-ai
314
+ git checkout <branch-name>
315
+ bundle install
316
+ # Read this document for context
317
+ ```
318
+
319
+ ### Running the GTK4 App
320
+
321
+ ```bash
322
+ # Without logging
323
+ bundle exec bin/raictl desktop gtk4
324
+
325
+ # With debug logging
326
+ RAI_GUI_LOG=1 RAI_GUI_LOG_LEVEL=debug \
327
+ RAI_GUI_LOG_FILE=/tmp/rosett-ai-gui.log bundle exec bin/raictl desktop gtk4
328
+ ```
329
+
330
+ ## File Change Summary
331
+
332
+ ```text
333
+ lib/rosett_ai/desktop/
334
+ ├── dbus_client.rb # Modified: Safe defaults, never raises
335
+ ├── gtk4_app.rb # Modified: safe_action wrapper, GuiLogger
336
+ ├── gtk4_preferences.rb # Modified: safe_callback, version checks
337
+ └── gui_logger.rb # NEW: Structured JSON logging
338
+ ```
339
+
340
+ ## Conversation Context
341
+
342
+ This session continued from a previous context where:
343
+
344
+ - Engine Phase 1 (AGENTS.md) was completed
345
+ - Engine Phase 2 (Ollama/GPT-NeoX) was completed
346
+ - Desktop Phase 1 (D-Bus service) was completed
347
+ - Desktop Phase 2 (GTK4 app) had crash issues
348
+
349
+ The user's key requirement:
350
+
351
+ > "It is imperative that the application is robust and does not crash under any
352
+ > circumstances of usage. I am fully aware this is asking much but let's invest
353
+ > the time and effort to make this reliable, security-aware and safe above speed
354
+ > and snappiness."
355
+
356
+ ---
357
+
358
+ *Document generated: 2026-02-28*
359
+ *Session paused for breakfast*
data/doc/SETUP.md ADDED
@@ -0,0 +1,202 @@
1
+ # Rosett-AI - Setup Guide
2
+
3
+ ## Prerequisites
4
+
5
+ ### Ruby 3.3.10 via rbenv
6
+
7
+ This project requires Ruby 3.3.10. We use rbenv for Ruby version management.
8
+
9
+ #### Installing rbenv
10
+
11
+ ```bash
12
+ # On Debian/Ubuntu
13
+ sudo apt-get update
14
+ sudo apt-get install -y git curl autoconf bison build-essential \
15
+ libssl-dev libyaml-dev libreadline6-dev zlib1g-dev \
16
+ libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev
17
+
18
+ # Install rbenv
19
+ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
20
+ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
21
+ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
22
+ source ~/.bashrc
23
+
24
+ # Install ruby-build plugin
25
+ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
26
+ ```
27
+
28
+ #### Installing Ruby 3.3.10
29
+
30
+ ```bash
31
+ # Install Ruby 3.3.10
32
+ rbenv install 3.3.10
33
+
34
+ # Verify installation
35
+ rbenv versions
36
+
37
+ # The .ruby-version file will automatically select 3.3.10 in this directory
38
+ cd ~/.claude
39
+ ruby --version # Should show ruby 3.3.10
40
+ ```
41
+
42
+ ## Installation
43
+
44
+ ### 1. Clone/Initialize Repository
45
+
46
+ If you haven't already initialized the repository:
47
+
48
+ ```bash
49
+ cd ~/.claude
50
+ git init
51
+ ```
52
+
53
+ ### 2. Install Dependencies
54
+
55
+ ```bash
56
+ bundle install
57
+ ```
58
+
59
+ This installs all Bundler groups including `:desktop` (GTK4). If you do not
60
+ need desktop features or lack the GTK4 system libraries, exclude the group:
61
+
62
+ ```bash
63
+ bundle config set --local without 'desktop'
64
+ bundle install
65
+ ```
66
+
67
+ For desktop development, install system dependencies first:
68
+
69
+ ```bash
70
+ sudo apt-get install -y libgirepository1.0-dev libgtk-4-dev
71
+ bundle install
72
+ ```
73
+
74
+ ### 3. Install Git Hooks (CRITICAL)
75
+
76
+ **Important:** This step is mandatory. Without git hooks, code quality checks will not run before commits.
77
+
78
+ ```bash
79
+ # Install overcommit hooks
80
+ overcommit --install
81
+
82
+ # Verify hooks are installed correctly
83
+ ls -la .git/hooks/pre-commit && echo "✓ Pre-commit hook installed" || echo "✗ Hook installation failed"
84
+
85
+ # Test the hooks work
86
+ bundle exec overcommit --run
87
+ ```
88
+
89
+ ### 4. Verify Installation
90
+
91
+ ```bash
92
+ # Check CLI works
93
+ bin/raictl version
94
+
95
+ # Run tests
96
+ bundle exec rspec
97
+
98
+ # Run mutation testing
99
+ bundle exec mutant run
100
+
101
+ # Run linter
102
+ bundle exec rubocop
103
+
104
+ # Check for CVEs
105
+ bundle exec bundler-audit check
106
+ ```
107
+
108
+ ## Configuration
109
+
110
+ ### Global Settings
111
+
112
+ Edit `settings.json` to configure global Claude Code permissions:
113
+
114
+ ```json
115
+ {
116
+ "permissions": {
117
+ "allow": ["Bash(bundle:*)"],
118
+ "deny": ["Read(/home/user/.ssh/**)"]
119
+ }
120
+ }
121
+ ```
122
+
123
+ ### Local Overrides
124
+
125
+ Create `settings.local.json` for machine-specific settings (gitignored):
126
+
127
+ ```json
128
+ {
129
+ "permissions": {
130
+ "additionalDirectories": ["/custom/path"]
131
+ }
132
+ }
133
+ ```
134
+
135
+ ## Troubleshooting
136
+
137
+ ### Ruby version mismatch
138
+
139
+ If you see "Your Ruby version is X, but your Gemfile specified 3.3.10":
140
+
141
+ ```bash
142
+ rbenv install 3.3.10
143
+ rbenv local 3.3.10
144
+ ```
145
+
146
+ ### Bundler issues
147
+
148
+ If gems fail to install:
149
+
150
+ ```bash
151
+ gem install bundler
152
+ bundle config set --local path 'vendor/bundle'
153
+ bundle install
154
+ ```
155
+
156
+ ### Permission errors
157
+
158
+ Ensure the bin/raictl is executable:
159
+
160
+ ```bash
161
+ chmod +x bin/raictl
162
+ ```
163
+
164
+ ## Updating Dependencies
165
+
166
+ `Gemfile.lock` is tracked in git and CI uses frozen mode (see ADR-008).
167
+ Always commit lockfile changes explicitly.
168
+
169
+ To update a specific gem:
170
+
171
+ ```bash
172
+ bundle update <gem-name>
173
+ bundle exec rspec # verify tests pass
174
+ bundle exec rubocop # verify no new offenses
175
+ bundle exec bundler-audit check # verify no CVEs
176
+ git add Gemfile.lock
177
+ git commit -m "chore(deps): update <gem-name> to X.Y.Z"
178
+ ```
179
+
180
+ To update all dependencies:
181
+
182
+ ```bash
183
+ bundle update
184
+ bundle exec rspec && bundle exec rubocop
185
+ bundle exec bundler-audit check
186
+ git add Gemfile.lock
187
+ git commit -m "chore(deps): update all dependencies"
188
+ ```
189
+
190
+ ## Uninstalling
191
+
192
+ To remove the project while preserving Claude Code data:
193
+
194
+ ```bash
195
+ # Remove only the rosett-ai-related files
196
+ rm -rf bin/ lib/ spec/ doc/ conf/
197
+ rm -f Gemfile Gemfile.lock rosett-ai.gemspec Rakefile
198
+ rm -f .ruby-version .rubocop.yml .reek.yml .rspec
199
+ rm -f .overcommit.yml .gitleaks.toml
200
+ rm -rf .gitlab-ci-files/ .gitlab-ci.yml
201
+ rm -rf .git/
202
+ ```
@@ -0,0 +1,152 @@
1
+ # Test Peer Review Process
2
+
3
+ ## Overview
4
+
5
+ The test peer review process provides structured, human-verified quality
6
+ assurance for all test suites across the rosett-ai ecosystem. It uses a
7
+ questionnaire-based approach where each spec file is examined through 10
8
+ standardized questions that expose gaps, redundancy, incorrect assumptions,
9
+ and missing edge cases.
10
+
11
+ ## Why This Exists
12
+
13
+ When AI generates both code and tests, the test suite can be perfectly
14
+ consistent yet meaningless — tests that mirror the implementation rather than
15
+ validate behaviour. The peer review process creates an independent human
16
+ verification layer that cannot be short-circuited by AI.
17
+
18
+ ## Scope
19
+
20
+ | Repository | Spec Files | Examples |
21
+ |-----------|-----------|----------|
22
+ | rosett-ai (core) | 141 | ~1,637 |
23
+ | rosett-ai-engine-claude | 8 | ~104 |
24
+ | rosett-ai-engine-aider | 4 | ~42 |
25
+ | rosett-ai-engine-goose | 4 | ~42 |
26
+ | rosett-ai-engine-gpt-neox | 4 | ~40 |
27
+ | rosett-ai-engine-ollama | 4 | ~39 |
28
+ | rosett-ai-engine-agents-md | 3 | ~25 |
29
+ | rosett-ai-engine-copilot | 3 | ~25 |
30
+ | rosett-ai-engine-cursor | 3 | ~25 |
31
+ | rosett-ai-engine-windsurf | 3 | ~25 |
32
+ | rosett-ai-engine-acme | 3 | ~21 |
33
+ | rosett-ai-engine-generic | 2 | ~17 |
34
+ | **Total** | **174** | **~1,882** |
35
+
36
+ ## Questionnaire (Q1–Q10)
37
+
38
+ Each spec file is evaluated against these questions:
39
+
40
+ | # | Question | Severity | What to look for |
41
+ |---|----------|----------|-----------------|
42
+ | Q1 | Intent Clarity | major | Can you explain what the file tests in one sentence? |
43
+ | Q2 | Assertion Quality | critical | Concrete values, not computed from implementation? |
44
+ | Q3 | Edge Case Coverage | major | Empty, nil, boundary, error paths tested? |
45
+ | Q4 | Mock Appropriateness | critical | Mocks only at boundaries, never the unit under test? |
46
+ | Q5 | Implementation Independence | critical | Would tests pass with a rewritten implementation? |
47
+ | Q6 | Mutation Resilience | major | Would mutating the code cause test failures? |
48
+ | Q7 | Naming Quality | minor | Behaviour specs, not implementation descriptions? |
49
+ | Q8 | Fixture Quality | major | Minimal, representative, no sensitive data? |
50
+ | Q9 | Completeness | major | All public methods covered, happy + unhappy paths? |
51
+ | Q10 | Documentation | minor | New developer would understand why each test exists? |
52
+
53
+ ## Verdicts
54
+
55
+ **Per question:** pass, concern, fail
56
+
57
+ **Per file:**
58
+
59
+ - `approved` — All questions pass or concern only
60
+ - `approved_with_notes` — Minor concerns, acceptable as-is
61
+ - `needs_fix` — Findings require code changes before sign-off
62
+ - `rejected` — Fundamental issues, test needs rewriting
63
+
64
+ ## Finding Severities
65
+
66
+ - **critical** — Blocks sign-off, must be resolved
67
+ - **major** — Should be resolved, can be deferred with justification
68
+ - **minor** — Noted for improvement, does not block
69
+
70
+ ## Workflow
71
+
72
+ ```text
73
+ Phase 1: AI prepares review summary (intent, metrics, observations)
74
+ Phase 2: Human reads spec file + AI summary, answers Q1-Q10
75
+ Phase 3: AI records answers and findings in registry YAML
76
+ Phase 4: If findings exist → AI proposes fixes → human approves
77
+ Phase 5: Human signs off (or requests further changes)
78
+ Phase 6: Progress report updated
79
+ ```
80
+
81
+ ## Review Batches (Priority Order)
82
+
83
+ 1. **Core foundation** — path_resolver, version, config (~10 files)
84
+ 2. **Core compiler** — compiler, composition (~15 files)
85
+ 3. **Core security** — policy, secrets, validation (~12 files)
86
+ 4. **Core CLI tasks** — thor/tasks/* (~26 files)
87
+ 5. **Core modules** — authorship, provenance, etc. (~30 files)
88
+ 6. **Core UI/desktop** — gtk4, qt6, tui (~8 files)
89
+ 7. **Core utilities** — gemspec, version, i18n (~5 files)
90
+ 8. **Engine: claude** — highest complexity (~8 files)
91
+ 9. **Remaining engines** — 10 engines (~25 files)
92
+
93
+ ## Files
94
+
95
+ | File | Purpose |
96
+ |------|---------|
97
+ | `conf/design/test_peer_review.yml` | Design document (intent, constraints, decisions) |
98
+ | `conf/review/questionnaire.yml` | Questionnaire template (Q1-Q10 definitions) |
99
+ | `conf/review/rosett-ai-core.yml` | Review registry for core repository |
100
+ | `conf/review/rosett-ai-engine-*.yml` | Review registries for engine repositories |
101
+
102
+ ## Controlled Stub Allowlists
103
+
104
+ ### Problem
105
+
106
+ Thor's `invoke` instantiates command classes internally, so test code cannot
107
+ obtain the instance before the call. This forces the use of RSpec's
108
+ `allow_any_instance_of` — a known code smell that stubs methods on ALL
109
+ instances of a class, bypassing normal instance-level mocking.
110
+
111
+ See: [RSpec any_instance documentation](https://rspec.info/features/3-13/rspec-mocks/working-with-legacy-code/any-instance/)
112
+
113
+ ### Solution
114
+
115
+ Build-related spec files define a `stubbable_methods` allowlist: a method
116
+ returning a frozen array of the ONLY methods permitted for
117
+ `allow_any_instance_of` stubbing. Three helper methods enforce the boundary:
118
+
119
+ - `stub_all_stages` — stubs all build pipeline stages (the common case)
120
+ - `stub_stages(*methods)` — stubs a subset (raises if not in allowlist)
121
+ - `stub_stage(method, return: val)` — stubs one method with return value or
122
+ block implementation (raises if not in allowlist)
123
+
124
+ A dedicated spec example verifies that every method in the allowlist still
125
+ exists on the class under test. If the implementation renames or removes a
126
+ method, this example fails immediately with a clear message.
127
+
128
+ ### Maintenance requirement
129
+
130
+ When a new build stage or shell-boundary method is added to `BuildPackage`
131
+ or `BuildEngine`, developers must:
132
+
133
+ 1. Add the method name to `stubbable_methods` in the corresponding spec file
134
+ 2. Use `stub_stages` or `stub_stage` to stub it (never raw
135
+ `allow_any_instance_of`)
136
+ 3. Verify the allowlist guard example still passes
137
+
138
+ This is intentional friction — it forces conscious review of every method
139
+ that bypasses real execution in tests. A raw `allow_any_instance_of` call
140
+ outside the helpers will be caught in code review.
141
+
142
+ ### Affected files
143
+
144
+ | Spec file | Allowlist method |
145
+ |-----------|-----------------|
146
+ | `spec/rosett_ai/thor/tasks/build_package_spec.rb` | `stubbable_methods` (12 methods) |
147
+ | `spec/rosett_ai/thor/tasks/build_engine_spec.rb` | (to be added in future review) |
148
+
149
+ ## Design Reference
150
+
151
+ See `conf/design/test_peer_review.yml` for the full design document including
152
+ decisions TPR-1 through TPR-7.