@event4u/agent-config 14.11.0 → 14.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +368 -516
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +109 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +400 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +65 -6
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +25 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
- package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +9 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +53 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-236PNQZK.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +42 -10
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +62 -62
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2413 -1087
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +639 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4818 -2645
- package/dist/server/schemas/settings.js +6 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +30 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +2 -2
- package/package.json +10 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/src/agent-src/scripts/guarded_baseline.ts +328 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +400 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +48 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/budgets.yml +19 -0
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +95 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +38 -31
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +731 -30
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +38 -20
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +35 -7
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +43 -0
- package/src/config/rule-stub-ceilings.json +126 -112
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/turnaround-budget.json +66 -0
- package/src/config/web-launch-readiness.json +188 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +27 -0
- package/src/scripts/_lib/activation_ladder.ts +211 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +126 -0
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +195 -7
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +263 -3
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +144 -6
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +528 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +980 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -11
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +378 -0
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_budget_ownership.ts +54 -4
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +752 -0
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +60 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +10 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +0 -17
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -67
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +0 -17
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/operational-readiness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/server-hardening/evals/triggers.json +0 -17
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/workspace-link/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiAudit.js.map +0 -1
- package/dist/cli/commands/uiRender.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/lean_projection_mode.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/ui_surface.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/skillRanking.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/ui_authority.test.ts +0 -251
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -246
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -60,6 +60,20 @@ const ADR_DIR = path.join(REPO_ROOT, 'docs', 'decisions');
|
|
|
60
60
|
*/
|
|
61
61
|
export const REVIEW_TRIGGER_SINCE = '2026-07-25';
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Staging date for the `## Not reopened` obligation on a scoped supersession
|
|
65
|
+
* (road-to-runtime-governance-flip step 1.4). Same shape and same reason as
|
|
66
|
+
* `REVIEW_TRIGGER_SINCE`: a new structural requirement is an error on records
|
|
67
|
+
* written after it and a warning on records written before, so the gate does
|
|
68
|
+
* not retroactively red the corpus it is being added to.
|
|
69
|
+
*
|
|
70
|
+
* Two records predate it and warn: `ADR-124` (2026-07-23) and `ADR-209`
|
|
71
|
+
* (2026-08-03). Both carry a real `supersedes_scope` and neither states its
|
|
72
|
+
* remainder in a section — measured, not assumed, and left visible as a warning
|
|
73
|
+
* rather than silenced with a baseline file.
|
|
74
|
+
*/
|
|
75
|
+
export const SCOPED_SUPERSESSION_SINCE = '2026-08-27';
|
|
76
|
+
|
|
63
77
|
/** Fields every ADR must carry — the shape that already exists in practice. */
|
|
64
78
|
const REQUIRED = ['adr', 'status', 'date', 'decision'] as const;
|
|
65
79
|
|
|
@@ -150,6 +164,12 @@ export function check_reopen_authority(
|
|
|
150
164
|
}
|
|
151
165
|
|
|
152
166
|
const ALLOWED_STATUS = new Set([
|
|
167
|
+
// `challenged` — accepted, and under active question. It names NO successor
|
|
168
|
+
// and SUSPENDS NOTHING: an ADR at `challenged` still binds until something
|
|
169
|
+
// replaces it. Without that clause the status becomes a way to stop obeying
|
|
170
|
+
// a decision without reopening it, which is the failure mode
|
|
171
|
+
// road-to-decision-conformance 1.2 exists to prevent.
|
|
172
|
+
'challenged',
|
|
153
173
|
'accepted',
|
|
154
174
|
'proposed',
|
|
155
175
|
'superseded',
|
|
@@ -258,6 +278,7 @@ export function check_one(rel: string, text: string): AdrFinding[] {
|
|
|
258
278
|
}
|
|
259
279
|
check_reopen_authority(rel, fm, findings);
|
|
260
280
|
check_amendment_shape(rel, fm, findings);
|
|
281
|
+
check_scoped_supersession(rel, fm, text, findings);
|
|
261
282
|
const parsed = readAdrFrontmatter(text);
|
|
262
283
|
if (parsed !== null) check_descriptive_axes(rel, parsed, findings);
|
|
263
284
|
return findings;
|
|
@@ -546,6 +567,111 @@ export function check_amendment_shape(
|
|
|
546
567
|
}
|
|
547
568
|
}
|
|
548
569
|
|
|
570
|
+
/**
|
|
571
|
+
* Validate a SCOPED supersession — the `supersedes_scope` / `superseded_scope`
|
|
572
|
+
* pair documented at `docs/contracts/adr-layout.md:59-60, 105-117`.
|
|
573
|
+
*
|
|
574
|
+
* Two invariants, both decidable from one file, both taken from that contract's
|
|
575
|
+
* own text rather than invented here:
|
|
576
|
+
*
|
|
577
|
+
* 1. **A scope with no refs is not a supersession.** The contract says so
|
|
578
|
+
* literally — "A scope with no refs is not a supersession and renders as
|
|
579
|
+
* `—`" — and `regenerate_index.ts` → `supersessionCell` silently drops the
|
|
580
|
+
* scope in that case, so the author's intent disappears with no signal.
|
|
581
|
+
* 2. **A scoped supersession names what it did NOT reopen.** Narrowing a
|
|
582
|
+
* prohibition to one row is precisely when a reader needs the boundary
|
|
583
|
+
* stated, and a `## Not reopened` section is where this corpus states it.
|
|
584
|
+
* Without the section, "supersedes ADR-NNN, partially" is an assertion with
|
|
585
|
+
* no stated remainder, and the remainder is the whole content of a partial
|
|
586
|
+
* supersession.
|
|
587
|
+
*
|
|
588
|
+
* **What this deliberately does NOT check**, because it is not observable: it
|
|
589
|
+
* cannot require a scope wherever partial supersession was *intended*. Intent
|
|
590
|
+
* is not in the file. A whole-document supersession that should have been
|
|
591
|
+
* scoped passes this check, and closing that gap needs stable section
|
|
592
|
+
* identifiers rather than prose scopes — recorded as the known limit rather
|
|
593
|
+
* than implied away.
|
|
594
|
+
*
|
|
595
|
+
* road-to-runtime-governance-flip step 1.4, which asked for exactly one thing:
|
|
596
|
+
* make the required section enforceable, or drop the word "required".
|
|
597
|
+
*/
|
|
598
|
+
/**
|
|
599
|
+
* Is there a `## Not reopened` section WITH content under it?
|
|
600
|
+
*
|
|
601
|
+
* Two corrections a neutral review made to the first version, both real:
|
|
602
|
+
*
|
|
603
|
+
* 1. **The level is exactly `##`.** The first pattern was `#{2,3}`, so a `###`
|
|
604
|
+
* subsection satisfied a contract and a diagnostic that both say `##`. A gate
|
|
605
|
+
* accepting a shape its own message forbids teaches the message is decorative.
|
|
606
|
+
* 2. **The section must say something.** Matching the heading alone let an empty
|
|
607
|
+
* section pass while the error text promises one "naming what the narrowing
|
|
608
|
+
* leaves standing". A heading with nothing under it is the absence the check
|
|
609
|
+
* exists to catch, wearing the right title.
|
|
610
|
+
*
|
|
611
|
+
* "Content" is deliberately weak — one non-blank, non-heading line. No gate can
|
|
612
|
+
* judge whether the prose is true, and pretending otherwise would be the
|
|
613
|
+
* masquerade the sibling gate's docstring warns about.
|
|
614
|
+
*/
|
|
615
|
+
export function hasNotReopenedSection(text: string): boolean {
|
|
616
|
+
const lines = text.split('\n');
|
|
617
|
+
const start = lines.findIndex((l) => /^##\s+Not reopened\s*$/i.test(l));
|
|
618
|
+
if (start === -1) return false;
|
|
619
|
+
for (const line of lines.slice(start + 1)) {
|
|
620
|
+
if (/^#{1,6}\s/.test(line)) break;
|
|
621
|
+
if (line.trim() !== '') return true;
|
|
622
|
+
}
|
|
623
|
+
return false;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
export function check_scoped_supersession(
|
|
627
|
+
rel: string,
|
|
628
|
+
fm: Record<string, string>,
|
|
629
|
+
text: string,
|
|
630
|
+
findings: AdrFinding[],
|
|
631
|
+
): void {
|
|
632
|
+
const placeholder = (v: string | undefined): boolean =>
|
|
633
|
+
v === undefined || v.trim() === '' || v.trim() === '—' || v.trim() === '-';
|
|
634
|
+
|
|
635
|
+
for (const [scopeKey, refKey] of [
|
|
636
|
+
['supersedes_scope', 'supersedes'],
|
|
637
|
+
['superseded_scope', 'superseded_by'],
|
|
638
|
+
] as const) {
|
|
639
|
+
if (placeholder(fm[scopeKey])) continue;
|
|
640
|
+
if (placeholder(fm[refKey])) {
|
|
641
|
+
findings.push({
|
|
642
|
+
file: rel,
|
|
643
|
+
level: 'error',
|
|
644
|
+
message:
|
|
645
|
+
`\`${scopeKey}\` is set but \`${refKey}\` names no ADR. A scope with no refs ` +
|
|
646
|
+
'is not a supersession (adr-layout § Frontmatter) — the index renders it as ' +
|
|
647
|
+
'`—` and the scope text is lost. Name the record, or drop the scope.',
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// The "Not reopened" obligation is on the record that PERFORMS the scoped
|
|
653
|
+
// supersession, never on the one that receives it: the successor is what
|
|
654
|
+
// has to state the remainder.
|
|
655
|
+
if (placeholder(fm['supersedes_scope'])) return;
|
|
656
|
+
if (!hasNotReopenedSection(text)) {
|
|
657
|
+
// A well-formed ISO date, or no grandfathering. A malformed `date:`
|
|
658
|
+
// sorts unpredictably against the staging constant, and the safe
|
|
659
|
+
// direction for an unreadable date is the error, not the warning.
|
|
660
|
+
const date = fm['date'] ?? '';
|
|
661
|
+
const wellFormed = /^\d{4}-\d{2}-\d{2}$/.test(date);
|
|
662
|
+
const staged = wellFormed && date < SCOPED_SUPERSESSION_SINCE;
|
|
663
|
+
findings.push({
|
|
664
|
+
file: rel,
|
|
665
|
+
level: staged ? 'warn' : 'error',
|
|
666
|
+
message:
|
|
667
|
+
'a scoped supersession (`supersedes_scope`) must carry a `## Not reopened` ' +
|
|
668
|
+
'section naming what the narrowing leaves standing. Partially superseding a ' +
|
|
669
|
+
'record without stating the remainder reads as a general relaxation, which is ' +
|
|
670
|
+
'the reading a safety floor cannot survive.',
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
549
675
|
/**
|
|
550
676
|
* Corpus-level check: every `amends:` has its reciprocal `amended_by:` and vice
|
|
551
677
|
* versa. Its absence for the `supersedes:` / `superseded_by:` pair is exactly
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* A benchmark or cost report that omits a required cache field fails, naming the
|
|
4
|
+
* field (`road-to-runtime-context-floors` step 4.1).
|
|
5
|
+
*
|
|
6
|
+
* `cache.read_write_ratio` and `cache.stable_prefix_share` are REQUIRED. A report
|
|
7
|
+
* that cannot compute one emits `{ unavailable: "<reason>" }`; it does not omit
|
|
8
|
+
* the key and it does not emit a zero. A blank reads as "no cache activity" and a
|
|
9
|
+
* zero reads as "the worst possible ratio" — both are claims, and neither is the
|
|
10
|
+
* claim "this was not measured".
|
|
11
|
+
*
|
|
12
|
+
* Contract: `docs/contracts/benchmark-report-schema.md` § The `cache` block.
|
|
13
|
+
*
|
|
14
|
+
* Exit codes: 0 every scanned report carries both fields · 1 a report is missing
|
|
15
|
+
* or malformed · 2 misuse / unreadable input.
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* ./scripts-run src/scripts/check_benchmark_report_fields [--dir <path>] [--quiet]
|
|
19
|
+
* ./scripts-run src/scripts/check_benchmark_report_fields --self-test
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'node:fs';
|
|
22
|
+
import * as os from 'node:os';
|
|
23
|
+
import * as path from 'node:path';
|
|
24
|
+
|
|
25
|
+
import { describeProblem, validateCacheBlock, validateProvenanceBlock } from './_lib/benchmark_cache_fields.js';
|
|
26
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
27
|
+
import { runGateCli, runSelfTest, type SelfTestCase } from './_lib/gate_self_test.js';
|
|
28
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
29
|
+
|
|
30
|
+
const HERE = path.dirname(new URL(import.meta.url).pathname);
|
|
31
|
+
const REPO_ROOT = path.resolve(HERE, '..', '..');
|
|
32
|
+
const DEFAULT_DIR = path.join(REPO_ROOT, 'internal', 'bench', 'reports');
|
|
33
|
+
|
|
34
|
+
export interface ReportFinding {
|
|
35
|
+
file: string;
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface FieldVerdict {
|
|
40
|
+
scanned: number;
|
|
41
|
+
findings: ReportFinding[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Only files that ANNOUNCE themselves as benchmark reports are in the corpus. */
|
|
45
|
+
function isBenchmarkReport(doc: unknown): boolean {
|
|
46
|
+
const d = doc as { schema_version?: unknown; selection?: unknown; corpus?: unknown } | null;
|
|
47
|
+
if (d === null || typeof d !== 'object') return false;
|
|
48
|
+
return d.schema_version !== undefined && (d.selection !== undefined || d.corpus !== undefined);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function evaluate(dir: string = DEFAULT_DIR, ledger?: GateLedger): FieldVerdict {
|
|
52
|
+
const findings: ReportFinding[] = [];
|
|
53
|
+
let scanned = 0;
|
|
54
|
+
if (!fs.existsSync(dir)) return { scanned, findings };
|
|
55
|
+
|
|
56
|
+
const names = fs.readdirSync(dir).sort();
|
|
57
|
+
ledger?.plan(names);
|
|
58
|
+
|
|
59
|
+
for (const name of names) {
|
|
60
|
+
if (!name.endsWith('.json')) {
|
|
61
|
+
ledger?.outOfScope(name, 'not_applicable_kind');
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const file = path.join(dir, name);
|
|
65
|
+
let doc: unknown;
|
|
66
|
+
try {
|
|
67
|
+
doc = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
68
|
+
} catch {
|
|
69
|
+
// Not our corpus; a malformed JSON is another gate's finding.
|
|
70
|
+
ledger?.skip(name, 'binary_content');
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!isBenchmarkReport(doc)) {
|
|
74
|
+
ledger?.outOfScope(name, 'not_applicable_kind');
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
scanned += 1;
|
|
78
|
+
const problems = [...validateCacheBlock(doc), ...validateProvenanceBlock(doc)];
|
|
79
|
+
for (const p of problems) {
|
|
80
|
+
findings.push({ file: path.relative(REPO_ROOT, file), message: describeProblem(p) });
|
|
81
|
+
}
|
|
82
|
+
if (problems.length > 0) ledger?.fail(name, `${String(problems.length)} missing or malformed required field(s)`);
|
|
83
|
+
else ledger?.complete(name);
|
|
84
|
+
}
|
|
85
|
+
return { scanned, findings };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ---------------------------------------------------------------- self-test
|
|
89
|
+
|
|
90
|
+
const BASE = { schema_version: 1, corpus: { id: 'x' }, selection: { top_k: 3 } };
|
|
91
|
+
|
|
92
|
+
const GOOD_CACHE = { read_write_ratio: 2, stable_prefix_share: 0.5 };
|
|
93
|
+
|
|
94
|
+
/** A provenance block that passes, so a cache-field case tests only cache fields. */
|
|
95
|
+
const GOOD_PROVENANCE = {
|
|
96
|
+
host_binary_hash: 'sha256:deadbeef',
|
|
97
|
+
harness_commit: 'abc1234',
|
|
98
|
+
harness_dirty: false,
|
|
99
|
+
reproducibility: 'task bench-run --corpus x at the commit above',
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
function plant(dir: string, cache: unknown, provenance: unknown = GOOD_PROVENANCE): void {
|
|
103
|
+
const doc: Record<string, unknown> = { ...BASE };
|
|
104
|
+
if (cache !== undefined) doc['cache'] = cache;
|
|
105
|
+
if (provenance !== undefined) doc['provenance'] = provenance;
|
|
106
|
+
fs.writeFileSync(path.join(dir, 'report.json'), JSON.stringify(doc));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function selfTestCases(): SelfTestCase[] {
|
|
110
|
+
const mk = (name: string, expect: 'reject' | 'accept', cache: unknown, provenance?: unknown): SelfTestCase => ({
|
|
111
|
+
name,
|
|
112
|
+
expect,
|
|
113
|
+
run: () => {
|
|
114
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'brf-'));
|
|
115
|
+
try {
|
|
116
|
+
plant(dir, cache, provenance === undefined ? GOOD_PROVENANCE : provenance);
|
|
117
|
+
return runGateCli(REPO_ROOT, 'src/scripts/check_benchmark_report_fields.ts', ['--dir', dir, '--quiet'], REPO_ROOT);
|
|
118
|
+
} finally {
|
|
119
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
return [
|
|
124
|
+
mk('no cache block at all → reject', 'reject', undefined),
|
|
125
|
+
mk('read_write_ratio missing → reject', 'reject', { stable_prefix_share: 0.5 }),
|
|
126
|
+
mk('stable_prefix_share missing → reject', 'reject', { read_write_ratio: 2 }),
|
|
127
|
+
mk('both present as numbers → accept', 'accept', { read_write_ratio: 2, stable_prefix_share: 0.5 }),
|
|
128
|
+
mk('unavailable WITH a reason → accept', 'accept', {
|
|
129
|
+
read_write_ratio: { unavailable: 'no cache_creation tokens in window' },
|
|
130
|
+
stable_prefix_share: 0.5,
|
|
131
|
+
}),
|
|
132
|
+
mk('unavailable with a BLANK reason → reject', 'reject', {
|
|
133
|
+
read_write_ratio: { unavailable: ' ' },
|
|
134
|
+
stable_prefix_share: 0.5,
|
|
135
|
+
}),
|
|
136
|
+
mk('a share above 1 → reject', 'reject', { read_write_ratio: 2, stable_prefix_share: 1.5 }),
|
|
137
|
+
// Provenance half (step 4.2) — the four reproducibility fields.
|
|
138
|
+
mk('no provenance block at all → reject', 'reject', GOOD_CACHE, null),
|
|
139
|
+
mk('harness_commit missing → reject', 'reject', GOOD_CACHE, { ...GOOD_PROVENANCE, harness_commit: undefined }),
|
|
140
|
+
mk('reproducibility is an empty string → reject', 'reject', GOOD_CACHE, { ...GOOD_PROVENANCE, reproducibility: ' ' }),
|
|
141
|
+
mk('harness_dirty as a string → reject', 'reject', GOOD_CACHE, { ...GOOD_PROVENANCE, harness_dirty: 'no' }),
|
|
142
|
+
// `false` is the GOOD case for a dirty flag, and a truthiness check
|
|
143
|
+
// would silently reject it. Pinned so it cannot regress.
|
|
144
|
+
mk('harness_dirty: false → accept', 'accept', GOOD_CACHE, { ...GOOD_PROVENANCE, harness_dirty: false }),
|
|
145
|
+
mk('harness_dirty: true → accept — a fact, not a failure', 'accept', GOOD_CACHE, { ...GOOD_PROVENANCE, harness_dirty: true }),
|
|
146
|
+
mk('a field unavailable WITH a reason → accept', 'accept', GOOD_CACHE, {
|
|
147
|
+
...GOOD_PROVENANCE,
|
|
148
|
+
host_binary_hash: { unavailable: 'the host binary is not on PATH in this runner' },
|
|
149
|
+
}),
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------- CLI
|
|
154
|
+
|
|
155
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
156
|
+
if (argv.includes('--self-test')) {
|
|
157
|
+
return runSelfTest({ gate: 'check_benchmark_report_fields', cases: selfTestCases(), minCases: 12, minRejectCases: 8 });
|
|
158
|
+
}
|
|
159
|
+
const quiet = argv.includes('--quiet');
|
|
160
|
+
const di = argv.indexOf('--dir');
|
|
161
|
+
const dirArg = di !== -1 ? argv[di + 1] : undefined;
|
|
162
|
+
const dir = dirArg !== undefined ? path.resolve(dirArg) : DEFAULT_DIR;
|
|
163
|
+
|
|
164
|
+
const ledger = new GateLedger('check_benchmark_report_fields');
|
|
165
|
+
let v: FieldVerdict;
|
|
166
|
+
try {
|
|
167
|
+
v = evaluate(dir, ledger);
|
|
168
|
+
} catch (err) {
|
|
169
|
+
process.stderr.write(`❌ check_benchmark_report_fields: ${(err as Error).message}\n`);
|
|
170
|
+
return 2;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
reportScanned({
|
|
175
|
+
gate: 'check_benchmark_report_fields',
|
|
176
|
+
scanned: v.scanned,
|
|
177
|
+
units: 'benchmark report(s)',
|
|
178
|
+
roots: [path.relative(REPO_ROOT, dir)],
|
|
179
|
+
// A tree with no committed benchmark report is a real state: reports
|
|
180
|
+
// are run artefacts, not source. The gate exists to fail the day one
|
|
181
|
+
// is committed without the block, not to demand one exist.
|
|
182
|
+
allowEmpty: 'OPTIONAL_INPUT: benchmark reports are run artefacts; a checkout may legitimately carry none',
|
|
183
|
+
});
|
|
184
|
+
} catch (err) {
|
|
185
|
+
if (err instanceof DeadScopeError) {
|
|
186
|
+
process.stderr.write(`❌ check_benchmark_report_fields: ${err.message}\n`);
|
|
187
|
+
return 2;
|
|
188
|
+
}
|
|
189
|
+
throw err;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
ledger.report();
|
|
193
|
+
|
|
194
|
+
if (v.findings.length > 0) {
|
|
195
|
+
for (const f of v.findings) process.stderr.write(`❌ ${f.file}: ${f.message}\n`);
|
|
196
|
+
process.stderr.write(`\n Contract: docs/contracts/benchmark-report-schema.md § The \`cache\` block.\n`);
|
|
197
|
+
return 1;
|
|
198
|
+
}
|
|
199
|
+
if (!quiet) process.stdout.write(`✅ every benchmark report carries its required cache and provenance fields (${String(v.scanned)} report(s)).\n`);
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (process.env['GATE_SELF_TEST_CHILD'] !== '1' || process.argv.includes('--dir')) {
|
|
204
|
+
if (process.argv[1] !== undefined && import.meta.url === `file://${process.argv[1]}`) {
|
|
205
|
+
process.exit(main());
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -16,11 +16,13 @@
|
|
|
16
16
|
* Exit codes: 0 = clean, 1 = violations found, 3 = internal error.
|
|
17
17
|
*/
|
|
18
18
|
import * as fs from 'node:fs';
|
|
19
|
+
import * as os from 'node:os';
|
|
19
20
|
import * as path from 'node:path';
|
|
20
21
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
21
22
|
|
|
22
23
|
import { asOf } from './_lib/as_of.js';
|
|
23
|
-
import {
|
|
24
|
+
import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
25
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
24
26
|
|
|
25
27
|
const _HERE = fileURLToPath(import.meta.url);
|
|
26
28
|
const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
@@ -30,6 +32,85 @@ const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---\s*\n/;
|
|
|
30
32
|
const STABILITY_RE = /^stability:\s*(\w+)\s*$/m;
|
|
31
33
|
const PROMOTE_RE = /^promote-to:\s*stable\s*$/m;
|
|
32
34
|
const KEEP_RE = /^keep-beta-until:\s*(\d{4}-\d{2}-\d{2})\s*$/m;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The frozen no-growth baseline of contracts already lapsed at 2026-08-25.
|
|
38
|
+
*
|
|
39
|
+
* AI council 2/2 (2026-08-25) chose a **ratchet** over both a flat report and a
|
|
40
|
+
* flat error. The shape, and each clause is load-bearing:
|
|
41
|
+
*
|
|
42
|
+
* - a lapsed contract **in** the baseline -> warning (inherited debt)
|
|
43
|
+
* - a lapsed contract **not** in it -> ERROR (a fresh lapse, today)
|
|
44
|
+
*
|
|
45
|
+
* So new work is enforced immediately while the 86-contract cohort does not red
|
|
46
|
+
* an arbitrary future PR whose author caused none of it. The cohort is real:
|
|
47
|
+
* 44 of the 86 lapsed on the same day and 64 within four days, which is one past
|
|
48
|
+
* session's uniform window expiring at once rather than 86 lapses of discipline.
|
|
49
|
+
*
|
|
50
|
+
* **The list may not grow, and an entry may not be re-added.** Both are the
|
|
51
|
+
* ratchet, and both fall out of the rule above rather than needing their own
|
|
52
|
+
* check: anything not already in the file errors.
|
|
53
|
+
*
|
|
54
|
+
* **Removal is derived from the contract's own state, never from editing this
|
|
55
|
+
* file.** An entry stops mattering because the contract stopped being a lapsed
|
|
56
|
+
* beta — promoted, recorded unmaintained, superseded, or given a reviewed new
|
|
57
|
+
* deadline. One seat asked for exactly this qualification, on the ground that an
|
|
58
|
+
* allowlist whose entries can simply be deleted is cosmetic.
|
|
59
|
+
*/
|
|
60
|
+
const BASELINE_REL = 'src/config/lapsed-beta-baseline.json';
|
|
61
|
+
|
|
62
|
+
interface LapsedBaseline {
|
|
63
|
+
contracts: string[];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let _baselineCache: Set<string> | null = null;
|
|
67
|
+
|
|
68
|
+
export function loadLapsedBaseline(root: string = ROOT): Set<string> {
|
|
69
|
+
if (_baselineCache !== null) {
|
|
70
|
+
return _baselineCache;
|
|
71
|
+
}
|
|
72
|
+
const p = path.join(root, BASELINE_REL);
|
|
73
|
+
if (!fs.existsSync(p)) {
|
|
74
|
+
// The baseline reaching zero is the SUCCESS state: the file is deleted
|
|
75
|
+
// in the same change that flips the severity. An absent file therefore
|
|
76
|
+
// means "no inherited debt", i.e. every lapse is fresh and errors.
|
|
77
|
+
_baselineCache = new Set<string>();
|
|
78
|
+
return _baselineCache;
|
|
79
|
+
}
|
|
80
|
+
const parsed = JSON.parse(fs.readFileSync(p, 'utf-8')) as LapsedBaseline;
|
|
81
|
+
_baselineCache = new Set(parsed.contracts);
|
|
82
|
+
return _baselineCache;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Test seam — the module-level cache would otherwise outlive a fixture. */
|
|
86
|
+
export function _resetLapsedBaseline(): void {
|
|
87
|
+
_baselineCache = null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Severity of the LAPSED-deadline finding — `keep-beta-until` in the past.
|
|
92
|
+
*
|
|
93
|
+
* `warning` on purpose, and this constant exists so that promoting it is a
|
|
94
|
+
* one-word, reviewable change rather than an edit buried in a branch.
|
|
95
|
+
*
|
|
96
|
+
* Until 2026-08-25 the gate compared `keep-beta-until` ONLY against
|
|
97
|
+
* `today + MAX_REVIEW_WINDOW_DAYS` and errored when the date was too far in the
|
|
98
|
+
* FUTURE. There was no floor, so a date arbitrarily far in the PAST passed and
|
|
99
|
+
* the gate printed "All beta contracts carry a valid review marker" while 86 of
|
|
100
|
+
* the 121 beta contracts were lapsed. The gate enforced the ceiling of the
|
|
101
|
+
* review window and never its expiry.
|
|
102
|
+
*
|
|
103
|
+
* It ships as a report rather than an error because the backlog is a COHORT:
|
|
104
|
+
* 44 of those 86 lapsed on the same day (2026-08-12) and 64 within four days,
|
|
105
|
+
* which is one past session's uniform window expiring en masse rather than 86
|
|
106
|
+
* independent lapses. Erroring on a cohort artifact produces one loud failure on
|
|
107
|
+
* an arbitrary future PR whose author did nothing wrong — the way a gate gets
|
|
108
|
+
* waived instead of adopted. The inventory and its dispositions are
|
|
109
|
+
* `agents/evidence/analysis/lapsed-beta-inventory-2026-08-25.md`; the decision on
|
|
110
|
+
* whether this becomes an error is that roadmap's step 0.2 and is not taken here.
|
|
111
|
+
*/
|
|
112
|
+
const LAPSED_SEVERITY_IN_BASELINE: 'error' | 'warning' = 'warning';
|
|
113
|
+
const LAPSED_SEVERITY_FRESH: 'error' | 'warning' = 'error';
|
|
33
114
|
const SUPERSEDED_RE = /^superseded-by:\s*\S+\s*$/m;
|
|
34
115
|
|
|
35
116
|
const MAX_REVIEW_WINDOW_DAYS = 90;
|
|
@@ -146,6 +227,26 @@ function check_one(p: string, todayOrdinal: number): Violation[] {
|
|
|
146
227
|
if (km) {
|
|
147
228
|
const [ry, rm, rd] = _parseISODate(km[1]!);
|
|
148
229
|
const reviewOrdinal = _dateOrdinal(ry, rm, rd);
|
|
230
|
+
// Lower bound — the deadline has passed. Checked BEFORE the upper
|
|
231
|
+
// bound because a lapsed date can never also exceed the forward window,
|
|
232
|
+
// so the order is a readability choice rather than a precedence one.
|
|
233
|
+
if (reviewOrdinal < todayOrdinal) {
|
|
234
|
+
const inherited = loadLapsedBaseline().has(rel);
|
|
235
|
+
const age = todayOrdinal - reviewOrdinal;
|
|
236
|
+
return [
|
|
237
|
+
{
|
|
238
|
+
file: rel,
|
|
239
|
+
reason:
|
|
240
|
+
`keep-beta-until=${_ordinalToISO(reviewOrdinal)} has LAPSED ` +
|
|
241
|
+
`(${age} day(s) ago); review the contract and ` +
|
|
242
|
+
'promote it, extend the window with a reason, or record it as superseded' +
|
|
243
|
+
(inherited
|
|
244
|
+
? ' [inherited: in the frozen 2026-08-25 baseline, clear by 2026-11-23]'
|
|
245
|
+
: ' [FRESH lapse — not in the frozen baseline, which may not grow]'),
|
|
246
|
+
severity: inherited ? LAPSED_SEVERITY_IN_BASELINE : LAPSED_SEVERITY_FRESH,
|
|
247
|
+
},
|
|
248
|
+
];
|
|
249
|
+
}
|
|
149
250
|
const maxOrdinal = todayOrdinal + MAX_REVIEW_WINDOW_DAYS;
|
|
150
251
|
if (reviewOrdinal > maxOrdinal) {
|
|
151
252
|
return [
|
|
@@ -162,17 +263,65 @@ function check_one(p: string, todayOrdinal: number): Violation[] {
|
|
|
162
263
|
return [];
|
|
163
264
|
}
|
|
164
265
|
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* STABILITY.md's own re-audit condition, as a command instead of as prose.
|
|
269
|
+
*
|
|
270
|
+
* `STABILITY.md`:
|
|
271
|
+
*
|
|
272
|
+
* "The audit is repeated whenever the `keep-beta-until` date passes for
|
|
273
|
+
* >= 25 % of beta contracts, or at the start of any roadmap phase that
|
|
274
|
+
* touches the contract surface."
|
|
275
|
+
*
|
|
276
|
+
* That condition was met at 71.1 % and nothing noticed, which is the defect
|
|
277
|
+
* `road-to-contract-review-deadlines` D2 records. A trigger nobody can run is
|
|
278
|
+
* how a threshold gets crossed by a factor of three in silence — so the
|
|
279
|
+
* percentage is computed here, next to the data, and printed.
|
|
280
|
+
*
|
|
281
|
+
* Deliberately a REPORT, not a gate: the enforcement half is the frozen
|
|
282
|
+
* baseline plus the fresh-lapse error above. A second failing check over the
|
|
283
|
+
* same population would red the same PRs twice for one cause.
|
|
284
|
+
*/
|
|
285
|
+
export const REAUDIT_TRIGGER_PCT = 25;
|
|
286
|
+
|
|
287
|
+
export interface TriggerVerdict {
|
|
288
|
+
betaContracts: number;
|
|
289
|
+
lapsed: number;
|
|
290
|
+
pct: number;
|
|
291
|
+
fired: boolean;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export function evaluateTrigger(violations: readonly Violation[], betaContracts: number): TriggerVerdict {
|
|
295
|
+
const lapsed = violations.filter((v) => v.reason.includes('has LAPSED')).length;
|
|
296
|
+
const pct = betaContracts === 0 ? 0 : (lapsed / betaContracts) * 100;
|
|
297
|
+
return { betaContracts, lapsed, pct, fired: pct >= REAUDIT_TRIGGER_PCT };
|
|
298
|
+
}
|
|
299
|
+
|
|
165
300
|
interface ParsedArgs {
|
|
166
301
|
json: boolean;
|
|
302
|
+
trigger: boolean;
|
|
303
|
+
/** Fixture root, for `--self-test`. A fixture is never judged against the repo baseline. */
|
|
304
|
+
root: string | null;
|
|
167
305
|
}
|
|
168
306
|
|
|
169
307
|
function parse_args(argv: readonly string[]): ParsedArgs {
|
|
170
|
-
const args: ParsedArgs = { json: false };
|
|
171
|
-
for (
|
|
308
|
+
const args: ParsedArgs = { json: false, trigger: false, root: null };
|
|
309
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
310
|
+
const arg = argv[i] as string;
|
|
172
311
|
if (arg === '--json') {
|
|
173
312
|
args.json = true;
|
|
313
|
+
} else if (arg === '--root') {
|
|
314
|
+
args.root = argv[i + 1] ?? null;
|
|
315
|
+
i += 1;
|
|
316
|
+
} else if (arg === '--trigger') {
|
|
317
|
+
args.trigger = true;
|
|
174
318
|
} else if (arg === '-h' || arg === '--help') {
|
|
175
|
-
process.stdout.write(
|
|
319
|
+
process.stdout.write(
|
|
320
|
+
'usage: check_beta_review_markers [-h] [--json] [--trigger]\n' +
|
|
321
|
+
' --trigger print the lapsed percentage and whether STABILITY.md\n' +
|
|
322
|
+
' re-audit condition (>= 25 %) has fired. Reports; never fails.\n' +
|
|
323
|
+
' --root DIR judge a fixture tree instead of the repo (self-test seam).\n',
|
|
324
|
+
);
|
|
176
325
|
process.exit(0);
|
|
177
326
|
} else {
|
|
178
327
|
process.stderr.write(
|
|
@@ -190,12 +339,70 @@ function _todayOrdinal(): number {
|
|
|
190
339
|
return _dateOrdinal(now.getFullYear(), now.getMonth() + 1, now.getDate());
|
|
191
340
|
}
|
|
192
341
|
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Self-test — the gate proving it still DISCRIMINATES, not merely that it ran.
|
|
345
|
+
*
|
|
346
|
+
* A `scanned:` floor proves a gate read something; only a rejecting case proves
|
|
347
|
+
* the reading changes the verdict. All four cases shell out to the real CLI
|
|
348
|
+
* through a fixture `docs/contracts/`, because an in-process call cannot catch
|
|
349
|
+
* an argv parser or an entry guard that silently no-ops.
|
|
350
|
+
*/
|
|
351
|
+
export function selfTest(): number {
|
|
352
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'beta-selftest-'));
|
|
353
|
+
const write = (name: string, body: string): string => {
|
|
354
|
+
const dir = path.join(tmp, name, 'docs', 'contracts');
|
|
355
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
356
|
+
fs.writeFileSync(path.join(dir, 'sample.md'), body, 'utf-8');
|
|
357
|
+
return path.join(tmp, name);
|
|
358
|
+
};
|
|
359
|
+
const run = (root: string): number =>
|
|
360
|
+
runGateCli(ROOT, 'src/scripts/check_beta_review_markers.ts', ['--root', root], root);
|
|
361
|
+
|
|
362
|
+
try {
|
|
363
|
+
return runSelfTest({
|
|
364
|
+
gate: 'check_beta_review_markers',
|
|
365
|
+
minCases: 4,
|
|
366
|
+
minRejectCases: 2,
|
|
367
|
+
cases: [
|
|
368
|
+
{
|
|
369
|
+
name: 'a lapsed deadline outside the frozen baseline is rejected',
|
|
370
|
+
expect: 'reject',
|
|
371
|
+
run: () => run(write('lapsed', '---\nstability: beta\nkeep-beta-until: 2020-01-01\n---\n')),
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
name: 'a beta contract with NO marker at all is rejected',
|
|
375
|
+
expect: 'reject',
|
|
376
|
+
run: () => run(write('nomarker', '---\nstability: beta\n---\n')),
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
name: 'a beta contract inside its window passes',
|
|
380
|
+
expect: 'accept',
|
|
381
|
+
run: () => run(write('fresh', `---\nstability: beta\nkeep-beta-until: ${_ordinalToISO(_todayOrdinal() + 30)}\n---\n`)),
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
name: 'a stable contract needs no marker and passes',
|
|
385
|
+
expect: 'accept',
|
|
386
|
+
run: () => run(write('stable', '---\nstability: stable\n---\n')),
|
|
387
|
+
},
|
|
388
|
+
],
|
|
389
|
+
});
|
|
390
|
+
} finally {
|
|
391
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
193
395
|
function main(): number {
|
|
396
|
+
if (process.argv.slice(2).includes('--self-test')) return selfTest();
|
|
194
397
|
const args = parse_args(process.argv.slice(2));
|
|
195
398
|
const todayOrdinal = _todayOrdinal();
|
|
196
399
|
const violations: Violation[] = [];
|
|
197
|
-
const
|
|
400
|
+
const scanRoot = args.root ?? ROOT;
|
|
401
|
+
const contracts = _globMdSorted(path.join(scanRoot, CONTRACTS_DIR));
|
|
402
|
+
let betaContracts = 0;
|
|
198
403
|
for (const p of contracts) {
|
|
404
|
+
const fm = read_frontmatter(p);
|
|
405
|
+
if (fm !== null && /^stability:\s*beta\s*$/m.test(fm)) betaContracts += 1;
|
|
199
406
|
violations.push(...check_one(p, todayOrdinal));
|
|
200
407
|
}
|
|
201
408
|
// Count every contract read, not the `stability: beta` subset: over a moved
|
|
@@ -203,7 +410,13 @@ function main(): number {
|
|
|
203
410
|
// the same clean line, and only the second is a dead gate. Exit 1 is the
|
|
204
411
|
// violation code; 3 stays reserved for the internal-error handler below.
|
|
205
412
|
try {
|
|
206
|
-
assertScanned
|
|
413
|
+
// `reportScanned`, not `assertScanned`: the gate-coverage manifest's
|
|
414
|
+
// rule 1 requires exactly one machine-readable `scanned: <N>` line, and
|
|
415
|
+
// asserting without printing satisfies the scope guard while leaving the
|
|
416
|
+
// census blind — which is the same "green over nothing" shape both
|
|
417
|
+
// mechanisms exist to end. Emitted on the RED path too, so the gate
|
|
418
|
+
// cannot report its coverage only when it passes.
|
|
419
|
+
reportScanned({
|
|
207
420
|
gate: 'check_beta_review_markers',
|
|
208
421
|
scanned: contracts.length,
|
|
209
422
|
units: 'contract file(s)',
|
|
@@ -216,6 +429,22 @@ function main(): number {
|
|
|
216
429
|
}
|
|
217
430
|
throw exc;
|
|
218
431
|
}
|
|
432
|
+
if (args.trigger) {
|
|
433
|
+
const t = evaluateTrigger(violations, betaContracts);
|
|
434
|
+
const line =
|
|
435
|
+
`beta contracts: ${String(t.betaContracts)} · lapsed: ${String(t.lapsed)} · ` +
|
|
436
|
+
`${t.pct.toFixed(1)} % · STABILITY.md re-audit trigger (>= ${String(REAUDIT_TRIGGER_PCT)} %): ` +
|
|
437
|
+
(t.fired ? 'FIRED' : 'not fired');
|
|
438
|
+
if (args.json) {
|
|
439
|
+
process.stdout.write(JSON.stringify({ trigger: t }, null, 2) + '\n');
|
|
440
|
+
} else {
|
|
441
|
+
process.stdout.write(`${line}\n`);
|
|
442
|
+
}
|
|
443
|
+
// A report never fails a build. The enforcement half is the frozen
|
|
444
|
+
// baseline plus the fresh-lapse error; failing here too would red the
|
|
445
|
+
// same pull request twice for one cause.
|
|
446
|
+
return 0;
|
|
447
|
+
}
|
|
219
448
|
if (args.json) {
|
|
220
449
|
process.stdout.write(JSON.stringify({ violations }, null, 2) + '\n');
|
|
221
450
|
} else {
|