rosett-ai 1.3.3 → 1.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +413 -22
- data/README.md +56 -42
- data/bin/raictl +13 -0
- data/conf/adopt_redactions.yml +2 -0
- data/conf/compliance/cra_rules.yml +2 -0
- data/conf/compliance/license_rules.yml +2 -0
- data/conf/mcp/server_defaults.yml +2 -0
- data/conf/mcp/trust.yml +1 -0
- data/conf/packaging/core.yml +2 -0
- data/conf/packaging/gtk4.yml +2 -0
- data/conf/packaging/qt6.yml +2 -0
- data/conf/policy/default_deny_list.yml +2 -0
- data/conf/review/cli-command-audit.yml +2 -0
- data/conf/review/design-docs.yml +2 -0
- data/conf/review/design-questionnaire.yml +2 -0
- data/conf/review/questionnaire.yml +2 -0
- data/conf/review/rosett-ai-core.yml +2 -0
- data/conf/schemas/ai_config_schema.json +14 -2
- data/conf/schemas/autoqueue.schema.json +153 -0
- data/conf/schemas/behaviour_schema.json +31 -7
- data/conf/schemas/compliance_rule_schema.json +17 -4
- data/conf/schemas/content_pack_manifest_schema.json +23 -4
- data/conf/schemas/design_schema.json +177 -42
- data/conf/schemas/engine_manifest_schema.json +22 -5
- data/conf/schemas/lockfile_schema.json +26 -4
- data/conf/schemas/mcp_server_schema.json +50 -9
- data/conf/schemas/packaging_schema.json +23 -5
- data/conf/schemas/policy_schema.json +35 -9
- data/conf/schemas/provenance_schema.json +33 -5
- data/conf/schemas/rai_config_schema.json +6 -2
- data/conf/schemas/rai_project_schema.json +8 -2
- data/conf/schemas/scope_hierarchy_schema.json +22 -5
- data/conf/schemas/target_schema.json +33 -6
- data/conf/schemas/tooling_schema.json +53 -12
- data/conf/schemas/workflow_schema.json +39 -9
- data/conf/targets/agents_md.yml +1 -0
- data/conf/targets/claude.yml +2 -0
- data/conf/tooling/tools.yml +2 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +5 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +40 -0
- data/lib/rosett_ai/ai_config/context_window.rb +3 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +1 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +1 -0
- data/lib/rosett_ai/ai_config/model_router.rb +1 -0
- data/lib/rosett_ai/ai_config/validator.rb +2 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +1 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +2 -0
- data/lib/rosett_ai/authorship/review_validator.rb +1 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +1 -0
- data/lib/rosett_ai/backup/compressor.rb +3 -0
- data/lib/rosett_ai/backup/destination.rb +1 -0
- data/lib/rosett_ai/behaviour/manager.rb +1 -0
- data/lib/rosett_ai/compiler/backend.rb +3 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +1 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +1 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +1 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +1 -7
- data/lib/rosett_ai/compiler/locale_compiler.rb +2 -0
- data/lib/rosett_ai/compiler/target_profile.rb +11 -0
- data/lib/rosett_ai/completion/generator.rb +2 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +1 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +1 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +2 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +4 -0
- data/lib/rosett_ai/comply/runner.rb +2 -0
- data/lib/rosett_ai/composition/composer.rb +1 -0
- data/lib/rosett_ai/composition/lockfile.rb +1 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +1 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +9 -0
- data/lib/rosett_ai/config/secret_resolver.rb +4 -0
- data/lib/rosett_ai/configuration.rb +4 -0
- data/lib/rosett_ai/content/content_client.rb +15 -0
- data/lib/rosett_ai/content/pack_installer.rb +1 -0
- data/lib/rosett_ai/content/pack_manifest.rb +21 -0
- data/lib/rosett_ai/content_packs/manager.rb +1 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +2 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +1 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +5 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +1 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +1 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +2 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +1 -0
- data/lib/rosett_ai/dbus/service.rb +3 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +14 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +6 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +3 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +1 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +2 -0
- data/lib/rosett_ai/doctor/check.rb +1 -1
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +1 -0
- data/lib/rosett_ai/doctor.rb +1 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +9 -0
- data/lib/rosett_ai/documentation/translator.rb +8 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +71 -1
- data/lib/rosett_ai/engines/detector.rb +5 -0
- data/lib/rosett_ai/engines/registry.rb +7 -0
- data/lib/rosett_ai/exit_codes.rb +6 -0
- data/lib/rosett_ai/formatting.rb +1 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +6 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +1 -0
- data/lib/rosett_ai/git_hooks/installer.rb +4 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +2 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +6 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +1 -0
- data/lib/rosett_ai/init/config_file_writer.rb +4 -0
- data/lib/rosett_ai/init/directory_builder.rb +15 -0
- data/lib/rosett_ai/init/file_copier.rb +51 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +1 -0
- data/lib/rosett_ai/init/project_initializer.rb +1 -0
- data/lib/rosett_ai/licensing/license_key.rb +4 -0
- data/lib/rosett_ai/licensing/license_store.rb +11 -0
- data/lib/rosett_ai/licensing/tier.rb +9 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +1 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +1 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +1 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +27 -4
- data/lib/rosett_ai/mcp/enforcement/validator.rb +24 -3
- data/lib/rosett_ai/mcp/governance.rb +9 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +22 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +4 -2
- data/lib/rosett_ai/mcp/keyfile.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +1 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +3 -0
- data/lib/rosett_ai/mcp/plugins.rb +1 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +3 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +3 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +1 -0
- data/lib/rosett_ai/mcp/server.rb +7 -1
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +3 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +7 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +33 -8
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +5 -0
- data/lib/rosett_ai/migration/detector.rb +1 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +2 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +3 -1
- data/lib/rosett_ai/package_manager/apt.rb +5 -0
- data/lib/rosett_ai/package_manager/base.rb +1 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +1 -0
- data/lib/rosett_ai/packaging/variant_config.rb +12 -0
- data/lib/rosett_ai/plugins/contract.rb +1 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +2 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +2 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +2 -0
- data/lib/rosett_ai/plugins/registry.rb +10 -0
- data/lib/rosett_ai/policy/auditor.rb +1 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +1 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +2 -0
- data/lib/rosett_ai/policy/validator.rb +1 -0
- data/lib/rosett_ai/profiler.rb +7 -0
- data/lib/rosett_ai/project/drift_detector.rb +1 -0
- data/lib/rosett_ai/project/manager.rb +1 -0
- data/lib/rosett_ai/project/template_applier.rb +1 -0
- data/lib/rosett_ai/provenance/entry.rb +2 -0
- data/lib/rosett_ai/provenance/source.rb +1 -0
- data/lib/rosett_ai/provenance/store.rb +3 -0
- data/lib/rosett_ai/provenance/validator.rb +1 -0
- data/lib/rosett_ai/quorum/collector.rb +1 -0
- data/lib/rosett_ai/quorum/comparator.rb +2 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +1 -0
- data/lib/rosett_ai/rai_config.rb +9 -0
- data/lib/rosett_ai/retrofit/engine.rb +2 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +8 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +10 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +9 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +3 -0
- data/lib/rosett_ai/secrets_resolver.rb +1 -0
- data/lib/rosett_ai/session_hooks/installer.rb +130 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +4 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +7 -0
- data/lib/rosett_ai/structured_logger.rb +1 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +1 -0
- data/lib/rosett_ai/telemetry.rb +1 -0
- data/lib/rosett_ai/thor/cli.rb +9 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +2 -0
- data/lib/rosett_ai/thor/tasks/backfill_user_yml.rb +207 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +6 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +12 -0
- data/lib/rosett_ai/thor/tasks/build.rb +106 -21
- data/lib/rosett_ai/thor/tasks/compile.rb +76 -32
- data/lib/rosett_ai/thor/tasks/completion.rb +9 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +2 -0
- data/lib/rosett_ai/thor/tasks/config.rb +21 -5
- data/lib/rosett_ai/thor/tasks/content.rb +8 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +13 -0
- data/lib/rosett_ai/thor/tasks/design.rb +2 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +4 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +2 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +7 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +8 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +8 -0
- data/lib/rosett_ai/thor/tasks/init.rb +1 -0
- data/lib/rosett_ai/thor/tasks/license.rb +8 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +40 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +2 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +15 -0
- data/lib/rosett_ai/thor/tasks/project.rb +8 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +8 -0
- data/lib/rosett_ai/thor/tasks/release.rb +8 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +4 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +1 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +14 -0
- data/lib/rosett_ai/tooling/version_checker.rb +1 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +18 -0
- data/lib/rosett_ai/ui/base.rb +3 -0
- data/lib/rosett_ai/ui/gtk4.rb +19 -0
- data/lib/rosett_ai/ui/kde.rb +1 -0
- data/lib/rosett_ai/ui/qt6.rb +1 -0
- data/lib/rosett_ai/ui/registry.rb +15 -0
- data/lib/rosett_ai/ui/tui.rb +22 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +1 -0
- data/lib/rosett_ai/validators/design_validator.rb +2 -0
- data/lib/rosett_ai/validators/schema_validator.rb +4 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +1 -0
- data/lib/rosett_ai/version.rb +2 -1
- data/lib/rosett_ai/version_consistency_checker.rb +6 -0
- data/lib/rosett_ai/workflow/engine.rb +1 -0
- data/lib/rosett_ai/workflow/manager.rb +1 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +2 -0
- data/lib/rosett_ai/workflow/step_runner.rb +1 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +1 -0
- data/lib/rosett_ai/yaml_loader.rb +2 -0
- data/lib/rosett_ai.rb +2 -0
- data/lib/scripts/generated/docker_hub_tags.rb +2 -0
- data/locales/ar.yml +2 -0
- data/locales/en.yml +5 -0
- data/locales/fr.yml +2 -0
- metadata +9 -189
- data/.ai-provenance.yml +0 -119
- data/.debride_whitelist +0 -186
- data/.fasterer.yml +0 -29
- data/.mdl_style.rb +0 -10
- data/.mdlrc +0 -3
- data/.mutant.yml +0 -49
- data/.namespace-allowlist +0 -42
- data/.reek.yml +0 -1040
- data/.rosett-ai/config.yml +0 -3
- data/.rspec +0 -5
- data/.rubocop.yml +0 -380
- data/.ruby-version +0 -1
- data/.yamllint +0 -51
- data/.yardopts +0 -12
- data/AI-DISCLOSURE.md +0 -48
- data/CLAUDE.md +0 -141
- data/CONTRIBUTING.md +0 -734
- data/INSTALL.md +0 -154
- data/LICENSE.md +0 -675
- data/QUICKSTART.md +0 -73
- data/Rakefile +0 -200
- data/SECURITY.md +0 -114
- data/cliff.toml +0 -52
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/design/aaif_alignment.yml +0 -181
- data/conf/design/ab_testing.yml +0 -172
- data/conf/design/accessibility.yml +0 -84
- data/conf/design/ai_authorship.yml +0 -210
- data/conf/design/ai_provenance.yml +0 -224
- data/conf/design/ai_tool_configuration.yml +0 -207
- data/conf/design/architecture.yml +0 -139
- data/conf/design/autocompletion.yml +0 -115
- data/conf/design/backward_compatibility.yml +0 -112
- data/conf/design/behaviour_composition.yml +0 -246
- data/conf/design/build_rake_extraction.yml +0 -57
- data/conf/design/ci_pipeline.yml +0 -100
- data/conf/design/claude_code_configuration.yml +0 -157
- data/conf/design/compiler.yml +0 -128
- data/conf/design/comply.yml +0 -153
- data/conf/design/content_packs.yml +0 -84
- data/conf/design/desktop_integration.yml +0 -289
- data/conf/design/distribution.yml +0 -216
- data/conf/design/doctor.yml +0 -184
- data/conf/design/documentation.yml +0 -152
- data/conf/design/engine_architecture.yml +0 -257
- data/conf/design/error_handling.yml +0 -103
- data/conf/design/feature_flags.yml +0 -142
- data/conf/design/git_hooks.yml +0 -165
- data/conf/design/gui_plugins.yml +0 -475
- data/conf/design/i18n.yml +0 -84
- data/conf/design/integration_testing.yml +0 -56
- data/conf/design/licensing_system.yml +0 -88
- data/conf/design/lifecycle_management.yml +0 -208
- data/conf/design/mcp_integration.yml +0 -207
- data/conf/design/mcp_settings.yml +0 -126
- data/conf/design/migration.yml +0 -56
- data/conf/design/monitoring_observability.yml +0 -194
- data/conf/design/namespace_cleanup.yml +0 -145
- data/conf/design/plugin_test_segregation.yml +0 -145
- data/conf/design/policy_management.yml +0 -229
- data/conf/design/project_management.yml +0 -183
- data/conf/design/rai_mcp_asset_discovery.yml +0 -164
- data/conf/design/rai_mcp_server.yml +0 -605
- data/conf/design/release_management.yml +0 -117
- data/conf/design/retrofit.yml +0 -199
- data/conf/design/retrospective_analyzer.yml +0 -79
- data/conf/design/scope_hierarchy.yml +0 -352
- data/conf/design/security.yml +0 -115
- data/conf/design/session_retrospective.yml +0 -85
- data/conf/design/smart_ui_feedback.yml +0 -89
- data/conf/design/structured_logging.yml +0 -148
- data/conf/design/styles.yml +0 -123
- data/conf/design/test_peer_review.yml +0 -89
- data/conf/design/testing.yml +0 -136
- data/conf/design/threat_model.yml +0 -108
- data/conf/design/ui_framework.yml +0 -111
- data/conf/design/usage_optimization.yml +0 -122
- data/conf/design/version_management.yml +0 -60
- data/conf/design/workflow.yml +0 -227
- data/doc/AAIF_POSITIONING.md +0 -58
- data/doc/ADOPT.md +0 -224
- data/doc/AI_PROVENANCE.md +0 -139
- data/doc/ARCHITECTURE.md +0 -920
- data/doc/BEHAVIOUR.md +0 -409
- data/doc/BUILD.md +0 -138
- data/doc/CI_CD_RECIPES.md +0 -171
- data/doc/CLAUDE_SESSIONS_MOVED.md +0 -16
- data/doc/COMMAND_ANALYSIS.md +0 -229
- data/doc/CONFIGURATION.md +0 -281
- data/doc/DESIGN_AUDIT.md +0 -235
- data/doc/DESIGN_PEER_REVIEW.md +0 -771
- data/doc/DESKTOP.md +0 -447
- data/doc/ENGINES.md +0 -567
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +0 -417
- data/doc/FEATURE_AUDIT.md +0 -218
- data/doc/IMPLEMENTATION_PLAN.md +0 -669
- data/doc/INCIDENT_REPORT_2026-02-02.md +0 -251
- data/doc/MIGRATION_GUIDE.md +0 -88
- data/doc/PACKAGING.md +0 -232
- data/doc/PROJECT_DASHBOARD.md +0 -153
- data/doc/PULP_DEPLOYMENT.md +0 -164
- data/doc/QUALITY_FIX_SUMMARY.md +0 -110
- data/doc/QUICK_START.md +0 -162
- data/doc/REEK_CONFIGURATION.md +0 -166
- data/doc/REFERENCE.md +0 -253
- data/doc/REFERENCES.md +0 -324
- data/doc/SECURITY_REVIEW_CHECKLIST.md +0 -72
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +0 -359
- data/doc/SETUP.md +0 -202
- data/doc/TEST_PEER_REVIEW.md +0 -152
- data/doc/THREAT_MODEL.md +0 -230
- data/doc/USAGE.md +0 -545
- data/doc/USER_MANUAL.md +0 -585
- data/doc/ai_test_review_checklist.md +0 -110
- data/doc/changes/2026-02-18-packaging-fpm.md +0 -155
- data/doc/changes/2026-02-19-testing-infrastructure.md +0 -221
- data/doc/changes/2026-02-20-security-implementation.md +0 -281
- data/doc/changes/2026-02-20-styles-implementation.md +0 -220
- data/doc/changes/2026-02-21-architecture-completion.md +0 -95
- data/doc/changes/2026-02-21-architecture-ui-layer.md +0 -253
- data/doc/changes/2026-02-21-cc-config-implementation.md +0 -108
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +0 -214
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +0 -241
- data/doc/changes/2026-02-21-config-design-show-commands.md +0 -61
- data/doc/changes/2026-02-21-design-implementation-overview.md +0 -455
- data/doc/changes/2026-02-21-lifecycle-management.md +0 -196
- data/doc/changes/2026-02-21-path-resolver.md +0 -128
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +0 -45
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +0 -120
- data/doc/changes/2026-03-20-security-hardening-phase2.md +0 -163
- data/doc/context/SESSION-HANDOFF.md +0 -69
- data/doc/context/ai-engine-usage-trends-2026.md +0 -80
- data/doc/context/plan-pluggable-engines.md +0 -590
- data/doc/decisions/001-flog-deferred.md +0 -32
- data/doc/decisions/002-path-resolution-strategy.md +0 -158
- data/doc/decisions/003-ui-adapter-selection.md +0 -193
- data/doc/decisions/004-design-document-validation.md +0 -179
- data/doc/decisions/005-package-splitting-strategy.md +0 -200
- data/doc/decisions/006-multi-engine-architecture.md +0 -147
- data/doc/decisions/007-engine-agnostic-pivot.md +0 -219
- data/doc/decisions/008-ci-bundler-strategy.md +0 -129
- data/doc/decisions/009-core-only-v1-release.md +0 -60
- data/doc/decisions/010-engine-debian-packaging.md +0 -66
- data/doc/decisions/011-context-aware-cli.md +0 -71
- data/doc/dependency_decisions.yml +0 -247
- data/doc/issues/001-wrapper-missing-environment-variables.md +0 -197
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +0 -217
- data/doc/issues/003-smoke-test-false-positive.md +0 -127
- data/doc/issues/004-market-research-design-updates.md +0 -109
- data/doc/issues/005-compile-scope-coexistence.md +0 -161
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +0 -505
- data/doc/operations/packaging.md +0 -133
- data/doc/operations/rosett-ai-release.md +0 -65
- data/doc/reference/error-catalog.md +0 -107
- data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
- data/doc/reference/src/Pictures/cover.jpg +0 -0
- data/doc/reference/src/Pictures/head1.jpg +0 -0
- data/doc/reference/src/Pictures/head2.jpg +0 -0
- data/doc/reference/src/Pictures/head3.jpg +0 -0
- data/doc/reference/src/Pictures/head4.jpg +0 -0
- data/doc/reference/src/Pictures/head5.jpg +0 -0
- data/doc/reference/src/Pictures/head6.jpg +0 -0
- data/doc/reference/src/Pictures/head7.jpg +0 -0
- data/doc/reference/src/Pictures/head8.jpg +0 -0
- data/doc/reference/src/StyleInd.ist +0 -4
- data/doc/reference/src/bibliography.bib +0 -79
- data/doc/reference/src/main.tex +0 -1288
- data/doc/reference/src/structure.tex +0 -303
- data/doc/rosett-ai-bookmarks.html +0 -301
- data/kitchen.yml +0 -46
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/locales/.gitkeep +0 -0
- data/packaging/build-engine-deb.sh +0 -81
- data/packaging/scripts/postinst +0 -17
- data/packaging/scripts/postrm +0 -19
- data/packaging/scripts/prerm +0 -10
- data/packaging/wrapper.sh.template +0 -38
- data/rosett-ai.gemspec +0 -63
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +0 -123
- data/settings.json +0 -29
|
@@ -1,224 +0,0 @@
|
|
|
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
|
|
@@ -1,207 +0,0 @@
|
|
|
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
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: architecture
|
|
3
|
-
domain: core
|
|
4
|
-
version: 2.0.0
|
|
5
|
-
status: draft
|
|
6
|
-
priority: 2
|
|
7
|
-
author: hugo
|
|
8
|
-
created_at: "2026-02-18"
|
|
9
|
-
modified_at: "2026-03-23"
|
|
10
|
-
modified_by: claude
|
|
11
|
-
depends_on:
|
|
12
|
-
- security
|
|
13
|
-
- testing
|
|
14
|
-
- ci_pipeline
|
|
15
|
-
- scope_hierarchy
|
|
16
|
-
|
|
17
|
-
intent: |
|
|
18
|
-
Define the overall system architecture of Rosett-AI as a TUI-first, pluggable
|
|
19
|
-
application with optional GUI layers delivered as separate Debian packages.
|
|
20
|
-
The core must run on headless servers (CLI/TUI only) while desktop users
|
|
21
|
-
can install GUI packages for their environment. All UI variants share the
|
|
22
|
-
same backend logic. The architecture must support multi-target AI model
|
|
23
|
-
compilation, licensing, i18n, and accessibility from the ground up —
|
|
24
|
-
informed by the security constraints established in Priority 1.
|
|
25
|
-
|
|
26
|
-
A foundational architectural principle is scope-first: all commands resolve
|
|
27
|
-
their working context from the three-level scope hierarchy (global, local,
|
|
28
|
-
project) before operating. Configuration sources are discovered from the
|
|
29
|
-
user's working directory, merged according to configurable strategies, and
|
|
30
|
-
compiled to scope-appropriate output locations. See scope_hierarchy.yml for
|
|
31
|
-
the full scope specification.
|
|
32
|
-
|
|
33
|
-
constraints:
|
|
34
|
-
- Core package (rai) must be fully functional without any GUI package installed
|
|
35
|
-
- GUI packages must not introduce dependencies on TUI-specific libraries
|
|
36
|
-
- All UI variants share the same backend logic in lib/rosett_ai/
|
|
37
|
-
- Only Linux is supported; Debian is the target distribution
|
|
38
|
-
- Ruby is the implementation language; version managed via rbenv
|
|
39
|
-
- Thor is the CLI framework
|
|
40
|
-
- All configuration files are YAML (validated by JSON Schema)
|
|
41
|
-
- Abstract UI interface (lib/rosett_ai/ui/base.rb) defines the contract all GUI plugins implement
|
|
42
|
-
- GUI plugins are discovered at runtime via a registry pattern
|
|
43
|
-
- Security constraints from security.yml apply to all architectural layers
|
|
44
|
-
- "Scope-first: all commands resolve their working context from the
|
|
45
|
-
three-level scope hierarchy (global, local, project) before operating
|
|
46
|
-
(see scope_hierarchy.yml)"
|
|
47
|
-
- Commands must never assume a single fixed source directory — source
|
|
48
|
-
directories are resolved from the active scope
|
|
49
|
-
|
|
50
|
-
acceptance_criteria:
|
|
51
|
-
- bin/raictl runs without errors on a headless Debian server (no X11/Wayland)
|
|
52
|
-
- Installing rosett-ai-gtk4 adds GTK4 UI option without modifying core
|
|
53
|
-
- lib/rosett_ai/ui/base.rb defines the abstract interface with documented methods
|
|
54
|
-
- lib/rosett_ai/ui/registry.rb discovers installed UI plugins automatically
|
|
55
|
-
- All business logic is in lib/rosett_ai/ (not in TUI or GUI code)
|
|
56
|
-
- conf/design/ documents are validated against conf/schemas/design_schema.json
|
|
57
|
-
- conf/behaviour/ documents are validated against conf/schemas/behaviour_schema.json
|
|
58
|
-
- Package dependencies are correctly declared (rosett-ai-gtk4 depends on rosett-ai)
|
|
59
|
-
- "Configuration sources are resolved from the three-level scope hierarchy:
|
|
60
|
-
global (~/.config/rosett-ai/conf/), local (<group>/.rosett-ai/conf/), project
|
|
61
|
-
(<project>/.rosett-ai/conf/) — see scope_hierarchy.yml"
|
|
62
|
-
- All scope-aware commands (compile, validate, design, behaviour) resolve
|
|
63
|
-
source directories from the active scope before operating
|
|
64
|
-
|
|
65
|
-
examples:
|
|
66
|
-
- scenario: "User installs only the Rosett-AI core package on a server"
|
|
67
|
-
expected: "All CLI commands work. TUI mode is available. No GUI-related errors or warnings."
|
|
68
|
-
not: "Application crashes due to missing GTK4 or Qt6 libraries."
|
|
69
|
-
- scenario: "User installs rosett-ai-gtk4 alongside rosett-ai on a GNOME desktop"
|
|
70
|
-
expected: "bin/raictl --ui gtk4 launches GTK4 interface. bin/raictl (no flag) uses TUI as default."
|
|
71
|
-
not: "GTK4 becomes the default. TUI mode breaks. Core behaviour changes."
|
|
72
|
-
- scenario: "Developer adds a new feature to the compiler"
|
|
73
|
-
expected: "Feature is implemented in lib/rosett_ai/compiler/. Both TUI and GUI see the feature without changes."
|
|
74
|
-
not: "Feature requires separate implementation in TUI and GUI code."
|
|
75
|
-
- scenario: "New AI model (e.g. Gemma) needs to be supported as compilation target"
|
|
76
|
-
expected: "Add conf/targets/gemma.yml with model profile. No code changes needed."
|
|
77
|
-
not: "Requires modifying compiler source code or adding conditional logic."
|
|
78
|
-
|
|
79
|
-
anti_patterns:
|
|
80
|
-
- Business logic in UI layer (TUI or GUI code making domain decisions)
|
|
81
|
-
- GUI-specific dependencies in core package
|
|
82
|
-
- Hardcoded paths instead of XDG-compliant directory resolution
|
|
83
|
-
- Assuming a single fixed source directory for all commands regardless of
|
|
84
|
-
working directory (see scope_hierarchy.yml)
|
|
85
|
-
- Monolithic package that bundles all UI toolkits
|
|
86
|
-
- Plugin discovery that requires editing a config file instead of auto-detection
|
|
87
|
-
|
|
88
|
-
gui_notes: |
|
|
89
|
-
Implicit Assumptions (documented per DESIGN_AUDIT.md recommendation #6):
|
|
90
|
-
|
|
91
|
-
1. Linux-only: rosett-ai targets Linux exclusively. macOS and Windows are not
|
|
92
|
-
supported. This is stated in constraints but deserves explicit callout
|
|
93
|
-
as it affects all design documents.
|
|
94
|
-
|
|
95
|
-
2. Debian-first: Primary packaging is .deb for Debian/Ubuntu. RPM support
|
|
96
|
-
(Fedora/RHEL) is Phase 2 of the distribution design. Other packaging
|
|
97
|
-
formats (AppImage, Homebrew, Winget) are Phase 3+.
|
|
98
|
-
|
|
99
|
-
3. Single-user: XDG paths (~/.config/rosett-ai/, ~/.cache/rosett-ai/) assume a
|
|
100
|
-
single user per HOME directory. Multi-user installations with shared
|
|
101
|
-
system-wide config are not designed for. Root-level managed settings
|
|
102
|
-
(/etc/claude-code/) are the exception for enterprise deployment.
|
|
103
|
-
|
|
104
|
-
4. Ruby 3.3.10: The project targets Ruby 3.3.10 managed via rbenv. This
|
|
105
|
-
is scattered across design documents but should be understood as a
|
|
106
|
-
hard constraint. Version bumps require updating rbenv, CI, and the
|
|
107
|
-
.ruby-version file.
|
|
108
|
-
|
|
109
|
-
5. Zeitwerk lazy loading: All module autoloading uses Zeitwerk. No
|
|
110
|
-
eager_load calls outside of test/CI. This affects startup time and
|
|
111
|
-
memory usage (see usage_optimization.yml).
|
|
112
|
-
|
|
113
|
-
6. UTF-8 everywhere: All text processing assumes UTF-8 encoding. YAML
|
|
114
|
-
files, CLI output, log files, and configuration all use UTF-8. No
|
|
115
|
-
other encodings are supported for configuration files.
|
|
116
|
-
|
|
117
|
-
7. Three-level scope hierarchy: The architecture supports three distinct
|
|
118
|
-
configuration scopes resolved from the user's working directory:
|
|
119
|
-
- Global: ~/.config/rosett-ai/conf/ (XDG user config, applied everywhere)
|
|
120
|
-
- Local: <group-dir>/.rosett-ai/conf/ (workspace-level, multi-project groups)
|
|
121
|
-
- Project: <project-dir>/.rosett-ai/conf/ (project-specific overrides)
|
|
122
|
-
Each scope has its own conf/ subtree with the same structure as the
|
|
123
|
-
raictl source directory. Commands auto-detect the active scope from the
|
|
124
|
-
working directory. See scope_hierarchy.yml for the full specification.
|
|
125
|
-
|
|
126
|
-
preferences:
|
|
127
|
-
language: ruby
|
|
128
|
-
patterns:
|
|
129
|
-
- hexagonal_architecture
|
|
130
|
-
- plugin_registry
|
|
131
|
-
- dependency_injection
|
|
132
|
-
- interface_contracts_via_shared_examples
|
|
133
|
-
testing: rspec with shared examples for interface contracts
|
|
134
|
-
gems:
|
|
135
|
-
- thor
|
|
136
|
-
- json_schemer
|
|
137
|
-
- tty-prompt
|
|
138
|
-
- tty-table
|
|
139
|
-
- pastel
|