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.
- checksums.yaml +7 -0
- data/.ai-provenance.yml +119 -0
- data/.debride_whitelist +186 -0
- data/.fasterer.yml +29 -0
- data/.mdl_style.rb +10 -0
- data/.mdlrc +3 -0
- data/.mutant.yml +49 -0
- data/.namespace-allowlist +42 -0
- data/.reek.yml +1040 -0
- data/.rosett-ai/config.yml +3 -0
- data/.rspec +5 -0
- data/.rubocop.yml +380 -0
- data/.ruby-version +1 -0
- data/.yamllint +51 -0
- data/.yardopts +12 -0
- data/AI-DISCLOSURE.md +48 -0
- data/CHANGELOG.md +519 -0
- data/CLAUDE.md +141 -0
- data/CONTRIBUTING.md +734 -0
- data/INSTALL.md +154 -0
- data/LICENSE +674 -0
- data/LICENSE.md +675 -0
- data/QUICKSTART.md +73 -0
- data/README.md +366 -0
- data/Rakefile +200 -0
- data/SECURITY.md +114 -0
- data/bin/rai +1 -0
- data/cliff.toml +52 -0
- data/conf/adopt_redactions.yml +8 -0
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/compliance/cra_rules.yml +25 -0
- data/conf/compliance/license_rules.yml +20 -0
- data/conf/design/aaif_alignment.yml +181 -0
- data/conf/design/ab_testing.yml +172 -0
- data/conf/design/accessibility.yml +84 -0
- data/conf/design/ai_authorship.yml +210 -0
- data/conf/design/ai_provenance.yml +224 -0
- data/conf/design/ai_tool_configuration.yml +207 -0
- data/conf/design/architecture.yml +139 -0
- data/conf/design/autocompletion.yml +115 -0
- data/conf/design/backward_compatibility.yml +112 -0
- data/conf/design/behaviour_composition.yml +246 -0
- data/conf/design/build_rake_extraction.yml +57 -0
- data/conf/design/ci_pipeline.yml +100 -0
- data/conf/design/claude_code_configuration.yml +157 -0
- data/conf/design/compiler.yml +128 -0
- data/conf/design/comply.yml +153 -0
- data/conf/design/content_packs.yml +84 -0
- data/conf/design/desktop_integration.yml +289 -0
- data/conf/design/distribution.yml +216 -0
- data/conf/design/doctor.yml +184 -0
- data/conf/design/documentation.yml +152 -0
- data/conf/design/engine_architecture.yml +257 -0
- data/conf/design/error_handling.yml +103 -0
- data/conf/design/feature_flags.yml +142 -0
- data/conf/design/git_hooks.yml +165 -0
- data/conf/design/gui_plugins.yml +475 -0
- data/conf/design/i18n.yml +84 -0
- data/conf/design/integration_testing.yml +56 -0
- data/conf/design/licensing_system.yml +88 -0
- data/conf/design/lifecycle_management.yml +208 -0
- data/conf/design/mcp_integration.yml +207 -0
- data/conf/design/mcp_settings.yml +126 -0
- data/conf/design/migration.yml +56 -0
- data/conf/design/monitoring_observability.yml +194 -0
- data/conf/design/namespace_cleanup.yml +145 -0
- data/conf/design/plugin_test_segregation.yml +145 -0
- data/conf/design/policy_management.yml +229 -0
- data/conf/design/project_management.yml +183 -0
- data/conf/design/rai_mcp_asset_discovery.yml +164 -0
- data/conf/design/rai_mcp_server.yml +605 -0
- data/conf/design/release_management.yml +117 -0
- data/conf/design/retrofit.yml +199 -0
- data/conf/design/retrospective_analyzer.yml +79 -0
- data/conf/design/scope_hierarchy.yml +352 -0
- data/conf/design/security.yml +115 -0
- data/conf/design/session_retrospective.yml +85 -0
- data/conf/design/smart_ui_feedback.yml +89 -0
- data/conf/design/structured_logging.yml +148 -0
- data/conf/design/styles.yml +123 -0
- data/conf/design/test_peer_review.yml +89 -0
- data/conf/design/testing.yml +136 -0
- data/conf/design/threat_model.yml +108 -0
- data/conf/design/ui_framework.yml +111 -0
- data/conf/design/usage_optimization.yml +122 -0
- data/conf/design/version_management.yml +60 -0
- data/conf/design/workflow.yml +227 -0
- data/conf/mcp/server_defaults.yml +42 -0
- data/conf/mcp/trust.yml +21 -0
- data/conf/packaging/core.yml +12 -0
- data/conf/packaging/gtk4.yml +11 -0
- data/conf/packaging/qt6.yml +11 -0
- data/conf/policy/default_deny_list.yml +197 -0
- data/conf/review/cli-command-audit.yml +857 -0
- data/conf/review/design-docs.yml +1064 -0
- data/conf/review/design-questionnaire.yml +153 -0
- data/conf/review/questionnaire.yml +146 -0
- data/conf/review/rosett-ai-core.yml +2919 -0
- data/conf/schemas/ai_config_schema.json +73 -0
- data/conf/schemas/behaviour_schema.json +132 -0
- data/conf/schemas/compliance_rule_schema.json +63 -0
- data/conf/schemas/content_pack_manifest_schema.json +51 -0
- data/conf/schemas/design_schema.json +210 -0
- data/conf/schemas/engine_manifest_schema.json +144 -0
- data/conf/schemas/lockfile_schema.json +74 -0
- data/conf/schemas/mcp_server_schema.json +48 -0
- data/conf/schemas/packaging_schema.json +70 -0
- data/conf/schemas/policy_schema.json +85 -0
- data/conf/schemas/provenance_schema.json +84 -0
- data/conf/schemas/rai_config_schema.json +56 -0
- data/conf/schemas/rai_project_schema.json +20 -0
- data/conf/schemas/scope_hierarchy_schema.json +49 -0
- data/conf/schemas/target_schema.json +67 -0
- data/conf/schemas/tooling_schema.json +65 -0
- data/conf/schemas/workflow_schema.json +112 -0
- data/conf/targets/agents_md.yml +17 -0
- data/conf/targets/claude.yml +12 -0
- data/conf/tooling/tools.yml +58 -0
- data/dist/rosett-ai-mcp.service +48 -0
- data/dist/rosett-ai-mcp.yml.default +45 -0
- data/doc/AAIF_POSITIONING.md +58 -0
- data/doc/ADOPT.md +224 -0
- data/doc/AI_PROVENANCE.md +139 -0
- data/doc/ARCHITECTURE.md +920 -0
- data/doc/BEHAVIOUR.md +409 -0
- data/doc/BUILD.md +138 -0
- data/doc/CI_CD_RECIPES.md +171 -0
- data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
- data/doc/COMMAND_ANALYSIS.md +229 -0
- data/doc/CONFIGURATION.md +281 -0
- data/doc/DESIGN_AUDIT.md +235 -0
- data/doc/DESIGN_PEER_REVIEW.md +771 -0
- data/doc/DESKTOP.md +447 -0
- data/doc/ENGINES.md +567 -0
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
- data/doc/FEATURE_AUDIT.md +218 -0
- data/doc/IMPLEMENTATION_PLAN.md +669 -0
- data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
- data/doc/MIGRATION_GUIDE.md +88 -0
- data/doc/PACKAGING.md +232 -0
- data/doc/PROJECT_DASHBOARD.md +153 -0
- data/doc/PULP_DEPLOYMENT.md +164 -0
- data/doc/QUALITY_FIX_SUMMARY.md +110 -0
- data/doc/QUICK_START.md +162 -0
- data/doc/REEK_CONFIGURATION.md +166 -0
- data/doc/REFERENCE.md +253 -0
- data/doc/REFERENCES.md +324 -0
- data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
- data/doc/SETUP.md +202 -0
- data/doc/TEST_PEER_REVIEW.md +152 -0
- data/doc/THREAT_MODEL.md +230 -0
- data/doc/USAGE.md +545 -0
- data/doc/USER_MANUAL.md +585 -0
- data/doc/ai_test_review_checklist.md +110 -0
- data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
- data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
- data/doc/changes/2026-02-20-security-implementation.md +281 -0
- data/doc/changes/2026-02-20-styles-implementation.md +220 -0
- data/doc/changes/2026-02-21-architecture-completion.md +95 -0
- data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
- data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
- data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
- data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
- data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
- data/doc/changes/2026-02-21-path-resolver.md +128 -0
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
- data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
- data/doc/context/SESSION-HANDOFF.md +69 -0
- data/doc/context/ai-engine-usage-trends-2026.md +80 -0
- data/doc/context/plan-pluggable-engines.md +590 -0
- data/doc/decisions/001-flog-deferred.md +32 -0
- data/doc/decisions/002-path-resolution-strategy.md +158 -0
- data/doc/decisions/003-ui-adapter-selection.md +193 -0
- data/doc/decisions/004-design-document-validation.md +179 -0
- data/doc/decisions/005-package-splitting-strategy.md +200 -0
- data/doc/decisions/006-multi-engine-architecture.md +147 -0
- data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
- data/doc/decisions/008-ci-bundler-strategy.md +129 -0
- data/doc/decisions/009-core-only-v1-release.md +60 -0
- data/doc/decisions/010-engine-debian-packaging.md +66 -0
- data/doc/decisions/011-context-aware-cli.md +71 -0
- data/doc/dependency_decisions.yml +247 -0
- data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
- data/doc/issues/003-smoke-test-false-positive.md +127 -0
- data/doc/issues/004-market-research-design-updates.md +109 -0
- data/doc/issues/005-compile-scope-coexistence.md +161 -0
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +505 -0
- data/doc/operations/packaging.md +133 -0
- data/doc/operations/rosett-ai-release.md +65 -0
- data/doc/reference/error-catalog.md +107 -0
- 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 +4 -0
- data/doc/reference/src/bibliography.bib +79 -0
- data/doc/reference/src/main.tex +1288 -0
- data/doc/reference/src/structure.tex +303 -0
- data/doc/rosett-ai-bookmarks.html +301 -0
- data/kitchen.yml +46 -0
- data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
- data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
- data/lib/rosett_ai/ai_config/context_window.rb +55 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
- data/lib/rosett_ai/ai_config/model_router.rb +121 -0
- data/lib/rosett_ai/ai_config/validator.rb +45 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
- data/lib/rosett_ai/authorship/review_validator.rb +39 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
- data/lib/rosett_ai/backup/compressor.rb +180 -0
- data/lib/rosett_ai/backup/destination.rb +91 -0
- data/lib/rosett_ai/behaviour/manager.rb +156 -0
- data/lib/rosett_ai/compiler/backend.rb +86 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
- data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
- data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
- data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
- data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
- data/lib/rosett_ai/compiler/target_profile.rb +112 -0
- data/lib/rosett_ai/completion/generator.rb +101 -0
- data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
- data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
- data/lib/rosett_ai/comply/reporter.rb +113 -0
- data/lib/rosett_ai/comply/runner.rb +50 -0
- data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
- data/lib/rosett_ai/composition/composer.rb +158 -0
- data/lib/rosett_ai/composition/composition_result.rb +64 -0
- data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
- data/lib/rosett_ai/composition/lockfile.rb +103 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
- data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
- data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
- data/lib/rosett_ai/config/compile_result.rb +37 -0
- data/lib/rosett_ai/config/compiler.rb +13 -0
- data/lib/rosett_ai/config/domain_transformer.rb +13 -0
- data/lib/rosett_ai/config/key_map.rb +13 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
- data/lib/rosett_ai/config/scope_router.rb +13 -0
- data/lib/rosett_ai/config/secret_resolver.rb +125 -0
- data/lib/rosett_ai/configuration.rb +119 -0
- data/lib/rosett_ai/content/content_client.rb +60 -0
- data/lib/rosett_ai/content/pack_installer.rb +117 -0
- data/lib/rosett_ai/content/pack_manifest.rb +50 -0
- data/lib/rosett_ai/content/pack_registry.rb +68 -0
- data/lib/rosett_ai/content_packs/manager.rb +50 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
- data/lib/rosett_ai/dbus/service.rb +121 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
- data/lib/rosett_ai/deprecation.rb +79 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
- data/lib/rosett_ai/doctor/check.rb +92 -0
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
- data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
- data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
- data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
- data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
- data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
- data/lib/rosett_ai/doctor.rb +81 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
- data/lib/rosett_ai/documentation/translator.rb +62 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
- data/lib/rosett_ai/engines/detector.rb +63 -0
- data/lib/rosett_ai/engines/registry.rb +50 -0
- data/lib/rosett_ai/error_handler.rb +139 -0
- data/lib/rosett_ai/exit_codes.rb +76 -0
- data/lib/rosett_ai/feature_flags.rb +102 -0
- data/lib/rosett_ai/formatting.rb +33 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
- data/lib/rosett_ai/git_hooks/installer.rb +175 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
- data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
- data/lib/rosett_ai/init/config_file_writer.rb +24 -0
- data/lib/rosett_ai/init/directory_builder.rb +38 -0
- data/lib/rosett_ai/init/file_copier.rb +95 -0
- data/lib/rosett_ai/init/global_initializer.rb +28 -0
- data/lib/rosett_ai/init/local_initializer.rb +27 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
- data/lib/rosett_ai/init/project_initializer.rb +38 -0
- data/lib/rosett_ai/licensing/license_key.rb +139 -0
- data/lib/rosett_ai/licensing/license_store.rb +64 -0
- data/lib/rosett_ai/licensing/license_validator.rb +60 -0
- data/lib/rosett_ai/licensing/tier.rb +42 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
- data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
- data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
- data/lib/rosett_ai/mcp/governance.rb +160 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
- data/lib/rosett_ai/mcp/instructions.rb +266 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
- data/lib/rosett_ai/mcp/keyfile.rb +221 -0
- data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
- data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
- data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
- data/lib/rosett_ai/mcp/plugins.rb +143 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
- data/lib/rosett_ai/mcp/response_helper.rb +46 -0
- data/lib/rosett_ai/mcp/security_logger.rb +60 -0
- data/lib/rosett_ai/mcp/server.rb +212 -0
- data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
- data/lib/rosett_ai/migration/detector.rb +117 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
- data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
- data/lib/rosett_ai/package_manager/apt.rb +108 -0
- data/lib/rosett_ai/package_manager/base.rb +68 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
- data/lib/rosett_ai/packaging/variant_config.rb +92 -0
- data/lib/rosett_ai/path_resolver.rb +115 -0
- data/lib/rosett_ai/plugins/contract.rb +43 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
- data/lib/rosett_ai/plugins/registry.rb +150 -0
- data/lib/rosett_ai/policy/auditor.rb +41 -0
- data/lib/rosett_ai/policy/deny_list.rb +71 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
- data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
- data/lib/rosett_ai/policy/protected_files.rb +47 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
- data/lib/rosett_ai/policy/validator.rb +35 -0
- data/lib/rosett_ai/profiler.rb +79 -0
- data/lib/rosett_ai/project/drift_detector.rb +126 -0
- data/lib/rosett_ai/project/manager.rb +115 -0
- data/lib/rosett_ai/project/sync_manager.rb +138 -0
- data/lib/rosett_ai/project/template_applier.rb +105 -0
- data/lib/rosett_ai/project_context.rb +82 -0
- data/lib/rosett_ai/provenance/entry.rb +63 -0
- data/lib/rosett_ai/provenance/file_source.rb +32 -0
- data/lib/rosett_ai/provenance/source.rb +62 -0
- data/lib/rosett_ai/provenance/store.rb +153 -0
- data/lib/rosett_ai/provenance/tracker.rb +62 -0
- data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
- data/lib/rosett_ai/provenance/validator.rb +45 -0
- data/lib/rosett_ai/quorum/collector.rb +59 -0
- data/lib/rosett_ai/quorum/comparator.rb +81 -0
- data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
- data/lib/rosett_ai/rai_config.rb +107 -0
- data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
- data/lib/rosett_ai/retrofit/engine.rb +171 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
- data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
- data/lib/rosett_ai/retrofit/scanner.rb +47 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
- data/lib/rosett_ai/secrets_resolver.rb +71 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
- data/lib/rosett_ai/structured_logger.rb +110 -0
- data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
- data/lib/rosett_ai/telemetry/provider.rb +26 -0
- data/lib/rosett_ai/telemetry/reporter.rb +144 -0
- data/lib/rosett_ai/telemetry.rb +47 -0
- data/lib/rosett_ai/text_sanitizer.rb +62 -0
- data/lib/rosett_ai/thor/cli.rb +269 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
- data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
- data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
- data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
- data/lib/rosett_ai/thor/tasks/config.rb +265 -0
- data/lib/rosett_ai/thor/tasks/content.rb +193 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
- data/lib/rosett_ai/thor/tasks/design.rb +258 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
- data/lib/rosett_ai/thor/tasks/init.rb +259 -0
- data/lib/rosett_ai/thor/tasks/license.rb +120 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
- data/lib/rosett_ai/thor/tasks/project.rb +260 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
- data/lib/rosett_ai/thor/tasks/release.rb +314 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
- data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
- data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
- data/lib/rosett_ai/tooling/version_checker.rb +35 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
- data/lib/rosett_ai/ui/base.rb +46 -0
- data/lib/rosett_ai/ui/gtk4.rb +98 -0
- data/lib/rosett_ai/ui/kde.rb +40 -0
- data/lib/rosett_ai/ui/qt6.rb +40 -0
- data/lib/rosett_ai/ui/registry.rb +60 -0
- data/lib/rosett_ai/ui/tty_helper.rb +74 -0
- data/lib/rosett_ai/ui/tui.rb +59 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
- data/lib/rosett_ai/validators/design_validator.rb +17 -0
- data/lib/rosett_ai/validators/schema_validator.rb +84 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
- data/lib/rosett_ai/version.rb +8 -0
- data/lib/rosett_ai/version_consistency_checker.rb +129 -0
- data/lib/rosett_ai/workflow/audit_log.rb +86 -0
- data/lib/rosett_ai/workflow/engine.rb +142 -0
- data/lib/rosett_ai/workflow/manager.rb +82 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
- data/lib/rosett_ai/workflow/step_runner.rb +61 -0
- data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
- data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
- data/lib/rosett_ai/yaml_loader.rb +78 -0
- data/lib/rosett_ai.rb +221 -0
- data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
- data/lib/rubocop/rosett_ai.rb +9 -0
- data/lib/scripts/generated/docker_hub_tags.rb +126 -0
- data/locales/.gitkeep +0 -0
- data/locales/ar.yml +579 -0
- data/locales/en.yml +571 -0
- data/locales/fr.yml +567 -0
- data/packaging/build-engine-deb.sh +81 -0
- data/packaging/scripts/postinst +17 -0
- data/packaging/scripts/postrm +19 -0
- data/packaging/scripts/prerm +10 -0
- data/packaging/wrapper.sh.template +38 -0
- data/rosett-ai.gemspec +63 -0
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +123 -0
- data/settings.json +29 -0
- data/share/applications/be.neatnerds.rosettai.desktop +29 -0
- data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
- data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
- data/share/templates/behaviour/criticalthinking.yml +69 -0
- 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
|