@event4u/agent-config 14.10.0 → 14.12.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 +161 -208
- package/README.md +1 -1
- package/dist/agent-src/commands/design.md +88 -0
- package/dist/agent-src/commands/project/analyze.md +47 -0
- package/dist/agent-src/commands/review/changes.md +67 -6
- package/dist/agent-src/commands/roadmap/create.md +49 -0
- package/dist/agent-src/commands/roadmap/next.md +27 -11
- package/dist/agent-src/commands/roadmap/process-full.md +14 -0
- package/dist/agent-src/commands/video/from-script.md +60 -3
- package/dist/agent-src/commands/video/stitch.md +14 -0
- package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
- package/dist/agent-src/rules/active-remediation.md +3 -3
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/context-hygiene.md +13 -33
- package/dist/agent-src/rules/council-availability.md +2 -2
- package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
- package/dist/agent-src/rules/design-fidelity.md +18 -0
- package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
- package/dist/agent-src/rules/evaluator-independence.md +56 -44
- package/dist/agent-src/rules/fix-what-you-see.md +9 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
- package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
- package/dist/agent-src/rules/playbook-precedence.md +105 -0
- package/dist/agent-src/rules/recurring-criticism.md +3 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
- package/dist/agent-src/rules/scale-discipline.md +24 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
- package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
- package/dist/agent-src/rules/ui-audit-gate.md +27 -15
- package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
- package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
- package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
- package/dist/agent-src/skills/brand/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +75 -5
- package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
- package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
- package/dist/agent-src/skills/design-review/SKILL.md +79 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
- package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
- package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
- package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
- package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
- package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
- package/dist/agent-src/skills/iconography/SKILL.md +3 -0
- package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
- package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
- package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
- package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
- package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
- package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
- package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
- package/dist/agent-src/skills/override-management/SKILL.md +3 -0
- package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
- package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
- package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
- package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
- package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
- package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
- package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
- package/dist/agent-src/skills/terraform/SKILL.md +3 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
- package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
- package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
- package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/playbook.md +75 -0
- package/dist/agent-src/templates/roadmaps.md +37 -0
- package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/dist/cli/commands/uiAudit.js +221 -0
- package/dist/cli/commands/uiRender.js +206 -0
- package/dist/cli/main.js +22 -1
- package/dist/cli/mcp/content.js +64 -1
- package/dist/cli/mcp/dispatch.js +175 -10
- package/dist/cli/registry.js +3 -0
- package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
- package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
- package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
- package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
- package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
- package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +8 -6
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- 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 +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +70 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +362 -127
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +18 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -6
- package/dist/hooks/dispatch.js +2575 -1472
- package/dist/install/install.mjs +800 -708
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1685 -1250
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/lean_projection_mode.js +40 -0
- package/dist/scripts/_lib/scoped_projection.js +84 -0
- package/dist/scripts/_lib/ui_surface.js +89 -0
- package/dist/scripts/condense.js +6 -10
- package/dist/scripts/project_thin_rules.js +40 -2
- package/dist/server/schemas/settings.js +6 -0
- package/dist/shared/skillRanking.js +159 -0
- package/docs/contracts/provider-lifecycle.md +47 -18
- package/docs/contracts/settings-classes.md +35 -5
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/design-antipatterns.md +4 -2
- package/docs/guidelines/design-asset-discipline.md +38 -0
- package/docs/guidelines/design-fidelity-mechanics.md +45 -29
- package/docs/guidelines/design-handover-extraction.md +35 -5
- package/docs/guidelines/design-modes.md +41 -1
- package/docs/guidelines/monorepo-antipatterns.md +141 -0
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +50 -39
- package/package.json +6 -2
- package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/src/config/agent-settings.template.yml +44 -0
- package/src/config/assurance-capability-registry.json +223 -0
- package/src/config/assurance-threshold-budget.json +65 -0
- package/src/config/budgets.yml +19 -0
- package/src/config/ci-local-parity.yml +29 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/dispatch-economy-metrics.json +4 -2
- package/src/config/estate-count-budget.json +8 -3
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +392 -8
- package/src/config/gate-violation-baselines.json +76 -72
- package/src/config/hook-latency-budget.json +1 -0
- package/src/config/hook-token-budget.json +137 -125
- package/src/config/pack-size-budget.json +39 -10
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/quorum-attendance-budget.json +12 -4
- package/src/config/routing-coverage-seed.json +29 -0
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/config/rule-stub-ceilings.json +112 -91
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/web-launch-readiness.json +188 -0
- package/src/scripts/_cli/cmd_doctor.ts +15 -16
- package/src/scripts/_cli/doctor_install_mode.ts +49 -0
- package/src/scripts/_cli/doctor_overrides.ts +154 -0
- package/src/scripts/_dispatch.bash +17 -0
- package/src/scripts/_lib/as_of.ts +412 -0
- package/src/scripts/_lib/exec_evidence.ts +7 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/hook_settings.ts +33 -0
- package/src/scripts/_lib/host_listing_model.ts +192 -0
- package/src/scripts/_lib/lean_projection_mode.ts +44 -0
- package/src/scripts/_lib/mcp_bridge.ts +199 -0
- package/src/scripts/_lib/review_independence.ts +62 -10
- package/src/scripts/_lib/rule_injection.ts +239 -0
- package/src/scripts/_lib/run_checkpoint.ts +54 -1
- package/src/scripts/_lib/scoped_projection.ts +96 -0
- package/src/scripts/_lib/session_register.ts +44 -2
- package/src/scripts/_lib/skill_catalogue.ts +38 -2
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/transcript_reads.ts +207 -0
- package/src/scripts/_lib/ui_authority.ts +343 -0
- package/src/scripts/ai-video/adapters/fal.sh +8 -3
- package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
- package/src/scripts/ai-video/adapters/kling.sh +10 -0
- package/src/scripts/ai-video/adapters/sora.sh +10 -0
- package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
- package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
- package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
- package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
- package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
- package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
- package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
- package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
- package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
- package/src/scripts/ai-video/smoke-trace.sh +450 -2
- package/src/scripts/ai-video/stitch.sh +191 -10
- package/src/scripts/ai-video/test-pipeline.sh +84 -6
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
- package/src/scripts/ai_council/clients.ts +3 -2
- package/src/scripts/ai_council/consensus.ts +63 -6
- package/src/scripts/ai_council/events_log.ts +46 -1
- package/src/scripts/ai_council/orchestrator.ts +103 -108
- package/src/scripts/ai_council/orchestrator_results.ts +166 -0
- package/src/scripts/ai_council/prompts.ts +12 -5
- package/src/scripts/ai_council/quorum.ts +82 -1
- package/src/scripts/ai_council/quorum_wiring.ts +82 -5
- package/src/scripts/ai_council/stance_tally.ts +22 -0
- package/src/scripts/bench_hook_latency.ts +62 -0
- package/src/scripts/build_proof.ts +12 -1
- package/src/scripts/capture_skill_catalogue.ts +21 -0
- package/src/scripts/check_always_budget.ts +2 -1
- package/src/scripts/check_augmentignore.ts +2 -1
- package/src/scripts/check_beta_review_markers.ts +2 -1
- package/src/scripts/check_bundle_path_leakage.ts +162 -7
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +364 -0
- package/src/scripts/check_corpus_staleness.ts +2 -1
- package/src/scripts/check_council_pin_staleness.ts +3 -1
- package/src/scripts/check_enforcement_coverage.ts +116 -3
- package/src/scripts/check_enforcement_denominator.ts +365 -0
- package/src/scripts/check_estate_count.ts +122 -3
- package/src/scripts/check_gate_coverage.ts +2 -1
- package/src/scripts/check_hook_bundle_freshness.ts +13 -1
- package/src/scripts/check_knowledge_cards.ts +2 -1
- package/src/scripts/check_knowledge_pages.ts +3 -2
- package/src/scripts/check_memory.ts +2 -1
- package/src/scripts/check_no_automerge_key.ts +287 -0
- package/src/scripts/check_pack_conformance_fixture.ts +565 -0
- package/src/scripts/check_preamble_payload_budget.ts +30 -3
- package/src/scripts/check_proposal.ts +2 -1
- package/src/scripts/check_reach_staleness.ts +2 -1
- package/src/scripts/check_release_adjacent_health.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_review_schema.ts +34 -1
- package/src/scripts/check_roadmap_trackable.ts +48 -3
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_score_contract.ts +505 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_source_size_budget.ts +2 -1
- package/src/scripts/check_standing_payload_delta.ts +505 -0
- package/src/scripts/check_trigger_evals.ts +2 -1
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/classify_change_risk.ts +281 -0
- package/src/scripts/compute_skill_tiers.ts +186 -0
- package/src/scripts/condense.ts +8 -13
- package/src/scripts/council_attendance_metrics.ts +183 -0
- package/src/scripts/council_cli.ts +10 -8
- package/src/scripts/council_parse_rate.ts +116 -0
- package/src/scripts/derive_playbooks.ts +406 -0
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/design_slop_rules.ts +56 -2
- package/src/scripts/dispatch_r2_reviewer.ts +16 -0
- package/src/scripts/frontend_corpus_hash.ts +116 -0
- package/src/scripts/grade_target_readiness.ts +478 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +124 -16
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/design_pass_hook.ts +356 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
- package/src/scripts/hooks/rule_inject_hook.ts +318 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
- package/src/scripts/hot_context_hook.ts +74 -7
- package/src/scripts/install.ts +40 -89
- package/src/scripts/lint_adapter_tier.ts +663 -0
- package/src/scripts/lint_archived_skills.ts +93 -0
- package/src/scripts/lint_budget_ownership.ts +56 -5
- package/src/scripts/lint_deterministic_time.ts +470 -0
- package/src/scripts/lint_framework_leakage.ts +5 -0
- package/src/scripts/lint_handoffs.ts +525 -1
- package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
- package/src/scripts/lint_marketplace.ts +88 -0
- package/src/scripts/lint_media_policy_linkage.ts +140 -1
- package/src/scripts/lint_one_off_age.ts +6 -1
- package/src/scripts/lint_override_kernel_guard.ts +87 -5
- package/src/scripts/lint_roadmap_complexity.ts +56 -0
- package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
- package/src/scripts/lint_rule_norm_pin.ts +321 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
- package/src/scripts/lint_spawn_payload.ts +42 -5
- package/src/scripts/lint_symptom_intake.ts +2 -1
- package/src/scripts/mcp_parity_smoke.ts +30 -4
- package/src/scripts/mcp_render.ts +66 -1
- package/src/scripts/mcp_tool_fingerprint.ts +241 -0
- package/src/scripts/measure_risk_class_drift.ts +140 -0
- package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
- package/src/scripts/media/lib/adapter-common.sh +211 -1
- package/src/scripts/media/lib/adapter-contract.md +74 -6
- package/src/scripts/model_rule_injection.ts +907 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/project_thin_rules.ts +45 -2
- package/src/scripts/release.ts +66 -860
- package/src/scripts/release_drill.ts +59 -3
- package/src/scripts/release_env.ts +298 -0
- package/src/scripts/release_publication.ts +720 -0
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/roadmap_context.ts +778 -0
- package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
- package/src/scripts/schemas/rule.schema.json +24 -2
- package/src/scripts/schemas/skill.schema.json +39 -0
- package/src/scripts/schemas/ui-authority.schema.json +114 -0
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/session_register_hook.ts +29 -3
- package/src/scripts/sessions_cli.ts +67 -3
- package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/token_sink_report.ts +239 -0
- package/src/scripts/trigger_coverage.ts +122 -3
- package/src/scripts/update_counts.ts +7 -3
- package/src/scripts/validate_frontmatter.ts +66 -0
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +183 -0
- 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/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 -55
- 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/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/nda-triage/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/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- 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/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/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/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/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/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.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/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 -239
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -152,8 +152,41 @@ function main(argv?: readonly string[]): number {
|
|
|
152
152
|
else ledger.complete(name);
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
+
// SECOND SURFACE — step 2.2 of road-to-review-independence. Until it existed, this
|
|
156
|
+
// gate scanned one directory with one producer in it, so `scanned: 1` meant "the only
|
|
157
|
+
// producer of this record agrees with itself". `dispatch_r2_reviewer` now emits the
|
|
158
|
+
// same record into its findings artefact, and those are checked here on the same
|
|
159
|
+
// terms: the independence pair must be internally consistent wherever it is written,
|
|
160
|
+
// or the derivation rule is advice rather than a contract.
|
|
161
|
+
//
|
|
162
|
+
// Only the independence check runs over this surface, not the release-findings schema
|
|
163
|
+
// — an R2 artefact is a different document and validating it against the ledger
|
|
164
|
+
// schema would report violations that are not violations.
|
|
165
|
+
const REVIEWS_DIR = path.join(process.cwd(), 'agents', 'evidence', 'reviews');
|
|
166
|
+
let reviewScanned = 0;
|
|
167
|
+
if (fs.existsSync(REVIEWS_DIR)) {
|
|
168
|
+
for (const name of fs.readdirSync(REVIEWS_DIR).filter((n) => n.endsWith('.md')).sort()) {
|
|
169
|
+
const text = fs.readFileSync(path.join(REVIEWS_DIR, name), 'utf-8');
|
|
170
|
+
const m = /<!--\s*(\{"review-independence".*?\})\s*-->/su.exec(text);
|
|
171
|
+
if (m === null) continue;
|
|
172
|
+
reviewScanned += 1;
|
|
173
|
+
let rec: Record<string, unknown>;
|
|
174
|
+
try {
|
|
175
|
+
rec = (JSON.parse(m[1]!) as { 'review-independence': Record<string, unknown> })[
|
|
176
|
+
'review-independence'
|
|
177
|
+
];
|
|
178
|
+
} catch (exc) {
|
|
179
|
+
problems.push(`${name}: unparseable review-independence block — ${String(exc)}`);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
for (const v of independenceViolations(rec)) {
|
|
183
|
+
problems.push(`${name}: independence — ${v}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
155
188
|
ledger.finalize();
|
|
156
|
-
process.stderr.write(`scanned: ${files.length}\n`);
|
|
189
|
+
process.stderr.write(`scanned: ${String(files.length + reviewScanned)}\n`);
|
|
157
190
|
|
|
158
191
|
if (problems.length > 0) {
|
|
159
192
|
process.stdout.write(
|
|
@@ -29,11 +29,13 @@ import * as fs from 'node:fs';
|
|
|
29
29
|
import * as path from 'node:path';
|
|
30
30
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
31
31
|
|
|
32
|
+
import { checkRatchet } from './_lib/gate_baseline.js';
|
|
32
33
|
import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
33
34
|
|
|
34
35
|
const QUIET = process.argv.slice(2).includes('--quiet');
|
|
35
36
|
|
|
36
37
|
const ROADMAP_ROOT = 'agents/roadmaps';
|
|
38
|
+
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
37
39
|
|
|
38
40
|
// --- Replicated from .augment/scripts/update_roadmap_progress.py ------------
|
|
39
41
|
// CHECKBOX_RE = re.compile(r"^\s*[-*]\s+\[([ xX~\-])\]\s", re.MULTILINE)
|
|
@@ -221,6 +223,25 @@ function violations_for(p: string): string[] {
|
|
|
221
223
|
return out;
|
|
222
224
|
}
|
|
223
225
|
|
|
226
|
+
/**
|
|
227
|
+
* Does this roadmap declare a `relates:` block?
|
|
228
|
+
*
|
|
229
|
+
* `road-to-roadmap-situational-awareness` § 4.2. `depends:` was defined in the
|
|
230
|
+
* template and its measured adoption was **0** — a field nothing requires is a
|
|
231
|
+
* field nobody writes. So the wider relation field is required, but RATCHETED:
|
|
232
|
+
* the roadmaps that predate the check are held at their measured count and a
|
|
233
|
+
* NEW one without the block pushes the count above it.
|
|
234
|
+
*
|
|
235
|
+
* Presence only. Whether the declared relations are legal is
|
|
236
|
+
* `lint_roadmap_complexity`'s `_check_relates`, and whether an empty list is
|
|
237
|
+
* honest is the pre-save self-check in `roadmap-writing` — a gate cannot tell a
|
|
238
|
+
* genuinely-empty `relates: []` from a reflex one, and pretending otherwise
|
|
239
|
+
* would be the worse failure.
|
|
240
|
+
*/
|
|
241
|
+
export function declares_relates(p: string): boolean {
|
|
242
|
+
return parse_frontmatter(fs.readFileSync(p, 'utf-8')).has('relates');
|
|
243
|
+
}
|
|
244
|
+
|
|
224
245
|
function main(): number {
|
|
225
246
|
if (!_isDir(ROADMAP_ROOT)) {
|
|
226
247
|
process.stderr.write(`❌ ${ROADMAP_ROOT} not found — run from project root.\n`);
|
|
@@ -244,8 +265,9 @@ function main(): number {
|
|
|
244
265
|
}
|
|
245
266
|
throw exc;
|
|
246
267
|
}
|
|
268
|
+
const active = find_active_roadmaps(ROADMAP_ROOT);
|
|
247
269
|
const findings: string[] = [];
|
|
248
|
-
for (const p of
|
|
270
|
+
for (const p of active) {
|
|
249
271
|
findings.push(...violations_for(p));
|
|
250
272
|
}
|
|
251
273
|
if (findings.length > 0) {
|
|
@@ -259,11 +281,33 @@ function main(): number {
|
|
|
259
281
|
);
|
|
260
282
|
return 1;
|
|
261
283
|
}
|
|
262
|
-
|
|
284
|
+
// The `relates:` ratchet. Reported separately from trackability because the
|
|
285
|
+
// two are different obligations: one keeps a roadmap visible to the
|
|
286
|
+
// dashboard, this one keeps its relations to sibling work declared.
|
|
287
|
+
const no_relates = active.filter((p) => !declares_relates(p));
|
|
288
|
+
const verdict = checkRatchet({
|
|
289
|
+
gate: 'check_roadmap_trackable:relates',
|
|
290
|
+
actual: no_relates.length,
|
|
291
|
+
repoRoot: REPO_ROOT,
|
|
292
|
+
});
|
|
293
|
+
if (!verdict.ok) {
|
|
294
|
+
process.stderr.write(`❌ ${verdict.message}\n`);
|
|
295
|
+
for (const p of no_relates) {
|
|
296
|
+
process.stderr.write(` ${p}: no \`relates:\` block in the frontmatter\n`);
|
|
297
|
+
}
|
|
298
|
+
process.stderr.write(
|
|
299
|
+
'\n Run `agent-config roadmap:context` and write one row per hit\n' +
|
|
300
|
+
" ({slug, relation: extends|supersedes|depends|disjoint, note}), or an\n" +
|
|
301
|
+
" explicit `relates: []` carrying the probe's `scanned:` line as its\n" +
|
|
302
|
+
' justification. See templates/roadmaps.md rule 18.\n',
|
|
303
|
+
);
|
|
304
|
+
return 1;
|
|
305
|
+
}
|
|
263
306
|
if (!QUIET) {
|
|
264
307
|
process.stdout.write(
|
|
265
|
-
`✅ ${
|
|
308
|
+
`✅ ${active.length} active roadmap(s) — all parseable, all phases have checkboxes.\n`,
|
|
266
309
|
);
|
|
310
|
+
process.stdout.write(`✅ ${verdict.message}\n`);
|
|
267
311
|
}
|
|
268
312
|
return 0;
|
|
269
313
|
}
|
|
@@ -296,6 +340,7 @@ if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
|
296
340
|
}
|
|
297
341
|
|
|
298
342
|
export {
|
|
343
|
+
REPO_ROOT,
|
|
299
344
|
ROADMAP_ROOT,
|
|
300
345
|
CHECKBOX_RE,
|
|
301
346
|
PHASE_RE,
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* `check_routing_coverage` — two coverage ratchets, one per routed scope.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-routing-assurance` Phase 0.3. Coverage ratio = corpus cases / routed
|
|
6
|
+
* units, per scope, seeded at the measured current value. **CI fails only on a
|
|
7
|
+
* DECREASE** — the same COUNT-ratchet disposition `lint_trigger_precision.ts`
|
|
8
|
+
* already uses, and for the same reason: the number is a property of the estate,
|
|
9
|
+
* so a rise is somebody's work and a fall is somebody's omission.
|
|
10
|
+
*
|
|
11
|
+
* TWO scopes, never one aggregate, because the aggregate hides the finding:
|
|
12
|
+
*
|
|
13
|
+
* rules 94 / 105 = 0.895 deterministic corpus, gating
|
|
14
|
+
* skills 76 / 299 = 0.254 advisory live harness only
|
|
15
|
+
*
|
|
16
|
+
* The rules surface is ~90 % covered by a corpus that can fail a PR. The skills
|
|
17
|
+
* surface — the one production actually routes on — is 25 %, covered only by a
|
|
18
|
+
* harness that is "advisory only, never gating" (`rule_trigger_eval.ts:4`). One
|
|
19
|
+
* blended figure would read as ~46 % and describe neither.
|
|
20
|
+
*
|
|
21
|
+
* WHY A RATIO AND NOT A COUNT: the denominator moves. Adding 8 skills without
|
|
22
|
+
* adding corpus cases lowers coverage while every count rises, and a count
|
|
23
|
+
* ratchet would call that progress.
|
|
24
|
+
*
|
|
25
|
+
* Exit codes: 0 = at or above seed · 1 = a scope fell · 2 = dead scope.
|
|
26
|
+
*/
|
|
27
|
+
import * as fs from 'node:fs';
|
|
28
|
+
import * as os from 'node:os';
|
|
29
|
+
import * as path from 'node:path';
|
|
30
|
+
import process from 'node:process';
|
|
31
|
+
import { fileURLToPath } from 'node:url';
|
|
32
|
+
|
|
33
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
34
|
+
import { type SelfTestCase, runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
35
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
36
|
+
|
|
37
|
+
const HERE = fileURLToPath(import.meta.url);
|
|
38
|
+
const REAL_REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
|
|
39
|
+
/**
|
|
40
|
+
* Scan root. The env override exists for `--self-test`, which drives the REAL
|
|
41
|
+
* CLI against a synthetic tree — an in-process call would skip the argv parsing
|
|
42
|
+
* and the entry guard, and a gate resolving its root from `import.meta.url`
|
|
43
|
+
* reads the live checkout whatever the cwd, so every fixture would be green for
|
|
44
|
+
* the wrong reason.
|
|
45
|
+
*/
|
|
46
|
+
const REPO_ROOT = process.env['CHECK_ROUTING_COVERAGE_ROOT'] ?? REAL_REPO_ROOT;
|
|
47
|
+
export const SEED_REL = 'src/config/routing-coverage-seed.json';
|
|
48
|
+
|
|
49
|
+
export type Scope = 'rules' | 'skills';
|
|
50
|
+
|
|
51
|
+
export interface ScopeReading {
|
|
52
|
+
scope: Scope;
|
|
53
|
+
cases: number;
|
|
54
|
+
units: number;
|
|
55
|
+
ratio: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface Seed {
|
|
59
|
+
rules: number;
|
|
60
|
+
skills: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Routed rules = every tier-1 and tier-2 entry in the compiled router. */
|
|
64
|
+
export function measureRules(root: string): ScopeReading {
|
|
65
|
+
const routerPath = path.join(root, 'dist', 'router.json');
|
|
66
|
+
let doc: { tier_1?: { id: string }[]; tier_2?: { id: string }[] };
|
|
67
|
+
try {
|
|
68
|
+
doc = JSON.parse(fs.readFileSync(routerPath, 'utf-8')) as typeof doc;
|
|
69
|
+
} catch {
|
|
70
|
+
throw new DeadScopeError(
|
|
71
|
+
'check_routing_coverage',
|
|
72
|
+
'dist/router.json is unreadable — the routed-rule denominator cannot be measured, ' +
|
|
73
|
+
'and a missing router is not a coverage of zero.',
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
const ids = new Set([...(doc.tier_1 ?? []), ...(doc.tier_2 ?? [])].map((r) => r.id));
|
|
77
|
+
const dir = path.join(root, 'tests', 'eval', 'routing-matrix');
|
|
78
|
+
let files: string[];
|
|
79
|
+
try {
|
|
80
|
+
files = fs.readdirSync(dir);
|
|
81
|
+
} catch {
|
|
82
|
+
files = [];
|
|
83
|
+
}
|
|
84
|
+
const stems = new Set(
|
|
85
|
+
files.filter((f) => /\.ya?ml$/.test(f)).map((f) => f.replace(/\.ya?ml$/, '')),
|
|
86
|
+
);
|
|
87
|
+
// Intersection, not the file count: a fixture naming no routed rule covers
|
|
88
|
+
// nothing, and counting it would let the ratio rise on dead files.
|
|
89
|
+
let covered = 0;
|
|
90
|
+
for (const s of stems) if (ids.has(s)) covered += 1;
|
|
91
|
+
return { scope: 'rules', cases: covered, units: ids.size, ratio: ids.size === 0 ? 0 : covered / ids.size };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Routed skills = every SKILL.md; a case = that skill's `evals/triggers.json`. */
|
|
95
|
+
export function measureSkills(root: string): ScopeReading {
|
|
96
|
+
const base = path.join(root, 'src', 'skills');
|
|
97
|
+
let entries: fs.Dirent[];
|
|
98
|
+
try {
|
|
99
|
+
entries = fs.readdirSync(base, { withFileTypes: true });
|
|
100
|
+
} catch {
|
|
101
|
+
throw new DeadScopeError(
|
|
102
|
+
'check_routing_coverage',
|
|
103
|
+
'src/skills is unreadable — the routed-skill denominator cannot be measured.',
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
let units = 0;
|
|
107
|
+
let cases = 0;
|
|
108
|
+
for (const e of entries) {
|
|
109
|
+
if (!e.isDirectory()) continue;
|
|
110
|
+
if (!fs.existsSync(path.join(base, e.name, 'SKILL.md'))) continue;
|
|
111
|
+
units += 1;
|
|
112
|
+
if (fs.existsSync(path.join(base, e.name, 'evals', 'triggers.json'))) cases += 1;
|
|
113
|
+
}
|
|
114
|
+
return { scope: 'skills', cases, units, ratio: units === 0 ? 0 : cases / units };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function readSeed(root: string): Seed {
|
|
118
|
+
const p = path.join(root, SEED_REL);
|
|
119
|
+
let raw: string;
|
|
120
|
+
try {
|
|
121
|
+
raw = fs.readFileSync(p, 'utf-8');
|
|
122
|
+
} catch {
|
|
123
|
+
throw new DeadScopeError(
|
|
124
|
+
'check_routing_coverage',
|
|
125
|
+
`${SEED_REL} is missing — a ratchet with no seed passes every tree.`,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
const doc = JSON.parse(raw) as { seed?: Partial<Seed> };
|
|
129
|
+
const s = doc.seed ?? {};
|
|
130
|
+
if (typeof s.rules !== 'number' || typeof s.skills !== 'number') {
|
|
131
|
+
throw new DeadScopeError(
|
|
132
|
+
'check_routing_coverage',
|
|
133
|
+
`${SEED_REL} carries no numeric seed for both scopes.`,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
return { rules: s.rules, skills: s.skills };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export interface Verdict {
|
|
140
|
+
readings: ScopeReading[];
|
|
141
|
+
seed: Seed;
|
|
142
|
+
fallen: Scope[];
|
|
143
|
+
ledger: GateLedger;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Compare against the seed.
|
|
148
|
+
*
|
|
149
|
+
* Rounded to four decimals before comparing: an un-rounded float makes a ratio
|
|
150
|
+
* that did not change fail on a representation difference, which is a red the
|
|
151
|
+
* contributor cannot act on.
|
|
152
|
+
*/
|
|
153
|
+
/**
|
|
154
|
+
* The comparison precision, shared by the verdict AND the display.
|
|
155
|
+
*
|
|
156
|
+
* Exported because the first version rounded only inside `evaluate` and printed
|
|
157
|
+
* the raw float: rules read 0.895238… against a seed of 0.8952 and rendered `↑`,
|
|
158
|
+
* skills read 0.254180… against 0.2542 and rendered `❌`, while the summary line
|
|
159
|
+
* correctly said green. A gate whose rows contradict its verdict is worse than
|
|
160
|
+
* one that is simply wrong, because the reader cannot tell which half to trust.
|
|
161
|
+
*/
|
|
162
|
+
export function r4(n: number): number {
|
|
163
|
+
return Math.round(n * 10_000) / 10_000;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function evaluate(root = REPO_ROOT): Verdict {
|
|
167
|
+
const seed = readSeed(root);
|
|
168
|
+
const readings = [measureRules(root), measureSkills(root)];
|
|
169
|
+
// The ledger's target is the SCOPE, not the individual unit: this gate's
|
|
170
|
+
// verdict is per scope, so a ledger over 404 units would report 404 rows
|
|
171
|
+
// no one can act on while hiding which of the two actually fell.
|
|
172
|
+
const ledger = new GateLedger('check_routing_coverage');
|
|
173
|
+
ledger.plan(readings.map((r) => r.scope));
|
|
174
|
+
const fallen: Scope[] = [];
|
|
175
|
+
for (const r of readings) {
|
|
176
|
+
if (r4(r.ratio) < r4(seed[r.scope])) {
|
|
177
|
+
fallen.push(r.scope);
|
|
178
|
+
ledger.fail(
|
|
179
|
+
r.scope,
|
|
180
|
+
`${r.ratio.toFixed(4)} < seed ${seed[r.scope].toFixed(4)} ` +
|
|
181
|
+
`(${String(r.cases)}/${String(r.units)})`,
|
|
182
|
+
);
|
|
183
|
+
} else {
|
|
184
|
+
ledger.complete(r.scope);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { readings, seed, fallen, ledger };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Build a synthetic tree with `r` routed rules of which `rc` carry a fixture,
|
|
192
|
+
* and `s` routed skills of which `sc` carry a triggers file, plus a seed.
|
|
193
|
+
*
|
|
194
|
+
* A REALISTIC corpus rather than a minimal one: both scopes are always
|
|
195
|
+
* populated, because the gate reports two scopes and a fixture that leaves one
|
|
196
|
+
* empty would red for the empty scope no matter what the case under test does.
|
|
197
|
+
*/
|
|
198
|
+
function selfTestRoot(
|
|
199
|
+
tmp: string,
|
|
200
|
+
spec: { r: number; rc: number; s: number; sc: number; seed?: Partial<Seed> | null },
|
|
201
|
+
): string {
|
|
202
|
+
const root = fs.mkdtempSync(path.join(tmp, 'repo-'));
|
|
203
|
+
const ids: { id: string }[] = [];
|
|
204
|
+
const mdir = path.join(root, 'tests', 'eval', 'routing-matrix');
|
|
205
|
+
fs.mkdirSync(mdir, { recursive: true });
|
|
206
|
+
fs.mkdirSync(path.join(root, 'dist'), { recursive: true });
|
|
207
|
+
for (let i = 0; i < spec.r; i += 1) {
|
|
208
|
+
ids.push({ id: `st-rule-${String(i)}` });
|
|
209
|
+
if (i < spec.rc) fs.writeFileSync(path.join(mdir, `st-rule-${String(i)}.yaml`), 'cases: []\n');
|
|
210
|
+
}
|
|
211
|
+
fs.writeFileSync(
|
|
212
|
+
path.join(root, 'dist', 'router.json'),
|
|
213
|
+
JSON.stringify({ tier_1: ids.slice(0, 1), tier_2: ids.slice(1) }),
|
|
214
|
+
);
|
|
215
|
+
for (let i = 0; i < spec.s; i += 1) {
|
|
216
|
+
const d = path.join(root, 'src', 'skills', `st-skill-${String(i)}`);
|
|
217
|
+
fs.mkdirSync(d, { recursive: true });
|
|
218
|
+
fs.writeFileSync(path.join(d, 'SKILL.md'), '---\nname: st\n---\n');
|
|
219
|
+
if (i < spec.sc) {
|
|
220
|
+
fs.mkdirSync(path.join(d, 'evals'), { recursive: true });
|
|
221
|
+
fs.writeFileSync(path.join(d, 'evals', 'triggers.json'), '[]\n');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (spec.seed !== null) {
|
|
225
|
+
fs.mkdirSync(path.join(root, path.dirname(SEED_REL)), { recursive: true });
|
|
226
|
+
fs.writeFileSync(
|
|
227
|
+
path.join(root, SEED_REL),
|
|
228
|
+
JSON.stringify({ seed: spec.seed ?? { rules: spec.rc / spec.r, skills: spec.sc / spec.s } }),
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
return root;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function selfTest(): number {
|
|
235
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'crc-selftest-'));
|
|
236
|
+
const run = (root: string): number => {
|
|
237
|
+
process.env['CHECK_ROUTING_COVERAGE_ROOT'] = root;
|
|
238
|
+
try {
|
|
239
|
+
return runGateCli(REAL_REPO_ROOT, 'src/scripts/check_routing_coverage.ts', [], root);
|
|
240
|
+
} finally {
|
|
241
|
+
delete process.env['CHECK_ROUTING_COVERAGE_ROOT'];
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
const cases: SelfTestCase[] = [
|
|
245
|
+
{
|
|
246
|
+
name: 'a tree exactly at seed on both scopes is accepted',
|
|
247
|
+
expect: 'accept',
|
|
248
|
+
run: () => run(selfTestRoot(tmp, { r: 10, rc: 8, s: 10, sc: 5 })),
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: 'a tree ABOVE seed on both scopes is accepted',
|
|
252
|
+
expect: 'accept',
|
|
253
|
+
run: () =>
|
|
254
|
+
run(selfTestRoot(tmp, { r: 10, rc: 9, s: 10, sc: 6, seed: { rules: 0.8, skills: 0.5 } })),
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
name: 'a removed rules corpus case is rejected',
|
|
258
|
+
expect: 'reject',
|
|
259
|
+
run: () =>
|
|
260
|
+
run(selfTestRoot(tmp, { r: 10, rc: 7, s: 10, sc: 5, seed: { rules: 0.8, skills: 0.5 } })),
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
name: 'a removed skills corpus case is rejected',
|
|
264
|
+
expect: 'reject',
|
|
265
|
+
run: () =>
|
|
266
|
+
run(selfTestRoot(tmp, { r: 10, rc: 8, s: 10, sc: 4, seed: { rules: 0.8, skills: 0.5 } })),
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: 'ADDING routed units with no corpus cases is rejected — the count-ratchet blind spot',
|
|
270
|
+
expect: 'reject',
|
|
271
|
+
run: () =>
|
|
272
|
+
run(selfTestRoot(tmp, { r: 10, rc: 8, s: 12, sc: 5, seed: { rules: 0.8, skills: 0.5 } })),
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: 'a missing seed exits non-zero rather than passing every tree',
|
|
276
|
+
expect: 'reject',
|
|
277
|
+
run: () => run(selfTestRoot(tmp, { r: 10, rc: 8, s: 10, sc: 5, seed: null })),
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
name: 'an unreadable router exits non-zero rather than reporting coverage of zero',
|
|
281
|
+
expect: 'reject',
|
|
282
|
+
run: () => {
|
|
283
|
+
const root = selfTestRoot(tmp, { r: 10, rc: 8, s: 10, sc: 5 });
|
|
284
|
+
fs.writeFileSync(path.join(root, 'dist', 'router.json'), 'not json');
|
|
285
|
+
return run(root);
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
];
|
|
289
|
+
try {
|
|
290
|
+
return runSelfTest({
|
|
291
|
+
gate: 'check_routing_coverage',
|
|
292
|
+
cases,
|
|
293
|
+
minCases: 7,
|
|
294
|
+
minRejectCases: 5,
|
|
295
|
+
});
|
|
296
|
+
} finally {
|
|
297
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
|
|
302
|
+
if (argv.includes('--self-test')) return selfTest();
|
|
303
|
+
let v: Verdict;
|
|
304
|
+
try {
|
|
305
|
+
v = evaluate(root);
|
|
306
|
+
reportScanned({
|
|
307
|
+
gate: 'check_routing_coverage',
|
|
308
|
+
scanned: v.readings.reduce((n, r) => n + r.units, 0),
|
|
309
|
+
units: 'routed unit(s)',
|
|
310
|
+
roots: ['dist/router.json', 'src/skills'],
|
|
311
|
+
});
|
|
312
|
+
} catch (e) {
|
|
313
|
+
if (e instanceof DeadScopeError) {
|
|
314
|
+
process.stderr.write(`❌ ${e.message}\n`);
|
|
315
|
+
return 2;
|
|
316
|
+
}
|
|
317
|
+
throw e;
|
|
318
|
+
}
|
|
319
|
+
v.ledger.report(argv.includes('--quiet') ? () => undefined : process.stdout.write.bind(process.stdout));
|
|
320
|
+
if (argv.includes('--json')) {
|
|
321
|
+
process.stdout.write(`${JSON.stringify(v, null, 2)}\n`);
|
|
322
|
+
return v.fallen.length > 0 ? 1 : 0;
|
|
323
|
+
}
|
|
324
|
+
for (const r of v.readings) {
|
|
325
|
+
const seed = v.seed[r.scope];
|
|
326
|
+
// Same rounding as the verdict, deliberately: see r4's own comment.
|
|
327
|
+
const mark = r4(r.ratio) < r4(seed) ? '❌' : r4(r.ratio) > r4(seed) ? '↑' : '=';
|
|
328
|
+
process.stdout.write(
|
|
329
|
+
` ${mark} ${r.scope.padEnd(6)} ${String(r.cases).padStart(4)} / ${String(r.units).padEnd(4)} = ` +
|
|
330
|
+
`${r.ratio.toFixed(4)} (seed ${seed.toFixed(4)})\n`,
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
if (v.fallen.length === 0) {
|
|
334
|
+
process.stdout.write('✅ routing coverage at or above seed in both scopes.\n');
|
|
335
|
+
return 0;
|
|
336
|
+
}
|
|
337
|
+
for (const s of v.fallen) {
|
|
338
|
+
const r = v.readings.find((x) => x.scope === s)!;
|
|
339
|
+
process.stderr.write(
|
|
340
|
+
`❌ ${s} coverage fell: ${r.ratio.toFixed(4)} < seed ${v.seed[s].toFixed(4)} ` +
|
|
341
|
+
`(${String(r.cases)} case(s) over ${String(r.units)} routed unit(s)).\n` +
|
|
342
|
+
' A ratio falls two ways and the fix differs: a corpus case was removed ' +
|
|
343
|
+
'(restore it), or units were added without cases (add them). Lowering the seed ' +
|
|
344
|
+
`in ${SEED_REL} is a defect, not a fix.\n`,
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
return 1;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
|
|
351
|
+
process.exit(main());
|
|
352
|
+
}
|