@event4u/agent-config 14.11.0 → 14.13.0
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.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +368 -516
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +109 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +400 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +65 -6
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +25 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
- package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +9 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +53 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-236PNQZK.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +42 -10
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +62 -62
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2413 -1087
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +639 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4818 -2645
- package/dist/server/schemas/settings.js +6 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +30 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +2 -2
- package/package.json +10 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/src/agent-src/scripts/guarded_baseline.ts +328 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +400 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +48 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/budgets.yml +19 -0
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +95 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +38 -31
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +731 -30
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +38 -20
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +35 -7
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +43 -0
- package/src/config/rule-stub-ceilings.json +126 -112
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/turnaround-budget.json +66 -0
- package/src/config/web-launch-readiness.json +188 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +27 -0
- package/src/scripts/_lib/activation_ladder.ts +211 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +126 -0
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +195 -7
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +263 -3
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +144 -6
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +528 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +980 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -11
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +378 -0
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_budget_ownership.ts +54 -4
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +752 -0
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +60 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +10 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +0 -17
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -67
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +0 -17
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/operational-readiness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/server-hardening/evals/triggers.json +0 -17
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/workspace-link/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiAudit.js.map +0 -1
- package/dist/cli/commands/uiRender.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/lean_projection_mode.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/ui_surface.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/skillRanking.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/ui_authority.test.ts +0 -251
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -246
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* `description_route_check` — a routing regression detector on the DESCRIPTION
|
|
4
|
+
* surface, cheap enough to run per PR.
|
|
5
|
+
*
|
|
6
|
+
* `road-to-routing-assurance` Phase 1. Input is the full catalogue (name +
|
|
7
|
+
* description — the production routing condition) plus one prompt; output is
|
|
8
|
+
* the would-load set. Two backends:
|
|
9
|
+
*
|
|
10
|
+
* (a) `dry` — the existing MockRouter shape: no key, no network, no spend.
|
|
11
|
+
* It exercises plumbing, never fidelity.
|
|
12
|
+
* (b) `cached-live` — a real model call keyed on `(catalogue-hash, prompt)`,
|
|
13
|
+
* so an unchanged pair costs zero on the second run. The cache key
|
|
14
|
+
* includes the catalogue hash deliberately: a description edit anywhere
|
|
15
|
+
* changes the routing condition for EVERY prompt, so a prompt-only key
|
|
16
|
+
* would serve a stale answer precisely when the answer changed.
|
|
17
|
+
*
|
|
18
|
+
* ## THE PROXY GAP — a stated limitation, not a caveat (Phase 1.4)
|
|
19
|
+
*
|
|
20
|
+
* This checker asks a model *"which units would you load given this
|
|
21
|
+
* catalogue"*. That is **NOT the host's selection procedure.** The host applies
|
|
22
|
+
* its own truncation, its own ordering, its own system prompt, and — measured
|
|
23
|
+
* on a default install — publishes a budget event saying it stripped every
|
|
24
|
+
* description and dropped hundreds of entries before the model saw the list.
|
|
25
|
+
*
|
|
26
|
+
* So a green run here is evidence that the **description signal** did not
|
|
27
|
+
* regress. It is NEVER evidence that production routing works. The fidelity of
|
|
28
|
+
* this proxy to real sessions is a MEASURED quantity — roadmap step 5.4, over
|
|
29
|
+
* prompts appearing in both the trace corpus and the fixture corpus — and until
|
|
30
|
+
* that measurement exists the gap is unquantified rather than small.
|
|
31
|
+
*
|
|
32
|
+
* ## Fail direction: recall first (Phase 1.3)
|
|
33
|
+
*
|
|
34
|
+
* A **positive that stops loading BLOCKS** — the unit was supposed to be
|
|
35
|
+
* consulted for this prompt and no longer is, which is the defect class this
|
|
36
|
+
* whole roadmap exists for. A **near-miss that starts loading WARNS** — a unit
|
|
37
|
+
* loading when it need not is a token cost, not a missing obligation. The
|
|
38
|
+
* asymmetry is deliberate and matches defect D2's direction: this repository's
|
|
39
|
+
* measured failure is under-delivery, not over-delivery.
|
|
40
|
+
*
|
|
41
|
+
* Exit codes: 0 = no recall breach · 1 = a positive stopped loading · 2 = usage
|
|
42
|
+
* or IO error.
|
|
43
|
+
*/
|
|
44
|
+
import { createHash } from 'node:crypto';
|
|
45
|
+
import * as fs from 'node:fs';
|
|
46
|
+
import * as path from 'node:path';
|
|
47
|
+
import process from 'node:process';
|
|
48
|
+
import { fileURLToPath } from 'node:url';
|
|
49
|
+
|
|
50
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
51
|
+
import { type SkillMeta } from './skill_trigger_eval.js';
|
|
52
|
+
|
|
53
|
+
const HERE = fileURLToPath(import.meta.url);
|
|
54
|
+
const REAL_REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
|
|
55
|
+
/** Scan root; the env override exists for the self-test and for fixtures. */
|
|
56
|
+
const REPO_ROOT = process.env['DESCRIPTION_ROUTE_CHECK_ROOT'] ?? REAL_REPO_ROOT;
|
|
57
|
+
|
|
58
|
+
export const CACHE_REL = 'internal/evals/cache/description-route';
|
|
59
|
+
|
|
60
|
+
/** One corpus case: a prompt, and whether the unit must be consulted for it. */
|
|
61
|
+
export interface Case {
|
|
62
|
+
unit: string;
|
|
63
|
+
prompt: string;
|
|
64
|
+
/** `true` = positive (must load) · `false` = near-miss (must not). */
|
|
65
|
+
expect: boolean;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface Backend {
|
|
69
|
+
name: string;
|
|
70
|
+
/** Returns the would-load set for one prompt against one catalogue. */
|
|
71
|
+
route(prompt: string, catalogue: readonly SkillMeta[]): string[];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Stable catalogue fingerprint.
|
|
76
|
+
*
|
|
77
|
+
* Sorted by name before hashing, so a reordering of the source directory — a
|
|
78
|
+
* property of the filesystem, not of the routing condition — does not
|
|
79
|
+
* invalidate every cache entry.
|
|
80
|
+
*/
|
|
81
|
+
export function catalogueHash(catalogue: readonly SkillMeta[]): string {
|
|
82
|
+
const body = [...catalogue]
|
|
83
|
+
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))
|
|
84
|
+
.map((c) => `${c.name} ${c.description}`)
|
|
85
|
+
.join('');
|
|
86
|
+
return createHash('sha256').update(body).digest('hex').slice(0, 16);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function cacheKey(catalogue: readonly SkillMeta[], prompt: string): string {
|
|
90
|
+
const p = createHash('sha256').update(prompt).digest('hex').slice(0, 16);
|
|
91
|
+
return `${catalogueHash(catalogue)}-${p}`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* A backend that answers from disk and calls `inner` only on a miss.
|
|
96
|
+
*
|
|
97
|
+
* `calls` is exposed so a test can assert ZERO calls on a repeat — the verify
|
|
98
|
+
* condition Phase 1.1 states, and the only one that distinguishes a working
|
|
99
|
+
* cache from a cache-shaped no-op.
|
|
100
|
+
*/
|
|
101
|
+
export class CachedBackend implements Backend {
|
|
102
|
+
name: string;
|
|
103
|
+
calls = 0;
|
|
104
|
+
private dir: string;
|
|
105
|
+
private inner: Backend;
|
|
106
|
+
|
|
107
|
+
constructor(inner: Backend, dir: string) {
|
|
108
|
+
this.inner = inner;
|
|
109
|
+
this.dir = dir;
|
|
110
|
+
this.name = `cached(${inner.name})`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
route(prompt: string, catalogue: readonly SkillMeta[]): string[] {
|
|
114
|
+
const file = path.join(this.dir, `${cacheKey(catalogue, prompt)}.json`);
|
|
115
|
+
try {
|
|
116
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8')) as string[];
|
|
117
|
+
} catch {
|
|
118
|
+
/* miss — fall through to the inner backend */
|
|
119
|
+
}
|
|
120
|
+
this.calls += 1;
|
|
121
|
+
const out = this.inner.route(prompt, catalogue);
|
|
122
|
+
fs.mkdirSync(this.dir, { recursive: true });
|
|
123
|
+
fs.writeFileSync(file, JSON.stringify(out));
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* The dry backend: substring containment of the unit name in the prompt.
|
|
130
|
+
*
|
|
131
|
+
* Deliberately crude, and it must stay that way. Its job is to prove the
|
|
132
|
+
* plumbing runs with no key and no spend; making it cleverer would invite
|
|
133
|
+
* reading a green dry run as a routing result, which is the exact conflation
|
|
134
|
+
* the proxy-gap section above exists to prevent.
|
|
135
|
+
*/
|
|
136
|
+
export class DryBackend implements Backend {
|
|
137
|
+
name = 'dry';
|
|
138
|
+
route(prompt: string, catalogue: readonly SkillMeta[]): string[] {
|
|
139
|
+
const q = prompt.toLowerCase();
|
|
140
|
+
return catalogue.filter((c) => q.includes(c.name.toLowerCase())).map((c) => c.name);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export type Direction = 'recall' | 'precision';
|
|
145
|
+
|
|
146
|
+
export interface Finding {
|
|
147
|
+
unit: string;
|
|
148
|
+
prompt: string;
|
|
149
|
+
direction: Direction;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface Report {
|
|
153
|
+
findings: Finding[];
|
|
154
|
+
cases: number;
|
|
155
|
+
backend: string;
|
|
156
|
+
/** Recall breaches block; precision breaches warn. */
|
|
157
|
+
blocked: number;
|
|
158
|
+
warned: number;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function evaluate(
|
|
162
|
+
cases: readonly Case[],
|
|
163
|
+
catalogue: readonly SkillMeta[],
|
|
164
|
+
backend: Backend,
|
|
165
|
+
): Report {
|
|
166
|
+
const findings: Finding[] = [];
|
|
167
|
+
for (const c of cases) {
|
|
168
|
+
const loaded = new Set(backend.route(c.prompt, catalogue));
|
|
169
|
+
const hit = loaded.has(c.unit);
|
|
170
|
+
if (c.expect && !hit) {
|
|
171
|
+
findings.push({ unit: c.unit, prompt: c.prompt, direction: 'recall' });
|
|
172
|
+
}
|
|
173
|
+
if (!c.expect && hit) {
|
|
174
|
+
findings.push({ unit: c.unit, prompt: c.prompt, direction: 'precision' });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
findings,
|
|
179
|
+
cases: cases.length,
|
|
180
|
+
backend: backend.name,
|
|
181
|
+
blocked: findings.filter((f) => f.direction === 'recall').length,
|
|
182
|
+
warned: findings.filter((f) => f.direction === 'precision').length,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function render(r: Report, write: (s: string) => unknown): number {
|
|
187
|
+
for (const f of r.findings) {
|
|
188
|
+
const tag = f.direction === 'recall' ? 'BLOCK' : 'WARN ';
|
|
189
|
+
const what = f.direction === 'recall' ? 'stopped loading' : 'started loading';
|
|
190
|
+
write(` ${tag} ${f.unit}: ${what} for ${JSON.stringify(f.prompt)}\n`);
|
|
191
|
+
}
|
|
192
|
+
write(
|
|
193
|
+
`description_route_check: ${String(r.cases)} case(s) via ${r.backend} · ` +
|
|
194
|
+
`${String(r.blocked)} recall breach(es) · ${String(r.warned)} precision warning(s)\n`,
|
|
195
|
+
);
|
|
196
|
+
if (r.blocked > 0) {
|
|
197
|
+
write(
|
|
198
|
+
'recall-first: a positive stopped loading, so this blocks. Either the\n' +
|
|
199
|
+
'description regressed or the corpus case is wrong — both are edits, and\n' +
|
|
200
|
+
'neither of them is "lower the expectation".\n',
|
|
201
|
+
);
|
|
202
|
+
return 1;
|
|
203
|
+
}
|
|
204
|
+
write('no recall breach on the description surface.\n');
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export function cacheDir(root = REPO_ROOT): string {
|
|
209
|
+
return path.join(root, CACHE_REL);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export { REPO_ROOT as SCAN_ROOT };
|
|
213
|
+
|
|
214
|
+
/* ── Phase 1.2 — diff scoping, inside the existing key boundary ───────────── */
|
|
215
|
+
|
|
216
|
+
export type RunMode = 'advisory' | 'scoped-live';
|
|
217
|
+
|
|
218
|
+
export interface ScopeDecision {
|
|
219
|
+
mode: RunMode;
|
|
220
|
+
/** The units whose description changed; empty for an advisory run. */
|
|
221
|
+
units: string[];
|
|
222
|
+
reason: string;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Does this changed path carry a routable `description`?
|
|
227
|
+
*
|
|
228
|
+
* Skill frontmatter lives in `SKILL.md`; a rule's description lives in the
|
|
229
|
+
* rule file itself. Both source and projection count: the projection is what a
|
|
230
|
+
* host reads, and a projection-only change is exactly the case a source-only
|
|
231
|
+
* filter would miss.
|
|
232
|
+
*/
|
|
233
|
+
export function describesAUnit(file: string): string | null {
|
|
234
|
+
let m = /^(?:src|dist\/agent-src)\/skills\/([^/]+)\/SKILL\.md$/.exec(file);
|
|
235
|
+
if (m) return m[1] ?? null;
|
|
236
|
+
m = /^(?:src|dist\/agent-src)\/rules\/([^/]+)\.md$/.exec(file);
|
|
237
|
+
if (m) return m[1] ?? null;
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Decide whether the scoped live run may happen at all.
|
|
243
|
+
*
|
|
244
|
+
* Live authorization derives exclusively from the key file the canary workflow
|
|
245
|
+
* materializes from repo secrets, with **no env-var fallback**. A fork PR
|
|
246
|
+
* cannot reach that key by construction, so it stays on the advisory path —
|
|
247
|
+
* and this function refuses BEFORE any spend rather than letting the call fail
|
|
248
|
+
* at the router, so the refusal is a decision with a reason rather than an
|
|
249
|
+
* error nobody planned for.
|
|
250
|
+
*/
|
|
251
|
+
export function scopeRun(opts: { isFork: boolean; changedFiles: readonly string[] }): ScopeDecision {
|
|
252
|
+
const units = [...new Set(opts.changedFiles.map(describesAUnit).filter((u): u is string => u !== null))].sort();
|
|
253
|
+
if (opts.isFork) {
|
|
254
|
+
return {
|
|
255
|
+
mode: 'advisory',
|
|
256
|
+
units: [],
|
|
257
|
+
reason: 'fork PR — the key file is unreachable by construction, so live cannot run',
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
if (units.length === 0) {
|
|
261
|
+
return {
|
|
262
|
+
mode: 'advisory',
|
|
263
|
+
units: [],
|
|
264
|
+
reason: 'no description surface in the diff — nothing to regress',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
mode: 'scoped-live',
|
|
269
|
+
units,
|
|
270
|
+
reason: `${String(units.length)} unit(s) with a changed description`,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/** Keep only the cases belonging to the units the diff actually touched. */
|
|
275
|
+
export function scopeCases(cases: readonly Case[], units: readonly string[]): Case[] {
|
|
276
|
+
const want = new Set(units);
|
|
277
|
+
return cases.filter((c) => want.has(c.unit));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* ── Corpus loading — one reader over BOTH existing shapes ────────────────── */
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Load every corpus case, from both surfaces, into one flat list.
|
|
284
|
+
*
|
|
285
|
+
* Two shapes exist and neither is rewritten: `tests/eval/routing-matrix/*.yaml`
|
|
286
|
+
* (rules — `positives` / `near_misses`) and `src/skills/<n>/evals/triggers.json`
|
|
287
|
+
* (skills — `queries[].trigger`). Normalising them here rather than migrating
|
|
288
|
+
* one to the other keeps the substring matcher's corpus untouched, which Phase
|
|
289
|
+
* 2.1 requires explicitly: this reuses the corpus DISCIPLINE, not the matcher.
|
|
290
|
+
*/
|
|
291
|
+
export function loadCases(root = REPO_ROOT): Case[] {
|
|
292
|
+
const out: Case[] = [];
|
|
293
|
+
const mdir = path.join(root, 'tests', 'eval', 'routing-matrix');
|
|
294
|
+
let matrixFiles: string[] = [];
|
|
295
|
+
try {
|
|
296
|
+
matrixFiles = fs.readdirSync(mdir).filter((f) => /\.ya?ml$/.test(f));
|
|
297
|
+
} catch {
|
|
298
|
+
matrixFiles = [];
|
|
299
|
+
}
|
|
300
|
+
for (const f of matrixFiles) {
|
|
301
|
+
const unit = f.replace(/\.ya?ml$/, '');
|
|
302
|
+
const text = fs.readFileSync(path.join(mdir, f), 'utf-8');
|
|
303
|
+
// Deliberately a line scan rather than a YAML parse: the only shape
|
|
304
|
+
// this reads is `- prompt: "..."` under one of two keys, and adding a
|
|
305
|
+
// parser dependency here would make the loader fail on YAML this gate
|
|
306
|
+
// has no opinion about.
|
|
307
|
+
let bucket: boolean | null = null;
|
|
308
|
+
for (const line of text.split('\n')) {
|
|
309
|
+
if (/^positives:/.test(line)) bucket = true;
|
|
310
|
+
else if (/^near_misses:/.test(line)) bucket = false;
|
|
311
|
+
else if (/^[a-z_]+:/.test(line)) bucket = null;
|
|
312
|
+
const m = /^\s*-\s*prompt:\s*(.+)$/.exec(line);
|
|
313
|
+
if (m && bucket !== null) {
|
|
314
|
+
out.push({ unit, prompt: unquote(m[1] ?? ''), expect: bucket });
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const sdir = path.join(root, 'src', 'skills');
|
|
319
|
+
let skillDirs: fs.Dirent[] = [];
|
|
320
|
+
try {
|
|
321
|
+
skillDirs = fs.readdirSync(sdir, { withFileTypes: true });
|
|
322
|
+
} catch {
|
|
323
|
+
skillDirs = [];
|
|
324
|
+
}
|
|
325
|
+
for (const d of skillDirs) {
|
|
326
|
+
if (!d.isDirectory()) continue;
|
|
327
|
+
const f = path.join(sdir, d.name, 'evals', 'triggers.json');
|
|
328
|
+
if (!fs.existsSync(f)) continue;
|
|
329
|
+
out.push(...readTriggersFile(d.name, f));
|
|
330
|
+
}
|
|
331
|
+
return out;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Read one skill trigger file, in EITHER of the two shapes that exist.
|
|
336
|
+
*
|
|
337
|
+
* 74 files use `queries: [{q, trigger}]`; 2 use `should_trigger` /
|
|
338
|
+
* `should_not_trigger` string arrays. A reader that knew only the majority
|
|
339
|
+
* shape returned ZERO cases for the other two while `check_routing_coverage`
|
|
340
|
+
* counted them as covered — the file exists, so the ratio said yes and the
|
|
341
|
+
* corpus said nothing. That is exactly the silent no-op this repository keeps
|
|
342
|
+
* finding, and it is the reason both shapes are read here rather than one
|
|
343
|
+
* being called the format.
|
|
344
|
+
*/
|
|
345
|
+
export function readTriggersFile(unit: string, file: string): Case[] {
|
|
346
|
+
const doc = JSON.parse(fs.readFileSync(file, 'utf-8')) as {
|
|
347
|
+
queries?: { q?: string; trigger?: boolean }[];
|
|
348
|
+
should_trigger?: string[];
|
|
349
|
+
should_not_trigger?: string[];
|
|
350
|
+
};
|
|
351
|
+
const out: Case[] = [];
|
|
352
|
+
for (const q of doc.queries ?? []) {
|
|
353
|
+
if (typeof q.q === 'string' && typeof q.trigger === 'boolean') {
|
|
354
|
+
out.push({ unit, prompt: q.q, expect: q.trigger });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
for (const q of doc.should_trigger ?? []) {
|
|
358
|
+
if (typeof q === 'string') out.push({ unit, prompt: q, expect: true });
|
|
359
|
+
}
|
|
360
|
+
for (const q of doc.should_not_trigger ?? []) {
|
|
361
|
+
if (typeof q === 'string') out.push({ unit, prompt: q, expect: false });
|
|
362
|
+
}
|
|
363
|
+
return out;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function unquote(s: string): string {
|
|
367
|
+
const t = s.trim();
|
|
368
|
+
if ((t.startsWith('"') && t.endsWith('"')) || (t.startsWith("'") && t.endsWith("'"))) {
|
|
369
|
+
return t.slice(1, -1);
|
|
370
|
+
}
|
|
371
|
+
return t;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* The catalogue is name + description — the production routing condition.
|
|
376
|
+
*
|
|
377
|
+
* Read from the PROJECTION (`dist/agent-src/`), not from `src/`, because that
|
|
378
|
+
* is the tree a host actually loads. Reading `src/` would measure a surface no
|
|
379
|
+
* host sees, and the two can diverge for exactly one revision at a time.
|
|
380
|
+
*
|
|
381
|
+
* The catalogue is the WHOLE estate even when the diff scope is one unit: the
|
|
382
|
+
* routing condition is competitive, so a description is only judgeable against
|
|
383
|
+
* the 400-odd it competes with. Scoping the CASES is the cost control; scoping
|
|
384
|
+
* the catalogue would change what is being measured.
|
|
385
|
+
*/
|
|
386
|
+
export function loadCatalogue(root = REPO_ROOT): SkillMeta[] {
|
|
387
|
+
const out: SkillMeta[] = [];
|
|
388
|
+
const push = (name: string, file: string): void => {
|
|
389
|
+
let text: string;
|
|
390
|
+
try {
|
|
391
|
+
text = fs.readFileSync(file, 'utf-8');
|
|
392
|
+
} catch {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const m = /^description:\s*(.+)$/m.exec(text.split('---')[1] ?? '');
|
|
396
|
+
out.push({ name, description: m ? unquote(m[1] ?? '') : '' });
|
|
397
|
+
};
|
|
398
|
+
const sdir = path.join(root, 'dist', 'agent-src', 'skills');
|
|
399
|
+
try {
|
|
400
|
+
for (const d of fs.readdirSync(sdir, { withFileTypes: true })) {
|
|
401
|
+
if (d.isDirectory()) push(d.name, path.join(sdir, d.name, 'SKILL.md'));
|
|
402
|
+
}
|
|
403
|
+
} catch {
|
|
404
|
+
/* no projection in this tree — the caller sees an empty catalogue */
|
|
405
|
+
}
|
|
406
|
+
const rdir = path.join(root, 'dist', 'agent-src', 'rules');
|
|
407
|
+
try {
|
|
408
|
+
for (const f of fs.readdirSync(rdir)) {
|
|
409
|
+
if (f.endsWith('.md')) push(f.replace(/\.md$/, ''), path.join(rdir, f));
|
|
410
|
+
}
|
|
411
|
+
} catch {
|
|
412
|
+
/* same */
|
|
413
|
+
}
|
|
414
|
+
return out;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/* ── CLI ──────────────────────────────────────────────────────────────────── */
|
|
418
|
+
|
|
419
|
+
function flagValue(argv: readonly string[], name: string): string | null {
|
|
420
|
+
const i = argv.indexOf(name);
|
|
421
|
+
return i >= 0 && i + 1 < argv.length ? (argv[i + 1] ?? null) : null;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
|
|
425
|
+
const write = process.stdout.write.bind(process.stdout);
|
|
426
|
+
const listFile = flagValue(argv, '--changed-files');
|
|
427
|
+
let changed: string[] = [];
|
|
428
|
+
if (listFile !== null) {
|
|
429
|
+
try {
|
|
430
|
+
changed = fs
|
|
431
|
+
.readFileSync(listFile, 'utf-8')
|
|
432
|
+
.split('\n')
|
|
433
|
+
.map((s) => s.trim())
|
|
434
|
+
.filter((s) => s !== '');
|
|
435
|
+
} catch {
|
|
436
|
+
process.stderr.write(`--changed-files: cannot read ${listFile}\n`);
|
|
437
|
+
return 2;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const decision = scopeRun({ isFork: argv.includes('--fork'), changedFiles: changed });
|
|
441
|
+
write(`scope: ${decision.mode} — ${decision.reason}\n`);
|
|
442
|
+
if (decision.mode === 'advisory') {
|
|
443
|
+
// Not a pass and not a skip-with-a-shrug: the advisory path is the
|
|
444
|
+
// SHIPPED behaviour for this class of diff, and saying so is what keeps
|
|
445
|
+
// a green run from reading as coverage it does not have.
|
|
446
|
+
write('advisory path unchanged; no scoped run, no spend.\n');
|
|
447
|
+
return 0;
|
|
448
|
+
}
|
|
449
|
+
const all = loadCases(root);
|
|
450
|
+
const cases = scopeCases(all, decision.units);
|
|
451
|
+
if (cases.length === 0) {
|
|
452
|
+
write(
|
|
453
|
+
`no corpus case exists for ${decision.units.join(', ')} — the description ` +
|
|
454
|
+
'changed on a unit nothing covers. That is a corpus gap, reported rather ' +
|
|
455
|
+
'than passed over; the 0.3 ratchet is what makes closing it durable.\n',
|
|
456
|
+
);
|
|
457
|
+
return 0;
|
|
458
|
+
}
|
|
459
|
+
const catalogue = loadCatalogue(root);
|
|
460
|
+
const dry = argv.includes('--dry');
|
|
461
|
+
const inner: Backend = new DryBackend();
|
|
462
|
+
const backend = dry ? inner : new CachedBackend(inner, path.join(root, CACHE_REL));
|
|
463
|
+
const report = evaluate(cases, catalogue, backend);
|
|
464
|
+
// The ledger's target is the UNIT, not the individual case: a unit is what
|
|
465
|
+
// the diff scoped in, so a per-case ledger would report rows nobody chose
|
|
466
|
+
// to include while hiding which unit actually regressed.
|
|
467
|
+
const ledger = new GateLedger('description_route_check');
|
|
468
|
+
ledger.plan(decision.units);
|
|
469
|
+
for (const u of decision.units) {
|
|
470
|
+
const own = report.findings.filter((f) => f.unit === u && f.direction === 'recall');
|
|
471
|
+
if (own.length === 0) ledger.complete(u);
|
|
472
|
+
else ledger.fail(u, `${String(own.length)} positive(s) stopped loading`);
|
|
473
|
+
}
|
|
474
|
+
ledger.report(write);
|
|
475
|
+
const code = render(report, write);
|
|
476
|
+
if (dry) {
|
|
477
|
+
// The dry backend is a NAME-substring matcher over a catalogue whose
|
|
478
|
+
// signal is the DESCRIPTION, so it misses almost every real prompt by
|
|
479
|
+
// construction. Its verdict is therefore not a verdict: `--dry` proves
|
|
480
|
+
// the plumbing runs with no key and no spend, and nothing else.
|
|
481
|
+
// Returning its exit code would make every description edit red for a
|
|
482
|
+
// reason that has nothing to do with the description.
|
|
483
|
+
write(
|
|
484
|
+
'dry backend: findings above are PLUMBING output, not a routing result. ' +
|
|
485
|
+
'Exit forced to 0.\n',
|
|
486
|
+
);
|
|
487
|
+
return 0;
|
|
488
|
+
}
|
|
489
|
+
return code;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
|
|
493
|
+
process.exit(main());
|
|
494
|
+
}
|
|
@@ -54,6 +54,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
54
54
|
// time, and each CLI entry guard only fires for its own argv[1].
|
|
55
55
|
import { isAcceptanceCriteriaHeading } from './_lib/ac_heading.js';
|
|
56
56
|
import { gitEnv } from './_lib/git_env.js';
|
|
57
|
+
import { loadDenyPatterns, redactSourceShape, redactSourceTokens, writeRedacted } from './_lib/source_redact.js';
|
|
57
58
|
import { completionReviewDisabled } from './_lib/planning_settings.js';
|
|
58
59
|
import { artifactRelevance } from './check_completion_review.js';
|
|
59
60
|
|
|
@@ -1251,17 +1252,41 @@ function runDispatch(args: Args): number {
|
|
|
1251
1252
|
acHash: hashes.ac_hash,
|
|
1252
1253
|
dispatched,
|
|
1253
1254
|
});
|
|
1255
|
+
// Phase 3.4 of road-to-source-silence: redact deny-set hits AT WRITE TIME.
|
|
1256
|
+
// This package's confidentiality gate carried a blanket `skip_paths`
|
|
1257
|
+
// exemption over `*.review-input/diff.patch`, which did not stop the leak —
|
|
1258
|
+
// it stopped the gate from seeing it. The generator is the only writer of
|
|
1259
|
+
// these files, so it is the only place the content can be fixed instead of
|
|
1260
|
+
// exempted. Redaction is line-local: hunks, paths and context are
|
|
1261
|
+
// untouched, so the evidence chain a reviewer reads stays intact.
|
|
1262
|
+
//
|
|
1263
|
+
// ORDERING IS LOAD-BEARING. `prompt_hash` must re-derive from the bytes on
|
|
1264
|
+
// disk (`check_review_prompt_binding` re-hashes `prompt.md`), so the prompt
|
|
1265
|
+
// is redacted BEFORE it is hashed. Hashing the pre-redaction text and
|
|
1266
|
+
// writing the post-redaction text would make every new artefact fail its
|
|
1267
|
+
// own binding gate.
|
|
1268
|
+
const denyPatterns = loadDenyPatterns();
|
|
1269
|
+
let redactions = 0;
|
|
1270
|
+
const promptTokens = redactSourceTokens(promptText, denyPatterns);
|
|
1271
|
+
// Shape redaction runs on the prompt too, and BEFORE the hash below, for the
|
|
1272
|
+
// same reason the deny pass does: `check_review_prompt_binding` re-derives
|
|
1273
|
+
// prompt_hash from prompt.md on disk, so hashing anything other than the
|
|
1274
|
+
// exact bytes written would make every new artefact fail its own binding.
|
|
1275
|
+
const promptRedacted = redactSourceShape(promptTokens.text);
|
|
1276
|
+
redactions += promptTokens.count + promptRedacted.count;
|
|
1277
|
+
|
|
1254
1278
|
const skeleton = findingsSkeleton({
|
|
1255
1279
|
slug,
|
|
1256
1280
|
headSha,
|
|
1257
1281
|
scopeHash: hashes.scope_hash,
|
|
1258
1282
|
reviewedDate,
|
|
1259
1283
|
manifest,
|
|
1260
|
-
promptHash: sha256(
|
|
1284
|
+
promptHash: sha256(promptRedacted.text),
|
|
1261
1285
|
});
|
|
1262
1286
|
|
|
1263
1287
|
fs.mkdirSync(inputDirAbs, { recursive: true });
|
|
1264
|
-
|
|
1288
|
+
|
|
1289
|
+
redactions += writeRedacted(path.join(inputDirAbs, 'diff.patch'), scopeDiffText, denyPatterns);
|
|
1265
1290
|
if (roadmapText !== null) {
|
|
1266
1291
|
// The snapshot lands under agents/evidence/, which check_references
|
|
1267
1292
|
// walks, while the live roadmap layer is deliberately excluded from
|
|
@@ -1273,10 +1298,26 @@ function runDispatch(args: Args): number {
|
|
|
1273
1298
|
const snapshotHeader =
|
|
1274
1299
|
'<!-- check-refs: skip -->\n' +
|
|
1275
1300
|
'<!-- verbatim roadmap snapshot for the R2 reviewer; the live roadmap layer is excluded from check_references, and a snapshot must not fail a gate its source is exempt from -->\n';
|
|
1276
|
-
|
|
1301
|
+
redactions += writeRedacted(
|
|
1302
|
+
path.join(inputDirAbs, 'roadmap.md'),
|
|
1303
|
+
snapshotHeader + roadmapText,
|
|
1304
|
+
denyPatterns,
|
|
1305
|
+
);
|
|
1306
|
+
}
|
|
1307
|
+
redactions += writeRedacted(
|
|
1308
|
+
path.join(inputDirAbs, 'acceptance-criteria.md'),
|
|
1309
|
+
acText ?? '',
|
|
1310
|
+
denyPatterns,
|
|
1311
|
+
);
|
|
1312
|
+
fs.writeFileSync(path.join(inputDirAbs, 'prompt.md'), promptRedacted.text, 'utf-8');
|
|
1313
|
+
if (redactions > 0) {
|
|
1314
|
+
// Never redact silently: a changed artefact nobody was told about is
|
|
1315
|
+
// the failure mode this whole programme is about.
|
|
1316
|
+
process.stderr.write(
|
|
1317
|
+
`dispatch_r2_reviewer: redacted ${redactions} source-confidentiality hit(s) ` +
|
|
1318
|
+
`from the review-input snapshot (marker: [REDACTED:src-conf]).\n`,
|
|
1319
|
+
);
|
|
1277
1320
|
}
|
|
1278
|
-
fs.writeFileSync(path.join(inputDirAbs, 'acceptance-criteria.md'), acText ?? '', 'utf-8');
|
|
1279
|
-
fs.writeFileSync(path.join(inputDirAbs, 'prompt.md'), promptText, 'utf-8');
|
|
1280
1321
|
fs.writeFileSync(findingsAbs, skeleton, 'utf-8');
|
|
1281
1322
|
|
|
1282
1323
|
const inputDirRel = path.join(args.outDir, `${slug}.review-input`);
|