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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9fc2d403485de8a1af9034d9f7bf19e7545620406b691b0c917e6e360ad9e56b
|
|
4
|
+
data.tar.gz: 89a8c039303808bed9f592e0f17d4478ffc87d34f129006a5981651c80bf82ac
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0254e2ea9ea0e3261863ec052e8987e8c45a645de615e9fd266a0ce6d861f90ce04f3c1b3f08ad4c9adc9e17fec951b026c4d01a24446dc69b6597aa7c97f7ed
|
|
7
|
+
data.tar.gz: c201357a747fa445901851484a17bbd5398b3be363bbbecaf8791a120768974a12b34c1a5cedc4173f6990b3ef470418c4ad818168537fdf176f2c2efda3f57e
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,373 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.5.10] - 2026-07-08
|
|
10
|
+
|
|
11
|
+
### Security
|
|
12
|
+
|
|
13
|
+
- **publish:gem CI gate hardened** — `publish:gem` now declares `needs:` on
|
|
14
|
+
`audit:artifact`, `package:smoke-test`, and `package:gem-smoke-test` in
|
|
15
|
+
addition to the existing `audit:gem` gate. Gem publication is blocked until
|
|
16
|
+
both the `.gem` and `.deb` artifact audits pass and the install-parity smoke
|
|
17
|
+
tests succeed. Closes the DAG gap that allowed v1.5.9 to publish the gem
|
|
18
|
+
past failing audit and smoke-test jobs.
|
|
19
|
+
|
|
20
|
+
- **publish:deb-push-aptly CI gate hardened** — adds `package:smoke-test`
|
|
21
|
+
to the existing `needs:` list so `.deb` publication is also blocked until
|
|
22
|
+
the postinst smoke test passes.
|
|
23
|
+
|
|
24
|
+
## [1.5.9] - 2026-07-06
|
|
25
|
+
|
|
26
|
+
### Security
|
|
27
|
+
|
|
28
|
+
- **audit:gem CI gate** — adds a standalone `audit:gem` job (allowlist,
|
|
29
|
+
denylist, PII scan, gitleaks) wired as a `needs:` dependency of
|
|
30
|
+
`publish:gem`. Closes the DAG gap that let v1.5.8 publish without any
|
|
31
|
+
security verification.
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- **Gem install smoke test** — new `package:gem-smoke-test` CI job installs
|
|
36
|
+
the built `.gem` in a clean Ruby container and verifies all 20 CLI
|
|
37
|
+
subcommands load without `LoadError` or `NameError`.
|
|
38
|
+
|
|
39
|
+
- **test:mutant:full** — full-suite mutant gate on `v*` tag pipelines;
|
|
40
|
+
`allow_failure:true` until surviving mutants are resolved
|
|
41
|
+
(baseline ~596 survivors).
|
|
42
|
+
|
|
43
|
+
- **sec_016 behaviour rule** — codifies the requirement that every publish
|
|
44
|
+
job targeting a public registry must declare both an artifact-audit gate
|
|
45
|
+
and an install-parity smoke test in its `needs:` block.
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
- **gemspec spec.files** — restores all intended runtime directories
|
|
50
|
+
(`conf/`, `locales/`, `packaging/`, `doc/man/`); removes stale globs
|
|
51
|
+
that produced a near-empty gem in v1.5.8.
|
|
52
|
+
|
|
53
|
+
- **Rakefile release:gem** — adds minimum-size floor, PII pattern scan,
|
|
54
|
+
gitleaks check, and positive-allowlist enforcement before any gem build.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- **BackfillUserYml spec coverage** — adds 21 missing specs for the
|
|
59
|
+
`backfill_user_yml` Thor task (last uncovered file in
|
|
60
|
+
`lib/rosett_ai/thor/**`).
|
|
61
|
+
|
|
62
|
+
## [1.5.8] - 2026-07-06
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
|
|
66
|
+
- **Automatic RubyGems publishing on tag** — `publish:gem` now runs
|
|
67
|
+
`when: on_success` on `v*` tags (previously a blocking manual gate), so a
|
|
68
|
+
tagged release publishes the `.gem` to rubygems.org alongside the `.deb` to
|
|
69
|
+
aptly. The job now reads the instance-level protected+masked variable
|
|
70
|
+
`NEATNERDS_RUBYGEMS_PUBLISH` (was the never-configured `RUBYGEMS_API_KEY`).
|
|
71
|
+
The `v*` tag pattern is a protected tag so the protected variable injects
|
|
72
|
+
into tag pipelines.
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
|
|
76
|
+
- **Smoke-test embedded-Ruby ABI probe** — the CI smoke-test derived the Ruby
|
|
77
|
+
ABI version via `RbConfig::CONFIG['ruby_version']`, which fails in the
|
|
78
|
+
hermetic embedded Ruby (RubyGems/stdlib load path disabled): both
|
|
79
|
+
`RbConfig` (NameError) and an explicit `require 'rbconfig'` (LoadError) are
|
|
80
|
+
unavailable there. The probe now derives the ABI from the built-in
|
|
81
|
+
`RUBY_VERSION` constant (`RUBY_VERSION.split('.')[0,2].join('.') + '.0'`),
|
|
82
|
+
which needs no require and no load path. Regression from the postinst
|
|
83
|
+
engine-extraction test block added in v1.5.6.
|
|
84
|
+
|
|
85
|
+
- **Embedded bin shebangs rewritten at build time** — ruby-build compiles
|
|
86
|
+
with the staging directory as `--prefix`, so scripts in `embedded/bin/`
|
|
87
|
+
(gem, bundle, rake, irb, and others) carry the build-time staging path
|
|
88
|
+
(`…/tmp/staging/opt/rosett-ai/embedded/bin/ruby`) as their shebang.
|
|
89
|
+
That path does not exist at runtime, causing engine plugin gem installs
|
|
90
|
+
invoked from postinst to fail with `ENOENT`. A new `rewrite_shebangs!`
|
|
91
|
+
build stage runs after `:install_gems` (which needs the staging shebang
|
|
92
|
+
at build time) and rewrites every ruby-shebang script in `embedded/bin/`
|
|
93
|
+
to `#!/opt/rosett-ai/embedded/bin/ruby` before packaging.
|
|
94
|
+
|
|
95
|
+
- **Post-install `gem install` bypass staging shebang** — postinst now
|
|
96
|
+
invokes `"${EMBEDDED_RUBY}" "${EMBEDDED_GEM}" install` (passing the gem
|
|
97
|
+
script as an argument to the ruby binary) rather than calling
|
|
98
|
+
`"${EMBEDDED_GEM}" install` directly. Defence-in-depth against any
|
|
99
|
+
residual stale shebang on the installed gem binary. The postinst ABI
|
|
100
|
+
probe was also converted from `RbConfig::CONFIG['ruby_version']` to
|
|
101
|
+
`RUBY_VERSION.split('.')[0,2].join('.') + '.0'` for the same reason as
|
|
102
|
+
the smoke-test fix above.
|
|
103
|
+
|
|
104
|
+
- **Postinst engine-gem install: set RUBYLIB to runtime stdlib path** —
|
|
105
|
+
ruby-build compiles with the staging tree as `--prefix`, so the embedded
|
|
106
|
+
ruby's compiled-in `$LOAD_PATH` references the staging path (non-existent
|
|
107
|
+
at runtime). `require 'rubygems'` therefore fails when the gem binary is
|
|
108
|
+
invoked by postinst, silently skipping engine extraction. The postinst now
|
|
109
|
+
exports `RUBYLIB=${INSTALL_DIR}/embedded/lib/ruby/${RUBY_ABI}` for the gem
|
|
110
|
+
install invocation, prepending the correct runtime path so rubygems loads.
|
|
111
|
+
The CI smoke-test's test-gem build step now uses the system `gem` binary
|
|
112
|
+
(already present from the apt-installed ruby) rather than the embedded gem
|
|
113
|
+
binary, keeping the test focused on postinst extraction correctness.
|
|
114
|
+
|
|
115
|
+
## [1.5.7] - 2026-07-05
|
|
116
|
+
|
|
117
|
+
### Security
|
|
118
|
+
|
|
119
|
+
- **Scrub author contact from man page** — replaced the pre-release author
|
|
120
|
+
address in the `## AUTHORS` section of `doc/man/raictl.1.ronn` with the
|
|
121
|
+
public contact address (`query@neatnerds.be`). The address was present in
|
|
122
|
+
the installed man page and was detected by the Gate B post-publish PII scan
|
|
123
|
+
on v1.5.6. The `artifact-audit` CI gate allows standard man-page attribution;
|
|
124
|
+
Gate B requires zero pre-release-email hits in the shipped `.deb`.
|
|
125
|
+
|
|
126
|
+
## [1.5.6] - 2026-07-05
|
|
127
|
+
|
|
128
|
+
### Security
|
|
129
|
+
|
|
130
|
+
- **Redact internal tracker references from shipped files** — removed an
|
|
131
|
+
internal issue reference from `packaging/lib/systemd/rosett-ai-mcp.service.d/throttle.conf`
|
|
132
|
+
and rephrased the `CHANGELOG.md` v1.5.5 security note to avoid embedding
|
|
133
|
+
the pre-scrub email address in the changelog description itself. Both were
|
|
134
|
+
flagged by `artifact-audit` v2.10.1 on the v1.5.5 tag pipeline.
|
|
135
|
+
|
|
136
|
+
### Fixed
|
|
137
|
+
|
|
138
|
+
- **Smoke-test embedded Ruby `LD_LIBRARY_PATH`** — the CI smoke-test invoked
|
|
139
|
+
`/opt/rosett-ai/embedded/bin/ruby` and `/opt/rosett-ai/embedded/bin/gem`
|
|
140
|
+
directly without setting `LD_LIBRARY_PATH`, causing `libruby.so.3.4: cannot
|
|
141
|
+
open shared object file` on the CI runner. Prefixed both invocations with
|
|
142
|
+
`LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib` so the dynamic linker finds
|
|
143
|
+
the hermetic library alongside the binary.
|
|
144
|
+
|
|
145
|
+
## [1.5.5] - 2026-07-05
|
|
146
|
+
|
|
147
|
+
### Security
|
|
148
|
+
|
|
149
|
+
- **PII scrub — personal email replaced with functional contact** — replaced
|
|
150
|
+
internal developer email addresses with the public contact address (`query@neatnerds.be`) in all YAML configuration files,
|
|
151
|
+
JSON schemas, locale files, and documentation that are shipped in the `.deb`
|
|
152
|
+
package. This covers SPDX copyright comment headers in `conf/` YAML files,
|
|
153
|
+
`conf/mcp/trust.yml`, `conf/schemas/*.json`, `locales/*.yml`, `AUTHORS`,
|
|
154
|
+
`GOVERNANCE.md`, and `README.md`.
|
|
155
|
+
|
|
156
|
+
- **Artifact audit upgraded to `@v2.10.1`** — the previous pin (`@v2.8.2`)
|
|
157
|
+
applied a blanket `.pem` extension denylist that flagged public CA certificates
|
|
158
|
+
bundled with the hermetic Ruby runtime as private-key leaks. The new release
|
|
159
|
+
uses content-aware detection: only files whose content contains a
|
|
160
|
+
`BEGIN ... PRIVATE KEY` header are rejected. This eliminates false positives
|
|
161
|
+
on public certificates while preserving detection of actual private key material.
|
|
162
|
+
|
|
163
|
+
### Changed
|
|
164
|
+
|
|
165
|
+
- **`deb-push-aptly` upgraded to `@v2.10.0`** — adds the `http_port` input to
|
|
166
|
+
allow non-standard aptly API ports. Set `http_port: '8080'` to match the
|
|
167
|
+
host's aptly configuration.
|
|
168
|
+
|
|
169
|
+
- **Extended `.deb` exclusions** — the following paths are now excluded from the
|
|
170
|
+
Debian package staging tree: `.ai-provenance.yml` (AI provenance tracking file,
|
|
171
|
+
dev-only), `doc/audits/` (internal audit reports), `doc/operations/` (runbooks
|
|
172
|
+
with internal references), `doc/signing/` (signing scripts), and
|
|
173
|
+
`doc/rules-audit-*.md` (rule audit snapshots). These files are not runtime
|
|
174
|
+
requirements and must not appear in a published package.
|
|
175
|
+
|
|
176
|
+
### Fixed
|
|
177
|
+
|
|
178
|
+
- **Smoke-test `dpkg --configure` failure on Debian Trixie** — the postinst
|
|
179
|
+
idempotency check previously called `dpkg --configure rosett-ai` on an
|
|
180
|
+
already-configured package. On Debian Trixie this fails with a non-zero exit
|
|
181
|
+
code because `dpkg` refuses to re-configure an already-installed package.
|
|
182
|
+
Replaced with a direct call to the postinst script:
|
|
183
|
+
`DEBIAN_FRONTEND=noninteractive /var/lib/dpkg/info/rosett-ai.postinst configure`
|
|
184
|
+
which exercises the postinst idempotency path without involving dpkg's
|
|
185
|
+
package-state machine.
|
|
186
|
+
|
|
187
|
+
## [1.5.4] - 2026-07-05
|
|
188
|
+
|
|
189
|
+
### Security
|
|
190
|
+
|
|
191
|
+
- **Artifact audit gate** — added `artifact-audit@v2.8.2` CI/CD catalog component
|
|
192
|
+
to the pipeline. The `audit:artifact` job runs in a new `audit` stage (between
|
|
193
|
+
`package` and `deploy`) and verifies the built `.deb` against the positive
|
|
194
|
+
allowlist, denylist, PII patterns, and gitleaks before publication. A failing
|
|
195
|
+
audit blocks the `publish:deb-push-aptly` job via a `needs:` override in the
|
|
196
|
+
pipeline. This closes the gap where a malformed packaging allowlist could have
|
|
197
|
+
shipped leak-class files to the aptly repository without CI-level detection.
|
|
198
|
+
|
|
199
|
+
### Changed
|
|
200
|
+
|
|
201
|
+
- **deb-push-aptly upgraded to @v2.7.1** — bumped from `@v2.6.0`. Adds artifact
|
|
202
|
+
chain reliability improvements. See ci-components CHANGELOG.
|
|
203
|
+
|
|
204
|
+
- **Sanitize internal filesystem paths from audit docs and test fixtures** —
|
|
205
|
+
hardcoded `/home/user/` developer paths removed from `doc/audits/`, `doc/rules-audit-*`,
|
|
206
|
+
and `spec/` test fixtures. Spec paths replaced with `File.join(Dir.home, ...)` or
|
|
207
|
+
`/workspace/` placeholders so the `security:pre-tag` CI gate passes on tag pipelines.
|
|
208
|
+
|
|
209
|
+
## [1.5.3] - 2026-07-04
|
|
210
|
+
|
|
211
|
+
### Security
|
|
212
|
+
|
|
213
|
+
- **NNSA-2026-002 Phase B — deb packaging allowlist** — `conf/behaviour/`,
|
|
214
|
+
`conf/design/`, and `doc/security/` were absent from `APP_EXCLUDES` in
|
|
215
|
+
`lib/rosett_ai/thor/tasks/build.rb`, allowing user-authored behaviour rules,
|
|
216
|
+
design documents with internal WP references, and unpublished security
|
|
217
|
+
advisory drafts to be rsync'd into the `.deb` staging tree. All three
|
|
218
|
+
directories are now explicitly excluded. Documented in
|
|
219
|
+
`doc/operations/deb-publish-pipeline.md`.
|
|
220
|
+
|
|
221
|
+
- **Remove user-authored behaviour rules from HEAD** — `conf/behaviour/criticalthinking.yml`,
|
|
222
|
+
`conf/behaviour/orchestrator_loop.yml`, `conf/behaviour/session_retrospective.yml`,
|
|
223
|
+
and `conf/behaviour/tooling_idioms.yml` were tracked in the public repository
|
|
224
|
+
via `.gitignore` negation patterns (`!conf/behaviour/*.yml`). These are private
|
|
225
|
+
user rule files that must never ship in product repositories (rule_073). Removed
|
|
226
|
+
from index; negation lines removed from `.gitignore`. The `doc/security/NNSA-2026-002-draft.md`
|
|
227
|
+
draft advisory is also removed from HEAD.
|
|
228
|
+
|
|
229
|
+
- **Genericize `conf/schemas/autoqueue.schema.json`** — the schema `description`
|
|
230
|
+
field contained a private filesystem path (`~/.claude/projects/…/autoqueue.yml`)
|
|
231
|
+
and an internal issue tracker reference (``). Replaced with a generic
|
|
232
|
+
description that does not expose internal paths or issue IDs.
|
|
233
|
+
|
|
234
|
+
### Changed
|
|
235
|
+
|
|
236
|
+
- **Gemspec: exclude `conf/design/**`** — design documents carry internal WP
|
|
237
|
+
references and session identifiers. They are not runtime-required and are no
|
|
238
|
+
longer shipped in the gem. Only `conf/schemas/`, `conf/targets/`, `conf/mcp/`,
|
|
239
|
+
`conf/packaging/`, `conf/tooling/`, `conf/compliance/`, `conf/policy/`,
|
|
240
|
+
`conf/review/`, and `conf/adopt_redactions.yml` remain in the gem allowlist.
|
|
241
|
+
|
|
242
|
+
- **Anchor `.gitignore` patterns** — `doc/claude-sessions/` and `doc/context/memory/`
|
|
243
|
+
patterns now use a leading `/` to match only root-level directories, as required
|
|
244
|
+
by `sec_012`.
|
|
245
|
+
|
|
246
|
+
### Fixed
|
|
247
|
+
|
|
248
|
+
- **SPDX header on `.mdl_style.rb`** — the markdownlint style file was the sole
|
|
249
|
+
`.rb` file missing an SPDX header. Added `GPL-3.0-only` header to complete
|
|
250
|
+
full coverage.
|
|
251
|
+
|
|
252
|
+
## [1.5.2] - 2026-07-02
|
|
253
|
+
|
|
254
|
+
### Fixed
|
|
255
|
+
|
|
256
|
+
- **SimpleCov atomic write** — add `AtomicSimpleCov.install!` to
|
|
257
|
+
`spec/spec_helper.rb` and introduce `spec/support/atomic_simple_cov.rb`.
|
|
258
|
+
Prevents `refuse_coverage_drop` false positives caused by SimpleCov
|
|
259
|
+
persisting `.last_run.json` after partial/failed RSpec runs. Write is now
|
|
260
|
+
gated on a complete-green suite (`after(:suite)` hook) and performed
|
|
261
|
+
atomically via temp-file + `File.rename`. Harmonized from openproject-mcp across the full NeatNerds Ruby stack.
|
|
262
|
+
|
|
263
|
+
## [1.5.1] - 2026-06-16
|
|
264
|
+
|
|
265
|
+
### Fixed
|
|
266
|
+
|
|
267
|
+
- **CI: bump `deb-push-aptly` component to `@v2.6.0`** — the previous pin
|
|
268
|
+
(`@v2.2.0`) hardcoded `filesystem:neatnerds:` in the `aptly publish update`
|
|
269
|
+
invocation, mismatching the puppet-configured `filesystem:public:` endpoint
|
|
270
|
+
on `deb.neatnerds.be`. Every tag pipeline since v2.2.0 would have failed at
|
|
271
|
+
the publish step (none had reached it before — the smoke surfaced
|
|
272
|
+
this on rosett-ai v1.5.0). Bumped to `@v2.6.0`, which introduces a required `publish_endpoint`
|
|
273
|
+
input and replaces the hardcoded literal with that splat. Set `publish_endpoint:
|
|
274
|
+
'filesystem:public:'` in this consumer to match the host's aptly config.
|
|
275
|
+
CI-only change; no runtime behavior shift in the gem.
|
|
276
|
+
|
|
277
|
+
## [1.5.0] - 2026-06-12
|
|
278
|
+
|
|
279
|
+
### Fixed
|
|
280
|
+
|
|
281
|
+
- **postinst engine gem extraction** — `postinst` now runs
|
|
282
|
+
`gem install --local` for any `rosett-ai-engine-*.gem` files found in the
|
|
283
|
+
embedded gem cache after a package install or upgrade. Previously, engine
|
|
284
|
+
`.gem` archives were present in `cache/` but the extracted `gems/<name>-<ver>/`
|
|
285
|
+
directory was absent, causing `raictl config compile` to fail with
|
|
286
|
+
"Engine 'claude' not found. No engine plugins installed."
|
|
287
|
+
|
|
288
|
+
### Added
|
|
289
|
+
|
|
290
|
+
- **Systemd restart-throttle drop-in** — ships
|
|
291
|
+
`rosett-ai-mcp.service.d/throttle.conf` in the `.deb`, installed to
|
|
292
|
+
`/etc/systemd/system/rosett-ai-mcp.service.d/`. Sets `RestartSec=300`,
|
|
293
|
+
`StartLimitBurst=5`, `StartLimitIntervalSec=300` to prevent restart storms
|
|
294
|
+
(~9/min → ≤1/5min) during sustained MCP server crash loops. Mitigation for
|
|
295
|
+
the P0 issue tracked in ; see `doc/operations/systemd-throttle.md`
|
|
296
|
+
for rationale and rollback procedure
|
|
297
|
+
|
|
298
|
+
- **RubyGems publication pipeline** — `rake release:gem` build task with
|
|
299
|
+
sec_001 positive allowlist audit and sec_011 size monitoring; `build:gem`
|
|
300
|
+
and `publish:gem` CI jobs (manual trigger on tag) for rubygems.org
|
|
301
|
+
publication
|
|
302
|
+
|
|
303
|
+
- **Retrospective skip-to-rememberancer** — `behaviour-session_retrospective` rule_008
|
|
304
|
+
codifies the 60-second auto-skip default for `/retrospective` improvement proposals;
|
|
305
|
+
the skill body now routes proposals to `rememberancer/incoming-proposals/` without
|
|
306
|
+
blocking on user input. Autonomous sessions proceed immediately; interactive sessions
|
|
307
|
+
get a 60s override window
|
|
308
|
+
|
|
309
|
+
- **Merge-safe `raictl config compile`** — compiling now MERGES with the existing
|
|
310
|
+
target settings file by default, preserving entries not covered by any source YAML
|
|
311
|
+
scope and emitting a warning per preserved entry suggesting `raictl backfill-user-yml`.
|
|
312
|
+
Use `--strict` to restore the previous replace-all behaviour. Prevents accidental
|
|
313
|
+
destruction of manually-managed allow/deny/env entries during incremental adoption
|
|
314
|
+
|
|
315
|
+
- **`raictl backfill-user-yml` subcommand** — reads `~/.claude/settings.json` and
|
|
316
|
+
compares it to the engine's `user.yml` source file. Shows a diff of uncovered entries,
|
|
317
|
+
prompts for confirmation, and writes the merged YAML idempotently. Standalone
|
|
318
|
+
`scripts/backfill_user_yml.rb` also available for scripted use with `--yes`.
|
|
319
|
+
Supports `--target PATH` to specify a non-default user.yml
|
|
320
|
+
|
|
321
|
+
## [1.4.1] - 2026-06-10
|
|
322
|
+
|
|
323
|
+
### Fixed
|
|
324
|
+
|
|
325
|
+
#### fix(ci): Disable branch coverage to eliminate SimpleCov pathology
|
|
326
|
+
|
|
327
|
+
Applies the substrate fix proven on varuna (MR !165 / 8ea7674fc).
|
|
328
|
+
Disables SimpleCov branch coverage tracking; line coverage preserved.
|
|
329
|
+
CI post-test phase should drop substantially.
|
|
330
|
+
|
|
331
|
+
- `enable_coverage :line` (was `:branch`)
|
|
332
|
+
- `minimum_coverage` / `minimum_coverage_by_file`: drop `branch:` kwarg
|
|
333
|
+
|
|
334
|
+
Reference + varuna MR !165 for measurement.
|
|
335
|
+
|
|
336
|
+
## [1.4.0] - 2026-06-07
|
|
337
|
+
|
|
338
|
+
### Added
|
|
339
|
+
|
|
340
|
+
- **`SessionHooks::Installer`** — idempotent installer that wires a Ruby script
|
|
341
|
+
into Claude Code `settings.json` under both `SessionStart` and `PostToolUse`
|
|
342
|
+
hook sections. Reads existing settings, injects a new hook block if not already
|
|
343
|
+
present, and atomically writes the result via a tmp→rename strategy. A second
|
|
344
|
+
`install` call is a no-op; `installed?` reports whether both hook types are
|
|
345
|
+
wired. Raises `SessionHooksError` on JSON parse or filesystem errors.
|
|
346
|
+
|
|
347
|
+
## [1.3.4] - 2026-04-24
|
|
348
|
+
|
|
349
|
+
### Fixed
|
|
350
|
+
|
|
351
|
+
- **Compile double-load** — project-scope compile no longer loads rules
|
|
352
|
+
twice when both global and project behaviours exist
|
|
353
|
+
- **MCP tool specs** — specs are now self-contained with inline fixtures,
|
|
354
|
+
removing dependency on user-local configuration files in CI
|
|
355
|
+
|
|
356
|
+
### Changed
|
|
357
|
+
|
|
358
|
+
- **Gemspec positive allowlist** — replaced `git ls-files` denylist with
|
|
359
|
+
explicit allowlist of runtime-necessary paths (lib/, bin/, conf/, dist/,
|
|
360
|
+
share/, locales/). Gem file count reduced from 525 to ~398, eliminating
|
|
361
|
+
dev configs, doc/, packaging/, and dotfiles from the published gem
|
|
362
|
+
- **CI component adoption** — migrated to shared CI/CD templates from
|
|
363
|
+
ci-components (lint, test, build, security stages)
|
|
364
|
+
- **.deb package size** — excluded 43 MB of dev-only files (doc/, spec/,
|
|
365
|
+
.yardoc/) from Debian package build
|
|
366
|
+
|
|
367
|
+
### Added
|
|
368
|
+
|
|
369
|
+
- **YARD coverage** — pushed API documentation coverage from 67% to 99.89%
|
|
370
|
+
across 222 source files
|
|
371
|
+
- **SPDX header check** — CI now excludes `.gitkeep` files from SPDX
|
|
372
|
+
license header validation
|
|
373
|
+
- **Systemd service unit** — `dist/rosett-ai-mcp.service` for running the
|
|
374
|
+
MCP server as a systemd user service
|
|
375
|
+
|
|
9
376
|
## [1.3.3] - 2026-04-19
|
|
10
377
|
|
|
11
378
|
### Fixed
|
|
@@ -13,21 +380,30 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
13
380
|
- **MCP tool response type** — `Governance.register_tool` returned
|
|
14
381
|
`JSON.generate(result)` (String) but MCP gem v0.9.2 calls `.to_h` on the
|
|
15
382
|
return value (`server.rb:520`). Now returns `MCP::Tool::Response` with
|
|
16
|
-
content type `text`. v1.3.2 yanked from RubyGems
|
|
383
|
+
content type `text`. v1.3.2 yanked from RubyGems
|
|
17
384
|
|
|
18
385
|
## [1.3.2] - 2026-04-19 [YANKED]
|
|
19
386
|
|
|
387
|
+
### Yanked
|
|
388
|
+
|
|
389
|
+
- Yanked from RubyGems on 2026-04-19 (primary reason: MCP dispatch bug, see
|
|
390
|
+
Fixed below — superseded by v1.3.3). The same gem also shipped
|
|
391
|
+
`doc/reference/` content embedding author PII (name, email, internal
|
|
392
|
+
GitLab URL) in PDF metadata and rendered title page; that secondary leak
|
|
393
|
+
is fixed forward in v1.3.4 which excludes `doc/reference/` from the gem
|
|
394
|
+
build via the positive-allowlist gemspec.
|
|
395
|
+
|
|
20
396
|
### Fixed
|
|
21
397
|
|
|
22
398
|
- **MCP dispatch bug** — all 33 MCP tools were broken due to argument-passing
|
|
23
399
|
mismatch in `governance.rb`. Block parameter `do |args|` (positional) changed
|
|
24
400
|
to `do |**args|` (keyword splat) to match MCP gem v0.9.2 dispatch convention.
|
|
25
401
|
Second bug: bare `build_kwargs` call changed to `Governance.build_kwargs`
|
|
26
|
-
because `define_singleton_method` rebinds `self`
|
|
402
|
+
because `define_singleton_method` rebinds `self`
|
|
27
403
|
- **Empty tool schemas** — all 27 parameterised tools now declare `INPUT_SCHEMA`
|
|
28
404
|
with proper JSON Schema definitions (types, descriptions, enum constraints,
|
|
29
405
|
required flags). AI clients receive parameter guidance instead of empty
|
|
30
|
-
`{"type": "object"}`
|
|
406
|
+
`{"type": "object"}`
|
|
31
407
|
|
|
32
408
|
### Added
|
|
33
409
|
|
|
@@ -36,13 +412,22 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
36
412
|
- **MCP integration tests** — 114 integration tests covering dispatch, schema
|
|
37
413
|
presence, and schema-method parity for all 33 registered tools
|
|
38
414
|
|
|
39
|
-
## [1.3.1] - 2026-04-18
|
|
415
|
+
## [1.3.1] - 2026-04-18 [YANKED]
|
|
416
|
+
|
|
417
|
+
### Yanked
|
|
418
|
+
|
|
419
|
+
- Yanked from RubyGems on 2026-05-02. The published gem included
|
|
420
|
+
`doc/reference/` content (PDF + LaTeX source) that embedded author
|
|
421
|
+
contact info (name, email) and an internal GitLab URL in PDF metadata
|
|
422
|
+
and the rendered title page. No credentials, tokens, or session paths
|
|
423
|
+
were leaked. Fixed forward in v1.3.4, which excludes `doc/reference/`
|
|
424
|
+
from the gem build via the positive-allowlist gemspec.
|
|
40
425
|
|
|
41
426
|
### Fixed
|
|
42
427
|
|
|
43
428
|
- **Backup XDG path** — `raictl backup create --global` no longer writes to
|
|
44
429
|
read-only `/opt/rosett-ai/app/`. Default destination is now
|
|
45
|
-
`~/.config/rosett-ai/backups/` (XDG-compliant)
|
|
430
|
+
`~/.config/rosett-ai/backups/` (XDG-compliant)
|
|
46
431
|
- **MCP registrar path** — `resolve_command` now checks `/usr/local/bin/raictl`
|
|
47
432
|
first (where .deb installs the wrapper), then `/usr/bin/raictl`, then
|
|
48
433
|
falls back to `which raictl` for absolute path discovery
|
|
@@ -60,17 +445,25 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
60
445
|
- **Session transcript removal** — stripped 125MB of Claude session transcripts
|
|
61
446
|
(`doc/claude-sessions/`) and context memory files (`doc/context/memory/`)
|
|
62
447
|
from git history using `git filter-repo`. Updated `.gitignore` and hardened
|
|
63
|
-
gemspec reject block to prevent future leaks
|
|
448
|
+
gemspec reject block to prevent future leaks
|
|
64
449
|
- **Gem yank** — yanked `rosett-ai v1.2.0` from RubyGems (contained 122
|
|
65
450
|
session transcript files)
|
|
66
451
|
|
|
67
|
-
## [1.3.0] - 2026-04-18
|
|
452
|
+
## [1.3.0] - 2026-04-18 [YANKED]
|
|
453
|
+
|
|
454
|
+
### Yanked
|
|
455
|
+
|
|
456
|
+
- Yanked from RubyGems on 2026-05-02. Same root cause as v1.3.1 —
|
|
457
|
+
the published gem included `doc/reference/` content (PDF + LaTeX
|
|
458
|
+
source) that embedded author PII and an internal GitLab URL in
|
|
459
|
+
PDF metadata and the rendered title page. No credentials, tokens,
|
|
460
|
+
or session paths were leaked. Fixed forward in v1.3.4.
|
|
68
461
|
|
|
69
462
|
### Added
|
|
70
463
|
|
|
71
464
|
- **MCP server (rai-mcp)** — Model Context Protocol server with 33 tools,
|
|
72
465
|
8 resources, 4 prompts, and instructions field. Start with
|
|
73
|
-
`raictl mcp serve`
|
|
466
|
+
`raictl mcp serve`
|
|
74
467
|
- **MCP tool categories** — Behaviour management (list, show, display,
|
|
75
468
|
manage), design documents (list, show), compilation (compile,
|
|
76
469
|
compile_status), validation, configuration (config_status,
|
|
@@ -92,7 +485,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
92
485
|
enforcement blocks in behaviour rules with pattern safety checks
|
|
93
486
|
(no path traversal, no shell metacharacters, bounded globs).
|
|
94
487
|
`HookGenerator` generates overcommit hook scripts from enforcement
|
|
95
|
-
definitions
|
|
488
|
+
definitions
|
|
96
489
|
- **Schema v1.3.0** — Behaviour schema updated with optional
|
|
97
490
|
`enforcement` block supporting file_patterns, commands, and
|
|
98
491
|
hook_phase definitions
|
|
@@ -110,16 +503,14 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
110
503
|
|
|
111
504
|
- **Integration test: scope isolation** — Verifies project-scope compile
|
|
112
505
|
writes to `<project>/.claude/rules/` and does not modify global rules
|
|
113
|
-
(WP#1490)
|
|
114
506
|
- **Integration test: BehaviourCompiler production mode** — Verifies
|
|
115
507
|
BehaviourCompiler works without engine gems or stub registrations
|
|
116
|
-
(WP#1491)
|
|
117
508
|
- **Integration test: end-to-end compile** — Full pipeline test from YAML
|
|
118
509
|
source to compiled output for each builtin engine (claude, agents_md),
|
|
119
|
-
including scope isolation
|
|
510
|
+
including scope isolation
|
|
120
511
|
- **Integration test: engine registration** — Verifies builtin backends
|
|
121
512
|
resolve via `Backend.for()` without plugin registry, and that unknown
|
|
122
|
-
engines raise `CompileError`
|
|
513
|
+
engines raise `CompileError`
|
|
123
514
|
|
|
124
515
|
### Fixed
|
|
125
516
|
|
|
@@ -127,18 +518,18 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
127
518
|
always returned `~/.claude/rules/` regardless of compile scope. Split
|
|
128
519
|
into `resolve_target_dir` (explicit output_dir) and `default_target_dir`
|
|
129
520
|
(scope-based routing). Project scope now writes to
|
|
130
|
-
`<project_root>/.claude/rules/`
|
|
521
|
+
`<project_root>/.claude/rules/`
|
|
131
522
|
- **BehaviourCompiler failed without engine gem** — `BehaviourCompiler`
|
|
132
523
|
queried the plugin registry directly for the claude engine, which fails
|
|
133
524
|
when no engine gem is installed. Now uses `Backend.for('claude')` which
|
|
134
525
|
checks `BUILTIN_BACKENDS` first, matching the Thor compile task
|
|
135
|
-
resolution path
|
|
526
|
+
resolution path
|
|
136
527
|
|
|
137
528
|
## [1.1.0] - 2026-04-01
|
|
138
529
|
|
|
139
530
|
### Added
|
|
140
531
|
|
|
141
|
-
- **Doctor check: stale ~/.rosett-ai/ directory** — New `stale_home_nncc` diagnostic warns when `.rosett-ai/` exists at `$HOME` level, which causes scope resolution confusion by shadowing XDG-path behaviour files
|
|
532
|
+
- **Doctor check: stale ~/.rosett-ai/ directory** — New `stale_home_nncc` diagnostic warns when `.rosett-ai/` exists at `$HOME` level, which causes scope resolution confusion by shadowing XDG-path behaviour files
|
|
142
533
|
- **Commit hook behaviour** — OpenProject work package integration via branch naming conventions (`<type>/<id>-<subject>`) and overcommit CommitMsg hook for automatic `OP#<id>` injection
|
|
143
534
|
- **XDG auto-migration** — Automatic migration of behaviour files from legacy `~/.claude/conf/` to XDG-compliant `~/.config/rosett-ai/conf/` path
|
|
144
535
|
- **Duplicate rule ID detection** — Compiler now warns when rule IDs collide across behaviour files
|
|
@@ -178,12 +569,12 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
178
569
|
|
|
179
570
|
- **Duplicate rule ID warnings scoped per-file** — Compiler now only
|
|
180
571
|
warns about duplicate rule IDs within a single behaviour file, not
|
|
181
|
-
across files. Rule IDs are scoped by behaviour name
|
|
572
|
+
across files. Rule IDs are scoped by behaviour name
|
|
182
573
|
- **Removed dead compiler cache code** — `RosettAi::Cache::CompilerCache`
|
|
183
574
|
and `RosettAi::Cache::Manifest` were implemented but never wired into
|
|
184
575
|
the compilation pipeline. Removed until cache is properly
|
|
185
|
-
integrated
|
|
186
|
-
- **Pre-push hook segfault on GTK4 specs** — Switched pre-push RSpec from full suite to core-only (`RspecCore`) hook that excludes desktop/dbus specs matching CI's `--exclude-pattern`, preventing Ruby segfault in gobject-introspection gem
|
|
576
|
+
integrated
|
|
577
|
+
- **Pre-push hook segfault on GTK4 specs** — Switched pre-push RSpec from full suite to core-only (`RspecCore`) hook that excludes desktop/dbus specs matching CI's `--exclude-pattern`, preventing Ruby segfault in gobject-introspection gem
|
|
187
578
|
- **Wrapper breaks project context (RC1)** — `.deb` wrapper `cd /opt/rosett-ai/app` made `ProjectContext` resolve to the rosett-ai internal tree instead of the user's project. Now preserves `RAI_ORIGINAL_PWD` before `cd`
|
|
188
579
|
- **Engine discovery fails on ABI mismatch (RC2)** — Embedded Ruby 3.3.0 could not find engine gems installed under 3.3.10 `GEM_PATH`. Added version-agnostic fallback scan of `/opt/rosett-ai/embedded/lib/ruby/gems/*/`
|
|
189
580
|
- **Target profiles not found after extraction (RC3)** — `TargetProfile.load` now checks the plugin registry first (engine's `target_profile_path`) before falling back to file-based lookup
|
|
@@ -201,10 +592,10 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
201
592
|
|
|
202
593
|
### Fixed
|
|
203
594
|
|
|
204
|
-
- **38 audit bugs** — Comprehensive audit campaign fixing remote contamination, XDG migration, worktree issues, and CI divergence (Epic
|
|
595
|
+
- **38 audit bugs** — Comprehensive audit campaign fixing remote contamination, XDG migration, worktree issues, and CI divergence (Epic )
|
|
205
596
|
- **CVE-2026-33946** — Updated mcp gem to patched version
|
|
206
|
-
- **Compile scope coexistence** — Global and project behaviours now merge correctly in project scope (Issue 005,
|
|
207
|
-
- **Global scope source resolution** — Compile task now uses XDG-compliant path for global behaviour source
|
|
597
|
+
- **Compile scope coexistence** — Global and project behaviours now merge correctly in project scope (Issue 005, /712)
|
|
598
|
+
- **Global scope source resolution** — Compile task now uses XDG-compliant path for global behaviour source
|
|
208
599
|
|
|
209
600
|
### Changed
|
|
210
601
|
|