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,210 @@
1
+ ---
2
+ name: ai_authorship
3
+ domain: core
4
+ version: 0.1.0
5
+ status: implemented
6
+ priority: 2
7
+ author: hugo
8
+ created_at: "2026-03-10"
9
+ modified_at: "2026-03-16"
10
+ modified_by: claude
11
+ depends_on:
12
+ - ai_provenance
13
+ - security
14
+ - engine_architecture
15
+ - compiler
16
+ - error_handling
17
+ - policy_management
18
+ #
19
+ intent: |
20
+ Define how AI co-authorship is attributed, disclosed, and managed across
21
+ all projects using rosett-ai. While ai_provenance.yml tracks the raw data,
22
+ this design governs the human-facing policies: who gets credit, what
23
+ trailers appear on commits, how authorship is disclosed in compiled
24
+ output, and how the "hammer principle" (the human bears responsibility)
25
+ is operationalised.
26
+
27
+ This is particularly important for GPL-3.0 projects where copyright
28
+ attribution matters legally, and for organisations that need to comply
29
+ with emerging AI disclosure regulations (EU AI Act transparency
30
+ obligations, US executive orders on AI).
31
+
32
+ Authorship is the attribution layer in the provenance–authorship–policy
33
+ triad: ai_provenance.yml records what each AI tool did (audit trail),
34
+ this design governs how that involvement is attributed and disclosed
35
+ (human-facing output), and policy_management.yml governs the
36
+ requirements — which projects require what disclosure level.
37
+
38
+ Key decisions:
39
+ - AI tools are never listed as copyright holders (they are tools)
40
+ - The human operator is always the accountable author
41
+ - AI involvement is disclosed via standardised commit trailers
42
+ - Compiled CLAUDE.md / AGENTS.md / .cursorrules include authorship
43
+ attribution sections generated from provenance data
44
+ - Behaviour rules can mandate disclosure levels per project
45
+
46
+ Inspired by openvox-mcp's Area A (Attribution & Disclosure) and Area F
47
+ (Accountability), adapted for Rosett-AI's multi-engine compilation model.
48
+ #
49
+ constraints:
50
+ - "AI tools must never appear as copyright holders in SPDX headers or
51
+ LICENSE files"
52
+ - "The human who invoked the AI tool is always the accountable party"
53
+ - "Commit trailers must use one of the four standardised roles
54
+ (AI-Generated-By, AI-Co-Author, AI-Assisted-By, AI-Reviewed-By)"
55
+ - "Trailer format must follow: Role — Tool Version (Provider) <email>"
56
+ - "Trailer content must be validated against the format specification —
57
+ tool names must match known engine manifests or be explicitly
58
+ registered. Unknown tool names produce a warning (error in --strict)"
59
+ - "Authorship disclosure level is configurable per project (none,
60
+ minimal, standard, full)"
61
+ - "Changing disclosure level mid-project applies to future compilations
62
+ only — existing compiled output is not retroactively updated. A
63
+ recompile regenerates attribution for all provenance data at the
64
+ new level"
65
+ - "Compiled output must include attribution metadata when disclosure
66
+ level is standard or above"
67
+ - "Attribution metadata in compiled output must not expose information
68
+ beyond what the disclosure level permits — disclosure:minimal must
69
+ not leak per-file AI involvement details even if provenance data
70
+ contains them"
71
+ - "No contribution may be blocked solely on authorship grounds (record,
72
+ do not gate)"
73
+ - "Authorship rules must compile to every supported engine format.
74
+ Engines declare supported authorship features (trailers, metadata
75
+ sections, comments) in their capability manifest"
76
+ - "Human-Reviewed-By trailer must reference a different person than
77
+ the submitter"
78
+ - "Authorship configuration lives in .rosett-ai/config.yml, not in behaviour
79
+ YAML"
80
+ - "This design governs attribution and disclosure of AI involvement.
81
+ Provenance recording (audit trail) is governed by ai_provenance.yml.
82
+ Policy requirements for disclosure levels are governed by
83
+ policy_management.yml"
84
+ #
85
+ acceptance_criteria:
86
+ - "bin/raictl compile generates authorship attribution section when
87
+ disclosure is standard or above"
88
+ - "Commit trailer templates are generated for the active engine during
89
+ compile"
90
+ - "AI-Generated-By trailer uses the active engine name and version from
91
+ manifest"
92
+ - "Human-Reviewed-By validation rejects same-person review (submitter
93
+ must differ from reviewer)"
94
+ - "Disclosure level (none, minimal, standard, full) is configurable in
95
+ .rosett-ai/config.yml"
96
+ - "Disclosure level none produces no authorship metadata in compiled
97
+ output"
98
+ - "Disclosure level full includes per-file AI involvement summary"
99
+ - "Authorship rules are engine-agnostic — same YAML compiles to all
100
+ targets"
101
+ - "bin/raictl authorship status shows current disclosure level and recent
102
+ AI attributions using TTY-aware output (table when interactive,
103
+ plain text when piped)"
104
+ - "Compiled AGENTS.md includes an AI Attribution section when disclosure
105
+ is standard or above"
106
+ - "Compiled CLAUDE.md includes Co-Authored-By guidance when disclosure
107
+ is minimal or above"
108
+ - "Exit code 0 on success, 1 on compilation failure, 2 on validation
109
+ error, 3 on invalid trailer format, 5 on missing provenance data"
110
+ #
111
+ examples:
112
+ - scenario: "Open-source project with GPL-3.0 wants full AI transparency"
113
+ expected: |
114
+ .rosett-ai/config.yml sets disclosure: full. bin/raictl compile produces
115
+ CLAUDE.md with authorship section listing all AI tools used.
116
+ AGENTS.md includes "## AI Attribution" with provenance summary.
117
+ Commit hook template includes all four trailer types.
118
+ not: "AI appears as copyright holder. Attribution silently omitted."
119
+ - scenario: "Private corporate project wants minimal disclosure"
120
+ expected: |
121
+ .rosett-ai/config.yml sets disclosure: minimal. Compiled output includes
122
+ only a brief note that AI tools were used. No per-file details.
123
+ Commit trailers still generated (they are in git history, not public).
124
+ not: "Minimal disclosure disables provenance tracking entirely."
125
+ - scenario: "Developer submits code and reviews their own AI-generated PR"
126
+ expected: |
127
+ If Human-Reviewed-By matches the commit author, validation warns
128
+ that self-review does not satisfy the review requirement.
129
+ At strict level, this is an error.
130
+ not: "Self-review silently accepted as meaningful review."
131
+ - scenario: "Compiling for Cursor engine which has no trailer concept"
132
+ expected: |
133
+ Authorship metadata is embedded in .cursorrules comments or
134
+ omitted gracefully. Engine capability manifest indicates whether
135
+ the engine supports commit trailers. Warning emitted for gaps.
136
+ not: "Compilation fails because Cursor doesn't support trailers."
137
+ - scenario: "Project sets disclosure level to none"
138
+ expected: |
139
+ bin/raictl compile produces no authorship metadata in any compiled
140
+ output. Provenance tracking continues (recording is separate from
141
+ disclosure). `raictl authorship status` shows: 'Disclosure: none
142
+ (provenance recording active, no attribution in compiled output)'.
143
+ not: "Disclosure:none also disables provenance recording."
144
+ - scenario: "Commit trailer contains an unrecognised AI tool name"
145
+ expected: |
146
+ `raictl authorship validate` warns: 'Trailer AI-Co-Author references
147
+ unknown tool "GPT-5" — not found in any engine manifest. Register
148
+ via .rosett-ai/config.yml or install the engine.' --strict mode rejects.
149
+ not: "Unknown tool names silently accepted in trailers."
150
+ #
151
+ anti_patterns:
152
+ - "Listing AI tools as copyright holders or contributors in LICENSE files"
153
+ - "Using 'AI wrote this' as a defence for code quality issues"
154
+ - "Blocking contributions based solely on AI involvement level"
155
+ - "Storing authorship preferences in behaviour YAML (it belongs in
156
+ project config)"
157
+ - "Requiring all engines to support all authorship features (graceful
158
+ degradation via capability manifest)"
159
+ - "Making disclosure mandatory for all projects regardless of context"
160
+ - "Treating AI-Reviewed-By as equivalent to human review"
161
+ - "Leaking per-file AI details when disclosure level is minimal or none"
162
+ - "Retroactively changing compiled output when disclosure level changes
163
+ (recompile instead)"
164
+ #
165
+ gui_notes: |
166
+ Document interactions (cross-references):
167
+
168
+ 1. ai_provenance.yml: provenance records what AI did; authorship governs
169
+ how that involvement is attributed and disclosed in human-facing output.
170
+
171
+ 2. policy_management.yml: policies govern disclosure requirements — which
172
+ projects require what level, and compliance enforcement.
173
+
174
+ 3. security.yml: SPDX/LICENSE protection, trailer format validation,
175
+ compiled metadata exposure limits.
176
+
177
+ 4. engine_architecture.yml: engines declare supported authorship features
178
+ (trailers, metadata sections, comments) in capability manifests.
179
+
180
+ 5. compiler.yml: authorship attribution is a compilation output target.
181
+ Compiler invokes authorship generation as part of the pipeline.
182
+
183
+ 6. error_handling.yml: exit codes and structured error messages follow
184
+ the error hierarchy (what/why/fix format).
185
+
186
+ 7. backward_compatibility.yml: disclosure level changes affect future
187
+ compilations only — no retroactive output modification.
188
+
189
+ Disclosure level matrix:
190
+ | Level | Commit Trailers | CLAUDE.md | AGENTS.md | Per-file |
191
+ |----------|-----------------|-----------|-----------|----------|
192
+ | none | No | No | No | No |
193
+ | minimal | Yes | Brief | No | No |
194
+ | standard | Yes | Section | Section | No |
195
+ | full | Yes | Section | Section | Yes |
196
+ #
197
+ preferences:
198
+ language: ruby
199
+ patterns:
200
+ - "Configurable disclosure levels (none/minimal/standard/full)"
201
+ - "Engine capability-aware compilation"
202
+ - "Trailer template generation from provenance"
203
+ - "Separation of tracking (provenance) and policy (authorship)"
204
+ - "TTY-aware output (TtyHelper)"
205
+ testing: rspec with disclosure level fixtures, cross-engine compilation
206
+ tests, trailer format validation, self-review detection, and
207
+ disclosure level change scenarios
208
+ gems:
209
+ - json_schemer
210
+ - thor
@@ -0,0 +1,224 @@
1
+ ---
2
+ name: ai_provenance
3
+ domain: security
4
+ version: 0.1.0
5
+ status: implemented
6
+ priority: 2
7
+ author: hugo
8
+ created_at: "2026-03-10"
9
+ modified_at: "2026-03-16"
10
+ modified_by: claude
11
+ depends_on:
12
+ - security
13
+ - engine_architecture
14
+ - compiler
15
+ - error_handling
16
+ - ai_authorship
17
+ #
18
+ intent: |
19
+ Establish structured, machine-readable provenance tracking for AI involvement
20
+ in code contributions managed by Rosett-AI. Record which AI tools contributed to
21
+ which files, what role the AI played, and what external sources it drew from.
22
+
23
+ raictl already manages rules for multiple AI engines. This design extends
24
+ that to track provenance — the "who did what with which AI" metadata that
25
+ enables compliance auditing, license verification, and transparent
26
+ attribution in open-source projects.
27
+
28
+ Inspired by the OpenVox MCP Server's .ai-provenance.yml format (B3),
29
+ adapted for Rosett-AI's engine-agnostic, multi-tool architecture. Where
30
+ openvox-mcp tracks provenance for a single project, rosett-ai manages it
31
+ across all projects the user works on, compiling provenance metadata
32
+ alongside behaviour rules.
33
+
34
+ Provenance is the recording layer — it creates an audit trail of what
35
+ each AI tool did, per commit, with file-level granularity. The related
36
+ ai_authorship.yml design handles attribution and crediting — how AI
37
+ contributions are presented in commit trailers, AGENTS.md, and other
38
+ public-facing outputs. Policy management (policy_management.yml)
39
+ governs the requirements — which projects require provenance, at what
40
+ level, and what happens when provenance is missing.
41
+
42
+ Key capabilities:
43
+ - Per-commit AI provenance entries with file-level granularity
44
+ - Source type classification (library_api, project_code, documentation,
45
+ pattern, external_source) for license traceability
46
+ - Commit trailer generation (AI-Generated-By, AI-Co-Author,
47
+ AI-Assisted-By, AI-Reviewed-By) across all supported engines
48
+ - Engine-specific provenance: each engine records its own identity
49
+ - Compilation target: provenance YAML compiles to commit hooks,
50
+ CI validation rules, or AGENTS.md attribution sections
51
+ - A single commit may have provenance entries from multiple engines
52
+ (e.g. Ollama for local analysis, Claude for generation)
53
+ #
54
+ constraints:
55
+ - "Provenance file (.ai-provenance.yml) must use YAML.safe_load only"
56
+ - "Provenance entries are append-only — existing entries must never be
57
+ modified or deleted"
58
+ - "Each provenance entry must include a SHA-256 hash of the previous
59
+ entry (hash chain), creating a tamper-evident append-only log.
60
+ The first entry uses a zero hash. Validation checks the chain
61
+ integrity"
62
+ - "Source URLs for external_source type must reference specific pages,
63
+ not bare domains"
64
+ - "All provenance data must be storable offline — no mandatory network calls"
65
+ - "Commit trailers must follow the format: Trailer — Tool Version
66
+ (Provider) <email>"
67
+ - "Provenance validation must work without any engine installed (core feature)"
68
+ - "File paths in provenance entries must be relative to project root"
69
+ - "Provenance schema must be versioned independently from rosett-ai version"
70
+ - "No personally identifiable information beyond what git already stores
71
+ (name + email)"
72
+ - "Provenance entries must be validated before being written to disk"
73
+ - "When a provenance file exceeds a configurable size threshold (default
74
+ 1 MB), rosett-ai must offer archival: move older entries to a dated archive
75
+ file (.ai-provenance.YYYY.yml) and start a new active file with the
76
+ last entry's hash as the chain root"
77
+ - "This design governs provenance recording (audit trail of AI involvement).
78
+ Attribution and crediting of AI contributions is governed by
79
+ ai_authorship.yml. Policy requirements for provenance (which projects
80
+ require it, at what level) are governed by policy_management.yml"
81
+ #
82
+ acceptance_criteria:
83
+ - "bin/raictl provenance init creates .ai-provenance.yml in project root
84
+ with version header and zero-hash chain root"
85
+ - "bin/raictl provenance add creates a new entry with commit, contributor,
86
+ ai_tool, ai_role, files, and hash chain link"
87
+ - "bin/raictl provenance validate checks all entries against the provenance
88
+ schema and verifies hash chain integrity"
89
+ - "bin/raictl provenance show COMMIT displays provenance for a specific commit"
90
+ - "bin/raictl provenance show --file PATH displays all provenance entries
91
+ for a file"
92
+ - "bin/raictl provenance log shows all entries in reverse chronological order
93
+ using TTY-aware output (table when interactive, plain text when piped)"
94
+ - "bin/raictl provenance log --role AI-Co-Author filters entries by AI role"
95
+ - "Commit trailers (AI-Generated-By etc.) are generated from provenance
96
+ entries during compile"
97
+ - "Engine name and version are automatically populated from the active
98
+ engine's manifest"
99
+ - "Source type is validated against the allowed list (library_api,
100
+ project_code, documentation, pattern, external_source)"
101
+ - "External sources with bare domain URLs are rejected with a clear
102
+ error message"
103
+ - "Provenance file exceeding the size threshold triggers archival
104
+ recommendation"
105
+ - "All provenance operations work without network access"
106
+ - "Provenance entries survive round-trip (load → save produces identical YAML)"
107
+ - "Exit code 0 on success, 1 on write failure, 2 on validation error,
108
+ 3 on hash chain integrity failure, 5 on missing provenance file"
109
+ #
110
+ examples:
111
+ - scenario: "Developer uses Claude to write a new module, runs bin/raictl provenance add"
112
+ expected: |
113
+ Entry created with ai_tool: "Claude Opus 4.6 (Anthropic)",
114
+ ai_role: "AI-Co-Author", commit SHA from HEAD, contributor from
115
+ git config. File paths listed with source references. Hash chain
116
+ links to previous entry's SHA-256.
117
+ not: "Entry silently created without validation. AI tool name guessed incorrectly."
118
+ - scenario: "CI pipeline validates provenance on a pull request"
119
+ expected: |
120
+ bin/raictl provenance validate checks every commit in the PR has a
121
+ matching provenance entry. Missing entries produce warnings at
122
+ advisory level or errors at strict level. Hash chain is verified.
123
+ not: "Validation requires network access. Missing provenance silently passes."
124
+ - scenario: "Developer uses Ollama locally, no internet access"
125
+ expected: |
126
+ bin/raictl provenance add --engine ollama records provenance with
127
+ ai_tool from ollama engine manifest. Works completely offline.
128
+ not: "Provenance recording fails because it cannot reach an API."
129
+ - scenario: "A provenance entry references a StackOverflow answer"
130
+ expected: |
131
+ Source type: external_source, reference: "Answer by user123 on
132
+ handling thread safety in Ruby", url: specific answer URL.
133
+ Validated successfully.
134
+ not: "URL is just https://stackoverflow.com/ — rejected as too vague."
135
+ - scenario: "Developer views provenance history for a project"
136
+ expected: |
137
+ `rai provenance log` shows reverse chronological entries:
138
+ ┌───────────┬─────────────────┬───────────────┬──────────────┐
139
+ │ Commit │ AI Tool │ Role │ Files │
140
+ ├───────────┼─────────────────┼───────────────┼──────────────┤
141
+ │ abc1234 │ Claude Opus 4.6 │ AI-Co-Author │ lib/foo.rb │
142
+ │ def5678 │ Ollama llama3.3 │ AI-Assisted │ spec/bar.rb │
143
+ └───────────┴─────────────────┴───────────────┴──────────────┘
144
+ Piped output: tab-separated, no box drawing.
145
+ not: "No way to see provenance history. Must read YAML file manually."
146
+ - scenario: "Provenance file is corrupted — hash chain broken"
147
+ expected: |
148
+ `rai provenance validate` detects the break: 'Hash chain integrity
149
+ failure at entry #7: expected abc123..., got def456...'. Exit code 3.
150
+ Identifies the exact entry where tampering occurred.
151
+ not: "Corruption goes undetected. Provenance file accepted as valid."
152
+ - scenario: "Provenance file exceeds 1 MB after months of development"
153
+ expected: |
154
+ `rai provenance add` warns: 'Provenance file exceeds 1 MB — run
155
+ `rai provenance archive` to move older entries to a dated archive'.
156
+ Archive creates .ai-provenance.2026.yml with entries before cutoff.
157
+ New active file starts with the last archived entry's hash as root.
158
+ not: "File grows unbounded. No archival mechanism. Parsing slows down."
159
+ #
160
+ anti_patterns:
161
+ - "Storing provenance in a database instead of a versionable YAML file"
162
+ - "Requiring API calls to record provenance"
163
+ - "Allowing modification of existing provenance entries (append-only)"
164
+ - "Storing full file contents in provenance (only paths and line references)"
165
+ - "Using provenance to block contributions (it records, does not gate)"
166
+ - "Hardcoding AI tool names instead of reading from engine manifests"
167
+ - "Storing provenance per-engine instead of per-project"
168
+ - "Provenance entries without hash chain links (unverifiable integrity)"
169
+ #
170
+ gui_notes: |
171
+ Document interactions (cross-references):
172
+
173
+ 1. ai_authorship.yml: provenance records what AI did; authorship handles
174
+ how contributions are attributed and credited in public outputs.
175
+
176
+ 2. policy_management.yml: policies govern provenance requirements — which
177
+ projects require provenance, at what strictness level, and what happens
178
+ when provenance is missing.
179
+
180
+ 3. security.yml: YAML.safe_load, PII constraints, offline-first.
181
+
182
+ 4. engine_architecture.yml: engine manifests provide AI tool identity
183
+ (name, version, provider) for provenance entries.
184
+
185
+ 5. compiler.yml: provenance compiles to commit hooks, CI validation
186
+ rules, and AGENTS.md attribution sections.
187
+
188
+ 6. error_handling.yml: exit codes and structured error messages follow
189
+ the error hierarchy (what/why/fix format).
190
+
191
+ Provenance entry schema outline:
192
+ version: string (schema version, e.g. "1.0.0")
193
+ entries:
194
+ - commit: string (git SHA)
195
+ timestamp: string (ISO 8601)
196
+ contributor:
197
+ name: string (from git config)
198
+ email: string (from git config)
199
+ ai_tool:
200
+ name: string (from engine manifest)
201
+ version: string
202
+ provider: string
203
+ engine: string (rosett-ai engine name)
204
+ ai_role: AI-Generated-By | AI-Co-Author | AI-Assisted-By | AI-Reviewed-By
205
+ files:
206
+ - path: string (relative to project root)
207
+ source_type: library_api | project_code | documentation | pattern | external_source
208
+ reference: string (description of source)
209
+ url: string (optional, must be specific)
210
+ hash: string (SHA-256 of previous entry, zero-hash for first)
211
+ #
212
+ preferences:
213
+ language: ruby
214
+ patterns:
215
+ - "Append-only log with hash chain integrity"
216
+ - "Schema-validated entries before write"
217
+ - "Engine manifest integration for AI tool identity"
218
+ - "Offline-first recording"
219
+ - "TTY-aware output (TtyHelper)"
220
+ testing: rspec with provenance fixtures, round-trip tests, hash chain
221
+ validation, archival scenarios, and multi-engine provenance entries
222
+ gems:
223
+ - json_schemer
224
+ - thor
@@ -0,0 +1,207 @@
1
+ ---
2
+ name: ai_tool_configuration
3
+ domain: core
4
+ version: 0.1.0
5
+ status: implemented
6
+ priority: 2
7
+ author: hugo
8
+ created_at: "2026-03-10"
9
+ modified_at: "2026-03-16"
10
+ modified_by: claude
11
+ depends_on:
12
+ - engine_architecture
13
+ - security
14
+ - claude_code_configuration
15
+ - error_handling
16
+ - compiler
17
+ #
18
+ intent: |
19
+ Establish the engine-agnostic AI tool configuration and asset management
20
+ layer for Rosett-AI — model selection, context window settings, token budgets,
21
+ API routing, operational parameters, and AI tool assets (skills, hooks,
22
+ memory files, keybindings) that apply across all AI tools.
23
+
24
+ Relationship to claude_code_configuration.yml: that document is the Claude
25
+ engine's implementation of the contracts defined here. It handles Claude
26
+ Code's specific settings.json format, target paths, and scope routing.
27
+ This document defines the universal configuration and asset schema that
28
+ all engines implement. As rosett-ai matures, Claude-specific settings migrate
29
+ from claude_code_configuration into engine-specific config compiled from
30
+ this generic layer.
31
+
32
+ As developers use multiple AI tools simultaneously (Claude for complex
33
+ tasks, Ollama for quick local queries, Cursor for inline completions),
34
+ they need a single place to configure model routing, cost controls,
35
+ operational parameters, and reusable assets (skills, hooks, memory).
36
+ raictl compiles these preferences and assets into each tool's native
37
+ configuration format via the engine capability manifest contract.
38
+ #
39
+ constraints:
40
+ - This document defines the generic configuration and asset schema.
41
+ claude_code_configuration.yml documents the Claude engine's specific
42
+ implementation (target paths, JSON format, scope routing). Engine-specific
43
+ docs are implementation of the contracts defined here, not independent designs
44
+ - Configuration must be expressible in YAML without engine-specific keys in the generic layer
45
+ - Engine-specific overrides live in .rosett-ai/conf/engines/<name>/config.yml
46
+ - API keys and secrets must never appear in configuration YAML (reference ENV vars or keyring)
47
+ - Model names in generic config use canonical identifiers mapped per engine
48
+ - Cost controls are advisory — rosett-ai does not enforce runtime token limits
49
+ - Configuration validation must work without any engine installed
50
+ - Compiled configuration must respect security.yml constraints (no secret leakage)
51
+ - Fallback chains must not silently switch from local to remote models
52
+ - Temperature and sampling parameters are only set when the engine supports them
53
+ - Configuration changes must be diffable (YAML format, no binary blobs)
54
+ - AI tool asset types (skills, hooks, memory, keybindings, and others) are
55
+ declared by each engine's capability manifest as a contract. Core defines
56
+ the generic asset schema; engines declare which asset types they support,
57
+ their target paths, and compilation formats
58
+ - Asset content (skills, hooks) must be validated against ANSI and control
59
+ character stripping (per security.yml). Hook assets must use array-form
60
+ execution only — no shell expansion or string interpolation
61
+ - Skills and hooks are potential attack vectors (jailbreaking, shell expansion,
62
+ privilege escalation) and must undergo content validation during compilation.
63
+ Engines must reject asset content containing shell metacharacters in hook
64
+ definitions or prompt injection patterns in skill definitions
65
+ - Skill content must not contain secret references or literal API keys
66
+ - Asset compilation for unsupported asset types must produce warnings
67
+ (errors in --strict mode), consistent with unsupported parameter handling
68
+ #
69
+ acceptance_criteria:
70
+ - .rosett-ai/conf/ai_config.yml defines model routing, context, cost, and operational settings
71
+ - bin/raictl compile translates generic AI config to Claude Code settings.json model preferences
72
+ - bin/raictl compile --engine ollama translates to Ollama-specific model configuration
73
+ - bin/raictl compile --engine cursor translates to Cursor settings where applicable
74
+ - Model routing maps canonical names to engine-specific identifiers (e.g. "best" -> "claude-opus-4-6" for Claude, "llama3.3:70b" for Ollama)
75
+ - API key references use ENV variable names only — never literal values
76
+ - Context window settings compile to engine-native max_tokens or equivalent
77
+ - Fallback chain compilation warns when a fallback switches from local to remote
78
+ - bin/raictl config validate checks AI tool configuration against schema
79
+ - Engine capability manifest determines which settings are compilable for each engine
80
+ - Unsupported settings for a given engine produce warnings (errors in --strict mode)
81
+ - Cost tier preferences (economy/standard/premium) map to concrete models per engine
82
+ - Generic skill definition compiles to engine-native skill format (e.g.
83
+ .claude/skills/ for Claude, .cursor/rules/ for Cursor)
84
+ - Asset type not supported by an engine produces a warning listing the
85
+ unsupported type and the engine name (error in --strict mode)
86
+ - Engine manifest declares supported asset types with target paths and
87
+ compilation formats, verifiable by bin/raictl engines detect
88
+ #
89
+ examples:
90
+ - scenario: "Developer configures model routing for a mixed local/cloud workflow"
91
+ expected: |
92
+ .rosett-ai/conf/ai_config.yml defines: generation: premium, review: standard,
93
+ completion: economy. bin/raictl compile maps premium->opus for Claude,
94
+ premium->llama3.3:70b for Ollama. Each engine's compiled config uses
95
+ native model identifiers.
96
+ not: "Generic config contains claude-opus-4-6 directly. Ollama compilation fails."
97
+ - scenario: "Organisation sets a monthly token budget across all AI tools"
98
+ expected: |
99
+ ai_config.yml sets cost.monthly_budget: advisory with a note.
100
+ Compiled Claude Code config includes maxTokens hints. Compiled
101
+ AGENTS.md includes cost awareness instructions. Budget is advisory
102
+ — rosett-ai does not enforce at runtime.
103
+ not: "rosett-ai attempts to enforce token limits at runtime. Budget stored as hard limit."
104
+ - scenario: "Developer uses Ollama locally but wants Claude API as fallback"
105
+ expected: |
106
+ Fallback chain: [ollama, claude]. During compile, a warning is emitted:
107
+ 'Fallback from local (ollama) to remote (claude) — network required'.
108
+ Both engine configs are generated. User acknowledges the trade-off.
109
+ not: "Silent fallback from local to cloud. No network warning."
110
+ - scenario: "Compiling for Cursor which does not support temperature settings"
111
+ expected: |
112
+ Temperature setting in generic config is skipped for Cursor.
113
+ Warning: 'Cursor engine does not support temperature parameter — skipped'.
114
+ In --strict mode, this becomes an error.
115
+ not: "Invalid temperature setting written to .cursorrules. No warning."
116
+ - scenario: "Developer authors a reusable skill and compiles for Claude and Cursor"
117
+ expected: |
118
+ Generic skill definition in .rosett-ai/conf/assets/skills/code_review.yml
119
+ compiles to .claude/skills/code_review.md for Claude engine (markdown
120
+ format) and .cursor/rules/code_review.mdc for Cursor engine (Cursor
121
+ rules format). Each engine's manifest declares the target path and format.
122
+ not: |
123
+ Skill is hardcoded to .claude/skills/ only. Cursor users get nothing.
124
+ Skill format assumes Claude-specific prompt structure.
125
+ - scenario: "Compiling hook assets for an engine that does not support hooks"
126
+ expected: |
127
+ Warning: 'Ollama engine does not support hook assets — skipped 2
128
+ hook definitions'. In --strict mode, this becomes an error.
129
+ Compilation continues for other asset types.
130
+ not: |
131
+ Hook definitions are silently dropped with no warning. Or worse,
132
+ raictl attempts to write hook config to a non-existent Ollama path.
133
+ - scenario: "Engine manifest declares supported asset types"
134
+ expected: |
135
+ Claude engine manifest includes:
136
+ supported_assets:
137
+ skills: { target: ".claude/skills/", format: "markdown" }
138
+ hooks: { target: ".claude/settings.json#hooks", format: "json" }
139
+ memory: { target: ".claude/memory/", format: "markdown" }
140
+ bin/raictl engines detect lists all declared asset types per engine.
141
+ not: |
142
+ Asset types are hardcoded in core rosett-ai. Adding a new asset type
143
+ requires modifying core code instead of updating the engine manifest.
144
+ - scenario: "A skill definition contains a prompt injection attempt"
145
+ expected: |
146
+ Compilation validates skill content. Suspicious patterns (e.g.
147
+ 'ignore previous instructions', 'system prompt override', shell
148
+ metacharacters in hook commands) are flagged as warnings. In --strict
149
+ mode, compilation fails with a security error.
150
+ not: |
151
+ Malicious skill content is compiled and deployed without review.
152
+ Hook definitions with shell expansion are written to native config.
153
+ #
154
+ anti_patterns:
155
+ - Storing API keys in configuration YAML (use ENV references)
156
+ - Engine-specific model names in generic configuration layer
157
+ - Hardcoding model mappings instead of deriving from engine manifests
158
+ - Runtime token enforcement (rosett-ai is a compiler, not a runtime)
159
+ - Silent local-to-remote fallback without user awareness
160
+ - Binary configuration formats that cannot be diffed
161
+ - Assuming all engines support all parameters (capability-aware compilation)
162
+ - Designing the generic asset schema to match Claude Code's model too
163
+ closely — other engines have asset types that may not map to Claude's
164
+ categories (e.g. Cursor has .mdc rules, GitHub Copilot has instructions)
165
+ - Hardcoding asset types in core instead of declaring them in engine manifests
166
+ - Compiling skill or hook content without security validation
167
+ - Allowing shell metacharacters or string interpolation in hook definitions
168
+ #
169
+ gui_notes: |
170
+ Document interactions (cross-references):
171
+
172
+ 1. engine_architecture.yml: engines declare capability manifests including
173
+ supported asset types, target paths, and compilation formats. This doc
174
+ defines the generic schema that manifests implement.
175
+
176
+ 2. claude_code_configuration.yml: the Claude engine's implementation of
177
+ the contracts defined here. Handles settings.json format, skill paths,
178
+ hook configuration, and scope routing specific to Claude Code.
179
+
180
+ 3. security.yml: asset content validation (ANSI stripping, no secrets,
181
+ array-form hooks). Skills and hooks are attack surfaces requiring
182
+ audit for jailbreak, shell expansion, and privilege escalation.
183
+
184
+ 4. compiler.yml: asset compilation follows the same pipeline as behaviour
185
+ and configuration compilation. Assets are a new compilation target type.
186
+
187
+ 5. error_handling.yml: unsupported assets and validation failures use the
188
+ structured error hierarchy (exit codes, what/why/fix format).
189
+
190
+ 6. backward_compatibility.yml: the asset schema and manifest contract are
191
+ public API surfaces. Changes to supported asset types are breaking.
192
+ #
193
+ preferences:
194
+ language: ruby
195
+ patterns:
196
+ - canonical_model_identifiers
197
+ - engine_manifest_capability_mapping
198
+ - engine_manifest_asset_contract
199
+ - advisory_not_enforcement
200
+ - env_var_secret_references
201
+ - compile_time_validation
202
+ - asset_content_security_audit
203
+ testing: rspec with multi-engine compilation fixtures, capability gap tests,
204
+ and asset compilation round-trip tests
205
+ gems:
206
+ - json_schemer
207
+ - thor