@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
|
@@ -32,8 +32,10 @@
|
|
|
32
32
|
* Dates are plain `YYYY-MM-DD`; ages are whole days in UTC, so the verdict does
|
|
33
33
|
* not depend on the machine's timezone.
|
|
34
34
|
*/
|
|
35
|
+
import { execFileSync } from 'node:child_process';
|
|
35
36
|
import * as fs from 'node:fs';
|
|
36
37
|
import * as path from 'node:path';
|
|
38
|
+
import process from 'node:process';
|
|
37
39
|
|
|
38
40
|
/** Days a baseline may sit unchanged before it must be fixed or reaffirmed. */
|
|
39
41
|
export const STALE_AFTER_DAYS = 56;
|
|
@@ -105,12 +107,132 @@ export function loadBaselines(repoRoot: string, relPath: string = BASELINE_REL):
|
|
|
105
107
|
} catch {
|
|
106
108
|
return { gates: {} };
|
|
107
109
|
}
|
|
110
|
+
return parseBaselines(raw);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function parseBaselines(raw: string): BaselineFile {
|
|
108
114
|
const parsed = JSON.parse(raw) as Partial<BaselineFile>;
|
|
109
115
|
const out: BaselineFile = { gates: parsed.gates ?? {} };
|
|
110
116
|
if (parsed.$comment !== undefined) out.$comment = parsed.$comment;
|
|
111
117
|
return out;
|
|
112
118
|
}
|
|
113
119
|
|
|
120
|
+
/**
|
|
121
|
+
* A baseline-resolution failure, which is a HARD error and never a fallback.
|
|
122
|
+
*
|
|
123
|
+
* `loadBaselines` returns an empty ratchet when the file is missing, and that
|
|
124
|
+
* is correct for a working-tree read: a repository with no baseline file has no
|
|
125
|
+
* ratchet. It is NOT correct for a target-commit read. There, a failure to
|
|
126
|
+
* resolve the ref or the blob means the governing policy could not be
|
|
127
|
+
* determined — and silently falling back to the working tree would let an
|
|
128
|
+
* infrastructure error change which policy applies, invisibly. The AI council
|
|
129
|
+
* was unanimous on this point (2026-08-25) and stated it applies to whichever
|
|
130
|
+
* invariant won.
|
|
131
|
+
*/
|
|
132
|
+
export class BaselineResolutionError extends Error {
|
|
133
|
+
constructor(message: string) {
|
|
134
|
+
super(message);
|
|
135
|
+
this.name = 'BaselineResolutionError';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Read the baseline as it stands at a specific commit.
|
|
141
|
+
*
|
|
142
|
+
* `road-to-merge-surface-zero` Phase 3.1, under the **ABSOLUTE invariant** the
|
|
143
|
+
* AI council picked 2/2 on 2026-08-25 to resolve blocker B5.
|
|
144
|
+
*
|
|
145
|
+
* ## Why the target commit and not the merge base
|
|
146
|
+
*
|
|
147
|
+
* The merge-base read was the roadmap's original proposal and it selects the
|
|
148
|
+
* *contribution* invariant: a PR passes if it did not worsen the state it
|
|
149
|
+
* branched from. The worked example that killed it uses numbers this repository
|
|
150
|
+
* actually carries — `main` tightens `ci-parity:local-only` 165 → 160, a PR that
|
|
151
|
+
* branched earlier measures 163, the merge-base read returns 165, the PR
|
|
152
|
+
* **passes**, and after it merges `main` measures 163 against a baseline of 160.
|
|
153
|
+
* **A tightening is undone by a PR that never touched the baseline file and
|
|
154
|
+
* never saw a red.**
|
|
155
|
+
*
|
|
156
|
+
* The remedy of checking both was refused on a correctness ground rather than a
|
|
157
|
+
* preference: **violation counts are not necessarily compositional.** Conflict
|
|
158
|
+
* resolution, file movement, generated outputs and interactions with changes on
|
|
159
|
+
* `main` can make a prospective merge regress even when the isolated PR delta is
|
|
160
|
+
* non-positive. If trunk health is the invariant, the merge RESULT is what has
|
|
161
|
+
* to be measured.
|
|
162
|
+
*
|
|
163
|
+
* ## Why the TARGET commit specifically, and not the merge tree
|
|
164
|
+
*
|
|
165
|
+
* The count is measured on the prospective merge tree; the **policy** is read
|
|
166
|
+
* from the target. Reading the baseline out of the merge tree would let a PR
|
|
167
|
+
* loosen the very number it is being judged against, in the same diff.
|
|
168
|
+
*
|
|
169
|
+
* @throws BaselineResolutionError when the ref or the blob cannot be resolved.
|
|
170
|
+
*/
|
|
171
|
+
export function loadBaselinesAt(
|
|
172
|
+
repoRoot: string,
|
|
173
|
+
targetRef: string,
|
|
174
|
+
relPath: string = BASELINE_REL,
|
|
175
|
+
run: (args: string[]) => string = (args) =>
|
|
176
|
+
execFileSync('git', args, { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }),
|
|
177
|
+
): BaselineFile {
|
|
178
|
+
let sha: string;
|
|
179
|
+
try {
|
|
180
|
+
sha = run(['rev-parse', '--verify', `${targetRef}^{commit}`]).trim();
|
|
181
|
+
} catch {
|
|
182
|
+
throw new BaselineResolutionError(
|
|
183
|
+
`cannot resolve target ref "${targetRef}" — the governing baseline is unknown, ` +
|
|
184
|
+
'and a working-tree fallback would let an infrastructure error decide the policy.',
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
let raw: string;
|
|
188
|
+
try {
|
|
189
|
+
raw = run(['show', `${sha}:${relPath}`]);
|
|
190
|
+
} catch {
|
|
191
|
+
throw new BaselineResolutionError(
|
|
192
|
+
`${relPath} does not exist at ${sha.slice(0, 9)} ("${targetRef}") — this is a ` +
|
|
193
|
+
'resolution failure, NOT an empty ratchet. A missing blob at a named commit ' +
|
|
194
|
+
'means the read was wrong, not that the ratchet is empty.',
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
return parseBaselines(raw);
|
|
199
|
+
} catch {
|
|
200
|
+
throw new BaselineResolutionError(
|
|
201
|
+
`${relPath} at ${sha.slice(0, 9)} is not parseable JSON — refusing to continue ` +
|
|
202
|
+
'with an unknown policy.',
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* The merge-base reading, kept as a DIAGNOSTIC and never as the verdict.
|
|
209
|
+
*
|
|
210
|
+
* Both council seats asked for this explicitly. It does not decide pass/fail; it
|
|
211
|
+
* distinguishes two failures a reader cannot otherwise tell apart:
|
|
212
|
+
*
|
|
213
|
+
* - `branch-regression` — the branch itself made the count worse. Fix the code.
|
|
214
|
+
* - `main-tightened` — the branch is unchanged and `main` improved underneath
|
|
215
|
+
* it. Rebase, then re-run.
|
|
216
|
+
*
|
|
217
|
+
* The distinction matters because the remediations differ, and one seat was
|
|
218
|
+
* pointed about the wording: "rebase and re-run" is incomplete advice for a PR
|
|
219
|
+
* that genuinely reintroduced violations, so a diagnostic must say which case it
|
|
220
|
+
* is rather than always suggesting a rebase.
|
|
221
|
+
*/
|
|
222
|
+
export type RegressionCause = 'branch-regression' | 'main-tightened' | 'none';
|
|
223
|
+
|
|
224
|
+
export function diagnoseRegression(opts: {
|
|
225
|
+
actual: number;
|
|
226
|
+
targetBaseline: number;
|
|
227
|
+
mergeBaseBaseline: number | null;
|
|
228
|
+
}): RegressionCause {
|
|
229
|
+
if (opts.actual <= opts.targetBaseline) return 'none';
|
|
230
|
+
if (opts.mergeBaseBaseline === null) return 'branch-regression';
|
|
231
|
+
// The branch is at or under the policy it branched from, and it still
|
|
232
|
+
// exceeds the target's policy: main tightened while this work was open.
|
|
233
|
+
return opts.actual <= opts.mergeBaseBaseline ? 'main-tightened' : 'branch-regression';
|
|
234
|
+
}
|
|
235
|
+
|
|
114
236
|
export interface RatchetOptions {
|
|
115
237
|
/** Gate name — the key in the baseline file. */
|
|
116
238
|
gate: string;
|
|
@@ -122,6 +244,12 @@ export interface RatchetOptions {
|
|
|
122
244
|
baselineRel?: string;
|
|
123
245
|
/** Override "now" as `YYYY-MM-DD` (tests); defaults to the current UTC date. */
|
|
124
246
|
today?: string;
|
|
247
|
+
/**
|
|
248
|
+
* Read the governing baseline from this commit instead of the working tree.
|
|
249
|
+
* Defaults to `process.env[TARGET_REF_ENV]`; absent means a local run with
|
|
250
|
+
* no merge to judge, which is not the same as a failed resolution.
|
|
251
|
+
*/
|
|
252
|
+
targetRef?: string;
|
|
125
253
|
}
|
|
126
254
|
|
|
127
255
|
/**
|
|
@@ -131,9 +259,30 @@ export interface RatchetOptions {
|
|
|
131
259
|
* does not print or exit. A gate with no entry behaves exactly as it did before
|
|
132
260
|
* the ratchet existed: any violation fails.
|
|
133
261
|
*/
|
|
262
|
+
/**
|
|
263
|
+
* The env var that switches every ratchet onto the ABSOLUTE invariant at once.
|
|
264
|
+
*
|
|
265
|
+
* Set it to the target ref (`origin/main`, or the base SHA a PR job already
|
|
266
|
+
* knows) and all 18 `checkRatchet` call sites read the governing baseline from
|
|
267
|
+
* that commit instead of the working tree — no per-gate migration, no chance of
|
|
268
|
+
* migrating seventeen and forgetting one.
|
|
269
|
+
*
|
|
270
|
+
* **Unset is not a fallback.** A local run with no target configured has no
|
|
271
|
+
* merge to judge, so the working-tree read is the right and only answer there.
|
|
272
|
+
* What the council forbade is different and is honoured: a target that IS
|
|
273
|
+
* configured and fails to resolve throws, rather than quietly reverting to the
|
|
274
|
+
* working tree and changing the governing policy on an infrastructure error.
|
|
275
|
+
*/
|
|
276
|
+
export const TARGET_REF_ENV = 'GATE_BASELINE_TARGET_REF';
|
|
277
|
+
|
|
134
278
|
export function checkRatchet(opts: RatchetOptions): BaselineVerdict {
|
|
135
279
|
const { gate, actual } = opts;
|
|
136
|
-
const
|
|
280
|
+
const rel = opts.baselineRel ?? BASELINE_REL;
|
|
281
|
+
const target = opts.targetRef ?? process.env[TARGET_REF_ENV];
|
|
282
|
+
const file =
|
|
283
|
+
target !== undefined && target !== ''
|
|
284
|
+
? loadBaselinesAt(opts.repoRoot, target, rel)
|
|
285
|
+
: loadBaselines(opts.repoRoot, rel);
|
|
137
286
|
const entry = file.gates[gate];
|
|
138
287
|
|
|
139
288
|
if (entry === undefined) {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The attribution line a generated artifact carries.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-consumer-repo-reality` Phase 1, step 1.4: "A generated file that
|
|
5
|
+
* names the script that wrote it becomes a lie the moment that script moves.
|
|
6
|
+
* Emit a stable, resolvable reference instead."
|
|
7
|
+
*
|
|
8
|
+
* IT ALREADY HAPPENED, which is why this module exists rather than a style
|
|
9
|
+
* note. Measured 2026-08-26 across `src/`, ten generated artifacts named their
|
|
10
|
+
* generator by literal path and **six of those paths did not resolve**:
|
|
11
|
+
*
|
|
12
|
+
* scripts/audit_user_type_axis.py scripts/adoption_report.py
|
|
13
|
+
* scripts/skill_overlap.py scripts/gen_discovery_baseline.py
|
|
14
|
+
* scripts/generate_ownership_matrix.py
|
|
15
|
+
* scripts/generate_pack_manifests.ts
|
|
16
|
+
*
|
|
17
|
+
* The first five were retired by the py2ts migration (ADR-200) and the sixth by
|
|
18
|
+
* the `scripts/` → `src/scripts/` move. Each artifact kept telling its reader to
|
|
19
|
+
* go look at a file that is not there — the same over-reporting failure Phase 1
|
|
20
|
+
* measures in consumer root instruction files, produced by this package's own
|
|
21
|
+
* generators.
|
|
22
|
+
*
|
|
23
|
+
* THE STABLE REFERENCE IS THE COMMAND, NOT THE PATH. A path is an
|
|
24
|
+
* implementation detail that a refactor moves; the command a human runs to
|
|
25
|
+
* regenerate is the thing that stays true, and it is also the only half of the
|
|
26
|
+
* attribution a reader can act on. Where no command exists, the generator's
|
|
27
|
+
* MODULE NAME is used — stable under a directory move, and greppable.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* `Generated by <ref>. Do not edit.` — with `ref` a command or a module name,
|
|
32
|
+
* never a path.
|
|
33
|
+
*
|
|
34
|
+
* @param ref the regeneration command (`agent-config sync`, `task sync`) or
|
|
35
|
+
* the generator's module name (`regenerate_index`). A value
|
|
36
|
+
* containing a path separator is a bug this function refuses
|
|
37
|
+
* rather than emits, because emitting it is exactly the defect.
|
|
38
|
+
* @param detail optional trailing clause, e.g. a source description. No
|
|
39
|
+
* timestamp: a regenerated timestamp makes every run a diff.
|
|
40
|
+
*/
|
|
41
|
+
export function generatedBy(ref: string, detail?: string): string {
|
|
42
|
+
if (ref.includes('/') || ref.includes('\\')) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`generatedBy: "${ref}" contains a path separator. The attribution must be a command or a ` +
|
|
45
|
+
'module name — a literal path becomes wrong the moment the file moves, which is the ' +
|
|
46
|
+
'defect this helper exists to prevent (road-to-consumer-repo-reality 1.4).',
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
const tail = detail === undefined || detail.trim() === '' ? '' : ` ${detail.trim()}`;
|
|
50
|
+
return `Generated by \`${ref}\`. Do not edit.${tail}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The same line as a markdown blockquote, the shape most emitters use. */
|
|
54
|
+
export function generatedByQuote(ref: string, detail?: string): string {
|
|
55
|
+
return `> ${generatedBy(ref, detail)}`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The same line as an italic footer, for artifacts that use one. */
|
|
59
|
+
export function generatedByItalic(ref: string, detail?: string): string {
|
|
60
|
+
return `_${generatedBy(ref, detail)}_`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** The same line as a `#` comment, for YAML and INI-shaped output. */
|
|
64
|
+
export function generatedByComment(ref: string, detail?: string): string {
|
|
65
|
+
return `# ${generatedBy(ref, detail)}`;
|
|
66
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-registered guards for the governed harness-evolution programme.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-governed-harness-evolution` Phase 0, steps 0.4, 0.5 and 0.6. All
|
|
5
|
+
* three are PRE-REGISTRATION: the runner they guard does not exist yet (Phases
|
|
6
|
+
* 1-7 are unbuilt), and that is the point — a budget invariant written after
|
|
7
|
+
* the first run is a description of what was spent, and a leakage abort written
|
|
8
|
+
* after the first leak is a post-mortem.
|
|
9
|
+
*
|
|
10
|
+
* The three guards, and the failure each exists to make impossible:
|
|
11
|
+
*
|
|
12
|
+
* 0.4 EVALUATOR TRUST BOUNDARY. The parent design named which fields are
|
|
13
|
+
* proposer-visible and which are evaluator-private, and stopped at the
|
|
14
|
+
* naming. A declared boundary that nothing checks is a boundary that
|
|
15
|
+
* holds until the first convenient exception. {@link discloseToProposer}
|
|
16
|
+
* refuses a holdout field and records every field it did release.
|
|
17
|
+
*
|
|
18
|
+
* 0.5 BUDGET INVARIANT. Candidate count, trial repetitions and a spend
|
|
19
|
+
* ceiling, fixed BEFORE the run and aborting rather than truncating. A
|
|
20
|
+
* truncated run yields `underpowered`, which `paired_verdict` refuses to
|
|
21
|
+
* call a pass (`_lib/paired_verdict.ts:26`) and which a reader mistakes
|
|
22
|
+
* for one.
|
|
23
|
+
*
|
|
24
|
+
* 0.6 EPISTEMIC STOP CONDITIONS. A spend cap stops on cost; most of the
|
|
25
|
+
* reasons to stop are about VALIDITY. Each condition below carries a
|
|
26
|
+
* detector or is explicitly marked model-carried — never implied to be
|
|
27
|
+
* checked when it is not.
|
|
28
|
+
*
|
|
29
|
+
* Nothing here spends, fetches, or writes. The guards are pure functions over
|
|
30
|
+
* declared state so a future runner can call them before it does any of those.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* What a field may be shown to.
|
|
35
|
+
*
|
|
36
|
+
* `holdout` is the load-bearing member: it names a value whose disclosure
|
|
37
|
+
* INVALIDATES the run rather than merely leaking information, which is why
|
|
38
|
+
* {@link discloseToProposer} aborts on it instead of redacting.
|
|
39
|
+
*/
|
|
40
|
+
export type VisibilityClass =
|
|
41
|
+
/** The proposer may read it. Candidate text, public metric names, the task. */
|
|
42
|
+
| 'proposer-visible'
|
|
43
|
+
/** The evaluator reads it; the proposer never does. Per-trial raw scores. */
|
|
44
|
+
| 'evaluator-private'
|
|
45
|
+
/** Sealed-partition truth. Disclosure invalidates the run, not just the trial. */
|
|
46
|
+
| 'holdout';
|
|
47
|
+
|
|
48
|
+
/** One observation field and the boundary it sits behind. */
|
|
49
|
+
export interface FieldVisibility {
|
|
50
|
+
readonly field: string;
|
|
51
|
+
readonly visibility: VisibilityClass;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** A field released to a proposer, with the class it was released under. */
|
|
55
|
+
export interface DisclosureRecord {
|
|
56
|
+
readonly field: string;
|
|
57
|
+
readonly visibility: VisibilityClass;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class HoldoutLeakError extends Error {
|
|
61
|
+
readonly field: string;
|
|
62
|
+
constructor(field: string) {
|
|
63
|
+
super(
|
|
64
|
+
`holdout leakage: field '${field}' is class 'holdout' and reached proposer context. ` +
|
|
65
|
+
'The run is INVALID, not degraded — a proposer that has seen sealed truth cannot ' +
|
|
66
|
+
'be evaluated against it, and no later stage can undo that. Abort, do not redact.',
|
|
67
|
+
);
|
|
68
|
+
this.name = 'HoldoutLeakError';
|
|
69
|
+
this.field = field;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Release an observation to a proposer, recording every field released.
|
|
75
|
+
*
|
|
76
|
+
* Fails CLOSED on an undeclared field: a field with no `visibility_class` is
|
|
77
|
+
* treated as `holdout`, because the alternative — defaulting to visible —
|
|
78
|
+
* makes forgetting to classify a new field silently equivalent to publishing
|
|
79
|
+
* it. Step 0.4's whole subject is that a declared boundary nothing checks is
|
|
80
|
+
* not a boundary.
|
|
81
|
+
*
|
|
82
|
+
* @throws {HoldoutLeakError} on the first holdout or undeclared field.
|
|
83
|
+
*/
|
|
84
|
+
export function discloseToProposer(
|
|
85
|
+
observation: Readonly<Record<string, unknown>>,
|
|
86
|
+
schema: readonly FieldVisibility[],
|
|
87
|
+
log: DisclosureRecord[],
|
|
88
|
+
): Record<string, unknown> {
|
|
89
|
+
const byField = new Map(schema.map((f) => [f.field, f.visibility]));
|
|
90
|
+
const out: Record<string, unknown> = {};
|
|
91
|
+
for (const field of Object.keys(observation)) {
|
|
92
|
+
const visibility = byField.get(field) ?? 'holdout';
|
|
93
|
+
if (visibility === 'holdout') throw new HoldoutLeakError(field);
|
|
94
|
+
if (visibility !== 'proposer-visible') continue;
|
|
95
|
+
log.push({ field, visibility });
|
|
96
|
+
out[field] = observation[field];
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The budget fixed before a run. Every field is a ceiling, never a target. */
|
|
102
|
+
export interface RunBudget {
|
|
103
|
+
readonly maxCandidates: number;
|
|
104
|
+
readonly maxTrialsPerCandidate: number;
|
|
105
|
+
/** Spend ceiling in whole cents, so no float ever decides an abort. */
|
|
106
|
+
readonly maxSpendCents: number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** What a run intends to do, as declared before it starts. */
|
|
110
|
+
export interface RunPlan {
|
|
111
|
+
readonly candidates: number;
|
|
112
|
+
readonly trialsPerCandidate: number;
|
|
113
|
+
readonly estimatedSpendCents: number;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export class BudgetExceededError extends Error {
|
|
117
|
+
readonly dimension: 'candidates' | 'trials' | 'spend';
|
|
118
|
+
constructor(dimension: 'candidates' | 'trials' | 'spend', planned: number, ceiling: number) {
|
|
119
|
+
super(
|
|
120
|
+
`budget invariant: planned ${dimension} ${String(planned)} exceeds the pre-registered ` +
|
|
121
|
+
`ceiling ${String(ceiling)}. ABORTING BEFORE THE RUN, not truncating it — a ` +
|
|
122
|
+
'truncated run yields `underpowered`, which paired_verdict refuses to call a pass ' +
|
|
123
|
+
'and which a reader mistakes for one.',
|
|
124
|
+
);
|
|
125
|
+
this.name = 'BudgetExceededError';
|
|
126
|
+
this.dimension = dimension;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Check a plan against the pre-registered budget, BEFORE anything is spent.
|
|
132
|
+
*
|
|
133
|
+
* The order is deliberate — candidates, then trials, then spend. The first two
|
|
134
|
+
* are free to check and the third is the one an operator argues about; failing
|
|
135
|
+
* on a countable dimension first makes the message actionable without any
|
|
136
|
+
* pricing discussion.
|
|
137
|
+
*
|
|
138
|
+
* @throws {BudgetExceededError} on the first dimension over its ceiling.
|
|
139
|
+
*/
|
|
140
|
+
export function assertWithinBudget(plan: RunPlan, budget: RunBudget): void {
|
|
141
|
+
if (plan.candidates > budget.maxCandidates) {
|
|
142
|
+
throw new BudgetExceededError('candidates', plan.candidates, budget.maxCandidates);
|
|
143
|
+
}
|
|
144
|
+
if (plan.trialsPerCandidate > budget.maxTrialsPerCandidate) {
|
|
145
|
+
throw new BudgetExceededError('trials', plan.trialsPerCandidate, budget.maxTrialsPerCandidate);
|
|
146
|
+
}
|
|
147
|
+
if (plan.estimatedSpendCents > budget.maxSpendCents) {
|
|
148
|
+
throw new BudgetExceededError('spend', plan.estimatedSpendCents, budget.maxSpendCents);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* A stop condition, and whether anything actually checks it.
|
|
154
|
+
*
|
|
155
|
+
* `detector: null` means MODEL-CARRIED and is written out rather than left to
|
|
156
|
+
* inference. This repository's own records name the coverage-inflation failure
|
|
157
|
+
* — a condition listed as if it were enforced when nothing enforces it — often
|
|
158
|
+
* enough that the honest field is cheaper than the audit that finds it later.
|
|
159
|
+
*/
|
|
160
|
+
export interface StopCondition {
|
|
161
|
+
readonly id: string;
|
|
162
|
+
readonly why: string;
|
|
163
|
+
/** The exported detector's name, or `null` for model-carried. */
|
|
164
|
+
readonly detector: string | null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* The four epistemic stop conditions, from the roadmap's step 0.6.
|
|
169
|
+
*
|
|
170
|
+
* Both parent designs carried eight or nine stop conditions; the master
|
|
171
|
+
* compressed them into the budget cap. A spend cap stops on COST, and these
|
|
172
|
+
* stop on VALIDITY — stopping with INDETERMINATE is a valid result, and an
|
|
173
|
+
* honest null is a success when it prevents unnecessary architecture.
|
|
174
|
+
*/
|
|
175
|
+
export const STOP_CONDITIONS: readonly StopCondition[] = [
|
|
176
|
+
{
|
|
177
|
+
id: 'holdout-underpowered',
|
|
178
|
+
why: 'the sealed partition no longer carries enough discordant trials for the exact sign test to resolve, so every verdict it produces is `underpowered` by construction',
|
|
179
|
+
detector: 'holdoutUnderpowered',
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'evaluator-leakage',
|
|
183
|
+
why: 'a holdout field reached proposer context; the run is invalid rather than degraded, and no later stage can undo it',
|
|
184
|
+
detector: 'discloseToProposer',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: 'diversity-collapse',
|
|
188
|
+
why: 'the candidate set has collapsed to semantic duplicates, so the trials measure sampling noise rather than a difference between candidates',
|
|
189
|
+
detector: 'diversityCollapsed',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
id: 'cross-component-interference',
|
|
193
|
+
why: 'two components changed in one run and credit cannot be assigned to either',
|
|
194
|
+
// Honest null: deciding whether two changes interfere needs a causal
|
|
195
|
+
// model of the components, and this programme has none. Marked
|
|
196
|
+
// model-carried rather than given a detector that would pattern-match
|
|
197
|
+
// on file paths and report confidence it does not have.
|
|
198
|
+
detector: null,
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Has the candidate set collapsed to semantic duplicates?
|
|
204
|
+
*
|
|
205
|
+
* Deterministic and deliberately crude: normalise, then count DISTINCT
|
|
206
|
+
* candidates. Below `minDistinct` the set is collapsed. No embedding, no model
|
|
207
|
+
* call — a detector that needs a model to decide whether to stop a model run is
|
|
208
|
+
* a detector that can fail in the same way as the thing it watches.
|
|
209
|
+
*
|
|
210
|
+
* Normalisation is case- and whitespace-folding only. Two candidates differing
|
|
211
|
+
* by a synonym read as distinct here, which UNDER-detects; that direction is
|
|
212
|
+
* chosen on purpose, because a false stop discards a valid run while a missed
|
|
213
|
+
* stop is caught by the verdict coming back `no-change`.
|
|
214
|
+
*/
|
|
215
|
+
export function diversityCollapsed(candidates: readonly string[], minDistinct = 2): boolean {
|
|
216
|
+
const normalised = new Set(candidates.map((c) => c.trim().toLowerCase().replace(/\s+/g, ' ')));
|
|
217
|
+
return normalised.size < minDistinct;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Is the holdout partition too small for the exact sign test to resolve?
|
|
222
|
+
*
|
|
223
|
+
* Mirrors `paired_verdict`'s own floor rather than restating a number:
|
|
224
|
+
* `MIN_DISCORDANT` there is DERIVED from the exact test at ALPHA, not chosen,
|
|
225
|
+
* so a second hard-coded constant here would be a fork of a derivation.
|
|
226
|
+
*/
|
|
227
|
+
export function holdoutUnderpowered(discordantTrials: number, minDiscordant: number): boolean {
|
|
228
|
+
return discordantTrials < minDiscordant;
|
|
229
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does any of this configuration take effect here?
|
|
3
|
+
* (`road-to-delivered-cost-truth` Phase 3.)
|
|
4
|
+
*
|
|
5
|
+
* `doctorShell` states its own scope: Node version, package-root resolution,
|
|
6
|
+
* whether the Bash dispatcher exists. That is an ENVIRONMENT probe. It cannot
|
|
7
|
+
* answer whether a bound hook actually fires on this host — which is the
|
|
8
|
+
* question that decides whether any of the configuration this suite ships is
|
|
9
|
+
* doing anything here.
|
|
10
|
+
*
|
|
11
|
+
* FIVE STATES, NOT FOUR. The roadmap named four binding states; both council
|
|
12
|
+
* seats (2026-08-28, 2/2, resolving `how-far-the-effect-probe-may-reach` as
|
|
13
|
+
* option (c)) split one of them, and the split is real:
|
|
14
|
+
*
|
|
15
|
+
* effective fired, and a deny would have been honoured
|
|
16
|
+
* bound-discarded fired, and the host discards its output
|
|
17
|
+
* bound-not-fired the manifest binds it, and no dispatch was observed
|
|
18
|
+
* unbound the manifest does not bind it on this host
|
|
19
|
+
* unknown it was not safe to probe
|
|
20
|
+
*
|
|
21
|
+
* `bound-not-fired` and `unknown` were one bucket in the four-state model, and
|
|
22
|
+
* collapsing them hides the difference between "the host ignored it" and "we
|
|
23
|
+
* declined to look".
|
|
24
|
+
*
|
|
25
|
+
* ELIGIBILITY IS MEASURED, NOT DECLARED. Option (c) as written restricts
|
|
26
|
+
* dispatch to concerns that DECLARE themselves side-effect free, and both seats
|
|
27
|
+
* then said the same thing from different directions: a self-declared property
|
|
28
|
+
* nothing verifies is a weak control this repository flags as a defect
|
|
29
|
+
* elsewhere, and the dispatch should be sandboxed even for declared-safe
|
|
30
|
+
* concerns. Taken together that makes the declaration redundant — so this module
|
|
31
|
+
* measures the property instead: run the concern against a scratch root, compare
|
|
32
|
+
* the tree before and after, and treat any write as ineligible. A concern that
|
|
33
|
+
* writes is reported `unknown`, which is the honest answer and never a success.
|
|
34
|
+
*
|
|
35
|
+
* `unknown` IS NEVER RENDERED AS `effective`. That is the one rule every seat
|
|
36
|
+
* stated independently, and it is what the three coverage metrics exist to keep
|
|
37
|
+
* visible: a report can be truthful about each concern and still mislead, if
|
|
38
|
+
* almost nothing was actually probed.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
export const PROBE_STATES = ['effective', 'bound-discarded', 'bound-not-fired', 'unbound', 'unknown'] as const;
|
|
42
|
+
export type ProbeState = (typeof PROBE_STATES)[number];
|
|
43
|
+
|
|
44
|
+
/** The verdict a whole host gets. */
|
|
45
|
+
export const HOST_VERDICTS = ['effective', 'partial', 'inert', 'unknown'] as const;
|
|
46
|
+
export type HostVerdict = (typeof HOST_VERDICTS)[number];
|
|
47
|
+
|
|
48
|
+
export interface ConcernProbe {
|
|
49
|
+
concern: string;
|
|
50
|
+
slot: string;
|
|
51
|
+
state: ProbeState;
|
|
52
|
+
/** Always populated — for `unknown` it is the reason the probe declined. */
|
|
53
|
+
reason: string;
|
|
54
|
+
/** Did the sandbox observe a write? `null` when no dispatch was attempted. */
|
|
55
|
+
wrote_in_sandbox: boolean | null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface Coverage {
|
|
59
|
+
/** dispatched / total — tests the control itself. */
|
|
60
|
+
dispatch_rate: number;
|
|
61
|
+
/** non-unknown / total — where an answer exists at all. */
|
|
62
|
+
known_state_rate: number;
|
|
63
|
+
/** (effective + bound-discarded) / total — actual observed confidence. */
|
|
64
|
+
verified_rate: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface HostReport {
|
|
68
|
+
host: string;
|
|
69
|
+
probes: ConcernProbe[];
|
|
70
|
+
coverage: Coverage;
|
|
71
|
+
verdict: HostVerdict;
|
|
72
|
+
/** For `partial`, the slots that are inert. Empty otherwise. */
|
|
73
|
+
inert_slots: string[];
|
|
74
|
+
reason: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function rate(n: number, d: number): number {
|
|
78
|
+
return d === 0 ? 0 : n / d;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function coverageOf(probes: readonly ConcernProbe[]): Coverage {
|
|
82
|
+
const total = probes.length;
|
|
83
|
+
const dispatched = probes.filter((p) => p.wrote_in_sandbox !== null).length;
|
|
84
|
+
const known = probes.filter((p) => p.state !== 'unknown').length;
|
|
85
|
+
const verified = probes.filter((p) => p.state === 'effective' || p.state === 'bound-discarded').length;
|
|
86
|
+
return {
|
|
87
|
+
dispatch_rate: rate(dispatched, total),
|
|
88
|
+
known_state_rate: rate(known, total),
|
|
89
|
+
verified_rate: rate(verified, total),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* One verdict for the host.
|
|
95
|
+
*
|
|
96
|
+
* The ordering is the honesty: `unknown` is checked BEFORE `effective`, so a run
|
|
97
|
+
* that could not establish anything can never present itself as a working
|
|
98
|
+
* configuration. A single `effective` among a hundred `unknown`s is `unknown`,
|
|
99
|
+
* not `partial` — because the hundred were not measured, and `partial` is a
|
|
100
|
+
* claim about what IS inert rather than about what was not looked at.
|
|
101
|
+
*/
|
|
102
|
+
export function hostVerdict(probes: readonly ConcernProbe[]): { verdict: HostVerdict; inert: string[]; reason: string } {
|
|
103
|
+
if (probes.length === 0) {
|
|
104
|
+
return { verdict: 'unknown', inert: [], reason: 'no concern is bound on this host, so there is nothing to probe' };
|
|
105
|
+
}
|
|
106
|
+
const known = probes.filter((p) => p.state !== 'unknown');
|
|
107
|
+
if (known.length === 0) {
|
|
108
|
+
return {
|
|
109
|
+
verdict: 'unknown',
|
|
110
|
+
inert: [],
|
|
111
|
+
reason: `none of the ${String(probes.length)} bound concern(s) could be probed safely — no state was established`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const effective = known.filter((p) => p.state === 'effective');
|
|
115
|
+
const inertProbes = known.filter((p) => p.state === 'bound-discarded' || p.state === 'bound-not-fired' || p.state === 'unbound');
|
|
116
|
+
const inert = [...new Set(inertProbes.map((p) => p.slot))].sort();
|
|
117
|
+
|
|
118
|
+
if (effective.length === 0) {
|
|
119
|
+
return {
|
|
120
|
+
verdict: 'inert',
|
|
121
|
+
inert,
|
|
122
|
+
reason: `no probed concern reached the model on this host (${String(known.length)} of ${String(probes.length)} probed)`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (inertProbes.length === 0 && known.length === probes.length) {
|
|
126
|
+
return { verdict: 'effective', inert: [], reason: `every bound concern (${String(probes.length)}) took effect` };
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
verdict: 'partial',
|
|
130
|
+
inert,
|
|
131
|
+
reason:
|
|
132
|
+
`${String(effective.length)} of ${String(probes.length)} bound concern(s) took effect; ` +
|
|
133
|
+
`inert slot(s): ${inert.length === 0 ? 'none' : inert.join(', ')}` +
|
|
134
|
+
(known.length < probes.length ? ` · ${String(probes.length - known.length)} could not be probed` : ''),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function buildHostReport(host: string, probes: readonly ConcernProbe[]): HostReport {
|
|
139
|
+
const v = hostVerdict(probes);
|
|
140
|
+
return { host, probes: [...probes], coverage: coverageOf(probes), verdict: v.verdict, inert_slots: v.inert, reason: v.reason };
|
|
141
|
+
}
|