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,2919 @@
1
+ ---
2
+ # Test Peer Review Registry — Rosett-AI core
3
+ # Generated: 2026-03-14
4
+ # Questionnaire: conf/review/questionnaire.yml
5
+ #
6
+ # Status values: pending | in_review | needs_fix | signed_off
7
+ # This file is updated during the review process.
8
+
9
+ repository: rosett-ai
10
+ total_files: 142
11
+ reviewed: 142
12
+ signed_off: 142
13
+
14
+ files:
15
+ spec/rosett_ai/project_context_spec.rb:
16
+ status: signed_off
17
+ reviewer: hugo
18
+ review_date: "2026-03-15"
19
+ sign_off_date: "2026-03-15"
20
+ verdict: approved_with_notes
21
+ intent: "Verifies ProjectContext detects rai projects by walking up for .rosett-ai/ markers, respecting RAI_ORIGINAL_PWD and explicit start_dir"
22
+ answers:
23
+ Q1: pass
24
+ Q2: pass
25
+ Q3: pass
26
+ Q4: pass
27
+ Q5: pass
28
+ Q6: pass
29
+ Q7: pass
30
+ Q8: pass
31
+ Q9: pass
32
+ Q10: concern
33
+ findings:
34
+ - severity: minor
35
+ question: Q10
36
+ description: "around blocks for env var save/restore lacked explanatory comments for junior developers"
37
+ resolution: "Added inline documentation comments explaining the pattern"
38
+
39
+ spec/rosett_ai/thor/tasks/build_package_spec.rb:
40
+ status: signed_off
41
+ reviewer: hugo
42
+ review_date: "2026-03-15"
43
+ sign_off_date: "2026-03-15"
44
+ verdict: approved_with_notes
45
+ intent: "Verifies BuildPackage produces correct .deb packages with staging, variant handling, environment validation, and build summary"
46
+ answers:
47
+ Q1: pass
48
+ Q2: pass
49
+ Q3: pass
50
+ Q4: concern
51
+ Q5: concern
52
+ Q6: pass
53
+ Q7: pass
54
+ Q8: pass
55
+ Q9: pass
56
+ Q10: concern
57
+ findings:
58
+ - severity: minor
59
+ question: Q4
60
+ description: "Extensive use of allow_any_instance_of — pragmatic for Thor but a known RSpec smell"
61
+ resolution: "Created controlled stub allowlist: stubbable_methods + stub_stages/stub_stage helpers + guard example. See doc/TEST_PEER_REVIEW.md"
62
+ - severity: minor
63
+ question: Q5
64
+ description: "Private helper methods (format_size, format_duration, clean_env) tested via send"
65
+ resolution: "Extracted format_size/format_duration to RosettAi::Formatting module (spec/rosett_ai/formatting_spec.rb). clean_env retained with send — justified inline (no public surface, build-critical env isolation)"
66
+ - severity: minor
67
+ question: Q10
68
+ description: "stub_all_stages helper and 30-line before block lacked explanatory comments"
69
+ resolution: "Added inline documentation comments explaining fixture setup and stub rationale"
70
+
71
+ spec/rosett_ai/thor/tasks/build_engine_spec.rb:
72
+ status: signed_off
73
+ reviewer: hugo
74
+ review_date: "2026-03-15"
75
+ sign_off_date: "2026-03-15"
76
+ verdict: approved_with_notes
77
+ intent: "Verifies BuildEngine detects engine gemspecs, validates build environment, and produces correct .deb filenames and staging paths"
78
+ answers:
79
+ Q1: pass
80
+ Q2: pass
81
+ Q3: pass
82
+ Q4: concern
83
+ Q5: concern
84
+ Q6: pass
85
+ Q7: pass
86
+ Q8: pass
87
+ Q9: pass
88
+ Q10: concern
89
+ findings:
90
+ - severity: minor
91
+ question: Q4
92
+ description: "Gemspec detection tests use instance_variable_get to verify parsed values"
93
+ resolution: "Pragmatic — parsed values only exposed through downstream output; ivar access isolates unit from full pipeline. Documented inline."
94
+ - severity: minor
95
+ question: Q5
96
+ description: "Tests set instance variables directly and call private methods via send, coupling to internal structure"
97
+ resolution: "format_size removed (now in RosettAi::Formatting module). Remaining send/ivar usage justified — gemspec pipeline and package_filename have no public accessor surface."
98
+ - severity: minor
99
+ question: Q10
100
+ description: "Three-step gemspec pipeline and manual ivar setup lacked explanatory comments"
101
+ resolution: "Added inline documentation comments explaining the pipeline and isolation rationale"
102
+
103
+ # --- Batch 2: Core Foundation (reviewed 2026-03-15) ---
104
+
105
+ spec/nncc_spec.rb:
106
+ status: signed_off
107
+ reviewer: hugo
108
+ review_date: "2026-03-15"
109
+ sign_off_date: "2026-03-15"
110
+ verdict: approved
111
+ intent: "Verifies the top-level RosettAi module exposes correct VERSION format, memoized .root/.config singletons, and properly structured error class hierarchy"
112
+ answers:
113
+ Q1: pass
114
+ Q2: pass
115
+ Q3: pass
116
+ Q4: pass
117
+ Q5: pass
118
+ Q6: pass
119
+ Q7: pass
120
+ Q8: pass
121
+ Q9: pass
122
+ Q10: pass
123
+ findings: []
124
+
125
+ spec/rosett_ai/configuration_spec.rb:
126
+ status: signed_off
127
+ reviewer: hugo
128
+ review_date: "2026-03-15"
129
+ sign_off_date: "2026-03-15"
130
+ verdict: approved_with_notes
131
+ intent: "Verifies Configuration loads settings.json and settings.local.json, deep-merges nested hashes with array union deduplication, handles type mismatches, and clears memoized state on reload!"
132
+ answers:
133
+ Q1: pass
134
+ Q2: pass
135
+ Q3: pass
136
+ Q4: pass
137
+ Q5: concern
138
+ Q6: pass
139
+ Q7: pass
140
+ Q8: pass
141
+ Q9: pass
142
+ Q10: pass
143
+ findings:
144
+ - severity: minor
145
+ question: Q5
146
+ description: "reload! test used instance_variable_get to verify internal memoization state"
147
+ resolution: "Replaced with 4 behavioral tests verifying re-read of settings, local_settings, merged_settings, and behaviour_files after reload!"
148
+
149
+ spec/rosett_ai/rai_config_spec.rb:
150
+ status: signed_off
151
+ reviewer: hugo
152
+ review_date: "2026-03-15"
153
+ sign_off_date: "2026-03-15"
154
+ verdict: approved
155
+ intent: "Verifies RaiConfig returns compiled defaults when no config file exists, deep-merges user values, validates against JSON Schema, supports dotted-key updates with type coercion, and provides a memoized singleton"
156
+ answers:
157
+ Q1: pass
158
+ Q2: pass
159
+ Q3: pass
160
+ Q4: pass
161
+ Q5: pass
162
+ Q6: pass
163
+ Q7: pass
164
+ Q8: pass
165
+ Q9: pass
166
+ Q10: pass
167
+ findings: []
168
+
169
+ spec/rosett_ai/path_resolver_spec.rb:
170
+ status: signed_off
171
+ reviewer: hugo
172
+ review_date: "2026-03-15"
173
+ sign_off_date: "2026-03-15"
174
+ verdict: approved_with_notes
175
+ intent: "Verifies PathResolver resolves all filesystem paths correctly, respects RAI_ORIGINAL_PWD for .deb wrapper compatibility, honours XDG_CONFIG_HOME for Rosett-AI-domain paths, and provides a memoized singleton"
176
+ answers:
177
+ Q1: pass
178
+ Q2: pass
179
+ Q3: pass
180
+ Q4: pass
181
+ Q5: concern
182
+ Q6: pass
183
+ Q7: pass
184
+ Q8: pass
185
+ Q9: pass
186
+ Q10: pass
187
+ findings:
188
+ - severity: minor
189
+ question: Q5
190
+ description: "Test used instance_variable_get(:@engine) because engine value had no observable output"
191
+ resolution: "Added attr_reader :engine to PathResolver, test now uses public accessor — multi-engine ready"
192
+
193
+ spec/rosett_ai/version_consistency_checker_spec.rb:
194
+ status: signed_off
195
+ reviewer: hugo
196
+ review_date: "2026-03-15"
197
+ sign_off_date: "2026-03-15"
198
+ verdict: approved
199
+ intent: "Verifies VersionConsistencyChecker detects stale Ruby version references, correctly excludes build artifacts and version-pinning patterns, and reports file/line/found/expected for each mismatch"
200
+ answers:
201
+ Q1: pass
202
+ Q2: pass
203
+ Q3: pass
204
+ Q4: pass
205
+ Q5: pass
206
+ Q6: pass
207
+ Q7: pass
208
+ Q8: pass
209
+ Q9: pass
210
+ Q10: pass
211
+ findings: []
212
+
213
+ spec/rosett_ai/secrets_resolver_spec.rb:
214
+ status: signed_off
215
+ reviewer: hugo
216
+ review_date: "2026-03-15"
217
+ sign_off_date: "2026-03-15"
218
+ verdict: approved
219
+ intent: "Verifies SecretsResolver resolves secrets through ENV > secrets file fallback, rejects insecure file permissions (non-0600), and provides actionable error messages with setup instructions"
220
+ answers:
221
+ Q1: pass
222
+ Q2: pass
223
+ Q3: pass
224
+ Q4: pass
225
+ Q5: pass
226
+ Q6: pass
227
+ Q7: pass
228
+ Q8: pass
229
+ Q9: pass
230
+ Q10: pass
231
+ findings: []
232
+
233
+ spec/rosett_ai/validators/schema_validator_spec.rb:
234
+ status: signed_off
235
+ reviewer: hugo
236
+ review_date: "2026-03-15"
237
+ sign_off_date: "2026-03-15"
238
+ verdict: approved
239
+ intent: "Verifies SchemaValidator loads JSON schemas, validates YAML files against them, and provides clear error messages for missing files, broken YAML, and schema violations"
240
+ answers:
241
+ Q1: pass
242
+ Q2: pass
243
+ Q3: pass
244
+ Q4: pass
245
+ Q5: pass
246
+ Q6: pass
247
+ Q7: pass
248
+ Q8: pass
249
+ Q9: pass
250
+ Q10: pass
251
+ findings: []
252
+
253
+ spec/rosett_ai/validators/behaviour_validator_spec.rb:
254
+ status: signed_off
255
+ reviewer: hugo
256
+ review_date: "2026-03-15"
257
+ sign_off_date: "2026-03-15"
258
+ verdict: approved
259
+ intent: "Verifies BehaviourValidator validates behaviour YAML files against the behaviour JSON Schema, catching missing fields, empty rules, invalid rule structures, and malformed version strings"
260
+ answers:
261
+ Q1: pass
262
+ Q2: pass
263
+ Q3: pass
264
+ Q4: pass
265
+ Q5: pass
266
+ Q6: pass
267
+ Q7: pass
268
+ Q8: pass
269
+ Q9: pass
270
+ Q10: pass
271
+ findings: []
272
+
273
+ spec/rosett_ai/validators/design_validator_spec.rb:
274
+ status: signed_off
275
+ reviewer: hugo
276
+ review_date: "2026-03-15"
277
+ sign_off_date: "2026-03-15"
278
+ verdict: approved
279
+ intent: "Verifies DesignValidator validates design documents against the design JSON Schema and that all existing design files pass validation"
280
+ answers:
281
+ Q1: pass
282
+ Q2: pass
283
+ Q3: pass
284
+ Q4: pass
285
+ Q5: pass
286
+ Q6: pass
287
+ Q7: pass
288
+ Q8: pass
289
+ Q9: pass
290
+ Q10: pass
291
+ findings: []
292
+
293
+ spec/rosett_ai/validators/tooling_validator_spec.rb:
294
+ status: signed_off
295
+ reviewer: hugo
296
+ review_date: "2026-03-15"
297
+ sign_off_date: "2026-03-15"
298
+ verdict: approved
299
+ intent: "Verifies ToolingValidator validates tooling configuration files against the tooling JSON Schema and that all existing tooling files pass validation"
300
+ answers:
301
+ Q1: pass
302
+ Q2: pass
303
+ Q3: pass
304
+ Q4: pass
305
+ Q5: pass
306
+ Q6: pass
307
+ Q7: pass
308
+ Q8: pass
309
+ Q9: pass
310
+ Q10: pass
311
+ findings: []
312
+
313
+ # --- Batch 3: Core Compiler + Composition (reviewed 2026-03-15) ---
314
+
315
+ spec/rosett_ai/compiler/compilation_pipeline_spec.rb:
316
+ status: signed_off
317
+ reviewer: hugo
318
+ review_date: "2026-03-15"
319
+ sign_off_date: "2026-03-15"
320
+ verdict: approved
321
+ intent: "Verifies CompilationPipeline discovers categories, compiles behaviour YAML to markdown, produces checksums, and detects orphaned managed files"
322
+ answers:
323
+ Q1: pass
324
+ Q2: pass
325
+ Q3: pass
326
+ Q4: pass
327
+ Q5: pass
328
+ Q6: pass
329
+ Q7: pass
330
+ Q8: pass
331
+ Q9: pass
332
+ Q10: pass
333
+ findings: []
334
+
335
+ spec/rosett_ai/compiler/behaviour_compiler_spec.rb:
336
+ status: signed_off
337
+ reviewer: hugo
338
+ review_date: "2026-03-15"
339
+ sign_off_date: "2026-03-15"
340
+ verdict: approved_with_notes
341
+ intent: "Verifies BehaviourCompiler loads YAML, validates against schema, generates markdown with backend-appropriate templates, handles lockfile data and multi-category compilation"
342
+ answers:
343
+ Q1: pass
344
+ Q2: pass
345
+ Q3: pass
346
+ Q4: concern
347
+ Q5: pass
348
+ Q6: pass
349
+ Q7: pass
350
+ Q8: pass
351
+ Q9: pass
352
+ Q10: pass
353
+ findings:
354
+ - severity: minor
355
+ question: Q4
356
+ description: "Mocks class under test for lockfile_data — spy on compile result rather than exercising real pipeline"
357
+ resolution: "Pragmatic — lockfile_data is an accessor on compiled output, mocking avoids full pipeline setup. Documented inline."
358
+
359
+ spec/rosett_ai/compiler/backend_spec.rb:
360
+ status: signed_off
361
+ reviewer: hugo
362
+ review_date: "2026-03-15"
363
+ sign_off_date: "2026-03-15"
364
+ verdict: approved_with_notes
365
+ intent: "Verifies Backend.for resolves engine names to backend classes, handles aliases, raises for unknown engines, and supports the deprecated Backend.resolve_backend_class path"
366
+ answers:
367
+ Q1: pass
368
+ Q2: pass
369
+ Q3: pass
370
+ Q4: pass
371
+ Q5: concern
372
+ Q6: pass
373
+ Q7: pass
374
+ Q8: pass
375
+ Q9: pass
376
+ Q10: pass
377
+ findings:
378
+ - severity: minor
379
+ question: Q5
380
+ description: "Uses send(:resolve_backend_class) to test private class resolution method"
381
+ resolution: "Pragmatic — resolve_backend_class has no public surface, only consumed by Backend.for. Testing via send isolates the resolver from full pipeline."
382
+
383
+ spec/rosett_ai/compiler/backends/claude_backend_spec.rb:
384
+ status: signed_off
385
+ reviewer: hugo
386
+ review_date: "2026-03-15"
387
+ sign_off_date: "2026-03-15"
388
+ verdict: approved
389
+ intent: "Verifies ClaudeBackend is a deprecated alias that resolves to the correct backend class"
390
+ answers:
391
+ Q1: pass
392
+ Q2: pass
393
+ Q3: pass
394
+ Q4: pass
395
+ Q5: pass
396
+ Q6: pass
397
+ Q7: pass
398
+ Q8: pass
399
+ Q9: pass
400
+ Q10: pass
401
+ findings: []
402
+
403
+ spec/rosett_ai/compiler/backends/generic_backend_spec.rb:
404
+ status: signed_off
405
+ reviewer: hugo
406
+ review_date: "2026-03-15"
407
+ sign_off_date: "2026-03-15"
408
+ verdict: approved
409
+ intent: "Verifies GenericBackend is a deprecated alias that resolves to the correct backend class"
410
+ answers:
411
+ Q1: pass
412
+ Q2: pass
413
+ Q3: pass
414
+ Q4: pass
415
+ Q5: pass
416
+ Q6: pass
417
+ Q7: pass
418
+ Q8: pass
419
+ Q9: pass
420
+ Q10: pass
421
+ findings: []
422
+
423
+ spec/rosett_ai/compiler/capability_checker_spec.rb:
424
+ status: signed_off
425
+ reviewer: hugo
426
+ review_date: "2026-03-15"
427
+ sign_off_date: "2026-03-15"
428
+ verdict: approved
429
+ intent: "Verifies CapabilityChecker detects unsupported behaviour features for target engines, produces summarized warnings, and correctly passes through supported features"
430
+ answers:
431
+ Q1: pass
432
+ Q2: pass
433
+ Q3: pass
434
+ Q4: pass
435
+ Q5: pass
436
+ Q6: pass
437
+ Q7: pass
438
+ Q8: pass
439
+ Q9: pass
440
+ Q10: pass
441
+ findings: []
442
+
443
+ spec/rosett_ai/compiler/target_profile_spec.rb:
444
+ status: signed_off
445
+ reviewer: hugo
446
+ review_date: "2026-03-15"
447
+ sign_off_date: "2026-03-15"
448
+ verdict: approved
449
+ intent: "Verifies TargetProfile loads engine YAML profiles, exposes output_dir/template/features/metadata, and raises for missing profile files"
450
+ answers:
451
+ Q1: pass
452
+ Q2: pass
453
+ Q3: pass
454
+ Q4: pass
455
+ Q5: pass
456
+ Q6: pass
457
+ Q7: pass
458
+ Q8: pass
459
+ Q9: pass
460
+ Q10: pass
461
+ findings: []
462
+
463
+ spec/rosett_ai/compiler/locale_compiler_spec.rb:
464
+ status: signed_off
465
+ reviewer: hugo
466
+ review_date: "2026-03-15"
467
+ sign_off_date: "2026-03-15"
468
+ verdict: approved
469
+ intent: "Verifies LocaleCompiler compiles YAML locale files to gettext .po and Qt .ts formats, handles missing source directories, and produces correct file structures"
470
+ answers:
471
+ Q1: pass
472
+ Q2: pass
473
+ Q3: pass
474
+ Q4: pass
475
+ Q5: pass
476
+ Q6: pass
477
+ Q7: pass
478
+ Q8: pass
479
+ Q9: pass
480
+ Q10: pass
481
+ findings: []
482
+
483
+ spec/rosett_ai/compiler/compiled_output_spec.rb:
484
+ status: signed_off
485
+ reviewer: hugo
486
+ review_date: "2026-03-15"
487
+ sign_off_date: "2026-03-15"
488
+ verdict: approved
489
+ intent: "Verifies CompiledOutput wraps compilation results with content, metadata, and checksum accessors"
490
+ answers:
491
+ Q1: pass
492
+ Q2: pass
493
+ Q3: pass
494
+ Q4: pass
495
+ Q5: pass
496
+ Q6: pass
497
+ Q7: pass
498
+ Q8: pass
499
+ Q9: pass
500
+ Q10: pass
501
+ findings: []
502
+
503
+ spec/rosett_ai/thor/tasks/compile_spec.rb:
504
+ status: signed_off
505
+ reviewer: hugo
506
+ review_date: "2026-03-15"
507
+ sign_off_date: "2026-03-15"
508
+ verdict: approved_with_notes
509
+ intent: "Verifies Compile Thor task creates markdown rule files, handles simulate/verbose/vendor/engine options, removes orphans, and emits deprecation warnings for --target"
510
+ answers:
511
+ Q1: pass
512
+ Q2: pass
513
+ Q3: pass
514
+ Q4: concern
515
+ Q5: pass
516
+ Q6: pass
517
+ Q7: pass
518
+ Q8: pass
519
+ Q9: pass
520
+ Q10: pass
521
+ findings:
522
+ - severity: minor
523
+ question: Q4
524
+ description: "Used bare allow_any_instance_of for resolve_target_dir — Thor invoke prevents instance access"
525
+ resolution: "Created controlled stub allowlist: stubbable_methods + stub_stages/stub_stage helpers + guard example, consistent with build_package_spec.rb pattern"
526
+
527
+ spec/rosett_ai/composition/composer_spec.rb:
528
+ status: signed_off
529
+ reviewer: hugo
530
+ review_date: "2026-03-15"
531
+ sign_off_date: "2026-03-15"
532
+ verdict: approved
533
+ intent: "Verifies Composer orchestrates the full composition pipeline: priority sorting, scope resolution, conflict detection, circular dependency checks, and produces a CompositionResult"
534
+ answers:
535
+ Q1: pass
536
+ Q2: pass
537
+ Q3: pass
538
+ Q4: pass
539
+ Q5: pass
540
+ Q6: pass
541
+ Q7: pass
542
+ Q8: pass
543
+ Q9: pass
544
+ Q10: pass
545
+ findings: []
546
+
547
+ spec/rosett_ai/composition/circular_dependency_detector_spec.rb:
548
+ status: signed_off
549
+ reviewer: hugo
550
+ review_date: "2026-03-15"
551
+ sign_off_date: "2026-03-15"
552
+ verdict: approved
553
+ intent: "Verifies CircularDependencyDetector identifies circular requires between behaviours and reports the cycle path"
554
+ answers:
555
+ Q1: pass
556
+ Q2: pass
557
+ Q3: pass
558
+ Q4: pass
559
+ Q5: pass
560
+ Q6: pass
561
+ Q7: pass
562
+ Q8: pass
563
+ Q9: pass
564
+ Q10: pass
565
+ findings: []
566
+
567
+ spec/rosett_ai/composition/conflict_detector_spec.rb:
568
+ status: signed_off
569
+ reviewer: hugo
570
+ review_date: "2026-03-15"
571
+ sign_off_date: "2026-03-15"
572
+ verdict: approved
573
+ intent: "Verifies ConflictDetector identifies rule ID collisions across behaviours and reports conflicting sources"
574
+ answers:
575
+ Q1: pass
576
+ Q2: pass
577
+ Q3: pass
578
+ Q4: pass
579
+ Q5: pass
580
+ Q6: pass
581
+ Q7: pass
582
+ Q8: pass
583
+ Q9: pass
584
+ Q10: pass
585
+ findings: []
586
+
587
+ spec/rosett_ai/composition/lockfile_spec.rb:
588
+ status: signed_off
589
+ reviewer: hugo
590
+ review_date: "2026-03-15"
591
+ sign_off_date: "2026-03-15"
592
+ verdict: approved
593
+ intent: "Verifies Lockfile generates and reads compile.lock.yml with generator metadata, SHA-256 checksums, and version stamps"
594
+ answers:
595
+ Q1: pass
596
+ Q2: pass
597
+ Q3: pass
598
+ Q4: pass
599
+ Q5: pass
600
+ Q6: pass
601
+ Q7: pass
602
+ Q8: pass
603
+ Q9: pass
604
+ Q10: pass
605
+ findings: []
606
+
607
+ spec/rosett_ai/composition/priority_sorter_spec.rb:
608
+ status: signed_off
609
+ reviewer: hugo
610
+ review_date: "2026-03-15"
611
+ sign_off_date: "2026-03-15"
612
+ verdict: approved
613
+ intent: "Verifies PrioritySorter orders behaviours by priority field, handles equal priorities with stable sort, and places lower priority numbers first"
614
+ answers:
615
+ Q1: pass
616
+ Q2: pass
617
+ Q3: pass
618
+ Q4: pass
619
+ Q5: pass
620
+ Q6: pass
621
+ Q7: pass
622
+ Q8: pass
623
+ Q9: pass
624
+ Q10: pass
625
+ findings: []
626
+
627
+ spec/rosett_ai/composition/scope_resolver_spec.rb:
628
+ status: signed_off
629
+ reviewer: hugo
630
+ review_date: "2026-03-15"
631
+ sign_off_date: "2026-03-15"
632
+ verdict: approved
633
+ intent: "Verifies ScopeResolver filters behaviours by used_in scope tags, handles global/project/engine scopes, and passes through unscoped behaviours"
634
+ answers:
635
+ Q1: pass
636
+ Q2: pass
637
+ Q3: pass
638
+ Q4: pass
639
+ Q5: pass
640
+ Q6: pass
641
+ Q7: pass
642
+ Q8: pass
643
+ Q9: pass
644
+ Q10: pass
645
+ findings: []
646
+
647
+ spec/rosett_ai/composition/composition_result_spec.rb:
648
+ status: signed_off
649
+ reviewer: hugo
650
+ review_date: "2026-03-15"
651
+ sign_off_date: "2026-03-15"
652
+ verdict: approved
653
+ intent: "Verifies CompositionResult wraps composed behaviours with conflict/circular reports, provides success?/warnings accessors, and supports serialization"
654
+ answers:
655
+ Q1: pass
656
+ Q2: pass
657
+ Q3: pass
658
+ Q4: pass
659
+ Q5: pass
660
+ Q6: pass
661
+ Q7: pass
662
+ Q8: pass
663
+ Q9: pass
664
+ Q10: pass
665
+ findings: []
666
+
667
+ # --- Batch 4: Policy + Provenance + Authorship + AI Config (reviewed 2026-03-15) ---
668
+
669
+ spec/rosett_ai/policy/auditor_spec.rb:
670
+ status: signed_off
671
+ reviewer: hugo
672
+ review_date: "2026-03-15"
673
+ sign_off_date: "2026-03-15"
674
+ verdict: approved
675
+ intent: "Verifies Auditor counts deny list patterns, denied files, and protected files in a project and reports compliance status"
676
+ answers:
677
+ Q1: pass
678
+ Q2: pass
679
+ Q3: pass
680
+ Q4: pass
681
+ Q5: pass
682
+ Q6: pass
683
+ Q7: pass
684
+ Q8: pass
685
+ Q9: pass
686
+ Q10: pass
687
+ findings: []
688
+
689
+ spec/rosett_ai/policy/deny_list_spec.rb:
690
+ status: signed_off
691
+ reviewer: hugo
692
+ review_date: "2026-03-15"
693
+ sign_off_date: "2026-03-15"
694
+ verdict: approved
695
+ intent: "Verifies DenyList matches glob patterns against file paths, supports merge with deduplication, and provides size/empty? collection semantics"
696
+ answers:
697
+ Q1: pass
698
+ Q2: pass
699
+ Q3: pass
700
+ Q4: pass
701
+ Q5: pass
702
+ Q6: pass
703
+ Q7: pass
704
+ Q8: pass
705
+ Q9: pass
706
+ Q10: pass
707
+ findings: []
708
+
709
+ spec/rosett_ai/policy/opt_out_scanner_spec.rb:
710
+ status: signed_off
711
+ reviewer: hugo
712
+ review_date: "2026-03-15"
713
+ sign_off_date: "2026-03-15"
714
+ verdict: approved
715
+ intent: "Verifies OptOutScanner detects AI-MODIFICATION: disabled markers in files and scans batches for opted-out files"
716
+ answers:
717
+ Q1: pass
718
+ Q2: pass
719
+ Q3: pass
720
+ Q4: pass
721
+ Q5: pass
722
+ Q6: pass
723
+ Q7: pass
724
+ Q8: pass
725
+ Q9: pass
726
+ Q10: pass
727
+ findings: []
728
+
729
+ spec/rosett_ai/policy/policy_compiler_spec.rb:
730
+ status: signed_off
731
+ reviewer: hugo
732
+ review_date: "2026-03-15"
733
+ sign_off_date: "2026-03-15"
734
+ verdict: approved
735
+ intent: "Verifies PolicyCompiler compiles deny lists and protected files to engine-specific formats (Claude deniedPaths, Cursor ignore_patterns, AGENTS.md denied_access) with warnings for unknown engines"
736
+ answers:
737
+ Q1: pass
738
+ Q2: pass
739
+ Q3: pass
740
+ Q4: pass
741
+ Q5: pass
742
+ Q6: pass
743
+ Q7: pass
744
+ Q8: pass
745
+ Q9: pass
746
+ Q10: pass
747
+ findings: []
748
+
749
+ spec/rosett_ai/policy/protected_files_spec.rb:
750
+ status: signed_off
751
+ reviewer: hugo
752
+ review_date: "2026-03-15"
753
+ sign_off_date: "2026-03-15"
754
+ verdict: approved
755
+ intent: "Verifies ProtectedFiles identifies protected paths, supports merge with deduplication, and provides size/empty? collection semantics"
756
+ answers:
757
+ Q1: pass
758
+ Q2: pass
759
+ Q3: pass
760
+ Q4: pass
761
+ Q5: pass
762
+ Q6: pass
763
+ Q7: pass
764
+ Q8: pass
765
+ Q9: pass
766
+ Q10: pass
767
+ findings: []
768
+
769
+ spec/rosett_ai/policy/tier_hierarchy_spec.rb:
770
+ status: signed_off
771
+ reviewer: hugo
772
+ review_date: "2026-03-15"
773
+ sign_off_date: "2026-03-15"
774
+ verdict: approved
775
+ intent: "Verifies TierHierarchy enforces tighten-only pattern (child can add but not remove deny patterns) and validates tier/scope enum values"
776
+ answers:
777
+ Q1: pass
778
+ Q2: pass
779
+ Q3: pass
780
+ Q4: pass
781
+ Q5: pass
782
+ Q6: pass
783
+ Q7: pass
784
+ Q8: pass
785
+ Q9: pass
786
+ Q10: pass
787
+ findings: []
788
+
789
+ spec/rosett_ai/policy/validator_spec.rb:
790
+ status: signed_off
791
+ reviewer: hugo
792
+ review_date: "2026-03-15"
793
+ sign_off_date: "2026-03-15"
794
+ verdict: approved
795
+ intent: "Verifies Validator catches missing policy_version/tier fields, rejects invalid tier and scope enum values, and provides valid? convenience method"
796
+ answers:
797
+ Q1: pass
798
+ Q2: pass
799
+ Q3: pass
800
+ Q4: pass
801
+ Q5: pass
802
+ Q6: pass
803
+ Q7: pass
804
+ Q8: pass
805
+ Q9: pass
806
+ Q10: pass
807
+ findings: []
808
+
809
+ spec/rosett_ai/provenance/entry_spec.rb:
810
+ status: signed_off
811
+ reviewer: hugo
812
+ review_date: "2026-03-15"
813
+ sign_off_date: "2026-03-15"
814
+ verdict: approved
815
+ intent: "Verifies Entry immutable record stores AI contribution metadata, freezes all attributes, defaults timestamp, rejects invalid roles, and serializes via to_h"
816
+ answers:
817
+ Q1: pass
818
+ Q2: pass
819
+ Q3: pass
820
+ Q4: pass
821
+ Q5: pass
822
+ Q6: pass
823
+ Q7: pass
824
+ Q8: pass
825
+ Q9: pass
826
+ Q10: pass
827
+ findings: []
828
+
829
+ spec/rosett_ai/provenance/file_source_spec.rb:
830
+ status: signed_off
831
+ reviewer: hugo
832
+ review_date: "2026-03-15"
833
+ sign_off_date: "2026-03-15"
834
+ verdict: approved
835
+ intent: "Verifies FileSource value object stores path/source_type/optional lines, freezes attributes, and conditionally serializes lines in to_h"
836
+ answers:
837
+ Q1: pass
838
+ Q2: pass
839
+ Q3: pass
840
+ Q4: pass
841
+ Q5: pass
842
+ Q6: pass
843
+ Q7: pass
844
+ Q8: pass
845
+ Q9: pass
846
+ Q10: pass
847
+ findings: []
848
+
849
+ spec/rosett_ai/provenance/source_spec.rb:
850
+ status: signed_off
851
+ reviewer: hugo
852
+ review_date: "2026-03-15"
853
+ sign_off_date: "2026-03-15"
854
+ verdict: approved
855
+ intent: "Verifies Source validates type against ALLOWED_TYPES, requires specific URL for external_source, freezes attributes, and serializes conditionally"
856
+ answers:
857
+ Q1: pass
858
+ Q2: pass
859
+ Q3: pass
860
+ Q4: pass
861
+ Q5: pass
862
+ Q6: pass
863
+ Q7: pass
864
+ Q8: pass
865
+ Q9: pass
866
+ Q10: pass
867
+ findings: []
868
+
869
+ spec/rosett_ai/provenance/store_spec.rb:
870
+ status: signed_off
871
+ reviewer: hugo
872
+ review_date: "2026-03-15"
873
+ sign_off_date: "2026-03-15"
874
+ verdict: approved
875
+ intent: "Verifies Store manages append-only YAML provenance file with init/append/read/query-by-commit/query-by-file operations and raises on missing files"
876
+ answers:
877
+ Q1: pass
878
+ Q2: pass
879
+ Q3: pass
880
+ Q4: pass
881
+ Q5: pass
882
+ Q6: pass
883
+ Q7: pass
884
+ Q8: pass
885
+ Q9: pass
886
+ Q10: pass
887
+ findings: []
888
+
889
+ spec/rosett_ai/provenance/trailer_generator_spec.rb:
890
+ status: signed_off
891
+ reviewer: hugo
892
+ review_date: "2026-03-15"
893
+ sign_off_date: "2026-03-15"
894
+ verdict: approved
895
+ intent: "Verifies TrailerGenerator formats AI provenance as git trailer lines, deduplicates across entries, and produces newline-separated trailer blocks"
896
+ answers:
897
+ Q1: pass
898
+ Q2: pass
899
+ Q3: pass
900
+ Q4: pass
901
+ Q5: pass
902
+ Q6: pass
903
+ Q7: pass
904
+ Q8: pass
905
+ Q9: pass
906
+ Q10: pass
907
+ findings: []
908
+
909
+ spec/rosett_ai/provenance/validator_spec.rb:
910
+ status: signed_off
911
+ reviewer: hugo
912
+ review_date: "2026-03-15"
913
+ sign_off_date: "2026-03-15"
914
+ verdict: approved
915
+ intent: "Verifies Validator checks provenance YAML structure including version, commit SHA format, ai_role enum, and source_type enum"
916
+ answers:
917
+ Q1: pass
918
+ Q2: pass
919
+ Q3: pass
920
+ Q4: pass
921
+ Q5: pass
922
+ Q6: pass
923
+ Q7: pass
924
+ Q8: pass
925
+ Q9: pass
926
+ Q10: pass
927
+ findings: []
928
+
929
+ spec/rosett_ai/authorship/attribution_compiler_spec.rb:
930
+ status: signed_off
931
+ reviewer: hugo
932
+ review_date: "2026-03-15"
933
+ sign_off_date: "2026-03-15"
934
+ verdict: approved
935
+ intent: "Verifies AttributionCompiler produces disclosure-level-appropriate output: none (nil), minimal (HTML comment), standard (heading + trailers), full (per-file involvement)"
936
+ answers:
937
+ Q1: pass
938
+ Q2: pass
939
+ Q3: pass
940
+ Q4: pass
941
+ Q5: pass
942
+ Q6: pass
943
+ Q7: pass
944
+ Q8: pass
945
+ Q9: pass
946
+ Q10: pass
947
+ findings: []
948
+
949
+ spec/rosett_ai/authorship/disclosure_policy_spec.rb:
950
+ status: signed_off
951
+ reviewer: hugo
952
+ review_date: "2026-03-15"
953
+ sign_off_date: "2026-03-15"
954
+ verdict: approved
955
+ intent: "Verifies DisclosurePolicy enum class validates levels and exposes disclose?/include_attribution?/include_per_file?/include_trailer_guidance? query methods"
956
+ answers:
957
+ Q1: pass
958
+ Q2: pass
959
+ Q3: pass
960
+ Q4: pass
961
+ Q5: pass
962
+ Q6: pass
963
+ Q7: pass
964
+ Q8: pass
965
+ Q9: pass
966
+ Q10: pass
967
+ findings: []
968
+
969
+ spec/rosett_ai/authorship/review_validator_spec.rb:
970
+ status: signed_off
971
+ reviewer: hugo
972
+ review_date: "2026-03-15"
973
+ sign_off_date: "2026-03-15"
974
+ verdict: approved
975
+ intent: "Verifies ReviewValidator prevents self-review with case/whitespace normalization and handles nil author/reviewer gracefully"
976
+ answers:
977
+ Q1: pass
978
+ Q2: pass
979
+ Q3: pass
980
+ Q4: pass
981
+ Q5: pass
982
+ Q6: pass
983
+ Q7: pass
984
+ Q8: pass
985
+ Q9: pass
986
+ Q10: pass
987
+ findings: []
988
+
989
+ spec/rosett_ai/authorship/trailer_generator_spec.rb:
990
+ status: signed_off
991
+ reviewer: hugo
992
+ review_date: "2026-03-15"
993
+ sign_off_date: "2026-03-15"
994
+ verdict: approved
995
+ intent: "Verifies TrailerGenerator formats AI role trailers for all four roles, validates roles, and produces newline-separated trailer blocks"
996
+ answers:
997
+ Q1: pass
998
+ Q2: pass
999
+ Q3: pass
1000
+ Q4: pass
1001
+ Q5: pass
1002
+ Q6: pass
1003
+ Q7: pass
1004
+ Q8: pass
1005
+ Q9: pass
1006
+ Q10: pass
1007
+ findings: []
1008
+
1009
+ spec/rosett_ai/ai_config/config_compiler_spec.rb:
1010
+ status: signed_off
1011
+ reviewer: hugo
1012
+ review_date: "2026-03-15"
1013
+ sign_off_date: "2026-03-15"
1014
+ verdict: approved
1015
+ intent: "Verifies ConfigCompiler resolves model routing (tier→model), context window, and cost controls per engine, with strict mode and custom model support"
1016
+ answers:
1017
+ Q1: pass
1018
+ Q2: pass
1019
+ Q3: pass
1020
+ Q4: pass
1021
+ Q5: pass
1022
+ Q6: pass
1023
+ Q7: pass
1024
+ Q8: pass
1025
+ Q9: pass
1026
+ Q10: pass
1027
+ findings: []
1028
+
1029
+ spec/rosett_ai/ai_config/context_window_spec.rb:
1030
+ status: signed_off
1031
+ reviewer: hugo
1032
+ review_date: "2026-03-15"
1033
+ sign_off_date: "2026-03-15"
1034
+ verdict: approved
1035
+ intent: "Verifies ContextWindow value object stores max_tokens/output_reserve/truncation_strategy, calculates effective_input_tokens, and validates strategy enum"
1036
+ answers:
1037
+ Q1: pass
1038
+ Q2: pass
1039
+ Q3: pass
1040
+ Q4: pass
1041
+ Q5: pass
1042
+ Q6: pass
1043
+ Q7: pass
1044
+ Q8: pass
1045
+ Q9: pass
1046
+ Q10: pass
1047
+ findings: []
1048
+
1049
+ spec/rosett_ai/ai_config/cost_controls_spec.rb:
1050
+ status: signed_off
1051
+ reviewer: hugo
1052
+ review_date: "2026-03-15"
1053
+ sign_off_date: "2026-03-15"
1054
+ verdict: approved
1055
+ intent: "Verifies CostControls value object stores preferred_tier with validation, optional monthly_budget_note, and conditional to_h serialization"
1056
+ answers:
1057
+ Q1: pass
1058
+ Q2: pass
1059
+ Q3: pass
1060
+ Q4: pass
1061
+ Q5: pass
1062
+ Q6: pass
1063
+ Q7: pass
1064
+ Q8: pass
1065
+ Q9: pass
1066
+ Q10: pass
1067
+ findings: []
1068
+
1069
+ spec/rosett_ai/ai_config/fallback_chain_spec.rb:
1070
+ status: signed_off
1071
+ reviewer: hugo
1072
+ review_date: "2026-03-15"
1073
+ sign_off_date: "2026-03-15"
1074
+ verdict: approved
1075
+ intent: "Verifies FallbackChain stores ordered engine list, detects local-to-remote transitions with warnings, exposes primary/fallbacks, and serializes via to_h"
1076
+ answers:
1077
+ Q1: pass
1078
+ Q2: pass
1079
+ Q3: pass
1080
+ Q4: pass
1081
+ Q5: pass
1082
+ Q6: pass
1083
+ Q7: pass
1084
+ Q8: pass
1085
+ Q9: pass
1086
+ Q10: pass
1087
+ findings: []
1088
+
1089
+ spec/rosett_ai/ai_config/model_router_spec.rb:
1090
+ status: signed_off
1091
+ reviewer: hugo
1092
+ review_date: "2026-03-15"
1093
+ sign_off_date: "2026-03-15"
1094
+ verdict: approved
1095
+ intent: "Verifies ModelRouter maps canonical tiers to engine-specific models (Claude haiku/sonnet/opus, Ollama 3b/70b), supports custom:model syntax, and allows custom engine mappings"
1096
+ answers:
1097
+ Q1: pass
1098
+ Q2: pass
1099
+ Q3: pass
1100
+ Q4: pass
1101
+ Q5: pass
1102
+ Q6: pass
1103
+ Q7: pass
1104
+ Q8: pass
1105
+ Q9: pass
1106
+ Q10: pass
1107
+ findings: []
1108
+
1109
+ spec/rosett_ai/ai_config/validator_spec.rb:
1110
+ status: signed_off
1111
+ reviewer: hugo
1112
+ review_date: "2026-03-15"
1113
+ sign_off_date: "2026-03-15"
1114
+ verdict: approved
1115
+ intent: "Verifies Validator catches invalid truncation_strategy, preferred_tier, and model tier patterns while accepting empty config and custom:model format"
1116
+ answers:
1117
+ Q1: pass
1118
+ Q2: pass
1119
+ Q3: pass
1120
+ Q4: pass
1121
+ Q5: pass
1122
+ Q6: pass
1123
+ Q7: pass
1124
+ Q8: pass
1125
+ Q9: pass
1126
+ Q10: pass
1127
+ findings: []
1128
+
1129
+ # --- Batch 5: Configuration System (reviewed 2026-03-15) ---
1130
+
1131
+ spec/rosett_ai/config/compile_result_spec.rb:
1132
+ status: signed_off
1133
+ reviewer: hugo
1134
+ review_date: "2026-03-15"
1135
+ sign_off_date: "2026-03-15"
1136
+ verdict: approved
1137
+ intent: "Verifies CompileResult value object exposes success?/changed? predicates for action types (created/updated/unchanged/skipped) and defaults warnings"
1138
+ answers:
1139
+ Q1: pass
1140
+ Q2: pass
1141
+ Q3: pass
1142
+ Q4: pass
1143
+ Q5: pass
1144
+ Q6: pass
1145
+ Q7: pass
1146
+ Q8: pass
1147
+ Q9: pass
1148
+ Q10: pass
1149
+ findings: []
1150
+
1151
+ spec/rosett_ai/config/key_map_spec.rb:
1152
+ status: signed_off
1153
+ reviewer: hugo
1154
+ review_date: "2026-03-15"
1155
+ sign_off_date: "2026-03-15"
1156
+ verdict: approved
1157
+ intent: "Verifies deprecated RosettAi::Config::KeyMap alias resolves to RosettAiEngine::Claude::KeyMap when engine gem is installed"
1158
+ answers:
1159
+ Q1: pass
1160
+ Q2: pass
1161
+ Q3: pass
1162
+ Q4: pass
1163
+ Q5: pass
1164
+ Q6: pass
1165
+ Q7: pass
1166
+ Q8: pass
1167
+ Q9: pass
1168
+ Q10: pass
1169
+ findings: []
1170
+
1171
+ spec/rosett_ai/config/masking_secret_resolver_spec.rb:
1172
+ status: signed_off
1173
+ reviewer: hugo
1174
+ review_date: "2026-03-15"
1175
+ sign_off_date: "2026-03-15"
1176
+ verdict: approved
1177
+ intent: "Verifies MaskingSecretResolver replaces secret references with *** for safe display, handles nested structures, preserves non-secret and non-string values"
1178
+ answers:
1179
+ Q1: pass
1180
+ Q2: pass
1181
+ Q3: pass
1182
+ Q4: pass
1183
+ Q5: pass
1184
+ Q6: pass
1185
+ Q7: pass
1186
+ Q8: pass
1187
+ Q9: pass
1188
+ Q10: pass
1189
+ findings: []
1190
+
1191
+ spec/rosett_ai/config/scope_router_spec.rb:
1192
+ status: signed_off
1193
+ reviewer: hugo
1194
+ review_date: "2026-03-15"
1195
+ sign_off_date: "2026-03-15"
1196
+ verdict: approved
1197
+ intent: "Verifies deprecated RosettAi::Config::ScopeRouter alias resolves to RosettAiEngine::Claude::ScopeRouter when engine gem is installed"
1198
+ answers:
1199
+ Q1: pass
1200
+ Q2: pass
1201
+ Q3: pass
1202
+ Q4: pass
1203
+ Q5: pass
1204
+ Q6: pass
1205
+ Q7: pass
1206
+ Q8: pass
1207
+ Q9: pass
1208
+ Q10: pass
1209
+ findings: []
1210
+
1211
+ spec/rosett_ai/config/secret_resolver_spec.rb:
1212
+ status: signed_off
1213
+ reviewer: hugo
1214
+ review_date: "2026-03-15"
1215
+ sign_off_date: "2026-03-15"
1216
+ verdict: approved
1217
+ intent: "Verifies SecretResolver resolves env/file/path backends with security validation (0600 perms, UID ownership, path traversal, 64 KiB limit, single-pass guarantee, no regex)"
1218
+ answers:
1219
+ Q1: pass
1220
+ Q2: pass
1221
+ Q3: pass
1222
+ Q4: pass
1223
+ Q5: pass
1224
+ Q6: pass
1225
+ Q7: pass
1226
+ Q8: pass
1227
+ Q9: pass
1228
+ Q10: pass
1229
+ findings: []
1230
+
1231
+ spec/rosett_ai/backup/compressor_spec.rb:
1232
+ status: signed_off
1233
+ reviewer: hugo
1234
+ review_date: "2026-03-15"
1235
+ sign_off_date: "2026-03-15"
1236
+ verdict: approved
1237
+ intent: "Verifies Compressor abstract base and three implementations (TarGz/Zip/TarXz) create valid archives with compression levels and proper error handling"
1238
+ answers:
1239
+ Q1: pass
1240
+ Q2: pass
1241
+ Q3: pass
1242
+ Q4: pass
1243
+ Q5: pass
1244
+ Q6: pass
1245
+ Q7: pass
1246
+ Q8: pass
1247
+ Q9: pass
1248
+ Q10: pass
1249
+ findings: []
1250
+
1251
+ spec/rosett_ai/backup/destination_spec.rb:
1252
+ status: signed_off
1253
+ reviewer: hugo
1254
+ review_date: "2026-03-15"
1255
+ sign_off_date: "2026-03-15"
1256
+ verdict: approved
1257
+ intent: "Verifies Destination abstract base, FileDestination (copy + mkdir), UnsupportedDestination (s3/ssh), and scheme parsing with file:// URI support"
1258
+ answers:
1259
+ Q1: pass
1260
+ Q2: pass
1261
+ Q3: pass
1262
+ Q4: pass
1263
+ Q5: pass
1264
+ Q6: pass
1265
+ Q7: pass
1266
+ Q8: pass
1267
+ Q9: pass
1268
+ Q10: pass
1269
+ findings: []
1270
+
1271
+ spec/rosett_ai/init/config_file_writer_spec.rb:
1272
+ status: signed_off
1273
+ reviewer: hugo
1274
+ review_date: "2026-03-15"
1275
+ sign_off_date: "2026-03-15"
1276
+ verdict: approved
1277
+ intent: "Verifies ConfigFileWriter creates default config.yml with engine default, returns unchanged for existing files, and creates parent directories"
1278
+ answers:
1279
+ Q1: pass
1280
+ Q2: pass
1281
+ Q3: pass
1282
+ Q4: pass
1283
+ Q5: pass
1284
+ Q6: pass
1285
+ Q7: pass
1286
+ Q8: pass
1287
+ Q9: pass
1288
+ Q10: pass
1289
+ findings: []
1290
+
1291
+ # --- Batch 6: Content & Licensing (reviewed 2026-03-15) ---
1292
+
1293
+ spec/rosett_ai/content/content_client_spec.rb:
1294
+ status: signed_off
1295
+ reviewer: hugo
1296
+ review_date: "2026-03-15"
1297
+ sign_off_date: "2026-03-15"
1298
+ verdict: approved
1299
+ intent: "Verifies ContentClient issues authenticated HTTP requests (Bearer token) for catalog/download/signature/availability with WebMock-stubbed success, error, and connection failure paths"
1300
+ answers:
1301
+ Q1: pass
1302
+ Q2: pass
1303
+ Q3: pass
1304
+ Q4: pass
1305
+ Q5: pass
1306
+ Q6: pass
1307
+ Q7: pass
1308
+ Q8: pass
1309
+ Q9: pass
1310
+ Q10: pass
1311
+ findings: []
1312
+
1313
+ spec/rosett_ai/content/pack_installer_spec.rb:
1314
+ status: signed_off
1315
+ reviewer: hugo
1316
+ review_date: "2026-03-15"
1317
+ sign_off_date: "2026-03-15"
1318
+ verdict: approved
1319
+ intent: "Verifies PackInstaller extracts Ed25519-signed tarballs, rejects tampered signatures and path traversal attacks (../../../etc/passwd), and creates pack directories"
1320
+ answers:
1321
+ Q1: pass
1322
+ Q2: pass
1323
+ Q3: pass
1324
+ Q4: pass
1325
+ Q5: pass
1326
+ Q6: pass
1327
+ Q7: pass
1328
+ Q8: pass
1329
+ Q9: pass
1330
+ Q10: pass
1331
+ findings: []
1332
+
1333
+ spec/rosett_ai/content/pack_manifest_spec.rb:
1334
+ status: signed_off
1335
+ reviewer: hugo
1336
+ review_date: "2026-03-15"
1337
+ sign_off_date: "2026-03-15"
1338
+ verdict: approved
1339
+ intent: "Verifies PackManifest validates required fields (name, version, tier_required), rejects invalid patterns/semver/tiers, and loads from YAML files"
1340
+ answers:
1341
+ Q1: pass
1342
+ Q2: pass
1343
+ Q3: pass
1344
+ Q4: pass
1345
+ Q5: pass
1346
+ Q6: pass
1347
+ Q7: pass
1348
+ Q8: pass
1349
+ Q9: pass
1350
+ Q10: pass
1351
+ findings: []
1352
+
1353
+ spec/rosett_ai/content/pack_registry_spec.rb:
1354
+ status: signed_off
1355
+ reviewer: hugo
1356
+ review_date: "2026-03-15"
1357
+ sign_off_date: "2026-03-15"
1358
+ verdict: approved
1359
+ intent: "Verifies PackRegistry scans premium directory for installed packs, skips dirs without manifests, and supports version query and removal"
1360
+ answers:
1361
+ Q1: pass
1362
+ Q2: pass
1363
+ Q3: pass
1364
+ Q4: pass
1365
+ Q5: pass
1366
+ Q6: pass
1367
+ Q7: pass
1368
+ Q8: pass
1369
+ Q9: pass
1370
+ Q10: pass
1371
+ findings: []
1372
+
1373
+ spec/rosett_ai/licensing/license_key_spec.rb:
1374
+ status: signed_off
1375
+ reviewer: hugo
1376
+ review_date: "2026-03-15"
1377
+ sign_off_date: "2026-03-15"
1378
+ verdict: approved
1379
+ intent: "Verifies LicenseKey decodes Ed25519-signed JWT tokens, rejects forged keys, enforces 14-day grace period, supports perpetual/subscription/offline modes, and resists property-based fuzzing"
1380
+ answers:
1381
+ Q1: pass
1382
+ Q2: pass
1383
+ Q3: pass
1384
+ Q4: pass
1385
+ Q5: pass
1386
+ Q6: pass
1387
+ Q7: pass
1388
+ Q8: pass
1389
+ Q9: pass
1390
+ Q10: pass
1391
+ findings: []
1392
+
1393
+ spec/rosett_ai/licensing/license_store_spec.rb:
1394
+ status: signed_off
1395
+ reviewer: hugo
1396
+ review_date: "2026-03-15"
1397
+ sign_off_date: "2026-03-15"
1398
+ verdict: approved
1399
+ intent: "Verifies LicenseStore saves keys with 0600 file / 0700 dir permissions, rejects insecure permissions on load, strips trailing newlines, and supports remove/exists?"
1400
+ answers:
1401
+ Q1: pass
1402
+ Q2: pass
1403
+ Q3: pass
1404
+ Q4: pass
1405
+ Q5: pass
1406
+ Q6: pass
1407
+ Q7: pass
1408
+ Q8: pass
1409
+ Q9: pass
1410
+ Q10: pass
1411
+ findings: []
1412
+
1413
+ spec/rosett_ai/licensing/license_validator_spec.rb:
1414
+ status: signed_off
1415
+ reviewer: hugo
1416
+ review_date: "2026-03-15"
1417
+ sign_off_date: "2026-03-15"
1418
+ verdict: approved
1419
+ intent: "Verifies LicenseValidator integration: no-license returns community tier, valid perpetual key returns supporter, forged key falls back to community with error, and grace period produces warnings"
1420
+ answers:
1421
+ Q1: pass
1422
+ Q2: pass
1423
+ Q3: pass
1424
+ Q4: pass
1425
+ Q5: pass
1426
+ Q6: pass
1427
+ Q7: pass
1428
+ Q8: pass
1429
+ Q9: pass
1430
+ Q10: pass
1431
+ findings: []
1432
+
1433
+ spec/rosett_ai/licensing/tier_spec.rb:
1434
+ status: signed_off
1435
+ reviewer: hugo
1436
+ review_date: "2026-03-15"
1437
+ sign_off_date: "2026-03-15"
1438
+ verdict: approved
1439
+ intent: "Verifies Tier implements Comparable ordering (community < supporter < subscriber < enterprise), entitled_to? boundary checks, string input coercion, and invalid tier rejection"
1440
+ answers:
1441
+ Q1: pass
1442
+ Q2: pass
1443
+ Q3: pass
1444
+ Q4: pass
1445
+ Q5: pass
1446
+ Q6: pass
1447
+ Q7: pass
1448
+ Q8: pass
1449
+ Q9: pass
1450
+ Q10: pass
1451
+ findings: []
1452
+
1453
+ spec/rosett_ai/packaging/variant_config_spec.rb:
1454
+ status: signed_off
1455
+ reviewer: hugo
1456
+ review_date: "2026-03-15"
1457
+ sign_off_date: "2026-03-15"
1458
+ verdict: approved
1459
+ intent: "Verifies VariantConfig loads core/gtk4/qt6 packaging variants with schema validation, resolves dynamic VERSION dependencies, and produces fpm_depends arrays"
1460
+ answers:
1461
+ Q1: pass
1462
+ Q2: pass
1463
+ Q3: pass
1464
+ Q4: pass
1465
+ Q5: pass
1466
+ Q6: pass
1467
+ Q7: pass
1468
+ Q8: pass
1469
+ Q9: pass
1470
+ Q10: pass
1471
+ findings: []
1472
+
1473
+ spec/rosett_ai/text_sanitizer_spec.rb:
1474
+ status: signed_off
1475
+ reviewer: hugo
1476
+ review_date: "2026-03-15"
1477
+ sign_off_date: "2026-03-15"
1478
+ verdict: approved
1479
+ intent: "Verifies TextSanitizer strips ANSI escape sequences (SGR, cursor, OSC, control chars), normalizes NFC with encoding conversion, and recursively sanitizes nested hash/array structures"
1480
+ answers:
1481
+ Q1: pass
1482
+ Q2: pass
1483
+ Q3: pass
1484
+ Q4: pass
1485
+ Q5: pass
1486
+ Q6: pass
1487
+ Q7: pass
1488
+ Q8: pass
1489
+ Q9: pass
1490
+ Q10: pass
1491
+ findings: []
1492
+
1493
+ spec/gemspec_spec.rb:
1494
+ status: signed_off
1495
+ reviewer: hugo
1496
+ review_date: "2026-03-15"
1497
+ sign_off_date: "2026-03-15"
1498
+ verdict: approved
1499
+ intent: "Regression guard: verifies gemspec guards git ls-files behind .git check, provides Dir.glob fallback, and does not spawn git subprocess in non-git directories"
1500
+ answers:
1501
+ Q1: pass
1502
+ Q2: pass
1503
+ Q3: pass
1504
+ Q4: pass
1505
+ Q5: pass
1506
+ Q6: pass
1507
+ Q7: pass
1508
+ Q8: pass
1509
+ Q9: pass
1510
+ Q10: pass
1511
+ findings: []
1512
+
1513
+ spec/i18n_completeness_spec.rb:
1514
+ status: signed_off
1515
+ reviewer: hugo
1516
+ review_date: "2026-03-15"
1517
+ sign_off_date: "2026-03-15"
1518
+ verdict: approved
1519
+ intent: "Cross-cutting quality check: verifies all locale files have required structure, reports missing/orphan keys vs en.yml with CLDR plural awareness, and validates I18n.t calls in lib/"
1520
+ answers:
1521
+ Q1: pass
1522
+ Q2: pass
1523
+ Q3: pass
1524
+ Q4: pass
1525
+ Q5: pass
1526
+ Q6: pass
1527
+ Q7: pass
1528
+ Q8: pass
1529
+ Q9: pass
1530
+ Q10: pass
1531
+ findings: []
1532
+
1533
+ # --- Batch 7: D-Bus & Desktop (reviewed 2026-03-15) ---
1534
+
1535
+ spec/rosett_ai/dbus/service_spec.rb:
1536
+ status: signed_off
1537
+ reviewer: hugo
1538
+ review_date: "2026-03-15"
1539
+ sign_off_date: "2026-03-15"
1540
+ verdict: approved
1541
+ intent: "Verifies D-Bus Service lifecycle (start/stop/running?), session bus connection, interface export, focus monitoring delegation, error handling, and BUS_NAME/OBJECT_PATH constants"
1542
+ answers:
1543
+ Q1: pass
1544
+ Q2: pass
1545
+ Q3: pass
1546
+ Q4: pass
1547
+ Q5: pass
1548
+ Q6: pass
1549
+ Q7: pass
1550
+ Q8: pass
1551
+ Q9: pass
1552
+ Q10: pass
1553
+ findings: []
1554
+
1555
+ spec/rosett_ai/dbus/manager_interface_spec.rb:
1556
+ status: signed_off
1557
+ reviewer: hugo
1558
+ review_date: "2026-03-15"
1559
+ sign_off_date: "2026-03-15"
1560
+ verdict: approved
1561
+ intent: "Verifies ManagerInterface contract: INTERFACE constant, Shutdown logging, SetConfig delegation to RaiConfig, ListEngines returning name/display_name tuples, GetStatus dictionary with version/running/context/pid/dbus_name"
1562
+ answers:
1563
+ Q1: pass
1564
+ Q2: pass
1565
+ Q3: pass
1566
+ Q4: pass
1567
+ Q5: pass
1568
+ Q6: pass
1569
+ Q7: pass
1570
+ Q8: pass
1571
+ Q9: pass
1572
+ Q10: pass
1573
+ findings: []
1574
+
1575
+ spec/rosett_ai/dbus/focus_monitor_interface_spec.rb:
1576
+ status: signed_off
1577
+ reviewer: hugo
1578
+ review_date: "2026-03-15"
1579
+ sign_off_date: "2026-03-15"
1580
+ verdict: approved
1581
+ intent: "Verifies FocusMonitorInterface INTERFACE constant and create_adapter factory mapping all 7 compositor types (i3, sway, hyprland, gnome, kwin, x11, unknown)"
1582
+ answers:
1583
+ Q1: pass
1584
+ Q2: pass
1585
+ Q3: pass
1586
+ Q4: pass
1587
+ Q5: pass
1588
+ Q6: pass
1589
+ Q7: pass
1590
+ Q8: pass
1591
+ Q9: pass
1592
+ Q10: pass
1593
+ findings: []
1594
+
1595
+ spec/rosett_ai/dbus/focus_adapters/base_spec.rb:
1596
+ status: signed_off
1597
+ reviewer: hugo
1598
+ review_date: "2026-03-15"
1599
+ sign_off_date: "2026-03-15"
1600
+ verdict: approved
1601
+ intent: "Verifies FocusAdapters::Base abstract contract: non-running initial state, callback registration/notification, multiple callback support, NotImplementedError for start, argument-to-string coercion"
1602
+ answers:
1603
+ Q1: pass
1604
+ Q2: pass
1605
+ Q3: pass
1606
+ Q4: pass
1607
+ Q5: pass
1608
+ Q6: pass
1609
+ Q7: pass
1610
+ Q8: pass
1611
+ Q9: pass
1612
+ Q10: pass
1613
+ findings: []
1614
+
1615
+ spec/rosett_ai/dbus/focus_adapters/gnome_adapter_spec.rb:
1616
+ status: signed_off
1617
+ reviewer: hugo
1618
+ review_date: "2026-03-15"
1619
+ sign_off_date: "2026-03-15"
1620
+ verdict: approved
1621
+ intent: "Verifies GnomeAdapter D-Bus Eval-based focus polling with 0.5s interval, duplicate-focus suppression, double-start idempotency, and D-Bus error handling"
1622
+ answers:
1623
+ Q1: pass
1624
+ Q2: pass
1625
+ Q3: pass
1626
+ Q4: pass
1627
+ Q5: pass
1628
+ Q6: pass
1629
+ Q7: pass
1630
+ Q8: pass
1631
+ Q9: pass
1632
+ Q10: pass
1633
+ findings: []
1634
+
1635
+ spec/rosett_ai/dbus/focus_adapters/kwin_adapter_spec.rb:
1636
+ status: signed_off
1637
+ reviewer: hugo
1638
+ review_date: "2026-03-15"
1639
+ sign_off_date: "2026-03-15"
1640
+ verdict: approved
1641
+ intent: "Verifies KwinAdapter D-Bus signal subscription with polling fallback, double-start prevention, and graceful error handling when KWin unavailable"
1642
+ answers:
1643
+ Q1: pass
1644
+ Q2: pass
1645
+ Q3: pass
1646
+ Q4: pass
1647
+ Q5: pass
1648
+ Q6: pass
1649
+ Q7: pass
1650
+ Q8: pass
1651
+ Q9: pass
1652
+ Q10: pass
1653
+ findings: []
1654
+
1655
+ spec/rosett_ai/dbus/focus_adapters/hyprland_adapter_spec.rb:
1656
+ status: signed_off
1657
+ reviewer: hugo
1658
+ review_date: "2026-03-15"
1659
+ sign_off_date: "2026-03-15"
1660
+ verdict: approved
1661
+ intent: "Verifies HyprlandAdapter UNIX socket connection via HYPRLAND_INSTANCE_SIGNATURE, activewindow event parsing (app_id>>title), empty title/missing separator handling, and missing env/socket edge cases"
1662
+ answers:
1663
+ Q1: pass
1664
+ Q2: pass
1665
+ Q3: pass
1666
+ Q4: pass
1667
+ Q5: pass
1668
+ Q6: pass
1669
+ Q7: pass
1670
+ Q8: pass
1671
+ Q9: pass
1672
+ Q10: pass
1673
+ findings: []
1674
+
1675
+ spec/rosett_ai/dbus/focus_adapters/i3_adapter_spec.rb:
1676
+ status: signed_off
1677
+ reviewer: hugo
1678
+ review_date: "2026-03-15"
1679
+ sign_off_date: "2026-03-15"
1680
+ verdict: approved
1681
+ intent: "Verifies I3Adapter i3ipc connection, window event subscription, focus event extraction with app_id fallback to window_properties.class"
1682
+ answers:
1683
+ Q1: pass
1684
+ Q2: pass
1685
+ Q3: pass
1686
+ Q4: pass
1687
+ Q5: pass
1688
+ Q6: pass
1689
+ Q7: pass
1690
+ Q8: pass
1691
+ Q9: pass
1692
+ Q10: pass
1693
+ findings: []
1694
+
1695
+ spec/rosett_ai/dbus/focus_adapters/x11_adapter_spec.rb:
1696
+ status: signed_off
1697
+ reviewer: hugo
1698
+ review_date: "2026-03-15"
1699
+ sign_off_date: "2026-03-15"
1700
+ verdict: approved
1701
+ intent: "Verifies X11Adapter xprop-based focus detection: WM_CLASS extraction, _NET_WM_NAME with WM_NAME fallback, active window ID parsing, nil window handling, and POLL_INTERVAL constant"
1702
+ answers:
1703
+ Q1: pass
1704
+ Q2: pass
1705
+ Q3: pass
1706
+ Q4: pass
1707
+ Q5: pass
1708
+ Q6: pass
1709
+ Q7: pass
1710
+ Q8: pass
1711
+ Q9: pass
1712
+ Q10: pass
1713
+ findings: []
1714
+
1715
+ spec/rosett_ai/dbus/compositor_detector_spec.rb:
1716
+ status: signed_off
1717
+ reviewer: hugo
1718
+ review_date: "2026-03-15"
1719
+ sign_off_date: "2026-03-15"
1720
+ verdict: approved
1721
+ intent: "Verifies CompositorDetector env var detection (Hyprland > Sway > i3 > DISPLAY), D-Bus service detection (GNOME Shell, KWin), precedence ordering, and :unknown fallback"
1722
+ answers:
1723
+ Q1: pass
1724
+ Q2: pass
1725
+ Q3: pass
1726
+ Q4: pass
1727
+ Q5: pass
1728
+ Q6: pass
1729
+ Q7: pass
1730
+ Q8: pass
1731
+ Q9: pass
1732
+ Q10: pass
1733
+ findings: []
1734
+
1735
+ spec/rosett_ai/dbus/status_notifier_interface_spec.rb:
1736
+ status: signed_off
1737
+ reviewer: hugo
1738
+ review_date: "2026-03-15"
1739
+ sign_off_date: "2026-03-15"
1740
+ verdict: approved
1741
+ intent: "Verifies StatusNotifierInterface org.kde.StatusNotifierItem properties (id, category, status, title, icon_name, tool_tip struct), update_status method with NewStatus signal emission"
1742
+ answers:
1743
+ Q1: pass
1744
+ Q2: pass
1745
+ Q3: pass
1746
+ Q4: pass
1747
+ Q5: pass
1748
+ Q6: pass
1749
+ Q7: pass
1750
+ Q8: pass
1751
+ Q9: pass
1752
+ Q10: pass
1753
+ findings: []
1754
+
1755
+ spec/rosett_ai/desktop/dbus_client_spec.rb:
1756
+ status: signed_off
1757
+ reviewer: hugo
1758
+ review_date: "2026-03-15"
1759
+ sign_off_date: "2026-03-15"
1760
+ verdict: approved
1761
+ intent: "Verifies DbusClient full lifecycle (connect/disconnect/connected?/service_available?), all Manager methods (status/compile/switch_context/set_config/list_engines), FocusMonitor current_focus, and error paths for every D-Bus call"
1762
+ answers:
1763
+ Q1: pass
1764
+ Q2: pass
1765
+ Q3: pass
1766
+ Q4: pass
1767
+ Q5: pass
1768
+ Q6: pass
1769
+ Q7: pass
1770
+ Q8: pass
1771
+ Q9: pass
1772
+ Q10: pass
1773
+ findings: []
1774
+
1775
+ spec/rosett_ai/desktop/gtk4_app_spec.rb:
1776
+ status: signed_off
1777
+ reviewer: hugo
1778
+ review_date: "2026-03-15"
1779
+ sign_off_date: "2026-03-15"
1780
+ verdict: approved
1781
+ intent: "Verifies Gtk4App APPLICATION_ID reverse-DNS, conditional Adwaita availability, DbusClient initialization, and graceful exit when adwaita gem missing"
1782
+ answers:
1783
+ Q1: pass
1784
+ Q2: pass
1785
+ Q3: pass
1786
+ Q4: pass
1787
+ Q5: pass
1788
+ Q6: pass
1789
+ Q7: pass
1790
+ Q8: pass
1791
+ Q9: pass
1792
+ Q10: pass
1793
+ findings: []
1794
+
1795
+ spec/rosett_ai/desktop/gtk4_preferences_spec.rb:
1796
+ status: signed_off
1797
+ reviewer: hugo
1798
+ review_date: "2026-03-15"
1799
+ sign_off_date: "2026-03-15"
1800
+ verdict: approved
1801
+ intent: "Verifies Gtk4Preferences D-Bus preference callbacks (verbose/strict/engine/auto_switch), dynamic engine list from D-Bus with FALLBACK_ENGINES, index-based selection at boundaries, and Adw version compatibility"
1802
+ answers:
1803
+ Q1: pass
1804
+ Q2: pass
1805
+ Q3: pass
1806
+ Q4: pass
1807
+ Q5: pass
1808
+ Q6: pass
1809
+ Q7: pass
1810
+ Q8: pass
1811
+ Q9: pass
1812
+ Q10: pass
1813
+ findings: []
1814
+
1815
+ spec/rosett_ai/desktop/gui_logger_spec.rb:
1816
+ status: signed_off
1817
+ reviewer: hugo
1818
+ review_date: "2026-03-15"
1819
+ sign_off_date: "2026-03-15"
1820
+ verdict: approved
1821
+ intent: "Verifies GuiLogger env var control (RAI_GUI_LOG/FILE/LEVEL), JSON Lines structured logging, action tracking with duration_ms, error logging with truncated backtrace, level filtering, file logging, and LEVELS constant"
1822
+ answers:
1823
+ Q1: pass
1824
+ Q2: pass
1825
+ Q3: pass
1826
+ Q4: pass
1827
+ Q5: pass
1828
+ Q6: pass
1829
+ Q7: pass
1830
+ Q8: pass
1831
+ Q9: pass
1832
+ Q10: pass
1833
+ findings: []
1834
+
1835
+ # --- Batch 8: UI + Plugins + Engines + i18n (reviewed 2026-03-15) ---
1836
+
1837
+ spec/rosett_ai/ui/base_spec.rb:
1838
+ status: signed_off
1839
+ reviewer: hugo
1840
+ review_date: "2026-03-15"
1841
+ sign_off_date: "2026-03-15"
1842
+ verdict: approved
1843
+ intent: "Verifies UI::Base abstract contract — subclass enforcement for required methods (display_table, display_banner, etc.), shared helpers (format_status, truncate_text), and NotImplementedError on unimplemented calls"
1844
+ answers:
1845
+ Q1: pass
1846
+ Q2: pass
1847
+ Q3: pass
1848
+ Q4: pass
1849
+ Q5: pass
1850
+ Q6: pass
1851
+ Q7: pass
1852
+ Q8: pass
1853
+ Q9: pass
1854
+ Q10: pass
1855
+ findings: []
1856
+
1857
+ spec/rosett_ai/ui/tui_spec.rb:
1858
+ status: signed_off
1859
+ reviewer: hugo
1860
+ review_date: "2026-03-15"
1861
+ sign_off_date: "2026-03-15"
1862
+ verdict: approved
1863
+ intent: "Verifies Tui adapter renders display_table with aligned columns, display_banner with box-drawing, format_status with colour codes, progress_bar percentage, and truncate_text with Unicode awareness"
1864
+ answers:
1865
+ Q1: pass
1866
+ Q2: pass
1867
+ Q3: pass
1868
+ Q4: pass
1869
+ Q5: pass
1870
+ Q6: pass
1871
+ Q7: pass
1872
+ Q8: pass
1873
+ Q9: pass
1874
+ Q10: pass
1875
+ findings: []
1876
+
1877
+ spec/rosett_ai/ui/accessible_tui_spec.rb:
1878
+ status: signed_off
1879
+ reviewer: hugo
1880
+ review_date: "2026-03-15"
1881
+ sign_off_date: "2026-03-15"
1882
+ verdict: approved
1883
+ intent: "Verifies AccessibleTui screen-reader-safe output — no ANSI codes, text-only table format, high-contrast status labels, semantic progress reporting, and EN 301 549 compliance helpers"
1884
+ answers:
1885
+ Q1: pass
1886
+ Q2: pass
1887
+ Q3: pass
1888
+ Q4: pass
1889
+ Q5: pass
1890
+ Q6: pass
1891
+ Q7: pass
1892
+ Q8: pass
1893
+ Q9: pass
1894
+ Q10: pass
1895
+ findings: []
1896
+
1897
+ spec/rosett_ai/ui/registry_spec.rb:
1898
+ status: signed_off
1899
+ reviewer: hugo
1900
+ review_date: "2026-03-15"
1901
+ sign_off_date: "2026-03-15"
1902
+ verdict: approved
1903
+ intent: "Verifies UI::Registry adapter registration, lookup, default selection (tui), accessible auto-selection via ORCA_RUNNING/BRLTTY_TTY env vars, and unknown adapter error handling"
1904
+ answers:
1905
+ Q1: pass
1906
+ Q2: pass
1907
+ Q3: pass
1908
+ Q4: pass
1909
+ Q5: pass
1910
+ Q6: pass
1911
+ Q7: pass
1912
+ Q8: pass
1913
+ Q9: pass
1914
+ Q10: pass
1915
+ findings: []
1916
+
1917
+ spec/rosett_ai/ui/tty_helper_spec.rb:
1918
+ status: signed_off
1919
+ reviewer: hugo
1920
+ review_date: "2026-03-15"
1921
+ sign_off_date: "2026-03-15"
1922
+ verdict: approved
1923
+ intent: "Verifies TtyHelper TTY-aware prompt helpers — confirm_yes? reads from $stdin with default fallback, non-TTY auto-accepts defaults, and say outputs to $stdout"
1924
+ answers:
1925
+ Q1: pass
1926
+ Q2: pass
1927
+ Q3: pass
1928
+ Q4: pass
1929
+ Q5: pass
1930
+ Q6: pass
1931
+ Q7: pass
1932
+ Q8: pass
1933
+ Q9: pass
1934
+ Q10: pass
1935
+ findings: []
1936
+
1937
+ spec/rosett_ai/ui/gtk4_spec.rb:
1938
+ status: signed_off
1939
+ reviewer: hugo
1940
+ review_date: "2026-03-15"
1941
+ sign_off_date: "2026-03-15"
1942
+ verdict: approved
1943
+ intent: "Verifies Gtk4 UI adapter renders Pango-markup tables, styled banners, HTML-escaped status, GTK progress fraction, and Pango-safe text truncation"
1944
+ answers:
1945
+ Q1: pass
1946
+ Q2: pass
1947
+ Q3: pass
1948
+ Q4: pass
1949
+ Q5: pass
1950
+ Q6: pass
1951
+ Q7: pass
1952
+ Q8: pass
1953
+ Q9: pass
1954
+ Q10: pass
1955
+ findings: []
1956
+
1957
+ spec/rosett_ai/ui/qt6_spec.rb:
1958
+ status: signed_off
1959
+ reviewer: hugo
1960
+ review_date: "2026-03-15"
1961
+ sign_off_date: "2026-03-15"
1962
+ verdict: approved
1963
+ intent: "Verifies Qt6 UI adapter renders HTML tables with Qt-compatible styling, banner with border-radius, colour-coded status, QProgressBar percentage, and HTML-safe truncation"
1964
+ answers:
1965
+ Q1: pass
1966
+ Q2: pass
1967
+ Q3: pass
1968
+ Q4: pass
1969
+ Q5: pass
1970
+ Q6: pass
1971
+ Q7: pass
1972
+ Q8: pass
1973
+ Q9: pass
1974
+ Q10: pass
1975
+ findings: []
1976
+
1977
+ spec/rosett_ai/ui/kde_spec.rb:
1978
+ status: signed_off
1979
+ reviewer: hugo
1980
+ review_date: "2026-03-15"
1981
+ sign_off_date: "2026-03-15"
1982
+ verdict: approved
1983
+ intent: "Verifies KDE UI adapter renders Breeze-themed HTML tables, KDE-styled banners, Breeze-palette status colours, Plasma-compatible progress, and KDE-safe truncation"
1984
+ answers:
1985
+ Q1: pass
1986
+ Q2: pass
1987
+ Q3: pass
1988
+ Q4: pass
1989
+ Q5: pass
1990
+ Q6: pass
1991
+ Q7: pass
1992
+ Q8: pass
1993
+ Q9: pass
1994
+ Q10: pass
1995
+ findings: []
1996
+
1997
+ spec/rosett_ai/plugins/contract_spec.rb:
1998
+ status: signed_off
1999
+ reviewer: hugo
2000
+ review_date: "2026-03-15"
2001
+ sign_off_date: "2026-03-15"
2002
+ verdict: approved
2003
+ intent: "Verifies Plugins::Contract base class — validates plugin_name/plugin_type presence, PLUGIN_TYPES constant [:engine, :gui, :mcp], lifecycle hooks (activate/deactivate), and abstract method enforcement"
2004
+ answers:
2005
+ Q1: pass
2006
+ Q2: pass
2007
+ Q3: pass
2008
+ Q4: pass
2009
+ Q5: pass
2010
+ Q6: pass
2011
+ Q7: pass
2012
+ Q8: pass
2013
+ Q9: pass
2014
+ Q10: pass
2015
+ findings: []
2016
+
2017
+ spec/rosett_ai/plugins/engine_contract_spec.rb:
2018
+ status: signed_off
2019
+ reviewer: hugo
2020
+ review_date: "2026-03-15"
2021
+ sign_off_date: "2026-03-15"
2022
+ verdict: approved
2023
+ intent: "Verifies EngineContract duck-type — requires compile_rules/engine_name/supported_features, inherits Contract lifecycle, validates engine type classification"
2024
+ answers:
2025
+ Q1: pass
2026
+ Q2: pass
2027
+ Q3: pass
2028
+ Q4: pass
2029
+ Q5: pass
2030
+ Q6: pass
2031
+ Q7: pass
2032
+ Q8: pass
2033
+ Q9: pass
2034
+ Q10: pass
2035
+ findings: []
2036
+
2037
+ spec/rosett_ai/plugins/gui_contract_spec.rb:
2038
+ status: signed_off
2039
+ reviewer: hugo
2040
+ review_date: "2026-03-15"
2041
+ sign_off_date: "2026-03-15"
2042
+ verdict: approved
2043
+ intent: "Verifies GuiContract duck-type — requires show_window/gui_toolkit, inherits Contract lifecycle, validates gui type classification"
2044
+ answers:
2045
+ Q1: pass
2046
+ Q2: pass
2047
+ Q3: pass
2048
+ Q4: pass
2049
+ Q5: pass
2050
+ Q6: pass
2051
+ Q7: pass
2052
+ Q8: pass
2053
+ Q9: pass
2054
+ Q10: pass
2055
+ findings: []
2056
+
2057
+ spec/rosett_ai/plugins/mcp_contract_spec.rb:
2058
+ status: signed_off
2059
+ reviewer: hugo
2060
+ review_date: "2026-03-15"
2061
+ sign_off_date: "2026-03-15"
2062
+ verdict: approved
2063
+ intent: "Verifies McpContract duck-type — requires handle_request/server_info, inherits Contract lifecycle, validates mcp type classification"
2064
+ answers:
2065
+ Q1: pass
2066
+ Q2: pass
2067
+ Q3: pass
2068
+ Q4: pass
2069
+ Q5: pass
2070
+ Q6: pass
2071
+ Q7: pass
2072
+ Q8: pass
2073
+ Q9: pass
2074
+ Q10: pass
2075
+ findings: []
2076
+
2077
+ spec/rosett_ai/plugins/registry_spec.rb:
2078
+ status: signed_off
2079
+ reviewer: hugo
2080
+ review_date: "2026-03-15"
2081
+ sign_off_date: "2026-03-15"
2082
+ verdict: approved
2083
+ intent: "Verifies Plugins::Registry — register/lookup/list by type, duplicate name rejection, contract compliance validation, and type-filtered listing"
2084
+ answers:
2085
+ Q1: pass
2086
+ Q2: pass
2087
+ Q3: pass
2088
+ Q4: pass
2089
+ Q5: pass
2090
+ Q6: pass
2091
+ Q7: pass
2092
+ Q8: pass
2093
+ Q9: pass
2094
+ Q10: pass
2095
+ findings: []
2096
+
2097
+ spec/rosett_ai/engines/registry_spec.rb:
2098
+ status: signed_off
2099
+ reviewer: hugo
2100
+ review_date: "2026-03-15"
2101
+ sign_off_date: "2026-03-15"
2102
+ verdict: approved
2103
+ intent: "Verifies Engines::Registry — register/lookup/list engines, default engine selection, duplicate rejection, and reset! for test isolation"
2104
+ answers:
2105
+ Q1: pass
2106
+ Q2: pass
2107
+ Q3: pass
2108
+ Q4: pass
2109
+ Q5: pass
2110
+ Q6: pass
2111
+ Q7: pass
2112
+ Q8: pass
2113
+ Q9: pass
2114
+ Q10: pass
2115
+ findings: []
2116
+
2117
+ spec/rosett_ai/engines/base_config_compiler_spec.rb:
2118
+ status: signed_off
2119
+ reviewer: hugo
2120
+ review_date: "2026-03-15"
2121
+ sign_off_date: "2026-03-15"
2122
+ verdict: approved
2123
+ intent: "Verifies BaseConfigCompiler abstract contract — subclass must implement compile_scope/engine_name, provides config file discovery, validates YAML loading, and reports compile results"
2124
+ answers:
2125
+ Q1: pass
2126
+ Q2: pass
2127
+ Q3: pass
2128
+ Q4: pass
2129
+ Q5: pass
2130
+ Q6: pass
2131
+ Q7: pass
2132
+ Q8: pass
2133
+ Q9: pass
2134
+ Q10: pass
2135
+ findings: []
2136
+
2137
+ spec/rosett_ai/engines/detector_spec.rb:
2138
+ status: signed_off
2139
+ reviewer: hugo
2140
+ review_date: "2026-03-15"
2141
+ sign_off_date: "2026-03-15"
2142
+ verdict: approved
2143
+ intent: "Verifies Engines::Detector manifest-driven detection — checks cli_binary via which and config_dir existence, returns detected engine list, handles missing binaries gracefully"
2144
+ answers:
2145
+ Q1: pass
2146
+ Q2: pass
2147
+ Q3: pass
2148
+ Q4: pass
2149
+ Q5: pass
2150
+ Q6: pass
2151
+ Q7: pass
2152
+ Q8: pass
2153
+ Q9: pass
2154
+ Q10: pass
2155
+ findings: []
2156
+
2157
+ spec/rosett_ai/i18n/locale_resolver_spec.rb:
2158
+ status: signed_off
2159
+ reviewer: hugo
2160
+ review_date: "2026-03-15"
2161
+ sign_off_date: "2026-03-15"
2162
+ verdict: approved
2163
+ intent: "Verifies LocaleResolver POSIX locale parsing (LANG/LC_ALL/LC_MESSAGES), language-region extraction, fallback chain to 'en', and validation against available locales"
2164
+ answers:
2165
+ Q1: pass
2166
+ Q2: pass
2167
+ Q3: pass
2168
+ Q4: pass
2169
+ Q5: pass
2170
+ Q6: pass
2171
+ Q7: pass
2172
+ Q8: pass
2173
+ Q9: pass
2174
+ Q10: pass
2175
+ findings: []
2176
+
2177
+ spec/rosett_ai/i18n/utf8_checker_spec.rb:
2178
+ status: signed_off
2179
+ reviewer: hugo
2180
+ review_date: "2026-03-15"
2181
+ sign_off_date: "2026-03-15"
2182
+ verdict: approved
2183
+ intent: "Verifies Utf8Checker validates UTF-8 encoding on strings and files, detects invalid byte sequences, reports line/column positions of encoding errors, and handles empty/missing files"
2184
+ answers:
2185
+ Q1: pass
2186
+ Q2: pass
2187
+ Q3: pass
2188
+ Q4: pass
2189
+ Q5: pass
2190
+ Q6: pass
2191
+ Q7: pass
2192
+ Q8: pass
2193
+ Q9: pass
2194
+ Q10: pass
2195
+ findings: []
2196
+
2197
+ # --- Batch 9: Adopter + Quorum + Documentation + Core utilities (reviewed 2026-03-15) ---
2198
+
2199
+ spec/rosett_ai/adopter/executor_resolver_spec.rb:
2200
+ status: signed_off
2201
+ reviewer: hugo
2202
+ review_date: "2026-03-15"
2203
+ sign_off_date: "2026-03-15"
2204
+ verdict: approved
2205
+ intent: "Verifies ExecutorResolver creates correct executor instances for SDK-based (Claude), HTTP-based (Ollama), OpenAI-compatible (GPT-NeoX), and CLI-based (Goose/Aider) engines with proper kwargs routing"
2206
+ answers:
2207
+ Q1: pass
2208
+ Q2: pass
2209
+ Q3: pass
2210
+ Q4: pass
2211
+ Q5: pass
2212
+ Q6: pass
2213
+ Q7: pass
2214
+ Q8: pass
2215
+ Q9: pass
2216
+ Q10: pass
2217
+ findings: []
2218
+
2219
+ spec/rosett_ai/adopter/local_analysis_collector_spec.rb:
2220
+ status: signed_off
2221
+ reviewer: hugo
2222
+ review_date: "2026-03-15"
2223
+ sign_off_date: "2026-03-15"
2224
+ verdict: approved
2225
+ intent: "Verifies LocalAnalysisCollector structural analysis of compiled rules — empty descriptions, missing priorities, identical descriptions, bullet-list AGENTS.md format with synthetic IDs, and overall_status pass/warn/fail"
2226
+ answers:
2227
+ Q1: pass
2228
+ Q2: pass
2229
+ Q3: pass
2230
+ Q4: pass
2231
+ Q5: pass
2232
+ Q6: pass
2233
+ Q7: pass
2234
+ Q8: pass
2235
+ Q9: pass
2236
+ Q10: pass
2237
+ findings: []
2238
+
2239
+ spec/rosett_ai/adopter/rule_adopter_spec.rb:
2240
+ status: signed_off
2241
+ reviewer: hugo
2242
+ review_date: "2026-03-15"
2243
+ sign_off_date: "2026-03-15"
2244
+ verdict: approved
2245
+ intent: "Verifies RuleAdopter full adoption pipeline — file discovery, SHA256 checksums, cache read/write, redaction patterns, prompt building, local/API analysis, sensitive file filtering, engine parameter, and merge_results status logic"
2246
+ answers:
2247
+ Q1: pass
2248
+ Q2: pass
2249
+ Q3: pass
2250
+ Q4: pass
2251
+ Q5: pass
2252
+ Q6: pass
2253
+ Q7: pass
2254
+ Q8: pass
2255
+ Q9: pass
2256
+ Q10: pass
2257
+ findings: []
2258
+
2259
+ spec/rosett_ai/quorum/collector_spec.rb:
2260
+ status: signed_off
2261
+ reviewer: hugo
2262
+ review_date: "2026-03-15"
2263
+ sign_off_date: "2026-03-15"
2264
+ verdict: approved
2265
+ intent: "Verifies Quorum::Collector annotates findings with engine name, preserves original finding data, creates error findings for failed engines, and handles empty findings"
2266
+ answers:
2267
+ Q1: pass
2268
+ Q2: pass
2269
+ Q3: pass
2270
+ Q4: pass
2271
+ Q5: pass
2272
+ Q6: pass
2273
+ Q7: pass
2274
+ Q8: pass
2275
+ Q9: pass
2276
+ Q10: pass
2277
+ findings: []
2278
+
2279
+ spec/rosett_ai/quorum/comparator_spec.rb:
2280
+ status: signed_off
2281
+ reviewer: hugo
2282
+ review_date: "2026-03-15"
2283
+ sign_off_date: "2026-03-15"
2284
+ verdict: approved
2285
+ intent: "Verifies Quorum::Comparator cross-engine finding merge (identical findings → cross_engine:true), unique finding separation, severity promotion to highest across engines, overall status determination, and informative summary text"
2286
+ answers:
2287
+ Q1: pass
2288
+ Q2: pass
2289
+ Q3: pass
2290
+ Q4: pass
2291
+ Q5: pass
2292
+ Q6: pass
2293
+ Q7: pass
2294
+ Q8: pass
2295
+ Q9: pass
2296
+ Q10: pass
2297
+ findings: []
2298
+
2299
+ spec/rosett_ai/quorum/dispatcher_spec.rb:
2300
+ status: signed_off
2301
+ reviewer: hugo
2302
+ review_date: "2026-03-15"
2303
+ sign_off_date: "2026-03-15"
2304
+ verdict: approved
2305
+ intent: "Verifies Quorum::Dispatcher parallel executor dispatch — multiple executors, elapsed time tracking, error capture without crash, mixed success/failure isolation, and empty executor map"
2306
+ answers:
2307
+ Q1: pass
2308
+ Q2: pass
2309
+ Q3: pass
2310
+ Q4: pass
2311
+ Q5: pass
2312
+ Q6: pass
2313
+ Q7: pass
2314
+ Q8: pass
2315
+ Q9: pass
2316
+ Q10: pass
2317
+ findings: []
2318
+
2319
+ spec/rosett_ai/quorum/strategies/adopt_spec.rb:
2320
+ status: signed_off
2321
+ reviewer: hugo
2322
+ review_date: "2026-03-15"
2323
+ sign_off_date: "2026-03-15"
2324
+ verdict: approved
2325
+ intent: "Verifies Quorum Adopt strategy filters eligible engines by adopt_api capability + executor presence, runs aggregated analysis across engines, and raises AdoptError when no eligible engines exist"
2326
+ answers:
2327
+ Q1: pass
2328
+ Q2: pass
2329
+ Q3: pass
2330
+ Q4: pass
2331
+ Q5: pass
2332
+ Q6: pass
2333
+ Q7: pass
2334
+ Q8: pass
2335
+ Q9: pass
2336
+ Q10: pass
2337
+ findings: []
2338
+
2339
+ spec/rosett_ai/documentation/reference_compiler_spec.rb:
2340
+ status: signed_off
2341
+ reviewer: hugo
2342
+ review_date: "2026-03-15"
2343
+ sign_off_date: "2026-03-15"
2344
+ verdict: approved
2345
+ intent: "Verifies ReferenceCompiler LaTeX pipeline — tool availability checks, staleness detection (PDF vs source/design mtime), 4-pass compilation sequence (pdflatex×4 + biber + makeindex), artifact cleanup, and error handling for missing tools/sources"
2346
+ answers:
2347
+ Q1: pass
2348
+ Q2: pass
2349
+ Q3: pass
2350
+ Q4: pass
2351
+ Q5: pass
2352
+ Q6: pass
2353
+ Q7: pass
2354
+ Q8: pass
2355
+ Q9: pass
2356
+ Q10: pass
2357
+ findings: []
2358
+
2359
+ spec/rosett_ai/documentation/translator_spec.rb:
2360
+ status: signed_off
2361
+ reviewer: hugo
2362
+ review_date: "2026-03-15"
2363
+ sign_off_date: "2026-03-15"
2364
+ verdict: approved
2365
+ intent: "Verifies Translator Claude API-powered document translation — API call with correct prompt, output file creation in locale directory, skip guard for missing anthropic gem"
2366
+ answers:
2367
+ Q1: pass
2368
+ Q2: pass
2369
+ Q3: pass
2370
+ Q4: pass
2371
+ Q5: pass
2372
+ Q6: pass
2373
+ Q7: pass
2374
+ Q8: pass
2375
+ Q9: pass
2376
+ Q10: pass
2377
+ findings: []
2378
+
2379
+ spec/rosett_ai/config/compiler_spec.rb:
2380
+ status: signed_off
2381
+ reviewer: hugo
2382
+ review_date: "2026-03-15"
2383
+ sign_off_date: "2026-03-15"
2384
+ verdict: approved
2385
+ intent: "Verifies deprecated RosettAi::Config::Compiler alias resolves to RosettAiEngine::Claude::ConfigCompiler, with skip guard for missing engine gem"
2386
+ answers:
2387
+ Q1: pass
2388
+ Q2: pass
2389
+ Q3: pass
2390
+ Q4: pass
2391
+ Q5: pass
2392
+ Q6: pass
2393
+ Q7: pass
2394
+ Q8: pass
2395
+ Q9: pass
2396
+ Q10: pass
2397
+ findings: []
2398
+
2399
+ spec/rosett_ai/formatting_spec.rb:
2400
+ status: signed_off
2401
+ reviewer: hugo
2402
+ review_date: "2026-03-15"
2403
+ sign_off_date: "2026-03-15"
2404
+ verdict: approved
2405
+ intent: "Verifies Formatting module format_size (B/KB/MB/GB with boundaries) and format_duration (seconds/minutes) helpers, plus SIZE_UNITS frozen constant"
2406
+ answers:
2407
+ Q1: pass
2408
+ Q2: pass
2409
+ Q3: pass
2410
+ Q4: pass
2411
+ Q5: pass
2412
+ Q6: pass
2413
+ Q7: pass
2414
+ Q8: pass
2415
+ Q9: pass
2416
+ Q10: pass
2417
+ findings: []
2418
+
2419
+ spec/rosett_ai/gem_consistency_checker_spec.rb:
2420
+ status: signed_off
2421
+ reviewer: hugo
2422
+ review_date: "2026-03-15"
2423
+ sign_off_date: "2026-03-15"
2424
+ verdict: approved
2425
+ intent: "Verifies GemConsistencyChecker detects gemspec/lockfile mismatches (missing, conflict, ok), stale version references in docs (with file/line/gem/found/expected), exclusion paths (vendor/, Gemfile.lock, conf/design/), and rai:no-version-check suppression"
2426
+ answers:
2427
+ Q1: pass
2428
+ Q2: pass
2429
+ Q3: pass
2430
+ Q4: pass
2431
+ Q5: pass
2432
+ Q6: pass
2433
+ Q7: pass
2434
+ Q8: pass
2435
+ Q9: pass
2436
+ Q10: pass
2437
+ findings: []
2438
+
2439
+ spec/rosett_ai/yaml_loader_property_spec.rb:
2440
+ status: signed_off
2441
+ reviewer: hugo
2442
+ review_date: "2026-03-15"
2443
+ sign_off_date: "2026-03-15"
2444
+ verdict: approved
2445
+ intent: "Verifies YamlLoader safety limits via Rantly property-based testing — random valid hashes always load, oversized payloads always rejected, deeply nested structures always rejected"
2446
+ answers:
2447
+ Q1: pass
2448
+ Q2: pass
2449
+ Q3: pass
2450
+ Q4: pass
2451
+ Q5: pass
2452
+ Q6: pass
2453
+ Q7: pass
2454
+ Q8: pass
2455
+ Q9: pass
2456
+ Q10: pass
2457
+ findings: []
2458
+
2459
+ spec/rosett_ai/yaml_loader_spec.rb:
2460
+ status: signed_off
2461
+ reviewer: hugo
2462
+ review_date: "2026-03-15"
2463
+ sign_off_date: "2026-03-15"
2464
+ verdict: approved
2465
+ intent: "Verifies YamlLoader deterministic safety limits — file size (1MB), nesting depth (10 levels for hash/array/mixed), key count (1000 including nested), boundary acceptance/rejection, Date/Time permitted classes, and error messages with file paths and counts"
2466
+ answers:
2467
+ Q1: pass
2468
+ Q2: pass
2469
+ Q3: pass
2470
+ Q4: pass
2471
+ Q5: pass
2472
+ Q6: pass
2473
+ Q7: pass
2474
+ Q8: pass
2475
+ Q9: pass
2476
+ Q10: pass
2477
+ findings: []
2478
+
2479
+ spec/rubocop/cop/rosett-ai/shell_interpolation_spec.rb:
2480
+ status: signed_off
2481
+ reviewer: hugo
2482
+ review_date: "2026-03-15"
2483
+ sign_off_date: "2026-03-15"
2484
+ verdict: approved
2485
+ intent: "Verifies ShellInterpolation RuboCop cop detects shell injection via interpolated strings in system/exec/spawn/backticks, and permits array-form system() and plain string commands"
2486
+ answers:
2487
+ Q1: pass
2488
+ Q2: pass
2489
+ Q3: pass
2490
+ Q4: pass
2491
+ Q5: pass
2492
+ Q6: pass
2493
+ Q7: pass
2494
+ Q8: pass
2495
+ Q9: pass
2496
+ Q10: pass
2497
+ findings: []
2498
+
2499
+ spec/rubocop/cop/rosett-ai/unsafe_yaml_load_spec.rb:
2500
+ status: signed_off
2501
+ reviewer: hugo
2502
+ review_date: "2026-03-15"
2503
+ sign_off_date: "2026-03-15"
2504
+ verdict: approved
2505
+ intent: "Verifies UnsafeYamlLoad RuboCop cop detects YAML.load/load_file/::YAML.load usage and permits YAML.safe_load, safe_load_file, and RosettAi::YamlLoader.load_file"
2506
+ answers:
2507
+ Q1: pass
2508
+ Q2: pass
2509
+ Q3: pass
2510
+ Q4: pass
2511
+ Q5: pass
2512
+ Q6: pass
2513
+ Q7: pass
2514
+ Q8: pass
2515
+ Q9: pass
2516
+ Q10: pass
2517
+ findings: []
2518
+
2519
+ spec/yard_coverage_spec.rb:
2520
+ status: signed_off
2521
+ reviewer: hugo
2522
+ review_date: "2026-03-15"
2523
+ sign_off_date: "2026-03-15"
2524
+ verdict: approved
2525
+ intent: "Verifies YARD documentation coverage — tier1 core API files (6) each have @return tags, and overall lib/ coverage meets 40% threshold with dynamic file scanning"
2526
+ answers:
2527
+ Q1: pass
2528
+ Q2: pass
2529
+ Q3: pass
2530
+ Q4: pass
2531
+ Q5: pass
2532
+ Q6: pass
2533
+ Q7: pass
2534
+ Q8: pass
2535
+ Q9: pass
2536
+ Q10: pass
2537
+ findings: []
2538
+
2539
+ # --- Batch 10: Thor CLI + Thor tasks (reviewed 2026-03-15) — FINAL BATCH ---
2540
+
2541
+ spec/rosett_ai/thor/cli_help_spec.rb:
2542
+ status: signed_off
2543
+ reviewer: hugo
2544
+ review_date: "2026-03-15"
2545
+ sign_off_date: "2026-03-15"
2546
+ verdict: approved
2547
+ intent: "Verifies CLI help output renders without error for top-level help, version, and all 12 registered subcommands via dynamic test generation from subcommands array"
2548
+ answers:
2549
+ Q1: pass
2550
+ Q2: pass
2551
+ Q3: pass
2552
+ Q4: pass
2553
+ Q5: pass
2554
+ Q6: pass
2555
+ Q7: pass
2556
+ Q8: pass
2557
+ Q9: pass
2558
+ Q10: pass
2559
+ findings: []
2560
+
2561
+ spec/rosett_ai/thor/cli_spec.rb:
2562
+ status: signed_off
2563
+ reviewer: hugo
2564
+ review_date: "2026-03-15"
2565
+ sign_off_date: "2026-03-15"
2566
+ verdict: approved
2567
+ intent: "Verifies CLI command visibility — internal commands (release, documentation, dbus, desktop) hidden outside rosett-ai repo via nncc_internal? guard, invoke_command raises Thor::Error for restricted commands"
2568
+ answers:
2569
+ Q1: pass
2570
+ Q2: pass
2571
+ Q3: pass
2572
+ Q4: pass
2573
+ Q5: pass
2574
+ Q6: pass
2575
+ Q7: pass
2576
+ Q8: pass
2577
+ Q9: pass
2578
+ Q10: pass
2579
+ findings: []
2580
+
2581
+ spec/rosett_ai/thor/tasks/adopt_spec.rb:
2582
+ status: signed_off
2583
+ reviewer: hugo
2584
+ review_date: "2026-03-15"
2585
+ sign_off_date: "2026-03-15"
2586
+ verdict: approved
2587
+ intent: "Verifies Adopt task CLI output — local/API modes, pass/warn/fail/unknown status display, severity colorization, elaborate explanations, verbose file counts, sensitive file reporting, cached results, and empty files warning"
2588
+ answers:
2589
+ Q1: pass
2590
+ Q2: pass
2591
+ Q3: pass
2592
+ Q4: pass
2593
+ Q5: pass
2594
+ Q6: pass
2595
+ Q7: pass
2596
+ Q8: pass
2597
+ Q9: pass
2598
+ Q10: pass
2599
+ findings: []
2600
+
2601
+ spec/rosett_ai/thor/tasks/backup_spec.rb:
2602
+ status: signed_off
2603
+ reviewer: hugo
2604
+ review_date: "2026-03-15"
2605
+ sign_off_date: "2026-03-15"
2606
+ verdict: approved
2607
+ intent: "Verifies Backup task — global/local/both scopes, tar.gz creation with content verification, exclusions (settings.local.json, adopt cache), compression algorithms/ratios, URI destinations (file:// support, s3:// rejection), idempotency (unchanged/updated), and summary table"
2608
+ answers:
2609
+ Q1: pass
2610
+ Q2: pass
2611
+ Q3: pass
2612
+ Q4: pass
2613
+ Q5: pass
2614
+ Q6: pass
2615
+ Q7: pass
2616
+ Q8: pass
2617
+ Q9: pass
2618
+ Q10: pass
2619
+ findings: []
2620
+
2621
+ spec/rosett_ai/thor/tasks/behaviour_manage_spec.rb:
2622
+ status: signed_off
2623
+ reviewer: hugo
2624
+ review_date: "2026-03-15"
2625
+ sign_off_date: "2026-03-15"
2626
+ verdict: approved
2627
+ intent: "Verifies BehaviourManage CRUD lifecycle — add with editor ($EDITOR=true), modify with metadata update, delete with force/confirmation/decline, validation failure cleanup, and reference detection in CLAUDE.md and rules"
2628
+ answers:
2629
+ Q1: pass
2630
+ Q2: pass
2631
+ Q3: pass
2632
+ Q4: pass
2633
+ Q5: pass
2634
+ Q6: pass
2635
+ Q7: pass
2636
+ Q8: pass
2637
+ Q9: pass
2638
+ Q10: pass
2639
+ findings: []
2640
+
2641
+ spec/rosett_ai/thor/tasks/behaviour_spec.rb:
2642
+ status: signed_off
2643
+ reviewer: hugo
2644
+ review_date: "2026-03-15"
2645
+ sign_off_date: "2026-03-15"
2646
+ verdict: approved
2647
+ intent: "Verifies Behaviour task — display with table/json/yaml formats and used_in values, list all files, show specific behaviour, validate all/specific files with Thor::Error on failure, corrupted file error handling"
2648
+ answers:
2649
+ Q1: pass
2650
+ Q2: pass
2651
+ Q3: pass
2652
+ Q4: pass
2653
+ Q5: pass
2654
+ Q6: pass
2655
+ Q7: pass
2656
+ Q8: pass
2657
+ Q9: pass
2658
+ Q10: pass
2659
+ findings: []
2660
+
2661
+ spec/rosett_ai/thor/tasks/build_spec.rb:
2662
+ status: signed_off
2663
+ reviewer: hugo
2664
+ review_date: "2026-03-15"
2665
+ sign_off_date: "2026-03-15"
2666
+ verdict: approved
2667
+ intent: "Verifies Build task registers package and engine subcommands and returns exit_on_failure? true"
2668
+ answers:
2669
+ Q1: pass
2670
+ Q2: pass
2671
+ Q3: pass
2672
+ Q4: pass
2673
+ Q5: pass
2674
+ Q6: pass
2675
+ Q7: pass
2676
+ Q8: pass
2677
+ Q9: pass
2678
+ Q10: pass
2679
+ findings: []
2680
+
2681
+ spec/rosett_ai/thor/tasks/config_spec.rb:
2682
+ status: signed_off
2683
+ reviewer: hugo
2684
+ review_date: "2026-03-15"
2685
+ sign_off_date: "2026-03-15"
2686
+ verdict: approved
2687
+ intent: "Verifies Config task — compile with scope files, --simulate dry run, --scope filtering, invalid scope error, show with JSON display and secret masking, --raw YAML display, engine plugin resolution with actionable error messages, and CLI registration"
2688
+ answers:
2689
+ Q1: pass
2690
+ Q2: pass
2691
+ Q3: pass
2692
+ Q4: pass
2693
+ Q5: pass
2694
+ Q6: pass
2695
+ Q7: pass
2696
+ Q8: pass
2697
+ Q9: pass
2698
+ Q10: pass
2699
+ findings: []
2700
+
2701
+ spec/rosett_ai/thor/tasks/content_spec.rb:
2702
+ status: signed_off
2703
+ reviewer: hugo
2704
+ review_date: "2026-03-15"
2705
+ sign_off_date: "2026-03-15"
2706
+ verdict: approved
2707
+ intent: "Verifies Content task — list installed packs, install with WebMock-stubbed catalog/download/signature and Ed25519 license validation, tier-insufficient error, and update with no packs"
2708
+ answers:
2709
+ Q1: pass
2710
+ Q2: pass
2711
+ Q3: pass
2712
+ Q4: pass
2713
+ Q5: pass
2714
+ Q6: pass
2715
+ Q7: pass
2716
+ Q8: pass
2717
+ Q9: pass
2718
+ Q10: pass
2719
+ findings: []
2720
+
2721
+ spec/rosett_ai/thor/tasks/dbus_spec.rb:
2722
+ status: signed_off
2723
+ reviewer: hugo
2724
+ review_date: "2026-03-15"
2725
+ sign_off_date: "2026-03-15"
2726
+ verdict: approved
2727
+ intent: "Verifies DBus task — status (running/not running), detect compositor with adapter mapping, start (already running / D-Bus unavailable), stop (not running), and adapter_for private method for sway/hyprland/unknown"
2728
+ answers:
2729
+ Q1: pass
2730
+ Q2: pass
2731
+ Q3: pass
2732
+ Q4: pass
2733
+ Q5: pass
2734
+ Q6: pass
2735
+ Q7: pass
2736
+ Q8: pass
2737
+ Q9: pass
2738
+ Q10: pass
2739
+ findings: []
2740
+
2741
+ spec/rosett_ai/thor/tasks/design_spec.rb:
2742
+ status: signed_off
2743
+ reviewer: hugo
2744
+ review_date: "2026-03-15"
2745
+ sign_off_date: "2026-03-15"
2746
+ verdict: approved
2747
+ intent: "Verifies Design task — validate all/specific/missing docs, show with header/intent/constraints/acceptance/dependencies, --full with examples/anti-patterns/preferences, list with table and malformed file handling"
2748
+ answers:
2749
+ Q1: pass
2750
+ Q2: pass
2751
+ Q3: pass
2752
+ Q4: pass
2753
+ Q5: pass
2754
+ Q6: pass
2755
+ Q7: pass
2756
+ Q8: pass
2757
+ Q9: pass
2758
+ Q10: pass
2759
+ findings: []
2760
+
2761
+ spec/rosett_ai/thor/tasks/desktop_spec.rb:
2762
+ status: signed_off
2763
+ reviewer: hugo
2764
+ review_date: "2026-03-15"
2765
+ sign_off_date: "2026-03-15"
2766
+ verdict: approved
2767
+ intent: "Verifies Desktop task — status display with GTK4/D-Bus availability, install instructions when missing, gtk4 launch with SystemExit(0) on success and Thor::Error when unavailable"
2768
+ answers:
2769
+ Q1: pass
2770
+ Q2: pass
2771
+ Q3: pass
2772
+ Q4: pass
2773
+ Q5: pass
2774
+ Q6: pass
2775
+ Q7: pass
2776
+ Q8: pass
2777
+ Q9: pass
2778
+ Q10: pass
2779
+ findings: []
2780
+
2781
+ spec/rosett_ai/thor/tasks/documentation_spec.rb:
2782
+ status: signed_off
2783
+ reviewer: hugo
2784
+ review_date: "2026-03-15"
2785
+ sign_off_date: "2026-03-15"
2786
+ verdict: approved
2787
+ intent: "Verifies Documentation task — update with dry-run/apply/all-locales, status with file count and locale display, private change scanning (behaviour/dependency/lib/reference), documented? detection, locale resolution, and reference compilation integration"
2788
+ answers:
2789
+ Q1: pass
2790
+ Q2: pass
2791
+ Q3: pass
2792
+ Q4: pass
2793
+ Q5: pass
2794
+ Q6: pass
2795
+ Q7: pass
2796
+ Q8: pass
2797
+ Q9: pass
2798
+ Q10: pass
2799
+ findings: []
2800
+
2801
+ spec/rosett_ai/thor/tasks/engines_spec.rb:
2802
+ status: signed_off
2803
+ reviewer: hugo
2804
+ review_date: "2026-03-15"
2805
+ sign_off_date: "2026-03-15"
2806
+ verdict: approved
2807
+ intent: "Verifies Engines task — list all engines in table, detect with detector stubs for claude/agents_md/acme, and status with default engine display and detection results"
2808
+ answers:
2809
+ Q1: pass
2810
+ Q2: pass
2811
+ Q3: pass
2812
+ Q4: pass
2813
+ Q5: pass
2814
+ Q6: pass
2815
+ Q7: pass
2816
+ Q8: pass
2817
+ Q9: pass
2818
+ Q10: pass
2819
+ findings: []
2820
+
2821
+ spec/rosett_ai/thor/tasks/init_spec.rb:
2822
+ status: signed_off
2823
+ reviewer: hugo
2824
+ review_date: "2026-03-15"
2825
+ sign_off_date: "2026-03-15"
2826
+ verdict: approved
2827
+ intent: "Verifies Init task — --global creates directories/settings/config with engine detection, --local creates .claude structure, --project creates .rosett-ai with config.yml, RAI_ORIGINAL_PWD respects external directory, compile integration with --no-compile and CompileError graceful handling"
2828
+ answers:
2829
+ Q1: pass
2830
+ Q2: pass
2831
+ Q3: pass
2832
+ Q4: pass
2833
+ Q5: pass
2834
+ Q6: pass
2835
+ Q7: pass
2836
+ Q8: pass
2837
+ Q9: pass
2838
+ Q10: pass
2839
+ findings: []
2840
+
2841
+ spec/rosett_ai/thor/tasks/license_spec.rb:
2842
+ status: signed_off
2843
+ reviewer: hugo
2844
+ review_date: "2026-03-15"
2845
+ sign_off_date: "2026-03-15"
2846
+ verdict: approved
2847
+ intent: "Verifies License task — activate with valid/invalid Ed25519 JWT keys, status display (community/subscriber tiers), and deactivate with file removal and not-found handling"
2848
+ answers:
2849
+ Q1: pass
2850
+ Q2: pass
2851
+ Q3: pass
2852
+ Q4: pass
2853
+ Q5: pass
2854
+ Q6: pass
2855
+ Q7: pass
2856
+ Q8: pass
2857
+ Q9: pass
2858
+ Q10: pass
2859
+ findings: []
2860
+
2861
+ spec/rosett_ai/thor/tasks/release_spec.rb:
2862
+ status: signed_off
2863
+ reviewer: hugo
2864
+ review_date: "2026-03-15"
2865
+ sign_off_date: "2026-03-15"
2866
+ verdict: approved
2867
+ intent: "Verifies Release task — status table with version/commit count, prepare with invalid level/dirty tree guards, tag with exists check, version bumping arithmetic (major/minor/patch resets), VERIFICATION_GATES constant, and VALID_LEVELS constant"
2868
+ answers:
2869
+ Q1: pass
2870
+ Q2: pass
2871
+ Q3: pass
2872
+ Q4: pass
2873
+ Q5: pass
2874
+ Q6: pass
2875
+ Q7: pass
2876
+ Q8: pass
2877
+ Q9: pass
2878
+ Q10: pass
2879
+ findings: []
2880
+
2881
+ spec/rosett_ai/thor/tasks/tooling_spec.rb:
2882
+ status: signed_off
2883
+ reviewer: hugo
2884
+ review_date: "2026-03-15"
2885
+ sign_off_date: "2026-03-15"
2886
+ verdict: approved
2887
+ intent: "Verifies Tooling task registers validate-ci-yaml and check-versions commands"
2888
+ answers:
2889
+ Q1: pass
2890
+ Q2: pass
2891
+ Q3: pass
2892
+ Q4: pass
2893
+ Q5: pass
2894
+ Q6: pass
2895
+ Q7: pass
2896
+ Q8: pass
2897
+ Q9: pass
2898
+ Q10: pass
2899
+ findings: []
2900
+
2901
+ spec/rosett_ai/thor/tasks/validate_spec.rb:
2902
+ status: signed_off
2903
+ reviewer: hugo
2904
+ review_date: "2026-03-15"
2905
+ sign_off_date: "2026-03-15"
2906
+ verdict: approved
2907
+ intent: "Verifies Validate task — all categories (behaviour/design/tooling) with zero/valid/invalid/mixed files, per-category breakdown, Thor::Error on failure, and CATEGORIES constant coverage against schema files (excluding internal schemas)"
2908
+ answers:
2909
+ Q1: pass
2910
+ Q2: pass
2911
+ Q3: pass
2912
+ Q4: pass
2913
+ Q5: pass
2914
+ Q6: pass
2915
+ Q7: pass
2916
+ Q8: pass
2917
+ Q9: pass
2918
+ Q10: pass
2919
+ findings: []