@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,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pathology archive — best-known intervention per `WHERE x WHY` failure
|
|
3
|
+
* cell, over closed vocabularies, backed by append-only attempt history.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-governed-harness-evolution` step 4.4. A pure Pareto frontier orders
|
|
6
|
+
* candidates by their metric vectors and throws away the reason each candidate
|
|
7
|
+
* exists, so two candidates that fail for completely different reasons compete
|
|
8
|
+
* as if they were interchangeable. This module keeps the reason.
|
|
9
|
+
*
|
|
10
|
+
* ## What this is NOT
|
|
11
|
+
*
|
|
12
|
+
* It is not a second verdict beside `_lib/paired_verdict.ts`. Nothing here
|
|
13
|
+
* decides whether a candidate is better; the archive records WHY attempts
|
|
14
|
+
* failed and which intervention is currently RETAINED per cell. Promotion stays
|
|
15
|
+
* with `_lib/evaluation_vector.ts`'s `promotionVerdict`, which this module never
|
|
16
|
+
* calls and never reimplements.
|
|
17
|
+
*
|
|
18
|
+
* ## "Best" is a retained representative, not a quality claim
|
|
19
|
+
*
|
|
20
|
+
* The AI council of 2026-08-31 was explicit that "archive the best intervention
|
|
21
|
+
* per cell" names no operation until ranking, tie-break and replacement are all
|
|
22
|
+
* total. Two of the three candidate rules it enumerated need evidence systems
|
|
23
|
+
* that do not exist — lowest edit distance to a human gold standard (there is no
|
|
24
|
+
* gold standard) and highest measured failure-class coverage (there is no
|
|
25
|
+
* coverage metric). The third, recency, is trivially deterministic and is what
|
|
26
|
+
* ships. So the retained entry is a REPRESENTATIVE selected by recency, and this
|
|
27
|
+
* module says so in its type names rather than calling it "best" and implying a
|
|
28
|
+
* measurement nobody took.
|
|
29
|
+
*
|
|
30
|
+
* Because recency says nothing about quality, the attempt history is append-only
|
|
31
|
+
* and every ranking decision is stamped with `ranking_rule_version`. When a real
|
|
32
|
+
* quality metric arrives, representatives are RECOMPUTED from history rather
|
|
33
|
+
* than lost.
|
|
34
|
+
*
|
|
35
|
+
* ## Ordering is by sequence, never by timestamp
|
|
36
|
+
*
|
|
37
|
+
* `attempt_sequence` is assigned by the ingester, monotonically. Timestamps come
|
|
38
|
+
* from producer clocks: they collide, they arrive out of order, and they make a
|
|
39
|
+
* replacement rule that is not total. `observed_at` is retained for reporting
|
|
40
|
+
* and is never consulted for ordering.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import { LADDER_RUNGS, type LadderRung } from './activation_ladder.js';
|
|
44
|
+
|
|
45
|
+
/** `WHERE` — reused from the activation ladder, never re-invented. */
|
|
46
|
+
export const PATHOLOGY_WHERE = LADDER_RUNGS;
|
|
47
|
+
export type PathologyWhere = LadderRung;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* `WHY` — the closed failure-REASON vocabulary.
|
|
51
|
+
*
|
|
52
|
+
* Closed means: a versioned enum, exactly one value per attempt, and an addition
|
|
53
|
+
* requires a `classification_rule_version` bump plus migration. Free-form
|
|
54
|
+
* explanation belongs in `reason_detail` and never in this axis.
|
|
55
|
+
*
|
|
56
|
+
* The order IS the precedence order. When several reasons could apply, the
|
|
57
|
+
* earliest applicable value wins, so classification is deterministic rather than
|
|
58
|
+
* dependent on evaluation order. `reason_unknown` applies only when none of the
|
|
59
|
+
* first seven can be established — it is a real state, not a default.
|
|
60
|
+
*
|
|
61
|
+
* These are REASONS, deliberately not places. An earlier draft of this
|
|
62
|
+
* vocabulary used names like `projection_failed` and `delivery_failed`, which
|
|
63
|
+
* restate `WHERE` and collapse the very distinction the two axes exist to draw.
|
|
64
|
+
*/
|
|
65
|
+
export const PATHOLOGY_WHY = [
|
|
66
|
+
'precondition_unsatisfied',
|
|
67
|
+
'policy_blocked',
|
|
68
|
+
'dependency_unavailable',
|
|
69
|
+
'execution_failed',
|
|
70
|
+
'output_contract_violated',
|
|
71
|
+
'evidence_missing',
|
|
72
|
+
'human_rejected',
|
|
73
|
+
'reason_unknown',
|
|
74
|
+
] as const;
|
|
75
|
+
export type PathologyWhy = (typeof PATHOLOGY_WHY)[number];
|
|
76
|
+
|
|
77
|
+
/** Bumped when the cell/query shape changes. */
|
|
78
|
+
export const ARCHIVE_SCHEMA_VERSION = 1;
|
|
79
|
+
/** Bumped when `PATHOLOGY_WHY` or its precedence changes. */
|
|
80
|
+
export const CLASSIFICATION_RULE_VERSION = 1;
|
|
81
|
+
/** Bumped when the ranking/tie-break/replacement rule changes. */
|
|
82
|
+
export const RANKING_RULE_VERSION = 1;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Dominance threshold for the search-collapse guard.
|
|
86
|
+
*
|
|
87
|
+
* STATED POLICY DEFAULT, not a measured optimum — and deliberately a NEW
|
|
88
|
+
* constant rather than a reuse.
|
|
89
|
+
*
|
|
90
|
+
* The step's own verify line carries a bare `0.6`, and the prior council warned
|
|
91
|
+
* that reusing it would be "a semantic change wearing a constant's clothes" IF
|
|
92
|
+
* it already meant textual similarity. Checked against the tree on 2026-08-31:
|
|
93
|
+
* it does not, because no such constant exists. `diversityCollapsed`
|
|
94
|
+
* (`_lib/harness_evolution_guards.ts:215`) is a DISTINCT-COUNT check with
|
|
95
|
+
* `minDistinct = 2` and no ratio at all, and the only near-duplicate constant is
|
|
96
|
+
* `NEAR_DUPLICATE_THRESHOLD = 70` in `_lib/curator_ops.ts:106` — an integer
|
|
97
|
+
* percentage on a different scale. So the collision the objection feared is not
|
|
98
|
+
* present, and the number below is free to be given its own meaning.
|
|
99
|
+
*
|
|
100
|
+
* Revisit-if: a run records a collapse the guard did not catch, or a warm-up
|
|
101
|
+
* period in which the floor below suppressed a real signal.
|
|
102
|
+
*/
|
|
103
|
+
export const PATHOLOGY_DOMINANCE_THRESHOLD = 0.6;
|
|
104
|
+
/** Observation window: the latest N classifiable failed attempts. */
|
|
105
|
+
export const PATHOLOGY_WINDOW_SIZE = 50;
|
|
106
|
+
/** No verdict below this many classifiable attempts in the window. */
|
|
107
|
+
export const PATHOLOGY_MIN_CLASSIFIABLE_ATTEMPTS = 20;
|
|
108
|
+
|
|
109
|
+
export type ClassificationStatus = 'classified' | 'unclassifiable';
|
|
110
|
+
export type ValidationStatus = 'valid' | 'invalid';
|
|
111
|
+
|
|
112
|
+
/** One append-only attempt observation. Never mutated, never deleted. */
|
|
113
|
+
export interface PathologyAttempt {
|
|
114
|
+
readonly attempt_id: string;
|
|
115
|
+
/** Monotonic, ingester-assigned. The ONLY ordering key. */
|
|
116
|
+
readonly attempt_sequence: number;
|
|
117
|
+
readonly candidate_id: string;
|
|
118
|
+
readonly intervention_ref: string;
|
|
119
|
+
readonly where: PathologyWhere;
|
|
120
|
+
readonly why: PathologyWhy;
|
|
121
|
+
readonly reason_detail: string;
|
|
122
|
+
readonly classification_status: ClassificationStatus;
|
|
123
|
+
readonly validation_status: ValidationStatus;
|
|
124
|
+
/** Reporting only. Never consulted for ordering. */
|
|
125
|
+
readonly observed_at: string;
|
|
126
|
+
readonly archive_schema_version: number;
|
|
127
|
+
readonly classification_rule_version: number;
|
|
128
|
+
readonly ranking_rule_version: number;
|
|
129
|
+
readonly cohort_id: string;
|
|
130
|
+
readonly cohort_version: number;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** A versioned cell query result. The guard consumes THIS, never storage internals. */
|
|
134
|
+
export interface PathologyCell {
|
|
135
|
+
readonly where: PathologyWhere;
|
|
136
|
+
readonly why: PathologyWhy;
|
|
137
|
+
readonly archive_schema_version: number;
|
|
138
|
+
readonly classification_rule_version: number;
|
|
139
|
+
readonly ranking_rule_version: number;
|
|
140
|
+
readonly cohort_id: string;
|
|
141
|
+
readonly cohort_version: number;
|
|
142
|
+
readonly attempt_count: number;
|
|
143
|
+
readonly classifiable_count: number;
|
|
144
|
+
readonly unclassifiable_count: number;
|
|
145
|
+
readonly first_observed_attempt_sequence: number;
|
|
146
|
+
readonly first_observed_at: string;
|
|
147
|
+
readonly last_observed_attempt_sequence: number;
|
|
148
|
+
readonly last_observed_at: string;
|
|
149
|
+
readonly retained_candidate_id: string | null;
|
|
150
|
+
readonly retained_intervention_ref: string | null;
|
|
151
|
+
readonly retained_attempt_id: string | null;
|
|
152
|
+
readonly retained_attempt_sequence: number | null;
|
|
153
|
+
readonly retained_observed_at: string | null;
|
|
154
|
+
readonly retained_ranking_rule: string;
|
|
155
|
+
readonly retained_ranking_key: string | null;
|
|
156
|
+
readonly retained_validation_status: ValidationStatus | null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** A versioned window query result. The guard's only legal input. */
|
|
160
|
+
export interface PathologyWindowQuery {
|
|
161
|
+
readonly archive_schema_version: number;
|
|
162
|
+
readonly classification_rule_version: number;
|
|
163
|
+
readonly ranking_rule_version: number;
|
|
164
|
+
readonly window_size: number;
|
|
165
|
+
readonly unclassifiable_excluded: number;
|
|
166
|
+
readonly rows: readonly PathologyAttempt[];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface DominanceOptions {
|
|
170
|
+
readonly threshold?: number;
|
|
171
|
+
readonly windowSize?: number;
|
|
172
|
+
readonly minClassifiable?: number;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export const RETAINED_RANKING_RULE = 'recency-v1: attempt_sequence DESC, candidate_id ASC, attempt_id ASC';
|
|
176
|
+
|
|
177
|
+
export function cellKey(where: PathologyWhere, why: PathologyWhy): string {
|
|
178
|
+
return `${where} ${why}`;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export class PathologyArchiveError extends Error {}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Is `incoming` a better representative than `retained`?
|
|
185
|
+
*
|
|
186
|
+
* Total by construction: the tuple `(attempt_sequence DESC, candidate_id ASC,
|
|
187
|
+
* attempt_id ASC)` orders any two distinct attempts, and `attempt_id` is unique,
|
|
188
|
+
* so the comparison never falls through to "equal" for two different attempts.
|
|
189
|
+
* A rule whose tie-break is declared but unreachable is not total, which is the
|
|
190
|
+
* defect the council named in the timestamp-ordered alternative.
|
|
191
|
+
*/
|
|
192
|
+
export function replacesRetained(incoming: PathologyAttempt, retained: PathologyAttempt): boolean {
|
|
193
|
+
if (incoming.attempt_sequence !== retained.attempt_sequence) {
|
|
194
|
+
return incoming.attempt_sequence > retained.attempt_sequence;
|
|
195
|
+
}
|
|
196
|
+
if (incoming.candidate_id !== retained.candidate_id) {
|
|
197
|
+
return incoming.candidate_id < retained.candidate_id;
|
|
198
|
+
}
|
|
199
|
+
return incoming.attempt_id < retained.attempt_id;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** Only a validated, classified attempt may become a representative. */
|
|
203
|
+
function eligibleAsRepresentative(a: PathologyAttempt): boolean {
|
|
204
|
+
return a.classification_status === 'classified' && a.validation_status === 'valid';
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Append-only, idempotent attempt store.
|
|
209
|
+
*
|
|
210
|
+
* Re-ingesting an existing `attempt_id` is a no-op: it cannot alter counts and
|
|
211
|
+
* cannot change a representative. Without that, a retry loop silently inflates
|
|
212
|
+
* the very frequency evidence the dominance guard reads.
|
|
213
|
+
*/
|
|
214
|
+
export class PathologyArchive {
|
|
215
|
+
private readonly byId = new Map<string, PathologyAttempt>();
|
|
216
|
+
private readonly order: PathologyAttempt[] = [];
|
|
217
|
+
|
|
218
|
+
/** @returns true when the attempt was new, false when it was a duplicate. */
|
|
219
|
+
ingest(a: PathologyAttempt): boolean {
|
|
220
|
+
if (!PATHOLOGY_WHERE.includes(a.where)) {
|
|
221
|
+
throw new PathologyArchiveError(`unknown WHERE '${a.where}'`);
|
|
222
|
+
}
|
|
223
|
+
if (!PATHOLOGY_WHY.includes(a.why)) {
|
|
224
|
+
throw new PathologyArchiveError(`unknown WHY '${a.why}'`);
|
|
225
|
+
}
|
|
226
|
+
if (this.byId.has(a.attempt_id)) return false;
|
|
227
|
+
this.byId.set(a.attempt_id, a);
|
|
228
|
+
this.order.push(a);
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Every attempt, in ingest order. Callers must not mutate. */
|
|
233
|
+
attempts(): readonly PathologyAttempt[] {
|
|
234
|
+
return this.order;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* The versioned window query the collapse guard consumes.
|
|
239
|
+
*
|
|
240
|
+
* The guard may not read `attempts()` directly: the council required it to
|
|
241
|
+
* consume "a versioned archive query rather than storage internals", so the
|
|
242
|
+
* version/cohort quad travels WITH the rows and a guard cannot silently mix
|
|
243
|
+
* two classification vocabularies. It returns attempts rather than cells
|
|
244
|
+
* because a last-N window is not reconstructible from aggregates — which is
|
|
245
|
+
* the same reason `cells()` alone is not the guard's input.
|
|
246
|
+
*/
|
|
247
|
+
dominanceWindow(windowSize: number = PATHOLOGY_WINDOW_SIZE): PathologyWindowQuery {
|
|
248
|
+
const classifiable = this.order
|
|
249
|
+
.filter((a) => a.classification_status === 'classified')
|
|
250
|
+
.sort((a, b) => a.attempt_sequence - b.attempt_sequence);
|
|
251
|
+
const rows = classifiable.slice(-windowSize);
|
|
252
|
+
const head = rows[0] ?? this.order[0];
|
|
253
|
+
return {
|
|
254
|
+
archive_schema_version: head?.archive_schema_version ?? ARCHIVE_SCHEMA_VERSION,
|
|
255
|
+
classification_rule_version: head?.classification_rule_version ?? CLASSIFICATION_RULE_VERSION,
|
|
256
|
+
ranking_rule_version: head?.ranking_rule_version ?? RANKING_RULE_VERSION,
|
|
257
|
+
window_size: windowSize,
|
|
258
|
+
unclassifiable_excluded: this.order.length - classifiable.length,
|
|
259
|
+
rows,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** The collapse verdict, read through the versioned query above. */
|
|
264
|
+
collapseVerdict(opts: DominanceOptions = {}): DominanceVerdict {
|
|
265
|
+
return dominanceVerdict(this.dominanceWindow(opts.windowSize ?? PATHOLOGY_WINDOW_SIZE), opts);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* The versioned cell query. Cells are keyed on `WHERE x WHY` AND on the
|
|
270
|
+
* version/cohort quad — attempts recorded under a different classification
|
|
271
|
+
* rule describe a different vocabulary and must not be summed with these.
|
|
272
|
+
*/
|
|
273
|
+
cells(): readonly PathologyCell[] {
|
|
274
|
+
const groups = new Map<string, PathologyAttempt[]>();
|
|
275
|
+
for (const a of this.order) {
|
|
276
|
+
const k = [
|
|
277
|
+
a.where,
|
|
278
|
+
a.why,
|
|
279
|
+
a.archive_schema_version,
|
|
280
|
+
a.classification_rule_version,
|
|
281
|
+
a.ranking_rule_version,
|
|
282
|
+
a.cohort_id,
|
|
283
|
+
a.cohort_version,
|
|
284
|
+
].join(' ');
|
|
285
|
+
const bucket = groups.get(k);
|
|
286
|
+
if (bucket) bucket.push(a);
|
|
287
|
+
else groups.set(k, [a]);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const out: PathologyCell[] = [];
|
|
291
|
+
for (const bucket of groups.values()) {
|
|
292
|
+
const first = bucket.reduce((m, a) => (a.attempt_sequence < m.attempt_sequence ? a : m));
|
|
293
|
+
const last = bucket.reduce((m, a) => (a.attempt_sequence > m.attempt_sequence ? a : m));
|
|
294
|
+
let rep: PathologyAttempt | null = null;
|
|
295
|
+
for (const a of bucket) {
|
|
296
|
+
if (!eligibleAsRepresentative(a)) continue;
|
|
297
|
+
if (rep === null || replacesRetained(a, rep)) rep = a;
|
|
298
|
+
}
|
|
299
|
+
const head = bucket[0]!;
|
|
300
|
+
out.push({
|
|
301
|
+
where: head.where,
|
|
302
|
+
why: head.why,
|
|
303
|
+
archive_schema_version: head.archive_schema_version,
|
|
304
|
+
classification_rule_version: head.classification_rule_version,
|
|
305
|
+
ranking_rule_version: head.ranking_rule_version,
|
|
306
|
+
cohort_id: head.cohort_id,
|
|
307
|
+
cohort_version: head.cohort_version,
|
|
308
|
+
attempt_count: bucket.length,
|
|
309
|
+
classifiable_count: bucket.filter((a) => a.classification_status === 'classified').length,
|
|
310
|
+
unclassifiable_count: bucket.filter((a) => a.classification_status === 'unclassifiable').length,
|
|
311
|
+
first_observed_attempt_sequence: first.attempt_sequence,
|
|
312
|
+
first_observed_at: first.observed_at,
|
|
313
|
+
last_observed_attempt_sequence: last.attempt_sequence,
|
|
314
|
+
last_observed_at: last.observed_at,
|
|
315
|
+
retained_candidate_id: rep?.candidate_id ?? null,
|
|
316
|
+
retained_intervention_ref: rep?.intervention_ref ?? null,
|
|
317
|
+
retained_attempt_id: rep?.attempt_id ?? null,
|
|
318
|
+
retained_attempt_sequence: rep?.attempt_sequence ?? null,
|
|
319
|
+
retained_observed_at: rep?.observed_at ?? null,
|
|
320
|
+
retained_ranking_rule: RETAINED_RANKING_RULE,
|
|
321
|
+
retained_ranking_key: rep
|
|
322
|
+
? `${rep.attempt_sequence}|${rep.candidate_id}|${rep.attempt_id}`
|
|
323
|
+
: null,
|
|
324
|
+
retained_validation_status: rep?.validation_status ?? null,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return out.sort((a, b) => (cellKey(a.where, a.why) < cellKey(b.where, b.why) ? -1 : 1));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export type DominanceVerdict =
|
|
332
|
+
| { readonly status: 'warming-up'; readonly classifiable_in_window: number; readonly floor: number }
|
|
333
|
+
| {
|
|
334
|
+
readonly status: 'ok' | 'collapsed';
|
|
335
|
+
readonly dominant_share: number;
|
|
336
|
+
readonly dominant_cell: string;
|
|
337
|
+
readonly classifiable_in_window: number;
|
|
338
|
+
readonly window_size: number;
|
|
339
|
+
readonly threshold: number;
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* The search-collapse guard, reading the archive through `cells()`-shaped data.
|
|
344
|
+
*
|
|
345
|
+
* Why a share and not the occupancy the frontier already gives: retaining one
|
|
346
|
+
* winner per cell erases whether attempts were distributed 50/50 or 99.9/0.1 —
|
|
347
|
+
* identical occupancy, radically different evidence of collapse. The denominator
|
|
348
|
+
* is therefore CLASSIFIABLE ATTEMPTS in the window, not distinct cells.
|
|
349
|
+
*
|
|
350
|
+
* `warming-up` is a real state and NOT a pass. A guard that returned "ok" on
|
|
351
|
+
* three observations would be reporting a confidence it does not have; the floor
|
|
352
|
+
* exists so an empty archive cannot look healthy.
|
|
353
|
+
*/
|
|
354
|
+
export function dominanceVerdict(
|
|
355
|
+
query: PathologyWindowQuery,
|
|
356
|
+
opts: DominanceOptions = {},
|
|
357
|
+
): DominanceVerdict {
|
|
358
|
+
const threshold = opts.threshold ?? PATHOLOGY_DOMINANCE_THRESHOLD;
|
|
359
|
+
const windowSize = query.window_size;
|
|
360
|
+
const floor = opts.minClassifiable ?? PATHOLOGY_MIN_CLASSIFIABLE_ATTEMPTS;
|
|
361
|
+
|
|
362
|
+
// The query has already excluded unclassifiable rows and applied the
|
|
363
|
+
// window; re-filtering here would let a caller pass raw storage and get a
|
|
364
|
+
// verdict, which is the coupling this signature exists to prevent.
|
|
365
|
+
const window = query.rows;
|
|
366
|
+
|
|
367
|
+
if (window.length < floor) {
|
|
368
|
+
return { status: 'warming-up', classifiable_in_window: window.length, floor };
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const counts = new Map<string, number>();
|
|
372
|
+
for (const a of window) {
|
|
373
|
+
const k = cellKey(a.where, a.why);
|
|
374
|
+
counts.set(k, (counts.get(k) ?? 0) + 1);
|
|
375
|
+
}
|
|
376
|
+
let dominantCell = '';
|
|
377
|
+
let dominantCount = 0;
|
|
378
|
+
for (const [k, n] of [...counts.entries()].sort((x, y) => (x[0] < y[0] ? -1 : 1))) {
|
|
379
|
+
if (n > dominantCount) {
|
|
380
|
+
dominantCount = n;
|
|
381
|
+
dominantCell = k;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
const share = dominantCount / window.length;
|
|
385
|
+
return {
|
|
386
|
+
status: share >= threshold ? 'collapsed' : 'ok',
|
|
387
|
+
dominant_share: share,
|
|
388
|
+
dominant_cell: dominantCell.replace(' ', ' x '),
|
|
389
|
+
classifiable_in_window: window.length,
|
|
390
|
+
window_size: windowSize,
|
|
391
|
+
threshold,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The canonical prefix-stable surface set — one list, loaded by every gate
|
|
3
|
+
* that needs it, restated by none.
|
|
4
|
+
*
|
|
5
|
+
* WHAT A PREFIX-STABLE SURFACE IS
|
|
6
|
+
* -------------------------------
|
|
7
|
+
* Bytes that sit in the cached prompt prefix of every dispatch. Rewriting them
|
|
8
|
+
* mid-session invalidates the cache for the remainder of that session, so the
|
|
9
|
+
* next call pays the cache-WRITE rate over the whole prefix instead of the
|
|
10
|
+
* cache-READ rate. That is the cost this list exists to bound; it is not a
|
|
11
|
+
* correctness claim about the content.
|
|
12
|
+
*
|
|
13
|
+
* WHY THE LIST LIVES HERE AND NOT IN A GATE
|
|
14
|
+
* -----------------------------------------
|
|
15
|
+
* `check_preamble_payload_budget` measured these three buckets first and stated
|
|
16
|
+
* their roots twice inside its own file — once to drive the census, once as the
|
|
17
|
+
* `roots:` argument to the dead-scope guard. A second gate restating them a
|
|
18
|
+
* third time is the recorded drift shape this repository already pays for
|
|
19
|
+
* elsewhere: two lists describing one boundary diverge, and each gate then
|
|
20
|
+
* guards a set the other no longer measures. So the roots move here and both
|
|
21
|
+
* gates import them.
|
|
22
|
+
*
|
|
23
|
+
* SCOPE — decided, with the reopen condition recorded
|
|
24
|
+
* ---------------------------------------------------
|
|
25
|
+
* Council 2026-08-28 (2/2 convergent, anthropic + openai, 2 rounds) resolved
|
|
26
|
+
* `road-to-runtime-context-floors`'s `which-surfaces-are-prefix-stable` blocker
|
|
27
|
+
* as option (c): the declared set is the three buckets the payload budget
|
|
28
|
+
* already measures, and the widening to "every surface a hook can write that
|
|
29
|
+
* reaches standing context" is recorded as an explicit reopen condition rather
|
|
30
|
+
* than enumerated now. Enumerating carriers that do not exist would be
|
|
31
|
+
* enumerating a plan.
|
|
32
|
+
*
|
|
33
|
+
* REOPEN — see `docs/contracts/prefix-stable-surfaces.md` § Reopen condition.
|
|
34
|
+
* A change that lands a hook or resident-process carrier able to write standing
|
|
35
|
+
* context outside these three roots must add it here in the same change.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
export interface PrefixStableSurface {
|
|
39
|
+
/** Stable identifier; the mutation gate names it in its findings. */
|
|
40
|
+
id: string;
|
|
41
|
+
/** Repo-relative root. A directory root covers everything beneath it. */
|
|
42
|
+
root: string;
|
|
43
|
+
kind: 'dir' | 'file';
|
|
44
|
+
/** Human-readable bucket name, as the payload budget reports it. */
|
|
45
|
+
bucket: string;
|
|
46
|
+
/** Why these bytes are in the cached prefix. */
|
|
47
|
+
why: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The declared set. Order is the order the payload budget reports its buckets,
|
|
52
|
+
* so a reader comparing the two outputs sees the same sequence.
|
|
53
|
+
*/
|
|
54
|
+
export const PREFIX_STABLE_SURFACES: readonly PrefixStableSurface[] = [
|
|
55
|
+
{
|
|
56
|
+
id: 'project-scope-rules',
|
|
57
|
+
root: 'dist/agent-src/rules',
|
|
58
|
+
kind: 'dir',
|
|
59
|
+
bucket: 'project-scope rules',
|
|
60
|
+
why: 'Every always-loaded rule body is re-written into the preamble on every spawn.',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'preloaded-skills-catalog',
|
|
64
|
+
root: 'dist/agent-src/skills',
|
|
65
|
+
kind: 'dir',
|
|
66
|
+
bucket: 'preloaded skills catalog',
|
|
67
|
+
why: 'Skill names and descriptions are catalogued into the preamble on every spawn.',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'project-claude-md',
|
|
71
|
+
root: 'CLAUDE.md',
|
|
72
|
+
kind: 'file',
|
|
73
|
+
bucket: 'CLAUDE.md hierarchy (project only)',
|
|
74
|
+
why: 'The project half of the CLAUDE.md hierarchy is injected ahead of the first user turn.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'project-claude-local-md',
|
|
78
|
+
root: 'CLAUDE.local.md',
|
|
79
|
+
kind: 'file',
|
|
80
|
+
bucket: 'CLAUDE.md hierarchy (project only)',
|
|
81
|
+
why: 'The gitignored project-local override is injected on the same path as CLAUDE.md.',
|
|
82
|
+
},
|
|
83
|
+
] as const;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The re-arm events. A rebuilt prefix is expected and paid for once at each of
|
|
87
|
+
* these boundaries, so a write declared against one is not a mid-session
|
|
88
|
+
* mutation. Anything not listed here fires mid-session.
|
|
89
|
+
*/
|
|
90
|
+
export const RE_ARM_EVENTS: readonly string[] = ['session_start', 'pre_compact'] as const;
|
|
91
|
+
|
|
92
|
+
/** Roots only, in declaration order — the shape `assertScanned` wants. */
|
|
93
|
+
export function prefixStableRoots(): string[] {
|
|
94
|
+
return PREFIX_STABLE_SURFACES.map((s) => s.root);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Directory roots only — the shape the payload census walks. */
|
|
98
|
+
export function prefixStableDirRoots(): string[] {
|
|
99
|
+
return PREFIX_STABLE_SURFACES.filter((s) => s.kind === 'dir').map((s) => s.root);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function normalise(p: string): string {
|
|
103
|
+
return p.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Does `target` (a repo-relative path, or a path literal lifted out of source)
|
|
108
|
+
* resolve inside a declared surface? Returns the surface, or `null`.
|
|
109
|
+
*
|
|
110
|
+
* Deliberately substring-free: a literal must match a root exactly, or sit
|
|
111
|
+
* beneath a directory root at a path separator. `dist/agent-src/rules-backup`
|
|
112
|
+
* is NOT inside `dist/agent-src/rules`.
|
|
113
|
+
*/
|
|
114
|
+
export function surfaceFor(target: string): PrefixStableSurface | null {
|
|
115
|
+
const t = normalise(target);
|
|
116
|
+
if (t === '') return null;
|
|
117
|
+
for (const s of PREFIX_STABLE_SURFACES) {
|
|
118
|
+
const root = normalise(s.root);
|
|
119
|
+
if (t === root) return s;
|
|
120
|
+
if (s.kind === 'dir' && t.startsWith(root + '/')) return s;
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The privacy class an audit-log-v1 line declares about ITSELF.
|
|
3
|
+
*
|
|
4
|
+
* `docs/contracts/audit-log-v1.md` states a privacy floor in prose and, until
|
|
5
|
+
* 2026-08-30, named a test file that exists in no tree — so the floor was
|
|
6
|
+
* asserted and not enforced. Two things close that gap, and they are different
|
|
7
|
+
* mechanisms rather than one restated twice:
|
|
8
|
+
*
|
|
9
|
+
* 1. A COMPILE-TIME guard (`NoFreeForm`, applied to each producer's input type)
|
|
10
|
+
* makes a field that *could* hold a body a build error. That is what stops
|
|
11
|
+
* the leak.
|
|
12
|
+
* 2. This enum makes each line SAY what it carries. That is what lets a reader
|
|
13
|
+
* decide whether a stream is safe to aggregate, export, or ship without
|
|
14
|
+
* re-deriving the answer from the producer's source.
|
|
15
|
+
*
|
|
16
|
+
* The first without the second leaves every consumer inferring the class; the
|
|
17
|
+
* second without the first is a label with nothing behind it.
|
|
18
|
+
*
|
|
19
|
+
* One module rather than a literal per producer, per step 9.1's rule that an
|
|
20
|
+
* enum family appearing in more than one place gets exactly one definition —
|
|
21
|
+
* the duplicate-enum failure that gave this tree two outcome vocabularies.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Ordered from least to most permissive. A reader may treat a lower class as
|
|
26
|
+
* satisfying any assertion made about a higher one; the reverse is never true.
|
|
27
|
+
*/
|
|
28
|
+
export const PRIVACY_CLASSES = [
|
|
29
|
+
/**
|
|
30
|
+
* Counts, enums, timestamps and opaque ids the package itself minted. No
|
|
31
|
+
* artefact names at all. The strictest class a line can declare.
|
|
32
|
+
*/
|
|
33
|
+
'counts-only',
|
|
34
|
+
/**
|
|
35
|
+
* Everything `counts-only` allows, plus STABLE ARTEFACT IDS the package
|
|
36
|
+
* governs — rule ids, skill ids, task-class ids. Still no bodies, no paths,
|
|
37
|
+
* no user content, and no third-party identifiers. This is what both
|
|
38
|
+
* shipped producers emit, because both carry `rules_applied`.
|
|
39
|
+
*/
|
|
40
|
+
'ids-only',
|
|
41
|
+
] as const;
|
|
42
|
+
|
|
43
|
+
export type PrivacyClass = (typeof PRIVACY_CLASSES)[number];
|
|
44
|
+
|
|
45
|
+
export function isPrivacyClass(v: unknown): v is PrivacyClass {
|
|
46
|
+
return typeof v === 'string' && (PRIVACY_CLASSES as readonly string[]).includes(v);
|
|
47
|
+
}
|