@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,498 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A present-tense supervision claim on a public surface must be backed by a
|
|
3
|
+
* lifecycle result from THIS revision, or it does not ship.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-runtime-governance-flip` step 3.4. ADR-249 permits a supervised
|
|
6
|
+
* resident process in core and deliberately does **not** assert that one behaves
|
|
7
|
+
* as described — nothing supervised has shipped. The gap between "we adopted
|
|
8
|
+
* this policy" and "this property holds" is exactly where an unproven capability
|
|
9
|
+
* claim lands on a public page, and the roadmap's Phase 3 exists because the
|
|
10
|
+
* first draft would have let it.
|
|
11
|
+
*
|
|
12
|
+
* **What the gate refuses.** A public surface asserting, in the present tense,
|
|
13
|
+
* that a resident process IS supervised / bounded / isolated / auto-restarted /
|
|
14
|
+
* lifecycle-managed — while no lifecycle evidence for the current revision
|
|
15
|
+
* exists. The policy statement ADR-249 authorises is not a claim of this kind
|
|
16
|
+
* and is not matched: "resident processes are permitted only under the
|
|
17
|
+
* supervision contract" names an adopted rule, and the patterns below are
|
|
18
|
+
* written to require a copula plus a property, not a permission.
|
|
19
|
+
*
|
|
20
|
+
* **Why a file-presence check is not enough.** A council seat named this
|
|
21
|
+
* directly: "a file-presence check can masquerade as evidence". So the evidence
|
|
22
|
+
* artifact must establish four separate things, and each is a distinct refusal:
|
|
23
|
+
*
|
|
24
|
+
* 1. the named suite exists at all;
|
|
25
|
+
* 2. it ran on **this** revision (`revision` equals `git rev-parse HEAD`);
|
|
26
|
+
* 3. it exercised **real processes** (`processes_exercised: true`);
|
|
27
|
+
* 4. its result was neither empty nor skipped (`cases_run > 0`, and
|
|
28
|
+
* `cases_run > cases_skipped`).
|
|
29
|
+
*
|
|
30
|
+
* A suite that ran on a parent commit, a suite with every case skipped, and a
|
|
31
|
+
* suite that mocked the process layer are three different lies, and a gate that
|
|
32
|
+
* collapses them into "the file is there" catches none of them.
|
|
33
|
+
*
|
|
34
|
+
* **Today it passes vacuously, and says so.** No public surface carries a
|
|
35
|
+
* supervision claim, so the evidence side is never reached. That is the correct
|
|
36
|
+
* state — but a gate that scans a corpus and finds nothing is indistinguishable
|
|
37
|
+
* from a blind one, which is why `--self-test` plants the seeded negatives and
|
|
38
|
+
* asserts each one reds.
|
|
39
|
+
*
|
|
40
|
+
* ## Known limits — what a line-based pattern cannot do
|
|
41
|
+
*
|
|
42
|
+
* Written after a neutral review, and kept because the alternative is a reader
|
|
43
|
+
* assuming coverage this does not have. None of these is a bug to be fixed by
|
|
44
|
+
* widening the regex; each is a property of the approach.
|
|
45
|
+
*
|
|
46
|
+
* - **One physical line at a time.** A claim wrapped across two lines
|
|
47
|
+
* (`The resident process` / `is supervised.`) is not seen. Markdown reflow can
|
|
48
|
+
* therefore hide a claim from the gate.
|
|
49
|
+
* - **Copula-only.** Active voice escapes: `We supervise the resident process`
|
|
50
|
+
* asserts the property and does not match. Narrowing to a copula is what keeps
|
|
51
|
+
* the adopted-policy sentence out, so widening trades one error for the other.
|
|
52
|
+
* - **No grammatical subject resolution.** The 60-character window between the
|
|
53
|
+
* process noun and the copula can cross a clause boundary, so a property
|
|
54
|
+
* belonging to a different subject can be attributed to the first process noun
|
|
55
|
+
* on the line. Bounded distance is not ownership.
|
|
56
|
+
* - **No markdown structure awareness.** A claim quoted inside a fenced block or
|
|
57
|
+
* a historical excerpt is scanned like any other line.
|
|
58
|
+
* - **The negation guard is a heuristic.** It reads the captured gap plus a
|
|
59
|
+
* 24-character determiner window; a negator further away is not seen.
|
|
60
|
+
*
|
|
61
|
+
* The gate is therefore a **floor, not a proof**: it catches the plain forms of
|
|
62
|
+
* the claim it names. The obligation not to publish an unproven capability stays
|
|
63
|
+
* with the author, as it did before this file existed.
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
import { execFileSync } from 'node:child_process';
|
|
67
|
+
import fs from 'node:fs';
|
|
68
|
+
import path from 'node:path';
|
|
69
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
70
|
+
|
|
71
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
72
|
+
import { runGateCli, runSelfTest, type SelfTestCase } from './_lib/gate_self_test.js';
|
|
73
|
+
import { reportScanned } from './_lib/scan_scope.js';
|
|
74
|
+
|
|
75
|
+
/** Public surfaces a reader of this project actually lands on. */
|
|
76
|
+
export const PUBLIC_SURFACES = [
|
|
77
|
+
'README.md',
|
|
78
|
+
'docs/comparison.yaml',
|
|
79
|
+
'docs/positioning-evidence.md',
|
|
80
|
+
'docs/proof.md',
|
|
81
|
+
'docs/us-vs-the-category.md',
|
|
82
|
+
'docs/getting-started-by-role.md',
|
|
83
|
+
'docs/governance-advantage.md',
|
|
84
|
+
'docs/featured-skills.md',
|
|
85
|
+
] as const;
|
|
86
|
+
|
|
87
|
+
/** Where the dependent roadmap's lifecycle suite writes its result. */
|
|
88
|
+
export const EVIDENCE_REL = path.join('internal', 'reports', 'supervision-lifecycle.json');
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A present-tense assertion that a resident process HAS a runtime property.
|
|
92
|
+
*
|
|
93
|
+
* The subject is a process noun, the verb is a copula, and the object is a
|
|
94
|
+
* property word. All three are required together, which is what keeps the
|
|
95
|
+
* adopted-policy sentence out: "resident processes **are permitted** only under
|
|
96
|
+
* the supervision contract" carries no property word, and "the supervision
|
|
97
|
+
* contract ADR-249 **establishes**" has no copula binding a property to a
|
|
98
|
+
* process.
|
|
99
|
+
*/
|
|
100
|
+
const PROCESS = String.raw`(?:resident process(?:es)?|daemon|background (?:process|worker)|collector|supervisor)`;
|
|
101
|
+
const COPULA = String.raw`(?:is|are|stays?|remains?|runs?)`;
|
|
102
|
+
const PROPERTY = String.raw`(?:supervised|bounded|isolated|sandboxed|auto-restarted|restart(?:ed|s)? automatically|lifecycle-managed|always (?:up|available)|crash-safe|self-healing)`;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Words that INVERT the assertion. Their presence between the copula and the
|
|
106
|
+
* property means the sentence denies the property rather than asserting it.
|
|
107
|
+
*
|
|
108
|
+
* **This guard is the fix for the worst defect a neutral review found**, and it
|
|
109
|
+
* is worth stating what the bug was rather than only that it is closed. The
|
|
110
|
+
* first version matched `The resident process is **not** supervised.` — `not`
|
|
111
|
+
* was absorbed by the 0-to-3-word gap, and the gate would have refused a
|
|
112
|
+
* TRUTHFUL DENIAL of the capability while the sentence it exists to catch reads
|
|
113
|
+
* identically minus one word. That is an inversion, not a false positive: the
|
|
114
|
+
* gate would have pushed authors away from the honest statement.
|
|
115
|
+
*
|
|
116
|
+
* The test suite claimed to cover "historical and negative statements" and
|
|
117
|
+
* tested only `shipped no daemon before …` — a different grammatical form. The
|
|
118
|
+
* direct negation was untested and broken. Both council seats found it
|
|
119
|
+
* independently.
|
|
120
|
+
*/
|
|
121
|
+
const NEGATOR_RE = /\b(?:not|never|no|non|without|cannot|can't|won't|isn't|aren't|neither|nor|un\w+)\b/i;
|
|
122
|
+
|
|
123
|
+
/** The gap between the copula and the property, captured so it can be inspected. */
|
|
124
|
+
export const SUPERVISION_CLAIM_RE = new RegExp(
|
|
125
|
+
String.raw`\b${PROCESS}\b[^.\n]{0,60}?\b${COPULA}\b(\s+(?:\w+[\s-]+){0,3}?)\b${PROPERTY}\b`,
|
|
126
|
+
'i',
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Strip markdown emphasis before matching.
|
|
131
|
+
*
|
|
132
|
+
* `\b` does not match inside `**bold**`, so `The resident process is
|
|
133
|
+
* **supervised**.` escaped the pattern entirely — a false negative on exactly
|
|
134
|
+
* the formatting a README uses for the words that matter. Also found by review.
|
|
135
|
+
*/
|
|
136
|
+
export function normaliseLine(line: string): string {
|
|
137
|
+
return line.replace(/[*_`]+/g, '');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Does this line assert — rather than deny — a supervision property?
|
|
142
|
+
*
|
|
143
|
+
* Two steps, deliberately separate so each is testable: the shape must match,
|
|
144
|
+
* and the gap between copula and property must carry no negator.
|
|
145
|
+
*/
|
|
146
|
+
export function assertsSupervision(rawLine: string): boolean {
|
|
147
|
+
const line = normaliseLine(rawLine);
|
|
148
|
+
const m = SUPERVISION_CLAIM_RE.exec(line);
|
|
149
|
+
if (m === null) return false;
|
|
150
|
+
// Two negation slots, and both were found by review rather than by design.
|
|
151
|
+
// AFTER the copula: "the resident process is **not** supervised".
|
|
152
|
+
// BEFORE the subject, in the determiner: "**No** resident process is
|
|
153
|
+
// supervised here". The second is why this reads a bounded window ahead of
|
|
154
|
+
// the match instead of only the captured gap.
|
|
155
|
+
const lead = line.slice(Math.max(0, m.index - NEGATOR_LOOKBEHIND), m.index);
|
|
156
|
+
return !NEGATOR_RE.test(lead) && !NEGATOR_RE.test(m[1] ?? '');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* How far back the determiner slot is inspected for a negator.
|
|
161
|
+
*
|
|
162
|
+
* Bounded rather than whole-line on purpose: a negator early in a DIFFERENT
|
|
163
|
+
* clause ("the daemon is not the concern; the collector is supervised") must
|
|
164
|
+
* not suppress a real claim later in the same line. 24 characters covers
|
|
165
|
+
* "No ", "Never a ", "There is no " and the like without reaching a previous
|
|
166
|
+
* clause. This is a heuristic and is named as one — see § Known limits.
|
|
167
|
+
*/
|
|
168
|
+
const NEGATOR_LOOKBEHIND = 24;
|
|
169
|
+
|
|
170
|
+
export interface Finding {
|
|
171
|
+
readonly file: string;
|
|
172
|
+
readonly line: number;
|
|
173
|
+
readonly text: string;
|
|
174
|
+
readonly reason: string;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface LifecycleEvidence {
|
|
178
|
+
readonly suite?: string;
|
|
179
|
+
readonly revision?: string;
|
|
180
|
+
readonly processes_exercised?: boolean;
|
|
181
|
+
readonly cases_run?: number;
|
|
182
|
+
readonly cases_skipped?: number;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The four evidence conditions, each returning its own refusal.
|
|
187
|
+
*
|
|
188
|
+
* Returns `null` when the evidence is sufficient. Separated from I/O so the
|
|
189
|
+
* self-test can drive it with literal objects.
|
|
190
|
+
*/
|
|
191
|
+
export function evidenceRefusal(
|
|
192
|
+
ev: LifecycleEvidence | null | 'malformed',
|
|
193
|
+
headRevision: string,
|
|
194
|
+
): string | null {
|
|
195
|
+
if (ev === null) {
|
|
196
|
+
return `no lifecycle evidence at ${EVIDENCE_REL} — the suite that would back this claim does not exist`;
|
|
197
|
+
}
|
|
198
|
+
if (ev === 'malformed') {
|
|
199
|
+
return `${EVIDENCE_REL} exists but does not parse as a JSON object — a broken artifact is not weaker evidence than a missing one, it is a different problem`;
|
|
200
|
+
}
|
|
201
|
+
// A revision the gate could not read is not a revision that matched. Review
|
|
202
|
+
// found this reporting `HEAD is ` with an empty string, which reads as a
|
|
203
|
+
// mismatch rather than as a failure to determine anything.
|
|
204
|
+
if (headRevision === '') {
|
|
205
|
+
return 'could not determine HEAD (`git rev-parse HEAD` failed) — the same-revision condition cannot be checked, so it is not treated as met';
|
|
206
|
+
}
|
|
207
|
+
if (typeof ev.suite !== 'string' || ev.suite.trim() === '') {
|
|
208
|
+
return `${EVIDENCE_REL} names no \`suite\` — an unnamed suite cannot be re-run by a reader`;
|
|
209
|
+
}
|
|
210
|
+
if (ev.revision !== headRevision) {
|
|
211
|
+
return (
|
|
212
|
+
`${EVIDENCE_REL} records revision ${ev.revision ?? '(none)'}, but HEAD is ${headRevision} — ` +
|
|
213
|
+
'a result from another revision says nothing about the code being shipped'
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
if (ev.processes_exercised !== true) {
|
|
217
|
+
return `${EVIDENCE_REL} does not record \`processes_exercised: true\` — a suite that mocked the process layer did not test supervision`;
|
|
218
|
+
}
|
|
219
|
+
// Typed, not coerced. Review found `cases_run: "abc"` passing every
|
|
220
|
+
// comparison — `"abc" <= 0` and `"abc" <= 0` are both false, so an
|
|
221
|
+
// unparsable count read as sufficient evidence. A string `"12"` was worse
|
|
222
|
+
// than useless in the other direction: `"12" <= "2"` is TRUE
|
|
223
|
+
// lexicographically, so valid-looking data was refused for a wrong reason.
|
|
224
|
+
// The artifact is machine-written; a non-integer in it is a broken producer,
|
|
225
|
+
// and the gate says so instead of guessing.
|
|
226
|
+
const run = ev.cases_run ?? 0;
|
|
227
|
+
const skipped = ev.cases_skipped ?? 0;
|
|
228
|
+
if (!Number.isInteger(run) || !Number.isInteger(skipped)) {
|
|
229
|
+
return `${EVIDENCE_REL} records a non-integer case count (run: ${JSON.stringify(ev.cases_run)}, skipped: ${JSON.stringify(ev.cases_skipped)}) — the artifact is machine-written, so this is a broken producer rather than a low count`;
|
|
230
|
+
}
|
|
231
|
+
if (run < 0 || skipped < 0) {
|
|
232
|
+
return `${EVIDENCE_REL} records a negative case count (run: ${String(run)}, skipped: ${String(skipped)}) — not a possible measurement`;
|
|
233
|
+
}
|
|
234
|
+
if (run <= 0) {
|
|
235
|
+
return `${EVIDENCE_REL} records ${String(run)} cases run — an empty suite is not evidence`;
|
|
236
|
+
}
|
|
237
|
+
if (run <= skipped) {
|
|
238
|
+
return `${EVIDENCE_REL} records ${String(run)} run against ${String(skipped)} skipped — a suite that skipped at least as much as it ran is not evidence`;
|
|
239
|
+
}
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Read the evidence artifact.
|
|
245
|
+
*
|
|
246
|
+
* Returns `null` when it is ABSENT and the string `'malformed'` when it exists
|
|
247
|
+
* and does not parse. Review flagged that collapsing the two reported unparsable
|
|
248
|
+
* JSON as "the suite does not exist" — both fail closed, but they need
|
|
249
|
+
* different remediation and a reader deserves to know which one they have.
|
|
250
|
+
*/
|
|
251
|
+
export function readEvidence(root: string): LifecycleEvidence | null | 'malformed' {
|
|
252
|
+
const p = path.join(root, EVIDENCE_REL);
|
|
253
|
+
if (!fs.existsSync(p)) return null;
|
|
254
|
+
try {
|
|
255
|
+
const parsed: unknown = JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
256
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return 'malformed';
|
|
257
|
+
return parsed as LifecycleEvidence;
|
|
258
|
+
} catch {
|
|
259
|
+
return 'malformed';
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** Scan the public surfaces. Pure over an explicit file list. */
|
|
264
|
+
export function scan(
|
|
265
|
+
root: string,
|
|
266
|
+
files: readonly string[],
|
|
267
|
+
headRevision: string,
|
|
268
|
+
ledger?: GateLedger,
|
|
269
|
+
): Finding[] {
|
|
270
|
+
const findings: Finding[] = [];
|
|
271
|
+
let refusal: string | null | undefined;
|
|
272
|
+
|
|
273
|
+
for (const rel of files) {
|
|
274
|
+
const abs = path.join(root, rel);
|
|
275
|
+
// Plan BEFORE resolving, always. Resolving an unplanned target is a
|
|
276
|
+
// ledger usage error, and it only shows up where a surface is missing —
|
|
277
|
+
// never on the real tree, where all eight exist. Found by the self-test's
|
|
278
|
+
// positive control, whose fixture repo has README.md and nothing else.
|
|
279
|
+
ledger?.plan(rel);
|
|
280
|
+
if (!fs.existsSync(abs)) {
|
|
281
|
+
ledger?.skip(rel, 'dead_scan_root');
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const lines = fs.readFileSync(abs, 'utf8').split('\n');
|
|
285
|
+
let failedHere = '';
|
|
286
|
+
for (const [i, line] of lines.entries()) {
|
|
287
|
+
if (!assertsSupervision(line)) continue;
|
|
288
|
+
// Resolve the evidence once, and only when a claim is actually
|
|
289
|
+
// found: an absent artifact is not a finding on its own, because
|
|
290
|
+
// the correct state today is "no claim, no evidence, no gate".
|
|
291
|
+
if (refusal === undefined) refusal = evidenceRefusal(readEvidence(root), headRevision);
|
|
292
|
+
if (refusal === null) continue;
|
|
293
|
+
findings.push({
|
|
294
|
+
file: rel,
|
|
295
|
+
line: i + 1,
|
|
296
|
+
text: line.trim().slice(0, 160),
|
|
297
|
+
reason: refusal,
|
|
298
|
+
});
|
|
299
|
+
if (failedHere === '') failedHere = `${rel}:${String(i + 1)} — ${refusal}`;
|
|
300
|
+
}
|
|
301
|
+
if (failedHere === '') ledger?.complete(rel);
|
|
302
|
+
else ledger?.fail(rel, failedHere);
|
|
303
|
+
}
|
|
304
|
+
return findings;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function headRevisionOf(root: string): string {
|
|
308
|
+
try {
|
|
309
|
+
return execFileSync('git', ['-C', root, 'rev-parse', 'HEAD'], { encoding: 'utf8' }).trim();
|
|
310
|
+
} catch {
|
|
311
|
+
return '';
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Three seeded negatives and one positive control, each driving the REAL CLI.
|
|
317
|
+
*
|
|
318
|
+
* Step 3.4 required the seeded negatives to be OBSERVED red rather than
|
|
319
|
+
* asserted, and the three are separate on purpose: a suite that ran on a parent
|
|
320
|
+
* commit, a suite that skipped every case, and a suite that mocked the process
|
|
321
|
+
* layer are three different lies, and a file-presence check catches none of
|
|
322
|
+
* them. The positive control is what stops the suite passing by rejecting
|
|
323
|
+
* everything.
|
|
324
|
+
*
|
|
325
|
+
* Shelling out through {@link runGateCli} rather than calling `scan()` is the
|
|
326
|
+
* point of the harness: the thing under test is the binary a contributor runs,
|
|
327
|
+
* argv parsing and entry guard included.
|
|
328
|
+
*/
|
|
329
|
+
const SELF_TEST_MIN_CASES = 7;
|
|
330
|
+
const SELF_TEST_MIN_REJECTING = 5;
|
|
331
|
+
|
|
332
|
+
function selfTest(): number {
|
|
333
|
+
const repoRoot = process.cwd();
|
|
334
|
+
const rel = path.join('src', 'scripts', 'check_supervision_claim_atomicity.ts');
|
|
335
|
+
const CLAIM = 'The resident process is supervised and auto-restarted.\n';
|
|
336
|
+
|
|
337
|
+
/** Build a throwaway repo whose HEAD is real, so the revision check is meaningful. */
|
|
338
|
+
const fixture = (
|
|
339
|
+
evidence: LifecycleEvidence | null,
|
|
340
|
+
line: string = CLAIM,
|
|
341
|
+
): { dir: string; head: string } => {
|
|
342
|
+
const dir = fs.mkdtempSync(path.join(fs.realpathSync(process.env.TMPDIR ?? '/tmp'), 'supclaim-'));
|
|
343
|
+
fs.writeFileSync(path.join(dir, 'README.md'), line);
|
|
344
|
+
const git = (...a: string[]): void => {
|
|
345
|
+
execFileSync('git', ['-C', dir, ...a], { stdio: 'ignore' });
|
|
346
|
+
};
|
|
347
|
+
git('init', '-q');
|
|
348
|
+
git('config', 'user.email', 'selftest@example.com');
|
|
349
|
+
git('config', 'user.name', 'self test');
|
|
350
|
+
git('add', 'README.md');
|
|
351
|
+
git('commit', '-q', '-m', 'fixture');
|
|
352
|
+
const head = execFileSync('git', ['-C', dir, 'rev-parse', 'HEAD'], { encoding: 'utf8' }).trim();
|
|
353
|
+
if (evidence !== null) {
|
|
354
|
+
const abs = path.join(dir, EVIDENCE_REL);
|
|
355
|
+
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
356
|
+
fs.writeFileSync(abs, JSON.stringify({ ...evidence, revision: evidence.revision ?? head }));
|
|
357
|
+
}
|
|
358
|
+
return { dir, head };
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
const runWithLine = (line: string, evidence: LifecycleEvidence | null): number => {
|
|
362
|
+
const { dir } = fixture(evidence, line);
|
|
363
|
+
try {
|
|
364
|
+
return runGateCli(repoRoot, rel, [], dir);
|
|
365
|
+
} finally {
|
|
366
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
const run = (evidence: LifecycleEvidence | null): number => runWithLine(CLAIM, evidence);
|
|
370
|
+
|
|
371
|
+
const cases: SelfTestCase[] = [
|
|
372
|
+
{
|
|
373
|
+
name: 'a seeded supervision claim with no lifecycle evidence at all',
|
|
374
|
+
expect: 'reject',
|
|
375
|
+
run: () => run(null),
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
name: 'an emptied suite — every case skipped, none run',
|
|
379
|
+
expect: 'reject',
|
|
380
|
+
run: () =>
|
|
381
|
+
run({ suite: 'supervision-lifecycle', processes_exercised: true, cases_run: 0, cases_skipped: 12 }),
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
name: 'a result recorded against a different revision',
|
|
385
|
+
expect: 'reject',
|
|
386
|
+
run: () =>
|
|
387
|
+
run({
|
|
388
|
+
suite: 'supervision-lifecycle',
|
|
389
|
+
revision: 'b'.repeat(40),
|
|
390
|
+
processes_exercised: true,
|
|
391
|
+
cases_run: 12,
|
|
392
|
+
cases_skipped: 0,
|
|
393
|
+
}),
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
// Advertised by the docstring from the first version and ABSENT from
|
|
397
|
+
// the case list until a neutral review counted them. The doc said
|
|
398
|
+
// three negatives and named a mocked-process one; the code had two
|
|
399
|
+
// plus a foreign revision. A self-test that describes a case it does
|
|
400
|
+
// not run is the shape it exists to prevent.
|
|
401
|
+
name: 'a suite that did not exercise real processes',
|
|
402
|
+
expect: 'reject',
|
|
403
|
+
run: () =>
|
|
404
|
+
run({
|
|
405
|
+
suite: 'supervision-lifecycle',
|
|
406
|
+
processes_exercised: false,
|
|
407
|
+
cases_run: 12,
|
|
408
|
+
cases_skipped: 0,
|
|
409
|
+
}),
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
name: 'a non-integer case count — a broken producer, not a low count',
|
|
413
|
+
expect: 'reject',
|
|
414
|
+
run: () =>
|
|
415
|
+
run({
|
|
416
|
+
suite: 'supervision-lifecycle',
|
|
417
|
+
processes_exercised: true,
|
|
418
|
+
cases_run: 'twelve' as unknown as number,
|
|
419
|
+
cases_skipped: 0,
|
|
420
|
+
}),
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
// The inversion control. Without the negation guard this line
|
|
424
|
+
// matched, and the gate would have refused a TRUTHFUL DENIAL while
|
|
425
|
+
// no evidence existed. It must pass with no evidence at all.
|
|
426
|
+
name: 'a DENIAL of supervision is not a claim, and needs no evidence',
|
|
427
|
+
expect: 'accept',
|
|
428
|
+
run: () => runWithLine('The resident process is not supervised.\n', null),
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
name: 'sufficient evidence on this revision lets the same claim through',
|
|
432
|
+
expect: 'accept',
|
|
433
|
+
run: () =>
|
|
434
|
+
run({ suite: 'supervision-lifecycle', processes_exercised: true, cases_run: 12, cases_skipped: 1 }),
|
|
435
|
+
},
|
|
436
|
+
];
|
|
437
|
+
|
|
438
|
+
return runSelfTest({
|
|
439
|
+
gate: 'check_supervision_claim_atomicity',
|
|
440
|
+
cases,
|
|
441
|
+
minCases: SELF_TEST_MIN_CASES,
|
|
442
|
+
minRejectCases: SELF_TEST_MIN_REJECTING,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export function main(argv: readonly string[]): number {
|
|
447
|
+
const root = process.cwd();
|
|
448
|
+
if (argv.includes('--self-test')) return selfTest();
|
|
449
|
+
|
|
450
|
+
const ledger = new GateLedger('check_supervision_claim_atomicity');
|
|
451
|
+
const findings = scan(root, PUBLIC_SURFACES, headRevisionOf(root), ledger);
|
|
452
|
+
ledger.report();
|
|
453
|
+
reportScanned({
|
|
454
|
+
gate: 'check_supervision_claim_atomicity',
|
|
455
|
+
scanned: PUBLIC_SURFACES.filter((f) => fs.existsSync(path.join(root, f))).length,
|
|
456
|
+
units: 'public surfaces',
|
|
457
|
+
roots: ['README.md', 'docs/'],
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
if (findings.length > 0) {
|
|
461
|
+
for (const f of findings) {
|
|
462
|
+
process.stderr.write(` ❌ ${f.file}:${String(f.line)} — ${f.text}\n ${f.reason}\n`);
|
|
463
|
+
}
|
|
464
|
+
process.stderr.write(
|
|
465
|
+
`❌ check_supervision_claim_atomicity: ${String(findings.length)} present-tense supervision claim(s) ` +
|
|
466
|
+
'on a public surface without lifecycle evidence for this revision.\n' +
|
|
467
|
+
' ADR-249 permits a supervised resident process; it does not assert that one behaves as described.\n' +
|
|
468
|
+
' State the adopted policy, or land the evidence first.\n',
|
|
469
|
+
);
|
|
470
|
+
return 1;
|
|
471
|
+
}
|
|
472
|
+
process.stdout.write(
|
|
473
|
+
'✅ check_supervision_claim_atomicity: no unbacked present-tense supervision claim on a public surface.\n',
|
|
474
|
+
);
|
|
475
|
+
return 0;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
479
|
+
function _isCliEntry(): boolean {
|
|
480
|
+
if (process.argv[1] === undefined) {
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
484
|
+
if (import.meta.url === argvUrl) {
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
try {
|
|
488
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
489
|
+
const argv = fs.realpathSync(path.resolve(process.argv[1]));
|
|
490
|
+
return here === argv;
|
|
491
|
+
} catch {
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
497
|
+
process.exit(main(process.argv.slice(2)));
|
|
498
|
+
}
|
|
@@ -209,6 +209,21 @@ export const SUPPRESSION_INVENTORY: readonly SuppressionSpec[] = [
|
|
|
209
209
|
tier: 'string_list',
|
|
210
210
|
what: 'paths exempt from the external-source scan',
|
|
211
211
|
},
|
|
212
|
+
{
|
|
213
|
+
file: 'src/config/lapsed-beta-baseline.json',
|
|
214
|
+
listKey: 'contracts',
|
|
215
|
+
tier: 'string_list',
|
|
216
|
+
// `newInThisChange` removed 2026-08-26: the baseline resolves at the base
|
|
217
|
+
// ref, so the bootstrap window this flag exists for has closed. Same
|
|
218
|
+
// self-closing contract as the sibling entry below — the gate reported
|
|
219
|
+
// the stale flag rather than leaving it to silently accept a future
|
|
220
|
+
// mistyped path as a fresh baseline forever.
|
|
221
|
+
|
|
222
|
+
what:
|
|
223
|
+
'beta contracts already lapsed at 2026-08-25, which WARN instead of ' +
|
|
224
|
+
'failing check_beta_review_markers — every lapse outside this list is ' +
|
|
225
|
+
'an error, so the list is the ratchet and may not grow',
|
|
226
|
+
},
|
|
212
227
|
{
|
|
213
228
|
file: 'src/config/gate-violation-baselines.json',
|
|
214
229
|
listKey: 'gates',
|
package/src/scripts/ci_settle.ts
CHANGED
|
@@ -24,10 +24,33 @@
|
|
|
24
24
|
* read — NEVER a verdict, and the reason is printed.
|
|
25
25
|
*
|
|
26
26
|
* Usage: ./scripts-run src/scripts/ci_settle <pr> [--timeout-min N] [--interval-sec N]
|
|
27
|
+
*
|
|
28
|
+
* THE DEFAULT DEADLINE IS UNDER THE TOOL CEILING, deliberately (9 min, see
|
|
29
|
+
* {@link FOREGROUND_CEILING_MIN}). It used to be 45, and a `Bash` tool call is
|
|
30
|
+
* capped at 600 s: measured over ten sessions
|
|
31
|
+
* (`agents/evidence/analysis/agent-turnaround-2026-08-30.md` F2), ten of the
|
|
32
|
+
* twelve slowest calls in the corpus were this script KILLED at 592-603 s and
|
|
33
|
+
* re-invoked, for 2.7 h of a 14.2 h tool budget. A wait that is killed reports
|
|
34
|
+
* nothing — the exit-code contract below is exactly what the truncation
|
|
35
|
+
* destroys, which makes a deadline past the ceiling worse than a shorter one.
|
|
36
|
+
*
|
|
37
|
+
* A longer wait is still available and is a BACKGROUND job, not a bigger
|
|
38
|
+
* number: run this with the host's background-execution primitive, or
|
|
39
|
+
* `--timeout-min N` explicitly. Passing a value above the ceiling prints a
|
|
40
|
+
* warning naming the truncation rather than silently accepting it.
|
|
27
41
|
*/
|
|
28
42
|
|
|
29
43
|
import { spawnSync } from 'node:child_process';
|
|
30
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The largest default deadline that fits inside one foreground `Bash` call.
|
|
47
|
+
*
|
|
48
|
+
* The tool caps at 600 s. 9 min = 540 s leaves one 60 s poll interval of
|
|
49
|
+
* headroom, so the loop reaches its own `DID NOT SETTLE` branch and RETURNS a
|
|
50
|
+
* stated non-verdict instead of being killed mid-poll.
|
|
51
|
+
*/
|
|
52
|
+
export const FOREGROUND_CEILING_MIN = 9;
|
|
53
|
+
|
|
31
54
|
/** What one poll told us. `unreadable` is deliberately not a verdict. */
|
|
32
55
|
export type PollState =
|
|
33
56
|
| { kind: 'unreadable'; reason: string }
|
|
@@ -114,7 +137,11 @@ export function main(argv: readonly string[]): number {
|
|
|
114
137
|
const positional = argv.filter((a) => !a.startsWith('--'));
|
|
115
138
|
const pr = positional[0];
|
|
116
139
|
if (pr === undefined) {
|
|
117
|
-
process.stderr.write(
|
|
140
|
+
process.stderr.write(
|
|
141
|
+
'usage: ci_settle <pr> [--timeout-min N] [--interval-sec N]\n' +
|
|
142
|
+
` default --timeout-min is ${String(FOREGROUND_CEILING_MIN)}, which fits inside one foreground Bash call (600 s cap).\n` +
|
|
143
|
+
' a longer wait is a BACKGROUND job, not a bigger number — a foreground call past the cap is killed and reports nothing.\n',
|
|
144
|
+
);
|
|
118
145
|
return 2;
|
|
119
146
|
}
|
|
120
147
|
const num = (flag: string, dflt: number): number => {
|
|
@@ -124,7 +151,17 @@ export function main(argv: readonly string[]): number {
|
|
|
124
151
|
const n = v === undefined ? NaN : parseInt(v, 10);
|
|
125
152
|
return Number.isFinite(n) && n > 0 ? n : dflt;
|
|
126
153
|
};
|
|
127
|
-
const timeoutMin = num('--timeout-min',
|
|
154
|
+
const timeoutMin = num('--timeout-min', FOREGROUND_CEILING_MIN);
|
|
155
|
+
if (timeoutMin > FOREGROUND_CEILING_MIN) {
|
|
156
|
+
// Said once, up front, rather than discovered when the call is killed:
|
|
157
|
+
// a truncated wait produces no line at all, so the warning has to come
|
|
158
|
+
// before the wait rather than at its expiry.
|
|
159
|
+
process.stdout.write(
|
|
160
|
+
`ci_settle: --timeout-min ${String(timeoutMin)} exceeds the ${String(FOREGROUND_CEILING_MIN)} min that fits ` +
|
|
161
|
+
'inside one foreground Bash call (600 s cap). In the foreground this call will be KILLED before ' +
|
|
162
|
+
'the deadline and will report nothing — run it as a background job for a wait this long.\n',
|
|
163
|
+
);
|
|
164
|
+
}
|
|
128
165
|
const intervalSec = num('--interval-sec', 60);
|
|
129
166
|
|
|
130
167
|
const deadline = Date.now() + timeoutMin * 60_000;
|