@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "Outside-in evaluator budgets (road-to-credible-install Phase 6). VALUES ARE FROZEN FROM MEASURED ACCEPTANCE NUMBERS of Phases 0-3 (2026-07-27, packed tarball @ 9.8.0 tree, --omit=dev consumer install), never invented. The umbrella harness (src/scripts/evaluator_umbrella.sh) measures the packed artifact and check_evaluator_budgets.ts enforces: absolute budget AND >regression_pct growth vs last_measured fails even under budget. Owner + review date are lint-enforced (lint_budget_ownership). Timing metrics carry a per-entry regression_pct override (200)
|
|
2
|
+
"_comment": "Outside-in evaluator budgets (road-to-credible-install Phase 6). VALUES ARE FROZEN FROM MEASURED ACCEPTANCE NUMBERS of Phases 0-3 (2026-07-27, packed tarball @ 9.8.0 tree, --omit=dev consumer install), never invented. The umbrella harness (src/scripts/evaluator_umbrella.sh) measures the packed artifact and check_evaluator_budgets.ts enforces: absolute budget AND >regression_pct growth vs last_measured fails even under budget. Owner + review date are lint-enforced (lint_budget_ownership). Timing metrics carry a per-entry regression_pct override (200) \u2014 wall-clock noise would flap a 10% creep rule; their absolute max is the binding gate. Sizes/counts keep the tight 10% creep.",
|
|
3
3
|
"schema_version": 1,
|
|
4
4
|
"owner": "maintainer",
|
|
5
5
|
"review_by": "2027-07-27",
|
|
@@ -11,23 +11,23 @@
|
|
|
11
11
|
"always_blocking": [
|
|
12
12
|
"a metric with no measurement supplied"
|
|
13
13
|
],
|
|
14
|
-
"rationale": "road-to-gates-that-can-fail Phase 5. A hard fail on main turns every legitimate command addition into a blocked merge, which is how budgets get quietly raised with a cushion instead of consciously
|
|
15
|
-
"delivery": "This posture IS the nightly-visibility route (council 2026-08-02, blocker nightly-visibility-owner), not a second mechanism beside it: the nightly publishes measurement_record below, a later run re-measures and compares, and the contradiction warns on main / fails on release. No notification channel, no auto-managed issue
|
|
14
|
+
"rationale": "road-to-gates-that-can-fail Phase 5. A hard fail on main turns every legitimate command addition into a blocked merge, which is how budgets get quietly raised with a cushion instead of consciously \u2014 so budget / regression / drift findings are ADVISORY on main, the nightly and ordinary PRs, and BLOCKING on a release ref. Not a weakening: before the Phase-4 path triggers, this gate ran on release PRs and the nightly only, so the surfaces that now warn never saw it at all. A LOCAL run (no CI env) is strict, because a maintainer running it by hand \u2014 including release.ts \u2014 wants the strict answer and blocks nobody. A metric with NO measurement is always blocking in either posture: that is a broken harness reporting green on nothing. Implemented in src/scripts/check_evaluator_budgets.ts::detectPosture; override with --posture warn|fail.",
|
|
15
|
+
"delivery": "This posture IS the nightly-visibility route (council 2026-08-02, blocker nightly-visibility-owner), not a second mechanism beside it: the nightly publishes measurement_record below, a later run re-measures and compares, and the contradiction warns on main / fails on release. No notification channel, no auto-managed issue \u2014 a one-maintainer channel producing routine noise gets muted, and a muted channel reproduces the original failure."
|
|
16
16
|
},
|
|
17
17
|
"measurement_record": {
|
|
18
18
|
"path": "agents/evidence/metrics/evaluator-measurements.json",
|
|
19
|
-
"written_by": "src/scripts/evaluator_umbrella.sh (UMBRELLA_RECORD=1
|
|
19
|
+
"written_by": "src/scripts/evaluator_umbrella.sh (UMBRELLA_RECORD=1 \u2014 the nightly sets it)",
|
|
20
20
|
"compared_by": "src/scripts/check_evaluator_budgets.ts --recorded",
|
|
21
21
|
"note": "Only entries WITHOUT `deterministic: false` participate in the drift comparison. The council's recorded objection was that a non-deterministic comparison produces noise and gets ignored; determinism is therefore a precondition, verified per metric, not an assumption."
|
|
22
22
|
},
|
|
23
23
|
"remeasurement_2026_08_02": {
|
|
24
24
|
"verified_against_a_fresh_run": {
|
|
25
|
-
"cli_help_command_count": "80
|
|
26
|
-
"mcp_public_tool_count": "19
|
|
25
|
+
"cli_help_command_count": "80 \u2014 three consecutive runs of the pinned method on an unchanged tree returned 80/80/80. Matches last_measured; deterministic confirmed.",
|
|
26
|
+
"mcp_public_tool_count": "19 \u2014 two consecutive tools/list runs on a freshly built dist/mcp/server.mjs returned 19/19. Matches last_measured; deterministic confirmed."
|
|
27
27
|
},
|
|
28
|
-
"not_re_measured": "unpacked_size_mb, node_modules_mb, runtime_dep_count, cli_version_cold_ms, mcp_boot_to_initialize_ms. All five require the packed-tarball harness (npm pack of a fully built tree, then a clean `npm install --omit=dev <tarball>` into a scratch project) that evaluator_umbrella.sh runs in CI. They were NOT re-measured in this pass and their values remain the 2026-07-27 acceptance numbers
|
|
28
|
+
"not_re_measured": "unpacked_size_mb, node_modules_mb, runtime_dep_count, cli_version_cold_ms, mcp_boot_to_initialize_ms. All five require the packed-tarball harness (npm pack of a fully built tree, then a clean `npm install --omit=dev <tarball>` into a scratch project) that evaluator_umbrella.sh runs in CI. They were NOT re-measured in this pass and their values remain the 2026-07-27 acceptance numbers \u2014 stated rather than invented. The next nightly writes the real numbers into measurement_record, and the drift check then reports any contradiction with last_measured on the PR that carries it."
|
|
29
29
|
},
|
|
30
|
-
"removed_2026_08_04": "unpacked_size_mb (max 28)
|
|
30
|
+
"removed_2026_08_04": "unpacked_size_mb (max 28) \u2014 removed by maintainer decision at the 9.17.0 release: the gate turned every legitimate payload addition into a blocked release (measured 28.22 vs max 28 with all functional gates green), and the maintainer judged tarball size not worth gating. evaluator_umbrella.sh still MEASURES and records unpacked_size_mb as evidence; only the budget enforcement is gone. ADR-204 review_trigger (a) fired and was resolved this way.",
|
|
31
31
|
"budgets": {
|
|
32
32
|
"node_modules_mb": {
|
|
33
33
|
"max": 140,
|
|
@@ -58,18 +58,18 @@
|
|
|
58
58
|
"deterministic": false
|
|
59
59
|
},
|
|
60
60
|
"cli_help_command_count": {
|
|
61
|
-
"max":
|
|
62
|
-
"last_measured":
|
|
63
|
-
"last_measured_at": "2026-08-
|
|
64
|
-
"method": "registry enumeration
|
|
65
|
-
"baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 → 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time — there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 → 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop — the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 → 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 — the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 — brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95. 95 → 96 on 2026-08-10: the `session:recycle` verb (road-to-token-economy-recycling Phase 2.2 — the deterministic producer of the main-session recycle envelope; the recycle advisory names this exact verb, so it must exist as a shell surface) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 96. 96 -> 97 on 2026-08-10: the `gates` verb registers in the same PR that adds the surface, per this record's own contract. It exists because the blocker fields the dashboard already parses (Owner, What to do, Resolved when — CI-enforced by lint_roadmap_blockers) had no owner-filtered reader: the dashboard counts the open blockers across a 600-line file and links each to a per-roadmap anchor, so \"which of these are mine\" was a manual read of every anchor. The same inference-from-a-filename shape as the council:status entry above, one layer up. This branch and the session:recycle branch each measured 96 independently and landed on the same number for different verbs; the merge makes it 97, re-measured twice via the pinned method on the merged tree: 97/97. 97 -> 98 on 2026-08-15: the `workspace:doctor` verb (road-to-inbox-harvest-2026-08-c-workspace-identity Phase 3 — the read-only report over the new `workspaceIdentity()` resolver) registers in the same PR that adds the surface, per this record's own contract. It exists for the same inference-from-a-filename shape as the council:status and gates entries above, one layer down: the tree answered \"where am I\" in eight ad-hoc places across six files, and the 12.0.0 span shipped the same worktree misclassification twice, so no verb could be asked which checkout is the main one. Read-only by construction — the roadmap's Non-goals put worktree disposal out of scope and its Risk 3 names \"the pressure read becomes a disposal path by accident\" as the failure to design against, so the command carries no --fix and no --prune. Re-measured twice via the pinned method on the unchanged tree: 98/98. 98 -> 99 on 2026-08-17: the `council:quota` verb (road-to-council-quota-accounting-truth Phase 2) registers in the same PR that adds the surface, per this record's own contract. Exactly the inference-from-a-filename shape as the council:status entry above, one layer down: `cmd_quota` had existed in council_cli.ts and been reachable only via `scripts-run`, so the documented recovery path for an exhausted shared counter -- read the usage, reset one provider -- did not resolve through `agent-config`, and an operator debugging a quota failure met `unknown command`. The verb is read-only apart from the pre-existing `--reset <provider>`, which already required `--confirm`. Re-measured twice via the pinned method on the unchanged tree: 99/99. 99 -> 100 on 2026-08-19: the `decision:memo` verb (road-to-long-horizon-execution Phase 2.2, sequencing UOTL Phase 4.3 -- the decision-memo channel) registers in the same PR that adds the surface, per this record's own contract. It exists because the question ladder gained a rung between \"halt and ask\" and \"decide silently\": a resolution the run makes without contacting the operator is only legitimate if it is reviewable afterwards, and there was no surface that wrote such a record with a fixed shape. Write-and-list only, local-only (agents/runtime/ is gitignored), and it gates nothing -- the locked decision classes are refused at the config schema, never in the ledger. 100 -> 101 in the same PR: `run:supervise` (Phase 3.1 -- the out-of-process watcher for runs whose session died with open steps left). It is the operator-facing half of session continuity: nothing anywhere had the job of noticing that a claimed run stopped moving, so a roadmap 40% done and a roadmap finished looked identical from outside the dead session. Report-only by default and it NEVER merges, pushes or closes -- the auto-merge the reference design carries is a named rejection in the roadmap's harvest section, not an unbuilt feature. Re-measured twice via the pinned method on the unchanged tree: 101/101. 101 → 102 on 2026-08-22: the `adr:effective` verb (road-to-evidence-based-adr-governance step 2.2 — the effective-state projection over one decision record) registers in the same PR that adds the surface, per this record's own contract. It exists because current truth about an ADR was only reconstructable from linear prose: an agent had to read the body, then every amendment, and decide for itself which clauses still stand. The verb reports status, the Decision verbatim, clauses the record's own amendments superseded, active amendments, the three descriptive axes and the review-trigger state. It AUTHORIZES NOTHING — Phase 2 of that roadmap is titled \"surfacing only; no authority\" and its AC-7 forbids any authority consequence, so the verb reports an absent axis as absent (`— (no provenance axis)`, `— (ungraded)`, `absent → evidence`) and an unresolvable trigger as `indeterminate` rather than inferring one. Re-measured twice via the pinned method on the unchanged tree: 102/102. 102 → 104 on 2026-08-22: the `council:grant-billing` + `council:revoke-billing` verbs (road-to-billing-cliff-gate Phase 2 — the run-scoped billing grant that lets `ai_council.fallback.api_on_quota: 'ask'` be answered once per run instead of once per seat) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: a grant that can be issued and not revoked would outlive its run, which is the failure the run-scoped TTL exists to prevent. Re-measured via the pinned method: 104."
|
|
61
|
+
"max": 107,
|
|
62
|
+
"last_measured": 107,
|
|
63
|
+
"last_measured_at": "2026-08-23",
|
|
64
|
+
"method": "registry enumeration \u2014 count of `{ name: '...', disposition` entries in src/cli/registry.ts (NOT --help prose parsing; methods historically disagreed 74 vs 76 vs 79)",
|
|
65
|
+
"baseline_note": "80 \u2192 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) \u2014 the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design \u2014 the next registry addition must move this number in its own PR. 81 \u2192 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 \u2192 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 \u2192 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 \u2014 the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 \u2192 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 \u2014 replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 \u2192 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination \u2014 the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 \u2192 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time \u2014 there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 \u2192 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop \u2014 the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 \u2192 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 \u2014 the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 \u2014 brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95. 95 \u2192 96 on 2026-08-10: the `session:recycle` verb (road-to-token-economy-recycling Phase 2.2 \u2014 the deterministic producer of the main-session recycle envelope; the recycle advisory names this exact verb, so it must exist as a shell surface) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 96. 96 -> 97 on 2026-08-10: the `gates` verb registers in the same PR that adds the surface, per this record's own contract. It exists because the blocker fields the dashboard already parses (Owner, What to do, Resolved when \u2014 CI-enforced by lint_roadmap_blockers) had no owner-filtered reader: the dashboard counts the open blockers across a 600-line file and links each to a per-roadmap anchor, so \"which of these are mine\" was a manual read of every anchor. The same inference-from-a-filename shape as the council:status entry above, one layer up. This branch and the session:recycle branch each measured 96 independently and landed on the same number for different verbs; the merge makes it 97, re-measured twice via the pinned method on the merged tree: 97/97. 97 -> 98 on 2026-08-15: the `workspace:doctor` verb (road-to-inbox-harvest-2026-08-c-workspace-identity Phase 3 \u2014 the read-only report over the new `workspaceIdentity()` resolver) registers in the same PR that adds the surface, per this record's own contract. It exists for the same inference-from-a-filename shape as the council:status and gates entries above, one layer down: the tree answered \"where am I\" in eight ad-hoc places across six files, and the 12.0.0 span shipped the same worktree misclassification twice, so no verb could be asked which checkout is the main one. Read-only by construction \u2014 the roadmap's Non-goals put worktree disposal out of scope and its Risk 3 names \"the pressure read becomes a disposal path by accident\" as the failure to design against, so the command carries no --fix and no --prune. Re-measured twice via the pinned method on the unchanged tree: 98/98. 98 -> 99 on 2026-08-17: the `council:quota` verb (road-to-council-quota-accounting-truth Phase 2) registers in the same PR that adds the surface, per this record's own contract. Exactly the inference-from-a-filename shape as the council:status entry above, one layer down: `cmd_quota` had existed in council_cli.ts and been reachable only via `scripts-run`, so the documented recovery path for an exhausted shared counter -- read the usage, reset one provider -- did not resolve through `agent-config`, and an operator debugging a quota failure met `unknown command`. The verb is read-only apart from the pre-existing `--reset <provider>`, which already required `--confirm`. Re-measured twice via the pinned method on the unchanged tree: 99/99. 99 -> 100 on 2026-08-19: the `decision:memo` verb (road-to-long-horizon-execution Phase 2.2, sequencing UOTL Phase 4.3 -- the decision-memo channel) registers in the same PR that adds the surface, per this record's own contract. It exists because the question ladder gained a rung between \"halt and ask\" and \"decide silently\": a resolution the run makes without contacting the operator is only legitimate if it is reviewable afterwards, and there was no surface that wrote such a record with a fixed shape. Write-and-list only, local-only (agents/runtime/ is gitignored), and it gates nothing -- the locked decision classes are refused at the config schema, never in the ledger. 100 -> 101 in the same PR: `run:supervise` (Phase 3.1 -- the out-of-process watcher for runs whose session died with open steps left). It is the operator-facing half of session continuity: nothing anywhere had the job of noticing that a claimed run stopped moving, so a roadmap 40% done and a roadmap finished looked identical from outside the dead session. Report-only by default and it NEVER merges, pushes or closes -- the auto-merge the reference design carries is a named rejection in the roadmap's harvest section, not an unbuilt feature. Re-measured twice via the pinned method on the unchanged tree: 101/101. 101 \u2192 102 on 2026-08-22: the `adr:effective` verb (road-to-evidence-based-adr-governance step 2.2 \u2014 the effective-state projection over one decision record) registers in the same PR that adds the surface, per this record's own contract. It exists because current truth about an ADR was only reconstructable from linear prose: an agent had to read the body, then every amendment, and decide for itself which clauses still stand. The verb reports status, the Decision verbatim, clauses the record's own amendments superseded, active amendments, the three descriptive axes and the review-trigger state. It AUTHORIZES NOTHING \u2014 Phase 2 of that roadmap is titled \"surfacing only; no authority\" and its AC-7 forbids any authority consequence, so the verb reports an absent axis as absent (`\u2014 (no provenance axis)`, `\u2014 (ungraded)`, `absent \u2192 evidence`) and an unresolvable trigger as `indeterminate` rather than inferring one. Re-measured twice via the pinned method on the unchanged tree: 102/102. 102 \u2192 104 on 2026-08-22: the `council:grant-billing` + `council:revoke-billing` verbs (road-to-billing-cliff-gate Phase 2 \u2014 the run-scoped billing grant that lets `ai_council.fallback.api_on_quota: 'ask'` be answered once per run instead of once per seat) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: a grant that can be issued and not revoked would outlive its run, which is the failure the run-scoped TTL exists to prevent. Re-measured via the pinned method: 104. 104 -> 106 on 2026-08-23: the `ui:audit` + `ui:render` verbs (road-to-frontend-power E2.1 and E3.1 -- the two Class-A commands that give the frontend obligations an artefact a gate can read and a render a verdict can cite) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: `ui-audit-gate`'s enforced_by moved from `none` to a carrier in the same change, and that carrier reports `verification: degraded` whenever the render artefact is absent -- so an audit verb without a render verb would ship a gate that can never reach `verified`. Both are Class A under ADR-124: they terminate, their whole state is a rebuildable directory under agents/runtime/state/, and ui:render closes chromium in a `finally` on every path with no --serve, watch or cache for a resident browser to hide in. Re-measured via the pinned method on the unchanged tree: 106. 106 \u2192 107 on 2026-08-23: the `roadmap:context` verb (road-to-roadmap-situational-awareness \u2014 the single live probe that answers what else is in flight before a roadmap is picked) registers in the same PR that adds the surface, per this record's own contract. Its branch measured 105 against a base of 104 and this branch measured 106 against the same base for `ui:audit` + `ui:render`; the merge makes it 107, re-measured on the merged tree via the pinned method (registry enumeration): 107."
|
|
66
66
|
},
|
|
67
67
|
"mcp_public_tool_count": {
|
|
68
68
|
"max": 20,
|
|
69
69
|
"last_measured": 20,
|
|
70
70
|
"last_measured_at": "2026-08-17",
|
|
71
71
|
"method": "tools/list length on the stdio server (post-ADR-132: implemented tools only)",
|
|
72
|
-
"baseline_note": "19
|
|
72
|
+
"baseline_note": "19 \u2192 20 on 2026-08-17 (release 13.0.0 gate). The +1 is 866bd9861 (feat(mcp): recover what the host dropped \u2014 real ranker tool + a route to it, road-to-inbox-harvest-2026-08-d-runtime-skill-routing Phase 4): `suggest_skill_for_task` was promoted from a discovery STUB to a real ALLOWLIST entry and removed from STUB_TOOLS. Worth stating precisely, because the consumer-visible NAME did not grow \u2014 the stub already published that name and its `task` + `limit` input schema, which the promotion carried over verbatim. What grew is the count of tools tools/list actually returns, which is exactly what this metric measures post-ADR-132: implemented tools only. Same shape as the cli_help_command_count history above \u2014 this RECORDS growth that already shipped through its own reviewed PR (866bd9861 is on main), it does not authorize new surface. The registering PR did not move this budget, so the gate did its job: the breach warned on main and blocked on the release ref, which is the conscious-decision point rather than a silently raised cap. Re-measured twice via the pinned method on a freshly built dist/mcp/server.mjs: 20/20. Headroom stays zero by design \u2014 the next tool that leaves STUB_TOOLS must move this number in its own PR."
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
}
|
|
@@ -40,15 +40,108 @@
|
|
|
40
40
|
# visible, or it repeats the sin it exists to catch.
|
|
41
41
|
# canary optional mutation recipe (Phase 7) — see CANARY below
|
|
42
42
|
#
|
|
43
|
-
# COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-08-
|
|
43
|
+
# COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-08-25)
|
|
44
44
|
# ----------------------------------------------------------
|
|
45
|
-
#
|
|
45
|
+
# 291 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
|
|
46
46
|
# (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`,
|
|
47
|
-
# re-run
|
|
48
|
-
#
|
|
49
|
-
#
|
|
47
|
+
# re-run on the tree carrying these rows, with `check_skill_admissions`,
|
|
48
|
+
# `check_command_examples`, `check_routing_coverage`, `description_route_check`
|
|
49
|
+
# and `lint_skill_trigger_corpus` counted).
|
|
50
|
+
# **63 of them emit the machine-readable `scanned: <N>` line under their
|
|
51
|
+
# CI-identical argv, and 60 of those 63 are listed below.** The manifest is
|
|
50
52
|
# therefore complete with respect to its own contract for every gate that can
|
|
51
|
-
# carry a floor, and covers ~
|
|
53
|
+
# carry a floor, and covers ~21 % of the population.
|
|
54
|
+
#
|
|
55
|
+
# `description_route_check` is counted in the POPULATION and deliberately NOT
|
|
56
|
+
# listed: it is diff-scoped, so its natural reading on most trees is zero cases,
|
|
57
|
+
# and a `min_scanned` floor over a corpus that is legitimately empty would be a
|
|
58
|
+
# floor on the diff rather than on the gate.
|
|
59
|
+
#
|
|
60
|
+
# RECOUNTED on 2026-08-25 while adding `check_routing_coverage`, and this time
|
|
61
|
+
# the prose was NOT stale — 289 was correct for the tree before the row landed,
|
|
62
|
+
# which is the first recount in eight to find that. Derivation, unchanged and
|
|
63
|
+
# still the point: `grep -c '^ - id:' src/config/gate-coverage.yml` returns 59;
|
|
64
|
+
# every listed row is an emitter, because a row that did not emit could carry no
|
|
65
|
+
# floor; the same THREE emitters remain deliberately unlisted
|
|
66
|
+
# (`lint_evidence_artifacts`, `adr_cite_check`, `check_new_adr_evidence`);
|
|
67
|
+
# 59 + 3 = 62. The percentage moved DOWN while a gate was added, which is
|
|
68
|
+
# arithmetic rather than regression: the denominator grew by one too.
|
|
69
|
+
#
|
|
70
|
+
# RECOUNTED ON THE MERGE, 2026-08-24, and the merge is exactly the case the two
|
|
71
|
+
# paragraphs below were each written for and neither could cover. Both branches
|
|
72
|
+
# added a gate row and both recounted correctly for their own tree; after the
|
|
73
|
+
# merge BOTH gates exist, so either side's figure describes a tree that no longer
|
|
74
|
+
# does. Picking one would have been wrong by one on three axes at once — which is
|
|
75
|
+
# the arithmetic-on-prose this section forbids, arriving through a merge rather
|
|
76
|
+
# than through an edit. Recomputed here, not adjusted:
|
|
77
|
+
#
|
|
78
|
+
# ./scripts-run npx tsx -e "import {count_gate_scripts} from './src/scripts/check_gate_coverage.ts'; console.log(count_gate_scripts())"
|
|
79
|
+
# grep -c '^ - id:' src/config/gate-coverage.yml
|
|
80
|
+
#
|
|
81
|
+
# Both paragraphs are kept below rather than collapsed, because each records a
|
|
82
|
+
# real recount of a real tree and the pair is the evidence for this one.
|
|
83
|
+
#
|
|
84
|
+
# RECOUNTED on 2026-08-24 while adding `check_skill_admissions`, and the prose was
|
|
85
|
+
# stale by FOUR on the population axis before the row landed — it said 283 while
|
|
86
|
+
# the function already returned 288 with the new script counted, so three scripts
|
|
87
|
+
# had arrived since the previous recount without touching this text. Seventh
|
|
88
|
+
# consecutive recount to find the figures already wrong, which is the argument for
|
|
89
|
+
# computing them rather than incrementing: 283 + 1 would have written 284 and been
|
|
90
|
+
# wrong by four. Derivation, so the next reader checks rather than trusts:
|
|
91
|
+
# `grep -c '^ - id:' src/config/gate-coverage.yml` returns 57; every listed row is
|
|
92
|
+
# an emitter, because a row that did not emit could carry no floor; the same THREE
|
|
93
|
+
# emitters remain deliberately unlisted (`lint_evidence_artifacts`,
|
|
94
|
+
# `adr_cite_check`, `check_new_adr_evidence`); 57 + 3 = 60.
|
|
95
|
+
# RECOUNTED on 2026-08-24 while adding `check_command_examples`, and the prose
|
|
96
|
+
# was stale by FIVE on the population axis before the row landed — it said 283
|
|
97
|
+
# while the function already returned 288 including the new script, so four
|
|
98
|
+
# scripts had arrived since the previous recount without touching this text.
|
|
99
|
+
# That is the seventh consecutive recount to find the figures already wrong,
|
|
100
|
+
# which is the argument for the derivation below rather than for arithmetic:
|
|
101
|
+
# incrementing 283 by one would have written 284 and been wrong by four.
|
|
102
|
+
# Derivation, so the next reader checks rather than trusts:
|
|
103
|
+
# `grep -c '^ - id:' src/config/gate-coverage.yml` returns 57; every listed row
|
|
104
|
+
# is an emitter, because a row that did not emit could carry no floor; the same
|
|
105
|
+
# THREE emitters remain deliberately unlisted (`lint_evidence_artifacts`,
|
|
106
|
+
# `adr_cite_check`, `check_new_adr_evidence`, each with its reason at the place
|
|
107
|
+
# its row would have sat); 57 + 3 = 60. The population comes from the function.
|
|
108
|
+
#
|
|
109
|
+
# RECOUNTED on 2026-08-23 while adding `lint_deterministic_time` and
|
|
110
|
+
# `check_enforcement_denominator` (two rows, and the figures above are the
|
|
111
|
+
# function's answer AFTER both — not the previous reading plus two), and — the sixth
|
|
112
|
+
# time in a row, which is the whole point of this section — the prose was already
|
|
113
|
+
# stale before the row landed. It said 279 / 56 / 53 while `count_gate_scripts()`
|
|
114
|
+
# already returned **281**, so two scripts had arrived since the previous
|
|
115
|
+
# recount without touching this text. Incrementing 279 by one would have written
|
|
116
|
+
# 280 and been wrong by two; the figures above are the function's answer and a
|
|
117
|
+
# fresh `grep`, not arithmetic on the previous sentence. Derivation, so the next
|
|
118
|
+
# reader checks rather than trusts: `grep -c '^ - id:' src/config/gate-coverage.yml`
|
|
119
|
+
# returns 55; every listed row is an emitter, because a row that did not emit
|
|
120
|
+
# could carry no floor; the same THREE emitters remain deliberately unlisted
|
|
121
|
+
# (`lint_evidence_artifacts`, `adr_cite_check`, `check_new_adr_evidence`, each
|
|
122
|
+
# with its reason at the place its row would have sat); 55 + 3 = 58.
|
|
123
|
+
#
|
|
124
|
+
# RECOUNTED on 2026-08-23 while adding `check_no_automerge_key`, and BOTH numbers
|
|
125
|
+
# were stale before the recount by more than the one row this change adds — which
|
|
126
|
+
# is the fifth time, and the reason this paragraph keeps asking to be computed
|
|
127
|
+
# rather than adjusted. The previous prose said 272 / 47 / 44 while the file
|
|
128
|
+
# already carried 51 rows and the population function already returned 277: six
|
|
129
|
+
# scripts and seven rows had landed since 2026-08-22 without touching this text.
|
|
130
|
+
# Derivation, so the next reader checks rather than trusts:
|
|
131
|
+
# `grep -c '^ - id:' src/config/gate-coverage.yml` returns 53; every listed row
|
|
132
|
+
# is an emitter, because a row that did not emit could carry no floor; the same
|
|
133
|
+
# THREE emitters remain deliberately unlisted (`lint_evidence_artifacts`,
|
|
134
|
+
# `adr_cite_check`, `check_new_adr_evidence`, each with its reason at the place
|
|
135
|
+
# its row would have sat); 53 + 3 = 56. The population comes from the function.
|
|
136
|
+
#
|
|
137
|
+
# RE-RECOUNTED on the same day, after a rebase, and the re-count is the point:
|
|
138
|
+
# `check_no_automerge_key` and `check_pack_conformance_fixture` landed in two
|
|
139
|
+
# separate changes hours apart, and the first change's prose (52 / 55 / 278) was
|
|
140
|
+
# CORRECT when written and stale by one on each axis the moment the second
|
|
141
|
+
# rebased onto it. Adding one to each figure would have been right here by
|
|
142
|
+
# accident; it was recomputed anyway, because "right by accident" is
|
|
143
|
+
# indistinguishable in a diff from the arithmetic-on-prose this paragraph
|
|
144
|
+
# forbids.
|
|
52
145
|
#
|
|
53
146
|
# RECOUNTED on 2026-08-22, and it was wrong on every figure before the recount —
|
|
54
147
|
# which is the fourth time, and the reason this paragraph keeps asking to be
|
|
@@ -217,6 +310,79 @@
|
|
|
217
310
|
# contract is `dist == rewrite(src)`; `check_ci_local_parity`, whose corpus is
|
|
218
311
|
# workflow files) carries no recipe and is reported UNPROVEN, never green.
|
|
219
312
|
gates:
|
|
313
|
+
- id: lint_skill_trigger_corpus
|
|
314
|
+
argv: []
|
|
315
|
+
min_scanned: 70
|
|
316
|
+
corpus: "every src/skills/*/evals/triggers.json. The floor sits at 70 because 90 exist in the shipped tree and the count only grows — a reading below it means the scan root moved, not that corpora were deleted, which has its own gate. Two units (brand-asset-generation, estimate-ticket) are grandfathered BY NAME rather than by a numeric baseline, so a third failure cannot hide inside a count."
|
|
317
|
+
status: enforced
|
|
318
|
+
canary:
|
|
319
|
+
class: contract-violation
|
|
320
|
+
path: src/skills/zz-canary-trigger-corpus/evals/triggers.json
|
|
321
|
+
content: |
|
|
322
|
+
{
|
|
323
|
+
"skill": "zz-canary-trigger-corpus",
|
|
324
|
+
"last_eval": "2026-08-25",
|
|
325
|
+
"description": "Canary planted by check_gate_coverage --canary; never ships. One positive and no near-miss, which is the discipline violation this gate must reject.",
|
|
326
|
+
"queries": [
|
|
327
|
+
{ "q": "only one positive", "trigger": true }
|
|
328
|
+
]
|
|
329
|
+
}
|
|
330
|
+
- id: check_routing_coverage
|
|
331
|
+
argv: []
|
|
332
|
+
min_scanned: 300
|
|
333
|
+
corpus: "every routed unit on both surfaces — the tier-1 + tier-2 ids in dist/router.json, plus every src/skills/*/SKILL.md. `scanned` is the sum of the two DENOMINATORS, deliberately, not the covered count: a corpus case going missing must not shrink the scanned figure, or the ratchet's own dead-scope floor would move with the thing it measures. The floor sits at 300 because the skills denominator alone is 299 and cannot fall below the shipped estate without a skill deletion, which has its own gate."
|
|
334
|
+
status: enforced
|
|
335
|
+
canary:
|
|
336
|
+
class: contract-violation
|
|
337
|
+
path: src/skills/zz-canary-routing-coverage/SKILL.md
|
|
338
|
+
content: |
|
|
339
|
+
---
|
|
340
|
+
name: zz-canary-routing-coverage
|
|
341
|
+
description: Canary skill planted by check_gate_coverage --canary; never ships.
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
# zz-canary-routing-coverage
|
|
345
|
+
|
|
346
|
+
A routed unit with no evals/triggers.json. It raises the skills
|
|
347
|
+
denominator by one while the numerator stands still, so the ratio falls
|
|
348
|
+
below seed and the ratchet must red. A gate that stayed green here would
|
|
349
|
+
be a count ratchet wearing a ratio's name.
|
|
350
|
+
- id: check_skill_admissions
|
|
351
|
+
argv: []
|
|
352
|
+
min_scanned: 0
|
|
353
|
+
corpus: "the admission/refusal rows in agents/decisions/skill-admissions.jsonl, plus the skills added since the base ref (a `git diff --diff-filter=A` over src/skills). `min_scanned: 0` with a declared allowEmpty: 0 rows is the SHIPPED state, because the gate is forward-only and the 299 pre-existing skills are grandfathered by the diff scope rather than by rows. The dead-scope risk is covered one layer up instead — readLedger() throws a DeadScopeError when the file is missing or malformed, so `moved` and `empty` are different verdicts."
|
|
354
|
+
status: enforced
|
|
355
|
+
canary:
|
|
356
|
+
class: contract-violation
|
|
357
|
+
path: src/skills/zz-canary-skill-admissions/SKILL.md
|
|
358
|
+
content: |
|
|
359
|
+
---
|
|
360
|
+
name: zz-canary-skill-admissions
|
|
361
|
+
description: Canary skill planted by check_gate_coverage --canary; never ships.
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
# zz-canary-skill-admissions
|
|
365
|
+
|
|
366
|
+
An added skill with no row in the admission ledger — the gate must red.
|
|
367
|
+
- id: check_command_examples
|
|
368
|
+
argv: []
|
|
369
|
+
min_scanned: 18
|
|
370
|
+
corpus: "every `src/domains/**/command.md` whose `visibility` is `visible` or `advanced` — 23 on 2026-08-24 (5 visible + 18 advanced). The floor sits at 18 because a pack going uninstalled cannot shrink this corpus (the walk reads the source tree, not an install), so the only legitimate drop is a demotion to `internal`; a fall to 18 or below means a whole pack's commands stopped being read."
|
|
371
|
+
status: enforced
|
|
372
|
+
canary:
|
|
373
|
+
class: undetected-antipattern
|
|
374
|
+
path: src/domains/meta/zz-canary-command-examples/command.md
|
|
375
|
+
content: |
|
|
376
|
+
---
|
|
377
|
+
name: zz-canary-command-examples
|
|
378
|
+
description: Canary command planted by check_gate_coverage --canary; never ships.
|
|
379
|
+
disable-model-invocation: true
|
|
380
|
+
visibility: visible
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
# zz-canary-command-examples
|
|
384
|
+
|
|
385
|
+
A user-facing command with no `## Examples` section — sub-check (a) must red.
|
|
220
386
|
- id: check_pack_size
|
|
221
387
|
argv: []
|
|
222
388
|
min_scanned: 2000
|
|
@@ -491,8 +657,8 @@ gates:
|
|
|
491
657
|
|
|
492
658
|
- id: check_requirements_trace
|
|
493
659
|
argv: []
|
|
494
|
-
min_scanned:
|
|
495
|
-
corpus: "roadmap files at the top level of agents/roadmaps/ (25 at registration, 2026-08-22)"
|
|
660
|
+
min_scanned: 2
|
|
661
|
+
corpus: "roadmap files at the top level of agents/roadmaps/ (25 at registration, 2026-08-22; 9 live on 2026-08-23, mid-drain). The floor tracks a corpus that shrinks by design, so completing and archiving a roadmap lowers it — it is never satisfied by un-archiving finished work. LOWERED 10 -> 2 on 2026-08-23. The 15 -> 10 move earlier the same day already recorded this shape and under-shot it: eight further PRs were open at that moment, each one titled `roadmap: complete <slug>` and each archiving exactly one top-level file, so the estate this floor tracks was already committed to landing at one or two. A floor of 10 against a corpus heading for 2 does not detect anything — it reds on every remaining merge in the drain, which is the gate firing on the drain WORKING, and the note directly above says so in its own words. 2 is chosen as one above the only reading this floor exists to catch: a scan whose root moved reports 0, never 2, so the collapse signal survives the move intact. What is given up is the middle band, and it was never load-bearing here — this gate is a LISTING (see no_canary_reason: `main()` returns 0 on every path), so the floor is its only failure mode and a partial-corpus read is not something it could act on anyway. Revisit-if: the drain ends and the estate stabilises above 2 — re-derive the floor from what the estate is then expected to hold, and never from the live count, which reds on the next archive by construction."
|
|
496
662
|
status: enforced
|
|
497
663
|
no_canary_reason: >-
|
|
498
664
|
this gate is a LISTING, not an enforcement: `main()` returns 0 on every
|
|
@@ -511,6 +677,30 @@ gates:
|
|
|
511
677
|
registration: the active estate is being drained deliberately and is
|
|
512
678
|
expected to shrink, so a tight floor would red on the drain working.
|
|
513
679
|
|
|
680
|
+
LOWERED 15 -> 10 on 2026-08-23, and the reason is the sentence directly
|
|
681
|
+
above coming true. Archiving `road-to-role-scoped-spawn-profiles` took the
|
|
682
|
+
live top-level count from 15 to 14, so the floor red on the drain working
|
|
683
|
+
— exactly the failure mode the registration note predicted, one drain
|
|
684
|
+
after it was written. Measured at this commit: `find agents/roadmaps
|
|
685
|
+
-maxdepth 1 -name '*.md' -type f | wc -l` = 14, and the gate's own
|
|
686
|
+
`scanned:` line agrees at 14.
|
|
687
|
+
|
|
688
|
+
Why 10 and not 14. A floor set at the live count reds again on the very
|
|
689
|
+
next archive, which turns a collapse detector into per-drain friction with
|
|
690
|
+
no safety gain. The floor's only job is stated in its own note above: catch
|
|
691
|
+
a scan that stopped seeing `agents/roadmaps/` at all, and such a scan
|
|
692
|
+
reports **0**. 10 leaves four further drains of headroom while still
|
|
693
|
+
sitting an order of magnitude above the collapse signal it exists to
|
|
694
|
+
distinguish.
|
|
695
|
+
|
|
696
|
+
What did NOT move, checked rather than assumed: all four
|
|
697
|
+
`requirements-trace-budget.json` counters (`unlinked`, `unresolved`,
|
|
698
|
+
`dangling_ac`, `malformed`) remain at their registered baseline of 0. The
|
|
699
|
+
`0 declaring` reading is likewise NOT from this change — no top-level
|
|
700
|
+
roadmap at `origin/main` (2a7a8e221) declares `requirement_id` either, and
|
|
701
|
+
the archived roadmap never carried the trace fields. Only the scan count
|
|
702
|
+
moved.
|
|
703
|
+
|
|
514
704
|
- id: check_council_pin_staleness
|
|
515
705
|
argv: []
|
|
516
706
|
min_scanned: 3
|
|
@@ -1421,3 +1611,197 @@ gates:
|
|
|
1421
1611
|
# so a future change that silently narrowed its corpus to zero would pass. The
|
|
1422
1612
|
# honest close is the rename, in its own change, where 26 files of churn are
|
|
1423
1613
|
# the subject rather than a side effect.
|
|
1614
|
+
|
|
1615
|
+
- id: check_no_automerge_key
|
|
1616
|
+
argv: ["--quiet"]
|
|
1617
|
+
min_scanned: 200
|
|
1618
|
+
corpus: "every declared key in the two settings files — `src/config/agent-settings.template.yml` plus `src/scripts/schemas/agent-settings.schema.json` (304 on 2026-08-23, so the floor sits well below the live count and far above a collapse)"
|
|
1619
|
+
status: enforced
|
|
1620
|
+
no_canary_reason: >-
|
|
1621
|
+
Create-only canary cannot reach this corpus: both settings files are
|
|
1622
|
+
tracked and always exist, so a planted file lands outside the corpus and
|
|
1623
|
+
the gate correctly stays green. Measured on a previous attempt, where the
|
|
1624
|
+
gate was then mis-reported as dead. Same class as `check_condensation` and
|
|
1625
|
+
`check_ci_local_parity` — the only possible violation is a modification of
|
|
1626
|
+
an existing tracked artefact. The red is proven instead by the committed
|
|
1627
|
+
violating fixture `tests/fixtures/automerge-key/` plus two recorded
|
|
1628
|
+
sabotage probes in `tests/scripts/check_no_automerge_key.test.ts`.
|
|
1629
|
+
note: >
|
|
1630
|
+
The no-canary reason above is the create-only contract rather than an
|
|
1631
|
+
omission. Both corpus files are tracked and always exist, so a planted file
|
|
1632
|
+
lands OUTSIDE the corpus and the gate correctly stays green — measured on a
|
|
1633
|
+
previous attempt at this gate, where it was then mis-reported as dead. The
|
|
1634
|
+
only violation this gate can have is a modification of an existing tracked
|
|
1635
|
+
artefact, which is the same class as `check_condensation` and
|
|
1636
|
+
`check_ci_local_parity`, and the CANARY section above already states that
|
|
1637
|
+
such a gate carries no recipe and is reported UNPROVEN rather than green.
|
|
1638
|
+
|
|
1639
|
+
The red is proven elsewhere instead, deliberately and committed:
|
|
1640
|
+
`tests/fixtures/automerge-key/` is a violating settings pair the gate must
|
|
1641
|
+
refuse, and `tests/scripts/check_no_automerge_key.test.ts` asserts exit 1
|
|
1642
|
+
against it, exit 2 on a missing corpus, and records the two sabotage probes
|
|
1643
|
+
(emptying the forbidden set → 4 of 9 red; widening the matcher from a key
|
|
1644
|
+
to a bare word → 6 of 9 red).
|
|
1645
|
+
|
|
1646
|
+
The floor is a KEY count, not a file count. Two files is a constant, and a
|
|
1647
|
+
floor under a constant can never trip — the false-count shape this manifest
|
|
1648
|
+
rejects. 304 keys collapses to 0 if either root moves, which is what the
|
|
1649
|
+
floor is for.
|
|
1650
|
+
- id: check_pack_conformance_fixture
|
|
1651
|
+
argv: ["--quiet"]
|
|
1652
|
+
min_scanned: 12
|
|
1653
|
+
corpus: "(fixture, gate) assertions over `tests/fixtures/pack-conformance/` — 3 fixture-provable gates × (1 conformant fixture + 3 seeded twins) = 12 on 2026-08-23"
|
|
1654
|
+
status: enforced
|
|
1655
|
+
no_canary_reason: >-
|
|
1656
|
+
The corpus is a committed fixture and every violation this gate can have IS
|
|
1657
|
+
a seeded violation — the three twins under
|
|
1658
|
+
`tests/fixtures/pack-conformance/twins/` are the negative control, already
|
|
1659
|
+
committed and already asserted. A create-only plant would have to add a
|
|
1660
|
+
FOURTH twin, which the harness would not know about and would therefore
|
|
1661
|
+
ignore. Discrimination is proven instead by the gate's own `--self-test`
|
|
1662
|
+
(5 cases, 2 rejecting, including a missing-fixture probe that must exit 2)
|
|
1663
|
+
and by three recorded sabotage probes in
|
|
1664
|
+
`tests/scripts/check_pack_conformance_fixture.test.ts` — a conformant-fixture
|
|
1665
|
+
break, an orthogonality break (a twin reddening two gates), and a neutered
|
|
1666
|
+
twin that reds none. Real exit codes captured directly, never through a
|
|
1667
|
+
pipe.
|
|
1668
|
+
note: >
|
|
1669
|
+
The floor is an ASSERTION count, not a file count. It is exactly
|
|
1670
|
+
`provable_gates × (1 + twins)`, so adding a twin without wiring it — or
|
|
1671
|
+
losing one of the three injection seams — moves the number and the floor
|
|
1672
|
+
catches it. A file count would not: the fixture directory can grow while
|
|
1673
|
+
the harness quietly stops driving a gate.
|
|
1674
|
+
|
|
1675
|
+
This gate is deliberately PARTIAL and says so in its own success line
|
|
1676
|
+
("PARTIAL as designed: 3 of 6"). Three of the six pack-fitness gates cannot
|
|
1677
|
+
be driven from a fixture — `lint_pack_first_win` pins argv-ignoring as an
|
|
1678
|
+
ADR-200 port-fidelity guarantee, `lint_pack_dependencies` derives its pack
|
|
1679
|
+
home from `import.meta.url`, and `prove_pack_extractable` resolves a pack
|
|
1680
|
+
by name under the real `src/packs/`. Raising this gate's coverage by
|
|
1681
|
+
pretending otherwise is the manufactured green this file exists to prevent.
|
|
1682
|
+
|
|
1683
|
+
- id: lint_deterministic_time
|
|
1684
|
+
argv: ["--quiet"]
|
|
1685
|
+
min_scanned: 200
|
|
1686
|
+
corpus: "gate scripts under `src/scripts/` carrying a `check_` or `lint_` prefix, excluding `*.test.ts` (261 at baseline)"
|
|
1687
|
+
status: enforced
|
|
1688
|
+
canary:
|
|
1689
|
+
class: contract-violation
|
|
1690
|
+
path: src/scripts/check_zz_canary_wall_clock.ts
|
|
1691
|
+
content: |
|
|
1692
|
+
// zz canary probe: a gate script reading the wall clock inline, which is
|
|
1693
|
+
// exactly the construct `lint_deterministic_time` refuses. The plant is
|
|
1694
|
+
// create-only and therefore expressible as a canary, unlike the
|
|
1695
|
+
// MODIFICATION shape most ratchets in this file detect.
|
|
1696
|
+
const planted = Date.now();
|
|
1697
|
+
export { planted };
|
|
1698
|
+
note: >
|
|
1699
|
+
The floor is 200 against a live corpus of 261, which is the usual
|
|
1700
|
+
"comfortably below, far above a collapse" shape — a prefix regex that
|
|
1701
|
+
stopped matching, or the flat-`src/` scan root moving again, collapses this
|
|
1702
|
+
to single digits long before it reaches 200.
|
|
1703
|
+
|
|
1704
|
+
`argv` carries `--quiet` because that is what the preflight task and the
|
|
1705
|
+
workflow step both pass. `reportScanned` is not quiet-gated, so the count
|
|
1706
|
+
is published either way; the flag is registered anyway because rule 2 of
|
|
1707
|
+
this manifest is argv PARITY, not "an argv that happens to work".
|
|
1708
|
+
|
|
1709
|
+
The canary is a genuine create-only plant rather than a
|
|
1710
|
+
`no_canary_reason`, and that is unusual enough here to be worth stating:
|
|
1711
|
+
this gate's violation shape is a NEW file carrying the construct, so a
|
|
1712
|
+
single planted script expresses it completely. Discrimination is
|
|
1713
|
+
additionally proven by the gate's own `--self-test` (7 cases, 4 rejecting)
|
|
1714
|
+
— including the two cases the canary cannot express: a mention inside a
|
|
1715
|
+
comment or a string literal that must NOT be a finding (the gate's own
|
|
1716
|
+
docstring names the construct it bans, so a raw-text matcher would refuse
|
|
1717
|
+
itself), and a dead scan root that must exit 2 rather than green.
|
|
1718
|
+
|
|
1719
|
+
- id: check_enforcement_denominator
|
|
1720
|
+
argv: ["--quiet"]
|
|
1721
|
+
min_scanned: 350
|
|
1722
|
+
corpus: "published markdown under `docs/` plus `README.md`, excluding `docs/decisions/` and `docs/archive/` (464 at baseline)"
|
|
1723
|
+
status: enforced
|
|
1724
|
+
canary:
|
|
1725
|
+
class: contract-violation
|
|
1726
|
+
path: docs/zz-canary-enforcement-count.md
|
|
1727
|
+
content: |
|
|
1728
|
+
# ZZ canary probe
|
|
1729
|
+
|
|
1730
|
+
15 of 120 governed rules carry a backstop that fails a CI build.
|
|
1731
|
+
|
|
1732
|
+
A hand-written enforcement denominator in a published doc, which is the
|
|
1733
|
+
sixth-number defect this gate exists to prevent. Create-only, so it is
|
|
1734
|
+
expressible as a canary.
|
|
1735
|
+
note: >
|
|
1736
|
+
The floor is 350 against a live corpus of 464. The collapse case is real
|
|
1737
|
+
rather than theoretical here: `docs/` was flattened once already
|
|
1738
|
+
(ADR-051), and a walk rooted at a moved directory reads zero files and
|
|
1739
|
+
prints "no published doc restates it" — a green over nothing.
|
|
1740
|
+
|
|
1741
|
+
The gate deliberately does NOT compare values against the resolver. A
|
|
1742
|
+
hand-written figure that happens to be right today is precisely how the
|
|
1743
|
+
plurality returned each of the previous times, so the finding is the
|
|
1744
|
+
restatement, not the disagreement. That is why the canary body carries a
|
|
1745
|
+
CORRECT figure: a value-comparing gate would pass this plant.
|
|
1746
|
+
|
|
1747
|
+
Discrimination is additionally proven by the gate's own `--self-test`
|
|
1748
|
+
(9 cases, 5 rejecting) — including the three cases the canary cannot
|
|
1749
|
+
express: the generated projection which must stay green, a `docs/decisions/`
|
|
1750
|
+
ADR whose dated record must not be rewritten, and a bare rule count with no
|
|
1751
|
+
enforcement sense ("2 rules" in a concepts page) which must not be a finding.
|
|
1752
|
+
|
|
1753
|
+
- id: check_score_contract
|
|
1754
|
+
argv: ["--quiet"]
|
|
1755
|
+
min_scanned: 20
|
|
1756
|
+
corpus: "rows in `agents/evidence/ac-capability-scorecard.yaml` — one per rubric category recoverable from the tracked tree (23 at baseline, 2026-08-24)"
|
|
1757
|
+
status: enforced
|
|
1758
|
+
canary:
|
|
1759
|
+
class: contract-violation
|
|
1760
|
+
path: agents/evidence/ac-capability-scorecard-zz-canary.yaml
|
|
1761
|
+
content: |
|
|
1762
|
+
# zz canary probe: a scorecard awarding `ten` with an empty required
|
|
1763
|
+
# evidence class, which is the one thing this gate exists to refuse.
|
|
1764
|
+
# Create-only, so it is expressible as a canary — unlike the MODIFICATION
|
|
1765
|
+
# shapes (a redeclared `state: complete`, a count edited to match an
|
|
1766
|
+
# added row) that most of this file's ratchets detect.
|
|
1767
|
+
schema_version: 1
|
|
1768
|
+
rubric:
|
|
1769
|
+
state: incomplete
|
|
1770
|
+
authority: unavailable-external-review
|
|
1771
|
+
reported_category_count: 32
|
|
1772
|
+
recovered_category_count: 1
|
|
1773
|
+
missing_category_count: 31
|
|
1774
|
+
manifest_version: baseline_v1
|
|
1775
|
+
recovery_source: agents/roadmaps/road-to-ten-across-the-board.md
|
|
1776
|
+
excluded_from_manifest: []
|
|
1777
|
+
categories:
|
|
1778
|
+
- category: release-integrity
|
|
1779
|
+
baseline: 9.2
|
|
1780
|
+
claim: "canary"
|
|
1781
|
+
closing_path: "canary"
|
|
1782
|
+
mechanism_evidence: ["src/scripts/check_score_contract.ts"]
|
|
1783
|
+
adoption_evidence: ["src/scripts/check_score_contract.ts"]
|
|
1784
|
+
negative_control_evidence: []
|
|
1785
|
+
production_window: src/scripts/check_score_contract.ts
|
|
1786
|
+
outcome_evidence: ["src/scripts/check_score_contract.ts"]
|
|
1787
|
+
non_regression_evidence: ["src/scripts/check_score_contract.ts"]
|
|
1788
|
+
status: ten
|
|
1789
|
+
note: >
|
|
1790
|
+
The floor is 20 against a live corpus of 23, and the gap is deliberately
|
|
1791
|
+
narrow because this corpus does not grow by ordinary work: a row is added
|
|
1792
|
+
only when a rubric category is recovered, and `check_score_contract` itself
|
|
1793
|
+
refuses a row count that disagrees with the declared
|
|
1794
|
+
`recovered_category_count`. So the failure this floor guards is not
|
|
1795
|
+
"someone deleted a few rows" but the migration shape — the scorecard moving
|
|
1796
|
+
and the gate reading an absent file, which `countRows` reports as 0.
|
|
1797
|
+
|
|
1798
|
+
`argv` carries `--quiet` because that is the invocation the preflight task
|
|
1799
|
+
uses. The `scanned:` line is deliberately NOT quiet-gated and is emitted on
|
|
1800
|
+
the RED path too: a gate that publishes its coverage only when it passes
|
|
1801
|
+
cannot be caught going blind at the moment that matters most.
|
|
1802
|
+
|
|
1803
|
+
Six negative-control twins live under
|
|
1804
|
+
`tests/fixtures/score-contract/twins/`, and
|
|
1805
|
+
`tests/scripts/check_score_contract.test.ts` asserts each reds on exactly
|
|
1806
|
+
one finding CODE — not merely on a non-zero exit, which would let a twin
|
|
1807
|
+
keep passing while testing the wrong defect.
|