@event4u/agent-config 14.12.0 → 14.14.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 +118 -155
- 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 +145 -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/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-comment-discipline.md +6 -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 +252 -8
- package/dist/agent-src/scripts/guarded_baseline.ts +343 -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 +516 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
- 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/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 +17 -1
- 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/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
- 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/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 +45 -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-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-JJA2QEWA.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 +80 -11
- 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 +58 -58
- 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 +2900 -1049
- 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 +634 -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 +4895 -2627
- package/dist/server/schemas/settings.js +3 -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 +10 -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/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 +18 -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/llms.txt +2 -2
- package/package.json +5 -2
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
- package/src/agent-src/scripts/guarded_baseline.ts +343 -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 +516 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
- 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 +32 -3
- package/src/config/assurance-capability-registry.json +21 -9
- 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 +80 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +57 -36
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +729 -63
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +42 -19
- 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 +16 -15
- package/src/config/preamble-payload-budget.json +12 -4
- 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 +16 -2
- package/src/config/rule-stub-ceilings.json +133 -112
- package/src/config/turnaround-budget.json +66 -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 +23 -0
- package/src/scripts/_lib/activation_ladder.ts +255 -0
- package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/adr_frontmatter.ts +26 -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_pair_delta.ts +349 -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/carrier_status.ts +118 -0
- package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -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/corpus_manifest.ts +726 -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 +282 -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/estate_carrier_cases.ts +72 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_cascade.ts +452 -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/evolution_roi.ts +562 -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/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +239 -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/lexical_shortlist.ts +215 -0
- package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
- package/src/scripts/_lib/llm_proposer_transport.ts +153 -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/pathology_archive.ts +393 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/promotion_capability.ts +315 -0
- package/src/scripts/_lib/promotion_evidence.ts +414 -0
- package/src/scripts/_lib/promotion_review.ts +294 -0
- package/src/scripts/_lib/prompt_shape.ts +92 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/release_highlights.ts +70 -1
- package/src/scripts/_lib/release_material.ts +125 -2
- 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/routing_corpus.ts +307 -0
- package/src/scripts/_lib/routing_index_input.ts +104 -0
- package/src/scripts/_lib/rule_injection.ts +22 -1
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/semantic_noop.ts +167 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- 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/activation_receipt.ts +258 -0
- 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/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/cross_exam.ts +128 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/explain_route.ts +157 -0
- package/src/scripts/ai_council/information_gain.ts +293 -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/leakage_corpus.ts +385 -0
- package/src/scripts/ai_council/leakage_patterns.ts +453 -0
- package/src/scripts/ai_council/minority_retention.ts +171 -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/recouncil_savings.ts +299 -0
- package/src/scripts/ai_council/replay_route.ts +223 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
- package/src/scripts/ai_council/routing_training_row.ts +197 -0
- package/src/scripts/ai_council/synthesis_strategy.ts +159 -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 +131 -10
- 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 +34 -1
- package/src/scripts/check_claims.ts +576 -6
- 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 +347 -25
- 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 +114 -3
- 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_release_highlights.ts +96 -13
- package/src/scripts/check_roadmap_trackable.ts +17 -2
- 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 +26 -3
- 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/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/corpus_manifest.ts +235 -0
- 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/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +1153 -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 -16
- 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/comment_discipline_hook.ts +146 -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 +10 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
- 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/language_mirror_hook.ts +14 -2
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_carrier_integrity.ts +820 -0
- package/src/scripts/lint_code_comments.ts +643 -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_plan_risk_register.ts +39 -19
- package/src/scripts/lint_promotion_paths.ts +779 -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 +426 -23
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/llm_propose.ts +256 -0
- 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_delivery_sets.ts +361 -0
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/measure_routing_signal.ts +307 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +76 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_council_retention.ts +495 -0
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/release.ts +21 -37
- package/src/scripts/release_drill.ts +143 -0
- package/src/scripts/release_env.ts +35 -0
- package/src/scripts/release_publication.ts +84 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- 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/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 +3 -3
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +5 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* capture_rate — the measurement itself: numerator ÷ denominator, reported with
|
|
3
|
+
* a 95 % Wilson score interval, judged on the LOWER bound.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-supervised-telemetry-collector` step 1.2 item 9 and step 1.3 fixed
|
|
6
|
+
* the decision rule before any number existed, so it could not be chosen after:
|
|
7
|
+
*
|
|
8
|
+
* > Capture rate = numerator ÷ denominator, both as defined above, reported with
|
|
9
|
+
* > a **95 % Wilson score interval**. The target in 1.3 is met when the **lower
|
|
10
|
+
* > bound** of that interval is at or above the target — not the point estimate.
|
|
11
|
+
*
|
|
12
|
+
* > **≥ 90 % capture**, read as the lower bound of the 95 % Wilson interval,
|
|
13
|
+
* > over the **21-day window** and **≥ 2,000 eligible dispatches across ≥ 5
|
|
14
|
+
* > machines**.
|
|
15
|
+
*
|
|
16
|
+
* This module computes that, and nothing else. It does not decide, does not
|
|
17
|
+
* enable anything, and does not read the clock — the window boundaries are
|
|
18
|
+
* inputs, because a measurement module that reads `Date.now()` cannot be tested
|
|
19
|
+
* against a fixed window.
|
|
20
|
+
*
|
|
21
|
+
* ## Why it exists before the window does
|
|
22
|
+
*
|
|
23
|
+
* AI council, 2026-08-30 (DEGRADED — 1 of 2 seats; `openai` absent,
|
|
24
|
+
* `os_error: ENOBUFS`), on the disposition of Phase 6: the seat chose option (d)
|
|
25
|
+
* and made this a **prerequisite checkpoint between Phase 5 and Phase 6** rather
|
|
26
|
+
* than a substitute for 6.1 —
|
|
27
|
+
*
|
|
28
|
+
* > The synthetic test is a checkpoint, not a Phase 6 step. It answers "does the
|
|
29
|
+
* > instrument work?" before asking "what does it measure?"
|
|
30
|
+
*
|
|
31
|
+
* So: seeded opportunities and captures, an asserted ratio, an asserted Wilson
|
|
32
|
+
* bound, the minimum-sample boundary, malformed input, and duplicate
|
|
33
|
+
* suppression — all verifiable with zero elapsed days. **It proves the
|
|
34
|
+
* instrument. It claims nothing about the field measurement**, which needs 21
|
|
35
|
+
* days that no run can compress.
|
|
36
|
+
*
|
|
37
|
+
* ## NO PRODUCTION CALLER, and that is the honest state rather than an omission
|
|
38
|
+
*
|
|
39
|
+
* `judgeCapture`, `judgeEnablement` and `readOpportunities`' window parameter
|
|
40
|
+
* are called from tests and from nothing else (R2 round-4 finding 12). The
|
|
41
|
+
* consumer is Phase 6, which is parked: 6.1 needs a 21-day window, 6.2 reads
|
|
42
|
+
* these verdicts, and neither has run. Naming it here because this module's own
|
|
43
|
+
* argument — that the two halves of the ratio must age on the same clock — reads
|
|
44
|
+
* as if something computed the ratio today, and nothing does.
|
|
45
|
+
*
|
|
46
|
+
* It is deliberately NOT the same class as the two no-caller defects this
|
|
47
|
+
* change fixed. `spoolRecord` and `terminateCollector` had consumers that were
|
|
48
|
+
* supposed to exist and did not; these have a consumer that is scheduled and
|
|
49
|
+
* blocked, which is why the roadmap leaves AC-10 unchecked rather than claiming
|
|
50
|
+
* the instrument is in use.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/** The confidence level the decision rule fixes. Not a parameter — 1.2 item 9 names it. */
|
|
54
|
+
export const WILSON_Z = 1.959963984540054; // two-sided 95 %
|
|
55
|
+
|
|
56
|
+
/** The target from 1.3, as a proportion. Read as a LOWER bound, never a point estimate. */
|
|
57
|
+
export const CAPTURE_TARGET = 0.9;
|
|
58
|
+
|
|
59
|
+
/** Minimum sample from 1.2 items 7–8. Below this the reading is not eligible at all. */
|
|
60
|
+
export const MINIMUM_SAMPLE = 2_000;
|
|
61
|
+
export const MINIMUM_MACHINES = 5;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* No single machine may contribute more than this share of the denominator.
|
|
65
|
+
*
|
|
66
|
+
* The third sample constraint from 1.2 item 7, dropped by the first
|
|
67
|
+
* implementation (R2 round-5 finding 7) with its reason attached: *"a rate
|
|
68
|
+
* measured on one machine measures that machine's supervisor, not the
|
|
69
|
+
* population's"*. `MINIMUM_SAMPLE` and `MINIMUM_MACHINES` are both satisfiable
|
|
70
|
+
* by 1,996 dispatches from one machine and one apiece from four others.
|
|
71
|
+
*/
|
|
72
|
+
export const MAX_MACHINE_SHARE = 0.4;
|
|
73
|
+
export const WINDOW_DAYS = 21;
|
|
74
|
+
|
|
75
|
+
export interface Interval {
|
|
76
|
+
readonly lower: number;
|
|
77
|
+
readonly upper: number;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The Wilson score interval for a binomial proportion.
|
|
82
|
+
*
|
|
83
|
+
* Wilson rather than the normal approximation because the normal one is wrong
|
|
84
|
+
* exactly where this measurement lives: near a proportion of 1, it produces an
|
|
85
|
+
* upper bound above 1 and a spuriously narrow interval. At `n = 0` there is no
|
|
86
|
+
* proportion to estimate, and the honest interval is the whole range `[0, 1]` —
|
|
87
|
+
* NOT `[0, 0]`, which would read as "we measured zero capture" rather than "we
|
|
88
|
+
* measured nothing".
|
|
89
|
+
*/
|
|
90
|
+
export function wilsonInterval(successes: number, trials: number, z: number = WILSON_Z): Interval {
|
|
91
|
+
if (!Number.isInteger(successes) || !Number.isInteger(trials)) {
|
|
92
|
+
throw new TypeError('wilsonInterval: counts must be integers');
|
|
93
|
+
}
|
|
94
|
+
if (successes < 0 || trials < 0 || successes > trials) {
|
|
95
|
+
throw new RangeError(
|
|
96
|
+
`wilsonInterval: impossible counts (${successes} of ${trials})`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
if (trials === 0) return Object.freeze({ lower: 0, upper: 1 });
|
|
100
|
+
|
|
101
|
+
const p = successes / trials;
|
|
102
|
+
const z2 = z * z;
|
|
103
|
+
const denominator = 1 + z2 / trials;
|
|
104
|
+
const centre = p + z2 / (2 * trials);
|
|
105
|
+
const spread = z * Math.sqrt((p * (1 - p) + z2 / (4 * trials)) / trials);
|
|
106
|
+
return Object.freeze({
|
|
107
|
+
lower: Math.max(0, (centre - spread) / denominator),
|
|
108
|
+
upper: Math.min(1, (centre + spread) / denominator),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface CaptureReading {
|
|
113
|
+
/** Records that reached the store, de-duplicated. */
|
|
114
|
+
readonly numerator: number;
|
|
115
|
+
/** Dispatch opportunities recorded by the independent writer. */
|
|
116
|
+
readonly denominator: number;
|
|
117
|
+
/**
|
|
118
|
+
* Distinct machines contributing to the denominator.
|
|
119
|
+
*
|
|
120
|
+
* **NOT derivable from the denominator artifact as it ships**, and saying so
|
|
121
|
+
* is the honest form (R2 round-5 finding 8). `recordOpportunity` writes
|
|
122
|
+
* `date\tevent\tplatform` with no machine identifier, so the only place a
|
|
123
|
+
* machine id exists is the STORE — the numerator. Counting the floor there
|
|
124
|
+
* biases it in the same direction as everything else this module warns
|
|
125
|
+
* about: a machine that captured nothing contributes zero and the
|
|
126
|
+
* population looks smaller than it is.
|
|
127
|
+
*
|
|
128
|
+
* The field is therefore an INPUT the caller must supply from somewhere
|
|
129
|
+
* that knows, and Phase 6 is where that caller is built. Closing it means
|
|
130
|
+
* either a machine column on the opportunity line — which is a schema
|
|
131
|
+
* change and a privacy question, since a machine id beside a date is the
|
|
132
|
+
* fingerprint `FIELD_PURPOSE` argues against — or an out-of-band count.
|
|
133
|
+
* Neither is decided here.
|
|
134
|
+
*/
|
|
135
|
+
readonly machines: number;
|
|
136
|
+
/**
|
|
137
|
+
* The largest single machine's share of the denominator, 0..1.
|
|
138
|
+
*
|
|
139
|
+
* Same provenance problem as `machines`, same honest treatment: supplied by
|
|
140
|
+
* the caller, `null` when unknown. `null` is INELIGIBLE rather than
|
|
141
|
+
* passing — an unmeasured concentration is not a satisfied one.
|
|
142
|
+
*/
|
|
143
|
+
// `| undefined` explicitly: `exactOptionalPropertyTypes` is on, so an
|
|
144
|
+
// optional property does NOT implicitly accept `undefined` — and a caller
|
|
145
|
+
// that has not measured the share is exactly the case this field exists to
|
|
146
|
+
// report as ineligible.
|
|
147
|
+
readonly maxMachineShare?: number | null | undefined;
|
|
148
|
+
/** Whole days elapsed in the observation window. */
|
|
149
|
+
readonly windowDays: number;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export type EligibilityFailure =
|
|
153
|
+
| 'window-too-short'
|
|
154
|
+
| 'sample-too-small'
|
|
155
|
+
| 'too-few-machines'
|
|
156
|
+
| 'numerator-exceeds-denominator'
|
|
157
|
+
/** One machine contributes more than {@link MAX_MACHINE_SHARE} of the denominator. */
|
|
158
|
+
| 'machine-concentration'
|
|
159
|
+
/**
|
|
160
|
+
* A count that is negative, fractional, or not a number at all.
|
|
161
|
+
*
|
|
162
|
+
* Its own member rather than a shared "impossible" bucket, because the
|
|
163
|
+
* remedy differs: `numerator-exceeds-denominator` is a counting bug in the
|
|
164
|
+
* two writers, `malformed-counts` is a corrupt reading. Before this existed
|
|
165
|
+
* such a reading fell straight through to `wilsonInterval` and CRASHED —
|
|
166
|
+
* the one class of bad input this module's three-valued design was built to
|
|
167
|
+
* report rather than throw on (R2 finding 15).
|
|
168
|
+
*/
|
|
169
|
+
| 'malformed-counts';
|
|
170
|
+
|
|
171
|
+
export interface CaptureVerdict {
|
|
172
|
+
/** Point estimate. `null` when the denominator is 0 — a ratio, not a zero. */
|
|
173
|
+
readonly rate: number | null;
|
|
174
|
+
readonly interval: Interval;
|
|
175
|
+
/** Whether the reading may be judged against the target at all. */
|
|
176
|
+
readonly eligible: boolean;
|
|
177
|
+
/** Why not. Empty when eligible. */
|
|
178
|
+
readonly ineligibleBecause: readonly EligibilityFailure[];
|
|
179
|
+
/**
|
|
180
|
+
* `true` / `false` only when eligible; `null` when the reading cannot be
|
|
181
|
+
* judged. A three-valued verdict, because "not eligible" collapsed to
|
|
182
|
+
* `false` reads as a MISS — and a miss triggers 6.3's decision record for a
|
|
183
|
+
* measurement that never happened.
|
|
184
|
+
*/
|
|
185
|
+
readonly meetsTarget: boolean | null;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Judge a reading against the 1.3 target.
|
|
190
|
+
*
|
|
191
|
+
* Eligibility is checked BEFORE the comparison and reported separately, because
|
|
192
|
+
* the two questions have different consequences: an ineligible reading means
|
|
193
|
+
* keep observing, a miss means run 6.3. Collapsing them is how a 200-dispatch
|
|
194
|
+
* sample becomes a recorded failure.
|
|
195
|
+
*/
|
|
196
|
+
export function judgeCapture(
|
|
197
|
+
reading: CaptureReading,
|
|
198
|
+
target: number = CAPTURE_TARGET,
|
|
199
|
+
): CaptureVerdict {
|
|
200
|
+
const failures: EligibilityFailure[] = [];
|
|
201
|
+
|
|
202
|
+
// Checked FIRST, and it is the guard that keeps `wilsonInterval` from
|
|
203
|
+
// raising: that function throws on a negative or fractional count, by
|
|
204
|
+
// design, and a judge that propagates the throw cannot report anything.
|
|
205
|
+
const countsAreSane =
|
|
206
|
+
Number.isInteger(reading.numerator)
|
|
207
|
+
&& Number.isInteger(reading.denominator)
|
|
208
|
+
&& reading.numerator >= 0
|
|
209
|
+
&& reading.denominator >= 0;
|
|
210
|
+
if (!countsAreSane) failures.push('malformed-counts');
|
|
211
|
+
else if (reading.numerator > reading.denominator) {
|
|
212
|
+
failures.push('numerator-exceeds-denominator');
|
|
213
|
+
}
|
|
214
|
+
if (!Number.isFinite(reading.windowDays) || reading.windowDays < WINDOW_DAYS) {
|
|
215
|
+
failures.push('window-too-short');
|
|
216
|
+
}
|
|
217
|
+
if (!Number.isFinite(reading.denominator) || reading.denominator < MINIMUM_SAMPLE) {
|
|
218
|
+
failures.push('sample-too-small');
|
|
219
|
+
}
|
|
220
|
+
if (!Number.isFinite(reading.machines) || reading.machines < MINIMUM_MACHINES) {
|
|
221
|
+
failures.push('too-few-machines');
|
|
222
|
+
}
|
|
223
|
+
const share = reading.maxMachineShare;
|
|
224
|
+
if (share === undefined || share === null || !Number.isFinite(share) || share > MAX_MACHINE_SHARE) {
|
|
225
|
+
failures.push('machine-concentration');
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const uncomputable =
|
|
229
|
+
failures.includes('numerator-exceeds-denominator') || failures.includes('malformed-counts');
|
|
230
|
+
const interval = uncomputable
|
|
231
|
+
? Object.freeze({ lower: 0, upper: 1 })
|
|
232
|
+
: wilsonInterval(reading.numerator, reading.denominator);
|
|
233
|
+
const rate =
|
|
234
|
+
uncomputable || reading.denominator === 0
|
|
235
|
+
? null
|
|
236
|
+
: reading.numerator / reading.denominator;
|
|
237
|
+
const eligible = failures.length === 0;
|
|
238
|
+
|
|
239
|
+
return Object.freeze({
|
|
240
|
+
rate,
|
|
241
|
+
interval,
|
|
242
|
+
eligible,
|
|
243
|
+
ineligibleBecause: Object.freeze(failures),
|
|
244
|
+
// The lower bound, never the point estimate. A point estimate that
|
|
245
|
+
// clears the target on a sample whose interval straddles it has not
|
|
246
|
+
// cleared it, and 1.2 item 9 fixed that before the number existed.
|
|
247
|
+
meetsTarget: eligible ? interval.lower >= target : null,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The six readings 6.2 requires, as a type that cannot be partially filled.
|
|
253
|
+
*
|
|
254
|
+
* Every field is required and `null` is a legal value meaning **not recorded**.
|
|
255
|
+
* That is the shape the step demands — *"a missing reading blocks the flip"* —
|
|
256
|
+
* and an optional field would let a caller omit one and still typecheck.
|
|
257
|
+
*
|
|
258
|
+
* The type is not the enforcement, though, and treating it as such was a defect:
|
|
259
|
+
* {@link judgeEnablement} accepts only a literal `true`, so a key absent at
|
|
260
|
+
* RUNTIME blocks the flip exactly like an explicit `null`. A compile-time
|
|
261
|
+
* guarantee does not survive `JSON.parse` or a cast, and these readings are
|
|
262
|
+
* precisely the kind of object that arrives through both.
|
|
263
|
+
*/
|
|
264
|
+
export interface EnablementReadings {
|
|
265
|
+
readonly captureTargetMet: boolean | null;
|
|
266
|
+
readonly lifecycleGreenOnEveryPlatform: boolean | null;
|
|
267
|
+
readonly resourceBudgetsMet: boolean | null;
|
|
268
|
+
readonly noPrivacyOrIntegrityIncident: boolean | null;
|
|
269
|
+
readonly staticModeCompatible: boolean | null;
|
|
270
|
+
readonly windowAndSampleSatisfied: boolean | null;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export const ENABLEMENT_READING_NAMES = [
|
|
274
|
+
'captureTargetMet',
|
|
275
|
+
'lifecycleGreenOnEveryPlatform',
|
|
276
|
+
'resourceBudgetsMet',
|
|
277
|
+
'noPrivacyOrIntegrityIncident',
|
|
278
|
+
'staticModeCompatible',
|
|
279
|
+
'windowAndSampleSatisfied',
|
|
280
|
+
] as const;
|
|
281
|
+
|
|
282
|
+
export interface EnablementVerdict {
|
|
283
|
+
readonly flip: boolean;
|
|
284
|
+
/** Readings that are `null`. A missing reading blocks, and is not a failure. */
|
|
285
|
+
readonly missing: readonly string[];
|
|
286
|
+
/** Readings that are `false`. */
|
|
287
|
+
readonly failed: readonly string[];
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Decide whether the default may flip.
|
|
292
|
+
*
|
|
293
|
+
* Missing and failed are reported separately for the same reason eligibility is
|
|
294
|
+
* separate above: "we did not look" and "we looked and it was bad" call for
|
|
295
|
+
* different actions, and one of them is 6.3.
|
|
296
|
+
*/
|
|
297
|
+
export function judgeEnablement(readings: EnablementReadings): EnablementVerdict {
|
|
298
|
+
const missing: string[] = [];
|
|
299
|
+
const failed: string[] = [];
|
|
300
|
+
for (const name of ENABLEMENT_READING_NAMES) {
|
|
301
|
+
const value = readings[name];
|
|
302
|
+
// ACCEPT ONLY `true` (R2 round-3 finding 4). The first version tested
|
|
303
|
+
// `=== null` then `=== false`, so a key that was ABSENT at runtime was
|
|
304
|
+
// neither and still yielded `flip: true`. The type made omission a
|
|
305
|
+
// compile error and these readings are exactly the kind of object
|
|
306
|
+
// assembled from JSON or a cast — including in this module's own tests —
|
|
307
|
+
// so the guarantee held everywhere except where it mattered. The step's
|
|
308
|
+
// rule is "a missing reading blocks the flip", and only a positive test
|
|
309
|
+
// for `true` implements it.
|
|
310
|
+
if (value === true) continue;
|
|
311
|
+
if (value === false) failed.push(name);
|
|
312
|
+
else missing.push(name);
|
|
313
|
+
}
|
|
314
|
+
return Object.freeze({
|
|
315
|
+
flip: missing.length === 0 && failed.length === 0,
|
|
316
|
+
missing: Object.freeze(missing),
|
|
317
|
+
failed: Object.freeze(failed),
|
|
318
|
+
});
|
|
319
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `status: carrier` predicate, and the reasoning five readers share.
|
|
3
|
+
*
|
|
4
|
+
* A carrier is a roadmap whose job is to hold obligations deferred out of a
|
|
5
|
+
* parent that is already archived. Every item in it has an unmet resumption
|
|
6
|
+
* trigger, and it has no `## Phase` headings, so it is skipped wherever a draft
|
|
7
|
+
* is: the dashboard, `/roadmap:process-*`, the trackability check and the plan
|
|
8
|
+
* risk register. It differs from a draft in what it costs to remove — a draft
|
|
9
|
+
* may be deleted freely, a carrier may not.
|
|
10
|
+
*
|
|
11
|
+
* This module exists because the predicate had two implementations within one
|
|
12
|
+
* change and five callers within one week. Two implementations of one frontmatter
|
|
13
|
+
* test drift, and the one nobody runs locally drifts first — the same
|
|
14
|
+
* memory-twin failure this repository has already recorded against a fixture
|
|
15
|
+
* corpus. One test, one place, and the reasoning above lives beside it rather
|
|
16
|
+
* than being restated in each caller.
|
|
17
|
+
*
|
|
18
|
+
* The read is frontmatter-scoped on purpose. A fenced `status: carrier` inside a
|
|
19
|
+
* roadmap that documents the syntax is not a declaration, and a body-wide match
|
|
20
|
+
* turned exactly that into a hard failure before a review caught it.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** The frontmatter values that mean "not schedulable work, and not disposable". */
|
|
24
|
+
export const CARRIER_VALUES: ReadonlySet<string> = new Set(['carrier']);
|
|
25
|
+
|
|
26
|
+
/** The leading `---\n…\n---` block, or null when the text carries none. */
|
|
27
|
+
export function frontmatterBlock(text: string): string | null {
|
|
28
|
+
const m = /^---\n([\s\S]*?)\n---/.exec(text);
|
|
29
|
+
return m === null ? null : (m[1] ?? '');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** True when `text`'s FRONTMATTER declares one of {@link CARRIER_VALUES}. */
|
|
33
|
+
export function declaresCarrier(text: string | null | undefined): boolean {
|
|
34
|
+
if (text === null || text === undefined) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const fm = frontmatterBlock(text);
|
|
38
|
+
if (fm === null) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const m = /^status:[ \t]*([A-Za-z-]+)[ \t]*$/m.exec(fm);
|
|
42
|
+
return m !== null && CARRIER_VALUES.has((m[1] ?? '').toLowerCase());
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Count the top-level roadmaps in `roadmapRoot` that declare themselves carriers.
|
|
47
|
+
*
|
|
48
|
+
* Lives here rather than in the estate gate because it is the same fact as the
|
|
49
|
+
* predicate above, read over a directory instead of a string, and the gate that
|
|
50
|
+
* needs it is already at its source-size ceiling.
|
|
51
|
+
*
|
|
52
|
+
* @param isCandidate the caller's own roadmap-filename test, so this module does
|
|
53
|
+
* not acquire a second opinion about what counts as a roadmap.
|
|
54
|
+
*/
|
|
55
|
+
export function countDeclaredCarriers(
|
|
56
|
+
roadmapRoot: string,
|
|
57
|
+
isCandidate: (name: string) => boolean,
|
|
58
|
+
fsLike: {
|
|
59
|
+
readdirSync: (p: string) => string[];
|
|
60
|
+
statSync: (p: string) => { isFile: () => boolean };
|
|
61
|
+
readFileSync: (p: string, enc: 'utf-8') => string;
|
|
62
|
+
},
|
|
63
|
+
join: (...parts: string[]) => string,
|
|
64
|
+
): number {
|
|
65
|
+
let names: string[];
|
|
66
|
+
try {
|
|
67
|
+
names = fsLike.readdirSync(roadmapRoot);
|
|
68
|
+
} catch {
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
let n = 0;
|
|
72
|
+
for (const name of names) {
|
|
73
|
+
if (!name.endsWith('.md') || !isCandidate(name)) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const abs = join(roadmapRoot, name);
|
|
77
|
+
try {
|
|
78
|
+
if (!fsLike.statSync(abs).isFile()) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (declaresCarrier(fsLike.readFileSync(abs, 'utf-8'))) {
|
|
82
|
+
n += 1;
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return n;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Fixture design — why two of the estate self-test cases are shaped as they are.
|
|
93
|
+
*
|
|
94
|
+
* The reasoning behind two of `check_estate_count`'s self-test cases, kept here
|
|
95
|
+
* because the gate that holds them is at its source-size ceiling and because
|
|
96
|
+
* both facts are about the carrier status rather than about that gate.
|
|
97
|
+
*
|
|
98
|
+
* **The deletion case's addition is a DRAFT, and that is the whole design.**
|
|
99
|
+
* A carrier holds obligations lifted out of an already-archived parent, so
|
|
100
|
+
* paying an offset for removing one rewards the loss: the deletion buys nothing
|
|
101
|
+
* and the addition stays unpaid. With an *ordinary* addition the growth half and
|
|
102
|
+
* the unpaid half coincide — growth iff `n > a`, unpaid iff `n > a` — so the
|
|
103
|
+
* case rejected on two independent grounds and stayed red with the carrier
|
|
104
|
+
* branch reverted, asserting nothing about the feature it named. A draft is
|
|
105
|
+
* invisible to `collect()`, so the count half cannot move and only the offset
|
|
106
|
+
* scoring decides.
|
|
107
|
+
*
|
|
108
|
+
* **The count case asserts the flip BACK, not the flip TO.** A reclassification
|
|
109
|
+
* is not a disposal in either direction, but the flip *to* carrier cannot be
|
|
110
|
+
* asserted by exit code: it lowers the count, a count below the floor is a
|
|
111
|
+
* drawdown, and a drawdown is free whichever way carriers are counted. Its
|
|
112
|
+
* consequence is assertable — with carriers uncounted the flip lowers the floor,
|
|
113
|
+
* so flipping the same file back reads as growth and must be paid for. That is
|
|
114
|
+
* the fixture's state, with the carrier already in the base tree, and it rejects
|
|
115
|
+
* with the carrier term removed from the count. The neutrality of the forward
|
|
116
|
+
* flip is asserted directly in `check_estate_count.test.ts`, where a count is
|
|
117
|
+
* readable.
|
|
118
|
+
*/
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The twelve-stage evaluation cascade, DERIVED rather than enumerated by hand.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-governed-evidence-production` step 1.2. E9 (2026-08-30) decided the
|
|
5
|
+
* ARITY — twelve — and enumerated the stages nowhere. The 2026-08-31 council
|
|
6
|
+
* round that was asked for the enumeration returned `REVISE`, and the reason it
|
|
7
|
+
* gave is the reason this module exists rather than a constant list: running the
|
|
8
|
+
* same seat twice produced two materially different twelves — different names,
|
|
9
|
+
* different order, a different placement of the statistical stage.
|
|
10
|
+
*
|
|
11
|
+
* **So the enumeration is not proposed. It is computed.** Two committed arrays
|
|
12
|
+
* and one stated ordering rule determine it, and re-running the computation over
|
|
13
|
+
* the same tree cannot yield a different answer. Nobody's judgement is in the
|
|
14
|
+
* output, which is what "settled" has to mean after two judgements disagreed.
|
|
15
|
+
*
|
|
16
|
+
* ## The ordering rule
|
|
17
|
+
*
|
|
18
|
+
* Stages are ordered by the EVIDENCE each one needs — the `CascadeInput` field
|
|
19
|
+
* it reads — and within a class by source order. The classes, cheapest evidence
|
|
20
|
+
* first:
|
|
21
|
+
*
|
|
22
|
+
* | Rank | Class | Evidence it needs | `CascadeInput` field |
|
|
23
|
+
* |---|---|---|---|
|
|
24
|
+
* | 0 | `record` | the candidate record alone | `raw` |
|
|
25
|
+
* | 1 | `plan` | the run plan and the budget ceiling | `plan`, `budget` |
|
|
26
|
+
* | 2 | `peers` | the sibling candidates of this run | `peers` |
|
|
27
|
+
* | 3 | `receipt` | an activation receipt | `receipt` |
|
|
28
|
+
* | 4 | `measurement` | measured trials | `rows`, `vector` |
|
|
29
|
+
*
|
|
30
|
+
* The rule is not a preference. It is the cascade's own cheapest-first,
|
|
31
|
+
* abort-on-first-failure discipline restated over evidence rather than over
|
|
32
|
+
* cost: a stage may not run before the evidence it depends on could exist, and a
|
|
33
|
+
* candidate that fails a cheap-evidence stage must never consume the expensive
|
|
34
|
+
* evidence. `docs/contracts/activation-receipt-trust-boundary.md` EC-2 is the
|
|
35
|
+
* receipt row of exactly this table.
|
|
36
|
+
*
|
|
37
|
+
* ## What is NOT decided here
|
|
38
|
+
*
|
|
39
|
+
* The rung SEMANTICS — what `delivered` means, what observes it — belong to
|
|
40
|
+
* `_lib/activation_ladder.ts`, and the `REVISE` verdict's condition on them was
|
|
41
|
+
* discharged by the trust-boundary and evidence-cost contract, not by this file.
|
|
42
|
+
* This module settles the enumeration and its order, and nothing else.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
import { CASCADE_STAGES, type StageId } from './evaluation_cascade.js';
|
|
46
|
+
import { RECEIPT_STAGES } from './activation_ladder.js';
|
|
47
|
+
|
|
48
|
+
/** What evidence a stage needs. The ordering key. */
|
|
49
|
+
export const EVIDENCE_CLASSES = ['record', 'plan', 'peers', 'receipt', 'measurement'] as const;
|
|
50
|
+
export type EvidenceClass = (typeof EVIDENCE_CLASSES)[number];
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The evidence class of each DETERMINISTIC prefix stage.
|
|
54
|
+
*
|
|
55
|
+
* Written out because it is a fact about `runCascade`'s body — which
|
|
56
|
+
* `CascadeInput` field each stage reads — and a fact about code cannot be
|
|
57
|
+
* derived from a list of names. It is not unchecked: the companion test asserts
|
|
58
|
+
* this order against the order in which `runCascade` first touches each input
|
|
59
|
+
* field, so a stage that starts reading a different field reds here rather than
|
|
60
|
+
* quietly reordering the enumeration.
|
|
61
|
+
*/
|
|
62
|
+
export const PREFIX_EVIDENCE_CLASS: Readonly<Record<string, EvidenceClass>> = {
|
|
63
|
+
'schema-validity': 'record',
|
|
64
|
+
'path-ownership': 'record',
|
|
65
|
+
'holdout-disclosure': 'record',
|
|
66
|
+
budget: 'plan',
|
|
67
|
+
'near-duplicate': 'peers',
|
|
68
|
+
'metric-verdict': 'measurement',
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/** The evidence class of any stage. Receipt stages are uniformly `receipt`. */
|
|
72
|
+
export function evidenceClass(stage: StageId): EvidenceClass {
|
|
73
|
+
if ((RECEIPT_STAGES as readonly string[]).includes(stage)) return 'receipt';
|
|
74
|
+
const c = PREFIX_EVIDENCE_CLASS[stage];
|
|
75
|
+
if (c === undefined) throw new Error(`no evidence class declared for stage '${stage}'`);
|
|
76
|
+
return c;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The committed twelve, in order.
|
|
81
|
+
*
|
|
82
|
+
* Route A of step 1.2's reproduction: the two committed arrays, sorted by
|
|
83
|
+
* evidence class, stable within a class. `Array.prototype.sort` is specified as
|
|
84
|
+
* stable since ES2019, which is what makes "within a class, source order" a
|
|
85
|
+
* property of the language rather than of an implementation.
|
|
86
|
+
*/
|
|
87
|
+
export const TWELVE_STAGES: readonly StageId[] = [...CASCADE_STAGES, ...RECEIPT_STAGES].sort(
|
|
88
|
+
(a, b) => EVIDENCE_CLASSES.indexOf(evidenceClass(a)) - EVIDENCE_CLASSES.indexOf(evidenceClass(b)),
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
/** The arity E9 decided. Stated so a drift from twelve is a named failure. */
|
|
92
|
+
export const DECIDED_ARITY = 12;
|