@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
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import { spawnSync } from 'node:child_process';
|
|
27
27
|
|
|
28
|
+
import { CURATED_HEAD_INSTRUCTION } from './release_material.js';
|
|
29
|
+
|
|
28
30
|
/** The five curated labels, in the order an operator reads them. */
|
|
29
31
|
export const HEAD_LABELS: readonly string[] = [
|
|
30
32
|
'Behaviour changes',
|
|
@@ -39,11 +41,27 @@ export const HEAD_NONE = '_none_';
|
|
|
39
41
|
/**
|
|
40
42
|
* Prefix marking a head line the generator derived rather than a human wrote.
|
|
41
43
|
*
|
|
42
|
-
* Machine-checkable so the gate can
|
|
44
|
+
* Machine-checkable so the gate can REFUSE when one survives to merge, and
|
|
43
45
|
* readable so the line still says something true to anyone who ships it
|
|
44
46
|
* unedited. It is not a placeholder token: the line it introduces carries real
|
|
45
47
|
* evidence (the reason plus the citing SHAs), so nothing here is
|
|
46
48
|
* wrong-if-shipped — only unpolished-if-unedited.
|
|
49
|
+
*
|
|
50
|
+
* **REVERSED 2026-09-01 — "only unpolished-if-unedited" no longer implies
|
|
51
|
+
* "therefore advisory".** The clause above is kept because it is TRUE, and the
|
|
52
|
+
* conclusion that used to follow from it is the part that was falsified: the
|
|
53
|
+
* gate warned, and the marker shipped anyway in five consecutive released
|
|
54
|
+
* sections (14.9.0 through 14.13.0, eighteen lines, re-derived at
|
|
55
|
+
* `b50b27281`). `check_release_highlights` now exits non-zero on a marker in
|
|
56
|
+
* the section under release, and the sibling annotation in that file's header
|
|
57
|
+
* carries the full reversal.
|
|
58
|
+
*
|
|
59
|
+
* **Instructing authority:** the maintainer's closing instruction in the
|
|
60
|
+
* 2026-09-a inbox round, carried into
|
|
61
|
+
* `agents/roadmaps/archive/road-to-publication-integrity-hard-fail.md` § Phase 1.
|
|
62
|
+
*
|
|
63
|
+
* Nothing about the marker's own shape changes here — it is still one
|
|
64
|
+
* definition, still shared with the generator that writes it.
|
|
47
65
|
*/
|
|
48
66
|
export const DERIVED_MARKER = '_auto-derived, rewrite before merge:_';
|
|
49
67
|
|
|
@@ -283,6 +301,57 @@ export function render_derived_head_values(
|
|
|
283
301
|
return out;
|
|
284
302
|
}
|
|
285
303
|
|
|
304
|
+
/**
|
|
305
|
+
* Reasons the section under release must NOT be published, in the order a
|
|
306
|
+
* reader should act on them. Empty means nothing here blocks publication.
|
|
307
|
+
*
|
|
308
|
+
* Added 2026-09-01 for roadmap § 3.1. It exists because the two IRREVERSIBLE
|
|
309
|
+
* transitions — the annotated tag and the GitHub Release body — happen inside
|
|
310
|
+
* `release.ts` after the PR gate has already passed, and nothing re-read the
|
|
311
|
+
* section between them. `check_release_highlights` guards the PR; this guards
|
|
312
|
+
* the publish.
|
|
313
|
+
*
|
|
314
|
+
* **It takes a section body, never a path and never a repository.** A guard
|
|
315
|
+
* that reads a file decides for itself what it is guarding, and the two
|
|
316
|
+
* refused earlier attempts both died there: one placed the check inside a pure
|
|
317
|
+
* formatter, which has no idea whether it is publishing, and one read the live
|
|
318
|
+
* changelog from a drill fixture. The caller cuts the section and owns the
|
|
319
|
+
* decision to publish; this function only answers whether that text is
|
|
320
|
+
* publishable.
|
|
321
|
+
*
|
|
322
|
+
* **Two markers since 2026-09-01, and the second one had to wait for a writer
|
|
323
|
+
* change.** This function used to check `DERIVED_MARKER` only, and said so:
|
|
324
|
+
* the generator still wrote its authoring comment into every section it cut,
|
|
325
|
+
* so refusing on that comment would have redded every release on its first run
|
|
326
|
+
* — Risk 1 of the roadmap, reproduced exactly. Roadmap § Phase 2 Option A
|
|
327
|
+
* removed the emission (`render_release_head` in `release.ts`), which is what
|
|
328
|
+
* makes refusing on it safe. The order was forced and it is the reason the
|
|
329
|
+
* check arrives second rather than late.
|
|
330
|
+
*
|
|
331
|
+
* `CURATED_HEAD_INSTRUCTION` is a named sentinel imported from the module that
|
|
332
|
+
* defines it — never a shape match over comment prose, which would reject
|
|
333
|
+
* unrelated legitimate comments and miss this one after a reword.
|
|
334
|
+
*/
|
|
335
|
+
export function publication_blockers(sectionBody: string, version: string): string[] {
|
|
336
|
+
const out: string[] = [];
|
|
337
|
+
if (sectionBody.includes(DERIVED_MARKER)) {
|
|
338
|
+
out.push(
|
|
339
|
+
`the ${version} section still carries \`${DERIVED_MARKER}\` — the generator's ` +
|
|
340
|
+
'draft head, not a curated claim. Rewrite those line(s) on ' +
|
|
341
|
+
`${'`main`'} and re-run.`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
if (sectionBody.includes(CURATED_HEAD_INSTRUCTION)) {
|
|
345
|
+
out.push(
|
|
346
|
+
`the ${version} section still carries the authoring instruction ` +
|
|
347
|
+
`(\`${CURATED_HEAD_INSTRUCTION}\`) — a reminder to the releaser, not ` +
|
|
348
|
+
'release content, and `CHANGELOG.md` is published to npm. Delete that ' +
|
|
349
|
+
'comment line from the section and re-run.',
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
return out;
|
|
353
|
+
}
|
|
354
|
+
|
|
286
355
|
/** Labels whose curated value is still the generator's unedited draft. */
|
|
287
356
|
export function stale_draft_labels(
|
|
288
357
|
curated: Readonly<Record<string, string>>,
|
|
@@ -61,6 +61,116 @@ export function extract_changelog_section(text: string, version: string): Change
|
|
|
61
61
|
return { heading: m[0], body };
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
/**
|
|
65
|
+
* The generator's authoring instruction, identified by ONE named sentinel.
|
|
66
|
+
*
|
|
67
|
+
* Roadmap `road-to-publication-integrity-hard-fail` § Phase 2, Option A. Until
|
|
68
|
+
* 2026-09-01 `render_release_head` wrote this comment into every changelog
|
|
69
|
+
* section it cut, and nothing removed it at release time — so it shipped. At
|
|
70
|
+
* that commit `grep -c 'Curated head: fill before merge' CHANGELOG.md` read 2,
|
|
71
|
+
* and `package.json` `files` carries the bare `"CHANGELOG.md"`, which is the
|
|
72
|
+
* npm-published artifact. The instruction now lives in the release-PR body,
|
|
73
|
+
* which is never published, and the writer emits none.
|
|
74
|
+
*
|
|
75
|
+
* **A sentinel, deliberately not a shape match.** A council seat warned that a
|
|
76
|
+
* pattern such as `/<!-- .* should(?: only)? be .* -->/` is overbroad and
|
|
77
|
+
* under-specified: it rejects unrelated legitimate comments while missing the
|
|
78
|
+
* prohibited instruction after harmless rewording. This follows the discipline
|
|
79
|
+
* `DERIVED_MARKER` already follows — one definition, imported by every
|
|
80
|
+
* consumer, including the gates that refuse on it.
|
|
81
|
+
*/
|
|
82
|
+
export const CURATED_HEAD_INSTRUCTION = 'Curated head: fill before merge';
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The full authoring instruction as the release-PR body carries it.
|
|
86
|
+
*
|
|
87
|
+
* Parameterized rather than importing `RELEASE_HEAD_CAP_LINES` / `HEAD_NONE`,
|
|
88
|
+
* because this module has no imports and that is load-bearing: it is the one
|
|
89
|
+
* place the equality gate, the drill fixtures and the unit tests all reach, so
|
|
90
|
+
* a dependency here is a dependency in all three.
|
|
91
|
+
*/
|
|
92
|
+
/**
|
|
93
|
+
* Cap on curated-head lines, and the placeholder a label carries when the
|
|
94
|
+
* answer is genuinely nothing.
|
|
95
|
+
*
|
|
96
|
+
* Relocated here from `release.ts` on 2026-09-01 with the instruction text:
|
|
97
|
+
* this module builds the release-PR body, so the instruction and the two
|
|
98
|
+
* values it interpolates belong on the same side of the import boundary. The
|
|
99
|
+
* generator re-exports `RELEASE_HEAD_CAP_LINES` under its original name, so
|
|
100
|
+
* nothing that referenced it there has to change.
|
|
101
|
+
*/
|
|
102
|
+
export const RELEASE_HEAD_CAP_LINES = 10;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The fallback value of a head line the span does not substantiate.
|
|
106
|
+
*
|
|
107
|
+
* `_none_` and not a placeholder token: where nothing was derived it is the
|
|
108
|
+
* **true** answer, and a release that genuinely changed no defaults should say
|
|
109
|
+
* so rather than carry an unfilled marker.
|
|
110
|
+
*
|
|
111
|
+
* It is a fallback and no longer a blanket default. Writing `_none_` into
|
|
112
|
+
* every field made the generator assert five things it had not checked, and
|
|
113
|
+
* `check_release_highlights` rejected exactly that assertion the moment the
|
|
114
|
+
* span contradicted it — which for this package is every release, because every
|
|
115
|
+
* release touches `src/rules/` or `src/scripts/schemas/`. Substantiated labels
|
|
116
|
+
* are now pre-filled from the span (`_derive_head_prefill`), so the tool states
|
|
117
|
+
* only what it can support and `_none_` means what it says.
|
|
118
|
+
*/
|
|
119
|
+
export const RELEASE_HEAD_DEFAULT = '_none_';
|
|
120
|
+
|
|
121
|
+
export function render_curated_head_instruction(capLines: number, headDefault: string): string {
|
|
122
|
+
return (
|
|
123
|
+
`<!-- ${CURATED_HEAD_INSTRUCTION}, keep it under ${capLines} lines, and leave ` +
|
|
124
|
+
`\`${headDefault}\` where it is genuinely the answer. The generated log below is ` +
|
|
125
|
+
'unchanged. -->'
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** The instruction exactly as the release-PR body carries it. */
|
|
130
|
+
export const CURATED_HEAD_INSTRUCTION_COMMENT = render_curated_head_instruction(
|
|
131
|
+
RELEASE_HEAD_CAP_LINES,
|
|
132
|
+
RELEASE_HEAD_DEFAULT,
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Delimiters bounding the release-PR-only region.
|
|
137
|
+
*
|
|
138
|
+
* The region exists so the PR body can carry something the changelog must not,
|
|
139
|
+
* WITHOUT relaxing surface equality anywhere else. `strip_pr_wrapper` removes
|
|
140
|
+
* exactly what sits between these two markers and nothing else — never a prose
|
|
141
|
+
* match, never a whole-body relaxation. Relaxing equality wholesale would
|
|
142
|
+
* remove the release-truth guarantee that the PR body and the changelog say
|
|
143
|
+
* the same thing, which is a larger floor than the one this change
|
|
144
|
+
* strengthens.
|
|
145
|
+
*
|
|
146
|
+
* An UNTERMINATED region is deliberately left in place: it then surfaces as an
|
|
147
|
+
* ordinary divergence instead of silently swallowing the rest of the body.
|
|
148
|
+
*/
|
|
149
|
+
export const PR_ONLY_START = '<!-- release-pr-only:start -->';
|
|
150
|
+
export const PR_ONLY_END = '<!-- release-pr-only:end -->';
|
|
151
|
+
|
|
152
|
+
/** Remove every complete PR-only region. Delimiter-bounded, never a prose match. */
|
|
153
|
+
export function strip_pr_only_regions(s: string): string {
|
|
154
|
+
const out: string[] = [];
|
|
155
|
+
let rest = s;
|
|
156
|
+
for (;;) {
|
|
157
|
+
const i = rest.indexOf(PR_ONLY_START);
|
|
158
|
+
if (i === -1) {
|
|
159
|
+
out.push(rest);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
const j = rest.indexOf(PR_ONLY_END, i + PR_ONLY_START.length);
|
|
163
|
+
if (j === -1) {
|
|
164
|
+
// Unterminated — leave it standing so equality reports it.
|
|
165
|
+
out.push(rest);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
out.push(rest.slice(0, i));
|
|
169
|
+
rest = rest.slice(j + PR_ONLY_END.length);
|
|
170
|
+
}
|
|
171
|
+
return out.join('');
|
|
172
|
+
}
|
|
173
|
+
|
|
64
174
|
/** Footer appended to the release-PR body; the strip helper accepts legacy variants. */
|
|
65
175
|
export const PR_BODY_FOOTER = 'Created by `src/scripts/release.ts`.';
|
|
66
176
|
const _LEGACY_PR_FOOTERS = ['Created by `scripts/release.py`.', PR_BODY_FOOTER];
|
|
@@ -68,9 +178,18 @@ const _LEGACY_PR_FOOTERS = ['Created by `scripts/release.py`.', PR_BODY_FOOTER];
|
|
|
68
178
|
/** Marker `_cap_body` embeds when a surface was truncated to a GitHub limit. */
|
|
69
179
|
export const TRUNCATION_MARKER = '_Changelog truncated to fit GitHub';
|
|
70
180
|
|
|
71
|
-
/**
|
|
181
|
+
/**
|
|
182
|
+
* Release-PR body derived from the (possibly capped) changelog-section body.
|
|
183
|
+
*
|
|
184
|
+
* Carries the authoring instruction inside the PR-only region. The region is
|
|
185
|
+
* emitted unconditionally rather than passed in by each caller: there are two
|
|
186
|
+
* PR-creation paths (`release.ts` and `release_publication.ts`), and a caller
|
|
187
|
+
* that forgot the argument would silently ship a PR with no reminder — the
|
|
188
|
+
* failure this change exists to make impossible, reintroduced one level up.
|
|
189
|
+
*/
|
|
72
190
|
export function pr_body_from_section(cappedBody: string, version: string): string {
|
|
73
|
-
|
|
191
|
+
const prOnly = `${PR_ONLY_START}\n${CURATED_HEAD_INSTRUCTION_COMMENT}\n${PR_ONLY_END}`;
|
|
192
|
+
return `Release ${version}.\n\n${prOnly}\n\n${cappedBody}\n\n${PR_BODY_FOOTER}`;
|
|
74
193
|
}
|
|
75
194
|
|
|
76
195
|
/** GitHub-release notes derived from the (possibly capped) changelog-section body. */
|
|
@@ -96,6 +215,10 @@ export function strip_pr_wrapper(prBody: string, version: string): string | null
|
|
|
96
215
|
return null;
|
|
97
216
|
}
|
|
98
217
|
s = s.slice(prefix.length);
|
|
218
|
+
// Delimiter-bounded, before the footer walk: the region is PR-only material
|
|
219
|
+
// by construction, so it is removed from the comparison rather than
|
|
220
|
+
// compared. Everything outside it still has to match the changelog.
|
|
221
|
+
s = strip_pr_only_regions(s);
|
|
99
222
|
for (const footer of _LEGACY_PR_FOOTERS) {
|
|
100
223
|
if (s.trimEnd().endsWith(footer)) {
|
|
101
224
|
s = s.trimEnd();
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The repeated-failure rate — computed over the AMENDED view, by construction.
|
|
3
|
+
*
|
|
4
|
+
* This is the roadmap's single pre-registered core metric, and the reason it
|
|
5
|
+
* needed the amendment path first is arithmetic rather than aesthetic. A repeat
|
|
6
|
+
* is precisely the signal that surfaces AFTER an episode's terminal record is
|
|
7
|
+
* written: rework lands, a regression is found, a review comes back. A rate
|
|
8
|
+
* computed over unamended rows therefore undercounts the exact thing it exists
|
|
9
|
+
* to measure, and undercounts it in the flattering direction.
|
|
10
|
+
*
|
|
11
|
+
* The guarantee here is structural, not documentary: this module's input type
|
|
12
|
+
* is {@link EpisodeReconstruction}, which is the folded projection. It has no
|
|
13
|
+
* overload taking raw `JournalEvent[]`, so a caller CANNOT accidentally compute
|
|
14
|
+
* the rate over unamended rows — there is nothing to pass.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { BasisTag } from './evidence_basis.js';
|
|
18
|
+
import type { EpisodeReconstruction } from './runtime_journal.js';
|
|
19
|
+
import { RUN_TERMINAL_STATES, type RunTerminalState } from './outcome_vocabularies.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Terminal states that count as a failure for this metric.
|
|
23
|
+
*
|
|
24
|
+
* `clean-no-op` is deliberately NOT a failure: an episode that correctly
|
|
25
|
+
* determined there was nothing to do succeeded at the thing it was asked. And
|
|
26
|
+
* `approval-required` is not one either — it is the safety floor working, and
|
|
27
|
+
* counting a floor doing its job as a failure would make the metric fall every
|
|
28
|
+
* time governance fires.
|
|
29
|
+
*/
|
|
30
|
+
export const FAILURE_TERMINALS: ReadonlySet<RunTerminalState> = new Set([
|
|
31
|
+
'blocked',
|
|
32
|
+
'exhausted',
|
|
33
|
+
'stagnated',
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
/** States that count as a success for the metric. */
|
|
37
|
+
export const SUCCESS_TERMINALS: ReadonlySet<RunTerminalState> = new Set([
|
|
38
|
+
'success',
|
|
39
|
+
'clean-no-op',
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
// Every terminal state is classified or deliberately excluded -- silence about
|
|
43
|
+
// one is how a metric quietly changes meaning when the vocabulary grows.
|
|
44
|
+
const CLASSIFIED = new Set<string>([...FAILURE_TERMINALS, ...SUCCESS_TERMINALS, 'approval-required']);
|
|
45
|
+
const _unclassified = RUN_TERMINAL_STATES.filter((t) => !CLASSIFIED.has(t));
|
|
46
|
+
if (_unclassified.length > 0) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`repeated_failure: terminal state(s) ${_unclassified.join(', ')} are neither a failure, ` +
|
|
49
|
+
'a success, nor explicitly excluded. Classify them or the rate silently changes meaning.',
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface RepeatedFailureRate {
|
|
54
|
+
/** Episodes whose EFFECTIVE terminal state is a failure. */
|
|
55
|
+
failed: number;
|
|
56
|
+
/** Episodes with any classifiable effective terminal state. */
|
|
57
|
+
classified: number;
|
|
58
|
+
/** Episodes whose terminal state is absent or excluded. Its own share. */
|
|
59
|
+
unknown: number;
|
|
60
|
+
/** `failed / classified`, or `null` when nothing was classifiable. */
|
|
61
|
+
rate: number | null;
|
|
62
|
+
/** How many of the counted episodes carried at least one amendment. */
|
|
63
|
+
amended_episodes: number;
|
|
64
|
+
basis: BasisTag;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Compute the rate.
|
|
69
|
+
*
|
|
70
|
+
* `rate` is `null`, never `0`, when nothing classifiable was seen — the same
|
|
71
|
+
* rule the per-asset report follows, for the same reason: zero is a measurement
|
|
72
|
+
* and null is an absence, and a reader acts on the first while asking about the
|
|
73
|
+
* second.
|
|
74
|
+
*/
|
|
75
|
+
export function repeatedFailureRate(
|
|
76
|
+
episodes: readonly EpisodeReconstruction[],
|
|
77
|
+
): RepeatedFailureRate {
|
|
78
|
+
let failed = 0;
|
|
79
|
+
let classified = 0;
|
|
80
|
+
let unknown = 0;
|
|
81
|
+
let amended_episodes = 0;
|
|
82
|
+
|
|
83
|
+
for (const ep of episodes) {
|
|
84
|
+
if (ep.amendment_count > 0) amended_episodes += 1;
|
|
85
|
+
|
|
86
|
+
// `ep.terminal_state` is already the AMENDED verdict: reconstructEpisode
|
|
87
|
+
// drops superseded rows and takes the LAST effective terminal state.
|
|
88
|
+
const t = ep.terminal_state;
|
|
89
|
+
if (t === null || !CLASSIFIED.has(t) || t === 'approval-required') {
|
|
90
|
+
unknown += 1;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
classified += 1;
|
|
94
|
+
if (FAILURE_TERMINALS.has(t)) failed += 1;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
failed,
|
|
99
|
+
classified,
|
|
100
|
+
unknown,
|
|
101
|
+
rate: classified === 0 ? null : failed / classified,
|
|
102
|
+
amended_episodes,
|
|
103
|
+
basis: 'estimated:ratio-over-amended-episode-terminals',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository-root resolution that REFUSES rather than guesses.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-skill-ecosystem-runtime-enforcement` Phase 2 Step 6. The trap class
|
|
5
|
+
* this closes is small to describe and has cost multiple sessions:
|
|
6
|
+
*
|
|
7
|
+
* 1. **An inherited `GIT_DIR`.** A git hook exports `GIT_DIR` (often `.git`,
|
|
8
|
+
* relative) into every child process. A gate that resolves its root with
|
|
9
|
+
* `git rev-parse --show-toplevel` then answers for whatever repository the
|
|
10
|
+
* inherited variable points at — which inside a worktree hook is the parent
|
|
11
|
+
* checkout, not the tree being committed. The gate runs, reads the wrong
|
|
12
|
+
* files, and passes.
|
|
13
|
+
* 2. **A path walked one directory too far.** `path.resolve(__dirname, '..',
|
|
14
|
+
* '..')` is correct until a file moves, and then it silently addresses a
|
|
15
|
+
* parent directory that also exists. Nothing fails; the scan is simply
|
|
16
|
+
* empty, which several gates report as a clean pass.
|
|
17
|
+
*
|
|
18
|
+
* Both are the same failure in the end: a resolver that always SUCCEEDS. So the
|
|
19
|
+
* contract here is the opposite — a root is returned only when the directory
|
|
20
|
+
* carries a **sentinel** proving it is the repository, and otherwise the call
|
|
21
|
+
* throws. A caller that cannot locate its own repository should stop, not scan
|
|
22
|
+
* an arbitrary directory.
|
|
23
|
+
*
|
|
24
|
+
* The sentinel is `package.json` carrying this package's `name`, not a bare
|
|
25
|
+
* `package.json`: every node_modules entry and every sibling project has one of
|
|
26
|
+
* those, and a resolver that accepts any of them has not narrowed anything.
|
|
27
|
+
*/
|
|
28
|
+
import * as fs from 'node:fs';
|
|
29
|
+
import * as path from 'node:path';
|
|
30
|
+
|
|
31
|
+
/** The package name that identifies THIS repository. */
|
|
32
|
+
export const SENTINEL_PACKAGE_NAME = '@event4u/agent-config';
|
|
33
|
+
|
|
34
|
+
/** Raised when no directory on the walk carries the sentinel. */
|
|
35
|
+
export class RepoRootUnresolvedError extends Error {
|
|
36
|
+
readonly startedAt: string;
|
|
37
|
+
|
|
38
|
+
constructor(startedAt: string, message: string) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.name = 'RepoRootUnresolvedError';
|
|
41
|
+
this.startedAt = startedAt;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* True when `dir` is this repository's root.
|
|
47
|
+
*
|
|
48
|
+
* Reads `package.json` and compares `name`. A parse failure is `false`, never a
|
|
49
|
+
* throw: a malformed `package.json` somewhere up the walk must not stop the walk
|
|
50
|
+
* from reaching a valid root above it.
|
|
51
|
+
*/
|
|
52
|
+
export function hasSentinel(dir: string): boolean {
|
|
53
|
+
try {
|
|
54
|
+
const raw = fs.readFileSync(path.join(dir, 'package.json'), 'utf8');
|
|
55
|
+
return (JSON.parse(raw) as { name?: unknown }).name === SENTINEL_PACKAGE_NAME;
|
|
56
|
+
} catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Walk upward from `from` and return the first directory carrying the sentinel.
|
|
63
|
+
*
|
|
64
|
+
* @throws {RepoRootUnresolvedError} when the walk reaches the filesystem root
|
|
65
|
+
* without finding one. Deliberately not a `null` return: an optional type
|
|
66
|
+
* invites `?? process.cwd()`, which is the guess this module exists to prevent.
|
|
67
|
+
*/
|
|
68
|
+
export function resolveRepoRoot(from: string = process.cwd()): string {
|
|
69
|
+
let dir = path.resolve(from);
|
|
70
|
+
const seen: string[] = [];
|
|
71
|
+
for (;;) {
|
|
72
|
+
seen.push(dir);
|
|
73
|
+
if (hasSentinel(dir)) return dir;
|
|
74
|
+
const parent = path.dirname(dir);
|
|
75
|
+
if (parent === dir) break;
|
|
76
|
+
dir = parent;
|
|
77
|
+
}
|
|
78
|
+
throw new RepoRootUnresolvedError(
|
|
79
|
+
path.resolve(from),
|
|
80
|
+
`no repository root above ${path.resolve(from)} — no directory on the walk carries a ` +
|
|
81
|
+
`package.json named "${SENTINEL_PACKAGE_NAME}". Checked ${String(seen.length)} directory(ies). ` +
|
|
82
|
+
'This is a refusal, not a fallback: resolving to the working directory here is how a gate ' +
|
|
83
|
+
'ends up scanning an arbitrary tree and reporting a clean pass over it.',
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The environment variables that override git's own discovery.
|
|
89
|
+
*
|
|
90
|
+
* `GIT_DIR` is the one that has actually bitten; the other three are listed
|
|
91
|
+
* because they fail the same way and a reader checking for one should see all
|
|
92
|
+
* four rather than believe the list is complete at one entry.
|
|
93
|
+
*/
|
|
94
|
+
export const GIT_DISCOVERY_OVERRIDES = [
|
|
95
|
+
'GIT_DIR',
|
|
96
|
+
'GIT_WORK_TREE',
|
|
97
|
+
'GIT_INDEX_FILE',
|
|
98
|
+
'GIT_COMMON_DIR',
|
|
99
|
+
] as const;
|
|
100
|
+
|
|
101
|
+
/** Any git discovery override present in `env`, with its value. */
|
|
102
|
+
export function inheritedGitOverrides(
|
|
103
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
104
|
+
): { name: string; value: string }[] {
|
|
105
|
+
const out: { name: string; value: string }[] = [];
|
|
106
|
+
for (const name of GIT_DISCOVERY_OVERRIDES) {
|
|
107
|
+
const value = env[name];
|
|
108
|
+
if (typeof value === 'string' && value !== '') out.push({ name, value });
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
@@ -34,6 +34,17 @@
|
|
|
34
34
|
*/
|
|
35
35
|
export type MutationMeasure = 'exact' | 'capped_approximation';
|
|
36
36
|
|
|
37
|
+
import type { NoFreeForm } from './runtime_journal.js';
|
|
38
|
+
import { type PrivacyClass } from './privacy_class.js';
|
|
39
|
+
|
|
40
|
+
type Assert<T extends true> = T;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* What THIS producer's lines carry: counts (`diff_lines`), enums, and the
|
|
44
|
+
* `rules_applied` id array. `ids-only`, same as the orchestration producer.
|
|
45
|
+
*/
|
|
46
|
+
const PRODUCER_PRIVACY_CLASS: PrivacyClass = 'ids-only';
|
|
47
|
+
|
|
37
48
|
export interface ReviewSkippedInput {
|
|
38
49
|
/** Non-doc tracked-file mutation size that triggered the nudge (count only). */
|
|
39
50
|
diff_lines: number;
|
|
@@ -92,6 +103,15 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
|
|
|
92
103
|
memory: { asks: 0, hits: 0 },
|
|
93
104
|
verify: { claims: 0, first_try_passes: 0 },
|
|
94
105
|
rules_applied: ['delegation-policy'],
|
|
106
|
+
// MANDATORY on every audit line, same as the orchestration producer.
|
|
107
|
+
privacy_class: PRODUCER_PRIVACY_CLASS,
|
|
108
|
+
// `skills_applied` is OMITTED here, deliberately and not by oversight.
|
|
109
|
+
// audit-log-v1 distinguishes an absent key ("not recorded") from `[]`
|
|
110
|
+
// ("recorded, none applied"), and this writer observes a review that
|
|
111
|
+
// did not happen -- it has no skill observation to offer in either
|
|
112
|
+
// direction. Emitting `[]` would assert "no skills applied" on evidence
|
|
113
|
+
// this producer never gathered, which is the exact fabrication the
|
|
114
|
+
// absent/empty split exists to make impossible.
|
|
95
115
|
persona: null,
|
|
96
116
|
input_kind: 'prompt',
|
|
97
117
|
type: 'note',
|
|
@@ -100,3 +120,20 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
|
|
|
100
120
|
|
|
101
121
|
return { line, errors: [] };
|
|
102
122
|
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The SECOND producer's half of the compile-time privacy floor.
|
|
126
|
+
*
|
|
127
|
+
* `docs/contracts/audit-log-v1.md` states that the floor holds by construction
|
|
128
|
+
* "on two paths"; guarding only the first would leave that sentence half true
|
|
129
|
+
* while reading as fully true. Same mechanism as
|
|
130
|
+
* `orchestration_record.ts`: a free-form key on the input type makes this
|
|
131
|
+
* `Assert<false>` and stops the build.
|
|
132
|
+
*
|
|
133
|
+
* The negative direction is fixtured there rather than duplicated here — one
|
|
134
|
+
* proof that `NoFreeForm` still rejects is enough for both call sites, since
|
|
135
|
+
* they share the type.
|
|
136
|
+
*/
|
|
137
|
+
type _ReviewSkippedInputCarriesNoFreeFormField = Assert<
|
|
138
|
+
[NoFreeForm<ReviewSkippedInput>] extends [never] ? false : true
|
|
139
|
+
>;
|