@event4u/agent-config 14.11.0 → 14.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +368 -516
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +109 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +400 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +65 -6
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +25 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
- package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +9 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +53 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-236PNQZK.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +42 -10
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +62 -62
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2413 -1087
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +639 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4818 -2645
- package/dist/server/schemas/settings.js +6 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +30 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +2 -2
- package/package.json +10 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/src/agent-src/scripts/guarded_baseline.ts +328 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +400 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +48 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/budgets.yml +19 -0
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +95 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +38 -31
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +731 -30
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +38 -20
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +35 -7
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +43 -0
- package/src/config/rule-stub-ceilings.json +126 -112
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/turnaround-budget.json +66 -0
- package/src/config/web-launch-readiness.json +188 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +27 -0
- package/src/scripts/_lib/activation_ladder.ts +211 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +126 -0
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +195 -7
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +263 -3
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +144 -6
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +528 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +980 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -11
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +378 -0
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_budget_ownership.ts +54 -4
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +752 -0
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +60 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +10 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +0 -17
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -67
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +0 -17
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/operational-readiness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/server-hardening/evals/triggers.json +0 -17
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/workspace-link/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiAudit.js.map +0 -1
- package/dist/cli/commands/uiRender.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/lean_projection_mode.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/ui_surface.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/skillRanking.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/ui_authority.test.ts +0 -251
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -246
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* The unblocked-ask rate — the class `user-interaction` measured and then had
|
|
4
|
+
* no instrument for.
|
|
5
|
+
*
|
|
6
|
+
* ## Why this one, and not one of the other 55
|
|
7
|
+
*
|
|
8
|
+
* `road-to-undeclared-obligation-disposition` Phase 2.1 ranks the
|
|
9
|
+
* `cheaply-probeable` bucket by MEASURED failure rather than by feel, and the
|
|
10
|
+
* ranking is lopsided: of 56 rules in that bucket, exactly **one** carries a
|
|
11
|
+
* cited measurement of its own failure. `user-interaction.md:75` records a
|
|
12
|
+
* 30-session conformance audit in which **every** malformed ask was a one-line
|
|
13
|
+
* parenthetical or a trailing free-text offer, and states that **no gate ships**
|
|
14
|
+
* for that class because `check_reply_consistency` inspects numbered-option
|
|
15
|
+
* blocks — "exactly the surface that did not fail".
|
|
16
|
+
*
|
|
17
|
+
* That is the whole case for building this and not a fourth probe. Phase 2.3
|
|
18
|
+
* caps the roadmap at one.
|
|
19
|
+
*
|
|
20
|
+
* ## What is counted
|
|
21
|
+
*
|
|
22
|
+
* A **hand-back** assistant turn — one immediately followed by a genuine user
|
|
23
|
+
* turn, i.e. where the agent actually stopped — that HANDS A DECISION and
|
|
24
|
+
* carries **no** numbered-options block. The rule's own § "The trigger is a
|
|
25
|
+
* decision, not a format" says the obligation fires on handing a decision in any
|
|
26
|
+
* form, so a trailing offer is an ask and owes a recommendation line.
|
|
27
|
+
*
|
|
28
|
+
* Of those, an ask is **malformed** when no recommendation line follows it.
|
|
29
|
+
*
|
|
30
|
+
* ## Honest bounds, and they are wide
|
|
31
|
+
*
|
|
32
|
+
* 1. **"Hands a decision" is a heuristic.** It matches offer shapes — *"soll ich
|
|
33
|
+
* …?"*, *"shall I …?"*, *"sag Bescheid, wenn …"*, *"willst du …?"* — anchored
|
|
34
|
+
* in the closing lines. A genuine clarifying question is deliberately NOT
|
|
35
|
+
* excluded, because `user-interaction` treats a bare yes/no as an ask too.
|
|
36
|
+
* Some rhetorical questions will be counted. The rate is therefore a
|
|
37
|
+
* CEILING for malformed asks of this class, not a point estimate.
|
|
38
|
+
* 2. **Turns WITH a numbered block are excluded**, not judged. That surface
|
|
39
|
+
* already has `check_reply_consistency`; measuring it here would double-count
|
|
40
|
+
* a covered class and hide the uncovered one.
|
|
41
|
+
* 3. **A recommendation line is matched on the label**, `Recommendation:` or
|
|
42
|
+
* `Empfehlung:` (with or without emphasis). A recommendation phrased without
|
|
43
|
+
* the label reads as malformed here. The rule requires the label — a
|
|
44
|
+
* wrong-language label is explicitly "no recommendation" — so this is the
|
|
45
|
+
* rule's own bar, but it is a bar on FORM.
|
|
46
|
+
*
|
|
47
|
+
* Both edges are printed. A reader who cannot see the bracket cannot judge the
|
|
48
|
+
* number.
|
|
49
|
+
*
|
|
50
|
+
* Usage:
|
|
51
|
+
* ./scripts-run src/scripts/probe_unblocked_ask [--limit N] [--store PATH] [--json]
|
|
52
|
+
* ./scripts-run src/scripts/probe_unblocked_ask --self-test
|
|
53
|
+
*
|
|
54
|
+
* Exit codes: 0 always — a measurement, not a gate. `--self-test` exits 1 when
|
|
55
|
+
* the detector fails to fire on its fixtures.
|
|
56
|
+
*/
|
|
57
|
+
import fs from 'node:fs';
|
|
58
|
+
import path from 'node:path';
|
|
59
|
+
import { pathToFileURL } from 'node:url';
|
|
60
|
+
|
|
61
|
+
import { defaultStore, HARNESS_TEXT, isInjectedBody } from './conformance_scan.js';
|
|
62
|
+
import { isSyntheticPrompt } from './_lib/prompt_shape.js';
|
|
63
|
+
|
|
64
|
+
/** A numbered-options block — the surface `check_reply_consistency` already reads. */
|
|
65
|
+
export const NUMBERED_BLOCK = /^\s{0,3}(\d+)[.)]\s+\S/m;
|
|
66
|
+
|
|
67
|
+
/** The recommendation line, matched on its label. Either language. */
|
|
68
|
+
export const RECOMMENDATION = /^\s{0,3}\**\s*(Recommendation|Empfehlung)\s*:?\**/im;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Offer shapes that hand a decision without a block. Every one of these is a
|
|
72
|
+
* shape the 2026-08-06 audit found in a REAL malformed ask.
|
|
73
|
+
*/
|
|
74
|
+
export const OFFER_SHAPES: readonly RegExp[] = [
|
|
75
|
+
/\bsoll(en)? ich\b[^.!?]{0,120}\?/i,
|
|
76
|
+
/\bwillst du\b[^.!?]{0,120}\?/i,
|
|
77
|
+
/\bm(ö|oe)chtest du\b[^.!?]{0,120}\?/i,
|
|
78
|
+
/\bsag (mir )?bescheid,? (wenn|ob|falls)\b/i,
|
|
79
|
+
/\bwenn du (willst|m(ö|oe)chtest),? (dann )?(mache|kann|nehme|ziehe)\b/i,
|
|
80
|
+
/\bshall i\b[^.!?]{0,120}\?/i,
|
|
81
|
+
/\bshould i\b[^.!?]{0,120}\?/i,
|
|
82
|
+
/\bdo you want me to\b[^.!?]{0,120}\?/i,
|
|
83
|
+
/\bwould you like me to\b[^.!?]{0,120}\?/i,
|
|
84
|
+
/\blet me know (if|whether)\b/i,
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
interface Turn {
|
|
88
|
+
role: 'user' | 'assistant';
|
|
89
|
+
text: string;
|
|
90
|
+
at: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function turns(lines: string[]): Turn[] {
|
|
94
|
+
const out: Turn[] = [];
|
|
95
|
+
for (const line of lines) {
|
|
96
|
+
if (!line.trim()) continue;
|
|
97
|
+
let e: Record<string, unknown>;
|
|
98
|
+
try {
|
|
99
|
+
e = JSON.parse(line) as Record<string, unknown>;
|
|
100
|
+
} catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (e['isSidechain'] === true) continue;
|
|
104
|
+
if (e['type'] === 'user' && e['toolUseResult'] !== undefined) continue;
|
|
105
|
+
if (e['isCompactSummary'] === true) continue;
|
|
106
|
+
const msg = e['message'] as { role?: string; content?: unknown } | undefined;
|
|
107
|
+
const role = msg?.role;
|
|
108
|
+
if (role !== 'user' && role !== 'assistant') continue;
|
|
109
|
+
const c = msg?.content;
|
|
110
|
+
const text =
|
|
111
|
+
typeof c === 'string'
|
|
112
|
+
? c
|
|
113
|
+
: Array.isArray(c)
|
|
114
|
+
? c
|
|
115
|
+
.filter((b: { type?: string }) => b?.type === 'text')
|
|
116
|
+
.map((b: { text?: string }) => b.text ?? '')
|
|
117
|
+
.join('\n')
|
|
118
|
+
: '';
|
|
119
|
+
if (!text.trim()) continue;
|
|
120
|
+
if (role === 'assistant' && HARNESS_TEXT.test(text.trim())) continue;
|
|
121
|
+
if (role === 'user' && (isSyntheticPrompt(text) || isInjectedBody(text))) continue;
|
|
122
|
+
out.push({ role, text, at: String(e['timestamp'] ?? '') });
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface AskVerdict {
|
|
128
|
+
/** The turn hands a decision with no numbered block. */
|
|
129
|
+
unblockedAsk: boolean;
|
|
130
|
+
/** …and carries no recommendation label. */
|
|
131
|
+
malformed: boolean;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Classify one assistant hand-back's closing lines. */
|
|
135
|
+
export function classifyTail(tail: string): AskVerdict {
|
|
136
|
+
if (NUMBERED_BLOCK.test(tail)) return { unblockedAsk: false, malformed: false };
|
|
137
|
+
const offers = OFFER_SHAPES.some((re) => re.test(tail));
|
|
138
|
+
if (!offers) return { unblockedAsk: false, malformed: false };
|
|
139
|
+
return { unblockedAsk: true, malformed: !RECOMMENDATION.test(tail) };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface Result {
|
|
143
|
+
handbacks: number;
|
|
144
|
+
withBlock: number;
|
|
145
|
+
unblockedAsks: number;
|
|
146
|
+
malformed: number;
|
|
147
|
+
samples: { session: string; at: string; span: string }[];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function measure(store: string, limit: number): Result {
|
|
151
|
+
const r: Result = { handbacks: 0, withBlock: 0, unblockedAsks: 0, malformed: 0, samples: [] };
|
|
152
|
+
let files: string[];
|
|
153
|
+
try {
|
|
154
|
+
files = fs.readdirSync(store).filter((f) => f.endsWith('.jsonl'));
|
|
155
|
+
} catch {
|
|
156
|
+
return r;
|
|
157
|
+
}
|
|
158
|
+
const ordered = files
|
|
159
|
+
.map((f) => ({ f, m: fs.statSync(path.join(store, f)).mtimeMs }))
|
|
160
|
+
.sort((a, b) => b.m - a.m)
|
|
161
|
+
.slice(0, limit)
|
|
162
|
+
.map((x) => x.f);
|
|
163
|
+
|
|
164
|
+
for (const f of ordered) {
|
|
165
|
+
const session = f.replace(/\.jsonl$/, '').slice(0, 8);
|
|
166
|
+
const ts = turns(fs.readFileSync(path.join(store, f), 'utf8').split('\n'));
|
|
167
|
+
for (let i = 0; i < ts.length; i += 1) {
|
|
168
|
+
const t = ts[i] as Turn;
|
|
169
|
+
if (t.role !== 'assistant') continue;
|
|
170
|
+
const next = ts[i + 1];
|
|
171
|
+
if (next !== undefined && next.role !== 'user') continue;
|
|
172
|
+
r.handbacks += 1;
|
|
173
|
+
// Closing lines only: an offer buried mid-reply is not the hand-back.
|
|
174
|
+
const tail = t.text.trimEnd().split('\n').slice(-8).join('\n');
|
|
175
|
+
if (NUMBERED_BLOCK.test(tail)) {
|
|
176
|
+
r.withBlock += 1;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const v = classifyTail(tail);
|
|
180
|
+
if (!v.unblockedAsk) continue;
|
|
181
|
+
r.unblockedAsks += 1;
|
|
182
|
+
if (v.malformed) {
|
|
183
|
+
r.malformed += 1;
|
|
184
|
+
if (r.samples.length < 5) {
|
|
185
|
+
const hit = OFFER_SHAPES.find((re) => re.test(tail));
|
|
186
|
+
r.samples.push({
|
|
187
|
+
session,
|
|
188
|
+
at: t.at,
|
|
189
|
+
span: (tail.match(hit as RegExp)?.[0] ?? '').slice(0, 110),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return r;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Prove the detector fires, and prove it stays silent where it must.
|
|
200
|
+
*
|
|
201
|
+
* An instrument never seen fire has unknown sensitivity — and one that fires on
|
|
202
|
+
* everything measures nothing, which is why the negative cases are here too.
|
|
203
|
+
*/
|
|
204
|
+
export function selfTest(): number {
|
|
205
|
+
const cases: Array<[string, string, boolean, boolean]> = [
|
|
206
|
+
['a trailing German offer with no recommendation', 'Fertig.\n\nSag Bescheid, wenn ich die drei Zeilen mitnehmen soll.', true, true],
|
|
207
|
+
['a bare yes/no offer', 'Der Branch ist grün.\n\nSoll ich das so umsetzen?', true, true],
|
|
208
|
+
['an English trailing offer', 'Done.\n\nLet me know if you want the second half too.', true, true],
|
|
209
|
+
['an offer WITH a recommendation label', 'Soll ich das so umsetzen?\n\n**Empfehlung:** ja, es ist reversibel.', true, false],
|
|
210
|
+
['a numbered block is excluded — another gate reads it', '1. do it\n2. skip it\n\nRecommendation: 1', false, false],
|
|
211
|
+
['an ordinary statement hands nothing', 'Fixed the schema lint; force-pushed b17c4ef8.', false, false],
|
|
212
|
+
['a question about the code is not an offer to act', 'Why does this function take a callback?', false, false],
|
|
213
|
+
];
|
|
214
|
+
let failed = 0;
|
|
215
|
+
for (const [name, tail, wantAsk, wantMalformed] of cases) {
|
|
216
|
+
const v = classifyTail(tail);
|
|
217
|
+
const ok = v.unblockedAsk === wantAsk && v.malformed === wantMalformed;
|
|
218
|
+
process.stdout.write(
|
|
219
|
+
`${ok ? '✅' : '❌'} ${name} — ask=${String(v.unblockedAsk)} malformed=${String(v.malformed)}` +
|
|
220
|
+
(ok ? '\n' : ` (wanted ask=${String(wantAsk)} malformed=${String(wantMalformed)})\n`),
|
|
221
|
+
);
|
|
222
|
+
if (!ok) failed += 1;
|
|
223
|
+
}
|
|
224
|
+
const positives = cases.filter((c) => c[3]).length;
|
|
225
|
+
if (positives < 3) {
|
|
226
|
+
process.stderr.write('❌ probe_unblocked_ask --self-test: fewer than 3 positive cases — a truncated suite must fail.\n');
|
|
227
|
+
return 1;
|
|
228
|
+
}
|
|
229
|
+
process.stdout.write(
|
|
230
|
+
`\nprobe_unblocked_ask --self-test: ${String(cases.length - failed)}/${String(cases.length)} case(s) behaved ` +
|
|
231
|
+
`(${String(positives)} positive, ${String(cases.length - positives)} negative)\n`,
|
|
232
|
+
);
|
|
233
|
+
return failed > 0 ? 1 : 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export function main(argv: string[]): number {
|
|
237
|
+
let limit = 60;
|
|
238
|
+
let storeArg: string | null = null;
|
|
239
|
+
let json = false;
|
|
240
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
241
|
+
const a = argv[i] as string;
|
|
242
|
+
if (a === '--limit') limit = Number(argv[++i]);
|
|
243
|
+
else if (a === '--store') storeArg = String(argv[++i]);
|
|
244
|
+
else if (a === '--json') json = true;
|
|
245
|
+
// --self-test runs BEFORE the store is resolved: the fixtures are
|
|
246
|
+
// in-process, and resolving a transcript store that may not exist here
|
|
247
|
+
// would make the sensitivity proof depend on the host having one.
|
|
248
|
+
else if (a === '--self-test') return selfTest();
|
|
249
|
+
else {
|
|
250
|
+
process.stderr.write(`probe_unblocked_ask: unrecognized argument: ${a}\n`);
|
|
251
|
+
return 0;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const store = storeArg ?? defaultStore(process.cwd());
|
|
255
|
+
const r = measure(store, limit);
|
|
256
|
+
if (json) {
|
|
257
|
+
process.stdout.write(`${JSON.stringify(r, null, 2)}\n`);
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
const pct = (n: number, d: number): string => (d === 0 ? 'n/a' : `${((100 * n) / d).toFixed(1)}%`);
|
|
261
|
+
process.stdout.write(
|
|
262
|
+
`probe_unblocked_ask · ${String(limit)} most recent session(s) under ${store}\n` +
|
|
263
|
+
` hand-back turns ${String(r.handbacks)}\n` +
|
|
264
|
+
` …with a numbered block ${String(r.withBlock)} (excluded — check_reply_consistency reads that surface)\n` +
|
|
265
|
+
` …unblocked asks ${String(r.unblockedAsks)} ${pct(r.unblockedAsks, r.handbacks)} of hand-backs\n` +
|
|
266
|
+
` …of those, malformed ${String(r.malformed)} ${pct(r.malformed, r.unblockedAsks)} of unblocked asks\n` +
|
|
267
|
+
'\n CEILING, not a point estimate: "hands a decision" is a heuristic and a\n' +
|
|
268
|
+
' rhetorical question can match it. A recommendation is matched on its LABEL,\n' +
|
|
269
|
+
' which is the rule\'s own bar but a bar on form.\n',
|
|
270
|
+
);
|
|
271
|
+
for (const s of r.samples) {
|
|
272
|
+
process.stdout.write(` · ${s.session} ${s.at}: ${s.span}\n`);
|
|
273
|
+
}
|
|
274
|
+
return 0;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
278
|
+
process.exit(main(process.argv.slice(2)));
|
|
279
|
+
}
|
|
@@ -617,7 +617,7 @@ export function render(quiet = false): number {
|
|
|
617
617
|
const parts = [
|
|
618
618
|
'# Package-Impact A/B Benchmark',
|
|
619
619
|
'',
|
|
620
|
-
'> Generated by `
|
|
620
|
+
'> Generated by `render_benchmark_md`. Do not edit. Source of truth: ' +
|
|
621
621
|
'`internal/bench/reports/ab/`. Re-render anytime with `task bench:ab:diff`.',
|
|
622
622
|
'',
|
|
623
623
|
render_headline(trackA, trackB, trackBRdp),
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Branch-vs-base packed-payload delta — make accretion legible while it is small.
|
|
4
|
+
*
|
|
5
|
+
* WHY, and this is the whole argument: the 2026-08-24 cap trip was a **merge
|
|
6
|
+
* artifact**. `origin/main` measured 8.3911 and the branch 8.4305, against a cap
|
|
7
|
+
* of 8.4 — *neither side was over alone*, and together they crossed. No
|
|
8
|
+
* per-branch absolute check can see that shape, which is why the cap had to be
|
|
9
|
+
* re-baselined rather than the payload fixed. `check_pack_size` answers "is the
|
|
10
|
+
* total under the cap"; this answers "how much did THIS branch add", which is
|
|
11
|
+
* the number that would have made the accretion visible four raises ago.
|
|
12
|
+
*
|
|
13
|
+
* It is a REPORT, not a gate. It prints a delta and exits 0 whatever the number,
|
|
14
|
+
* because a threshold here would be a second cap with no derivation behind it
|
|
15
|
+
* and the absolute cap already owns the refusal. `--fail-over <MB>` exists for a
|
|
16
|
+
* caller that wants one, and is deliberately not wired into CI.
|
|
17
|
+
*
|
|
18
|
+
* Measurement matches `pack-size-budget.json`'s documented conditions exactly —
|
|
19
|
+
* `npm pack --dry-run --json --ignore-scripts` on an unbuilt tree — because a
|
|
20
|
+
* delta between two figures measured differently is noise. Both sides are
|
|
21
|
+
* measured in throwaway detached worktrees for the same reason: a built working
|
|
22
|
+
* tree reads ~2 MB high, which the budget file records as a trap its own method
|
|
23
|
+
* invites.
|
|
24
|
+
*
|
|
25
|
+
* ```bash
|
|
26
|
+
* report_pack_delta # vs origin/main
|
|
27
|
+
* report_pack_delta --base origin/main --head HEAD
|
|
28
|
+
* report_pack_delta --json
|
|
29
|
+
* report_pack_delta --markdown # a PR-comment / step-summary block
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* Exit codes: 0 = reported · 2 = could not measure (a missing ref, a failed
|
|
33
|
+
* pack). Never non-zero for a large delta unless `--fail-over` says so.
|
|
34
|
+
*/
|
|
35
|
+
import * as fs from 'node:fs';
|
|
36
|
+
import * as os from 'node:os';
|
|
37
|
+
import * as path from 'node:path';
|
|
38
|
+
import { spawnSync } from 'node:child_process';
|
|
39
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
40
|
+
|
|
41
|
+
const _FILE = fileURLToPath(import.meta.url);
|
|
42
|
+
const REPO = path.resolve(path.dirname(_FILE), '..', '..');
|
|
43
|
+
|
|
44
|
+
export interface Side {
|
|
45
|
+
readonly ref: string;
|
|
46
|
+
readonly packedBytes: number;
|
|
47
|
+
readonly unpackedBytes: number;
|
|
48
|
+
readonly entries: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface Delta {
|
|
52
|
+
readonly base: Side;
|
|
53
|
+
readonly head: Side;
|
|
54
|
+
readonly packedDeltaBytes: number;
|
|
55
|
+
readonly entryDelta: number;
|
|
56
|
+
readonly capMb: number | null;
|
|
57
|
+
readonly headroomBytes: number | null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const run = (cmd: string, args: readonly string[], cwd: string): { code: number; out: string; err: string } => {
|
|
61
|
+
const r = spawnSync(cmd, [...args], {
|
|
62
|
+
cwd,
|
|
63
|
+
encoding: 'utf8',
|
|
64
|
+
timeout: 600_000,
|
|
65
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
66
|
+
});
|
|
67
|
+
return { code: r.status ?? 1, out: r.stdout ?? '', err: r.stderr ?? '' };
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/** Measure one ref in a throwaway detached worktree, unbuilt. */
|
|
71
|
+
export function measure(ref: string): Side {
|
|
72
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ac-pack-delta-'));
|
|
73
|
+
const tree = path.join(dir, 'tree');
|
|
74
|
+
try {
|
|
75
|
+
const add = run('git', ['worktree', 'add', '--quiet', '--detach', tree, ref], REPO);
|
|
76
|
+
if (add.code !== 0) throw new Error(`cannot check out ${ref}: ${add.err.trim()}`);
|
|
77
|
+
const packed = run('npm', ['pack', '--dry-run', '--json', '--ignore-scripts'], tree);
|
|
78
|
+
if (packed.code !== 0) throw new Error(`npm pack failed for ${ref}: ${packed.err.slice(-600)}`);
|
|
79
|
+
const start = packed.out.indexOf('[');
|
|
80
|
+
if (start === -1) throw new Error(`npm pack produced no JSON for ${ref}`);
|
|
81
|
+
const meta = JSON.parse(packed.out.slice(start)) as Array<{
|
|
82
|
+
size: number;
|
|
83
|
+
unpackedSize: number;
|
|
84
|
+
entryCount: number;
|
|
85
|
+
}>;
|
|
86
|
+
const m = meta[0];
|
|
87
|
+
if (m === undefined) throw new Error(`npm pack produced no entry for ${ref}`);
|
|
88
|
+
return { ref, packedBytes: m.size, unpackedBytes: m.unpackedSize, entries: m.entryCount };
|
|
89
|
+
} finally {
|
|
90
|
+
run('git', ['worktree', 'remove', '--force', tree], REPO);
|
|
91
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function readCap(): number | null {
|
|
96
|
+
try {
|
|
97
|
+
const raw = fs.readFileSync(path.join(REPO, 'src', 'config', 'pack-size-budget.json'), 'utf8');
|
|
98
|
+
const d = JSON.parse(raw) as { budgets?: { packed_size_mb?: { max?: number } } };
|
|
99
|
+
const max = d.budgets?.packed_size_mb?.max;
|
|
100
|
+
return typeof max === 'number' ? max : null;
|
|
101
|
+
} catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function delta(baseRef: string, headRef: string): Delta {
|
|
107
|
+
const base = measure(baseRef);
|
|
108
|
+
const head = measure(headRef);
|
|
109
|
+
const capMb = readCap();
|
|
110
|
+
return {
|
|
111
|
+
base,
|
|
112
|
+
head,
|
|
113
|
+
packedDeltaBytes: head.packedBytes - base.packedBytes,
|
|
114
|
+
entryDelta: head.entries - base.entries,
|
|
115
|
+
capMb,
|
|
116
|
+
headroomBytes: capMb === null ? null : Math.round(capMb * 1e6 - head.packedBytes),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const kb = (n: number): string => `${(n / 1024).toFixed(1)} KB`;
|
|
121
|
+
const mb = (n: number): string => `${(n / 1e6).toFixed(4)} MB`;
|
|
122
|
+
const signed = (n: number): string => `${n >= 0 ? '+' : '−'}${kb(Math.abs(n))}`;
|
|
123
|
+
|
|
124
|
+
export function markdown(d: Delta): string {
|
|
125
|
+
const dir = d.packedDeltaBytes === 0 ? 'unchanged' : d.packedDeltaBytes > 0 ? 'grew' : 'shrank';
|
|
126
|
+
const lines = [
|
|
127
|
+
`**Packed payload ${dir}: ${signed(d.packedDeltaBytes)}**`,
|
|
128
|
+
'',
|
|
129
|
+
'| | packed | entries |',
|
|
130
|
+
'|---|---|---|',
|
|
131
|
+
`| base \`${d.base.ref}\` | ${mb(d.base.packedBytes)} | ${d.base.entries} |`,
|
|
132
|
+
`| head \`${d.head.ref}\` | ${mb(d.head.packedBytes)} | ${d.head.entries} |`,
|
|
133
|
+
`| delta | **${signed(d.packedDeltaBytes)}** | ${d.entryDelta >= 0 ? '+' : ''}${d.entryDelta} |`,
|
|
134
|
+
];
|
|
135
|
+
if (d.capMb !== null && d.headroomBytes !== null) {
|
|
136
|
+
lines.push(
|
|
137
|
+
'',
|
|
138
|
+
`Cap ${d.capMb} MB · headroom after this branch **${kb(d.headroomBytes)}**.`,
|
|
139
|
+
'',
|
|
140
|
+
'<sub>Measured `npm pack --dry-run --ignore-scripts` on unbuilt detached worktrees of both refs — the ' +
|
|
141
|
+
'conditions `pack-size-budget.json` documents. A report, not a gate: the absolute cap owns the refusal. ' +
|
|
142
|
+
'This line exists because the 2026-08-24 trip was a MERGE artifact — neither side was over alone.</sub>',
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
return lines.join('\n');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
149
|
+
const arg = (name: string, dflt: string): string => {
|
|
150
|
+
const i = argv.indexOf(name);
|
|
151
|
+
return i !== -1 && argv[i + 1] !== undefined ? (argv[i + 1] as string) : dflt;
|
|
152
|
+
};
|
|
153
|
+
const baseRef = arg('--base', 'origin/main');
|
|
154
|
+
const headRef = arg('--head', 'HEAD');
|
|
155
|
+
const failOver = arg('--fail-over', '');
|
|
156
|
+
|
|
157
|
+
let d: Delta;
|
|
158
|
+
try {
|
|
159
|
+
d = delta(baseRef, headRef);
|
|
160
|
+
} catch (exc) {
|
|
161
|
+
process.stderr.write(`report_pack_delta: ${String(exc)}\n`);
|
|
162
|
+
return 2;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (argv.includes('--json')) {
|
|
166
|
+
process.stdout.write(`${JSON.stringify(d, null, 2)}\n`);
|
|
167
|
+
} else if (argv.includes('--markdown')) {
|
|
168
|
+
process.stdout.write(`${markdown(d)}\n`);
|
|
169
|
+
} else {
|
|
170
|
+
process.stdout.write(
|
|
171
|
+
`pack delta ${baseRef} → ${headRef}: ${signed(d.packedDeltaBytes)} ` +
|
|
172
|
+
`(${mb(d.base.packedBytes)} → ${mb(d.head.packedBytes)}, ` +
|
|
173
|
+
`${d.entryDelta >= 0 ? '+' : ''}${d.entryDelta} entries)\n`,
|
|
174
|
+
);
|
|
175
|
+
if (d.capMb !== null && d.headroomBytes !== null) {
|
|
176
|
+
process.stdout.write(` cap ${d.capMb} MB · headroom ${kb(d.headroomBytes)}\n`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// `scanned:` per the gate-coverage contract — two refs is what it inspected.
|
|
180
|
+
process.stdout.write('scanned: 2\n');
|
|
181
|
+
|
|
182
|
+
if (failOver !== '') {
|
|
183
|
+
const limit = Number(failOver) * 1e6;
|
|
184
|
+
if (Number.isFinite(limit) && d.packedDeltaBytes > limit) {
|
|
185
|
+
process.stderr.write(`report_pack_delta: delta ${kb(d.packedDeltaBytes)} exceeds --fail-over ${failOver} MB\n`);
|
|
186
|
+
return 1;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function _isCliEntry(): boolean {
|
|
193
|
+
const a = process.argv[1];
|
|
194
|
+
if (!a) return false;
|
|
195
|
+
if (a === _FILE || pathToFileURL(path.resolve(a)).href === import.meta.url) return true;
|
|
196
|
+
try {
|
|
197
|
+
return fs.realpathSync(a) === fs.realpathSync(_FILE);
|
|
198
|
+
} catch {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (_isCliEntry()) process.exit(main());
|
|
203
|
+
|
|
204
|
+
export { REPO };
|
|
@@ -58,6 +58,7 @@ import * as fs from 'node:fs';
|
|
|
58
58
|
import * as path from 'node:path';
|
|
59
59
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
60
60
|
|
|
61
|
+
import { isExclusivelyPackageOnly } from '../install/partitionEligibility.js';
|
|
61
62
|
import { _claude_paths_plan, _has_non_path_trigger, _parse_frontmatter } from './condense.js';
|
|
62
63
|
|
|
63
64
|
const RULES_DIR = path.join('src', 'rules');
|
|
@@ -83,6 +84,13 @@ export interface RuleActivation {
|
|
|
83
84
|
emitted_globs: string[];
|
|
84
85
|
/** Patterns the emitter deliberately drops, with the reason it records. */
|
|
85
86
|
dropped: { pattern: string; reason: string }[];
|
|
87
|
+
/**
|
|
88
|
+
* Scoped to this package alone, so ADR-236 withholds it from every global
|
|
89
|
+
* host layer. Load-bearing for the projection comparison: a package-only
|
|
90
|
+
* rule is counted by the source verdict and is absent from a delivered
|
|
91
|
+
* tree by design, not by drift.
|
|
92
|
+
*/
|
|
93
|
+
package_only: boolean;
|
|
86
94
|
/**
|
|
87
95
|
* The emitter's verdict in one word.
|
|
88
96
|
* `scoped` — loads on a path match · `unconditional` — loads every session ·
|
|
@@ -111,7 +119,11 @@ function _declares(meta: Record<string, unknown>, keys: readonly string[]): bool
|
|
|
111
119
|
}
|
|
112
120
|
|
|
113
121
|
/** Classify one rule file through the emitter's own exported decision path. */
|
|
114
|
-
export function classify_rule(
|
|
122
|
+
export function classify_rule(
|
|
123
|
+
id: string,
|
|
124
|
+
content: string,
|
|
125
|
+
package_only = false,
|
|
126
|
+
): RuleActivation {
|
|
115
127
|
const [meta] = _parse_frontmatter(content);
|
|
116
128
|
const plan = _claude_paths_plan(meta);
|
|
117
129
|
const has_path_trigger = _declares(meta, PATH_TRIGGER_KEYS);
|
|
@@ -139,6 +151,7 @@ export function classify_rule(id: string, content: string): RuleActivation {
|
|
|
139
151
|
emitted_globs: plan.globs,
|
|
140
152
|
dropped: plan.dropped.map((d) => ({ pattern: d.pattern, reason: d.reason })),
|
|
141
153
|
verdict,
|
|
154
|
+
package_only,
|
|
142
155
|
};
|
|
143
156
|
}
|
|
144
157
|
|
|
@@ -150,7 +163,11 @@ export function census(root: string): RuleActivation[] {
|
|
|
150
163
|
.map((e) => e.name)
|
|
151
164
|
.sort();
|
|
152
165
|
return files.map((f) =>
|
|
153
|
-
classify_rule(
|
|
166
|
+
classify_rule(
|
|
167
|
+
f.replace(/\.md$/, ''),
|
|
168
|
+
fs.readFileSync(path.join(dir, f), 'utf8'),
|
|
169
|
+
isExclusivelyPackageOnly(path.join(dir, f)),
|
|
170
|
+
),
|
|
154
171
|
);
|
|
155
172
|
}
|
|
156
173
|
|
|
@@ -223,10 +240,14 @@ export function main(): number {
|
|
|
223
240
|
|
|
224
241
|
const rows = census(root);
|
|
225
242
|
const sum = summarize(rows);
|
|
243
|
+
const resolved_projection_dir =
|
|
244
|
+
projection_dir === undefined || projection_dir === null || projection_dir === ''
|
|
245
|
+
? ''
|
|
246
|
+
: path.isAbsolute(projection_dir)
|
|
247
|
+
? projection_dir
|
|
248
|
+
: path.join(root, projection_dir);
|
|
226
249
|
const projection = projection_dir
|
|
227
|
-
? projection_reading(
|
|
228
|
-
? projection_dir
|
|
229
|
-
: path.join(root, projection_dir))
|
|
250
|
+
? projection_reading(resolved_projection_dir)
|
|
230
251
|
: null;
|
|
231
252
|
|
|
232
253
|
if (as_json) {
|
|
@@ -259,11 +280,51 @@ export function main(): number {
|
|
|
259
280
|
`\n host projection at ${projection_dir} — reported SEPARATELY, not merged:\n` +
|
|
260
281
|
` files ${projection.files} · declaring paths: ${projection.with_paths}\n`,
|
|
261
282
|
);
|
|
262
|
-
|
|
283
|
+
// The source verdict counts EVERY rule in `src/rules/`. A GLOBAL host
|
|
284
|
+
// layer does not carry the package-only ones: ADR-236 partitions them to
|
|
285
|
+
// the project layer, so such a tree is expected to be short by exactly
|
|
286
|
+
// that many. Comparing the raw counts reported a divergence on every
|
|
287
|
+
// partitioned install forever — the emitter was right and the
|
|
288
|
+
// comparator was not subtracting.
|
|
289
|
+
//
|
|
290
|
+
// But the subtraction is NOT unconditional, and making it so was its own
|
|
291
|
+
// regression (completion review, 2026-08-30): a full or project-layer
|
|
292
|
+
// projection — which is also the fail-safe default `partitionEligibility`
|
|
293
|
+
// returns on a fresh checkout, an absent install record, or a version or
|
|
294
|
+
// fingerprint mismatch — DOES carry those rules, and for this repo's own
|
|
295
|
+
// project layer `source-of-truth` is the one rule delivered there and the
|
|
296
|
+
// only one declaring `paths:`. Subtracting it there inverts the line.
|
|
297
|
+
//
|
|
298
|
+
// So the partition is DETECTED from the projection rather than assumed:
|
|
299
|
+
// if a package-only rule's file is present, this is not a global layer.
|
|
300
|
+
const pkg_only_ids = rows.filter((r) => r.package_only).map((r) => r.id);
|
|
301
|
+
const partitioned = !pkg_only_ids.some((id) =>
|
|
302
|
+
fs.existsSync(path.join(resolved_projection_dir, `${id}.md`)),
|
|
303
|
+
);
|
|
304
|
+
const scoped_pkg_only = partitioned
|
|
305
|
+
? rows.filter((r) => r.verdict === 'scoped' && r.package_only)
|
|
306
|
+
: [];
|
|
307
|
+
const expected = sum.scoped - scoped_pkg_only.length;
|
|
308
|
+
if (scoped_pkg_only.length > 0) {
|
|
309
|
+
process.stdout.write(
|
|
310
|
+
` source scopes ${sum.scoped}; ${scoped_pkg_only.length} of those ` +
|
|
311
|
+
`${scoped_pkg_only.length === 1 ? 'is' : 'are'} package-only and never\n` +
|
|
312
|
+
` delivered (${scoped_pkg_only.map((r) => r.id).join(', ')}), so a ` +
|
|
313
|
+
`partitioned projection is\n expected to declare ${expected}.\n`,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
if (projection.with_paths !== expected) {
|
|
317
|
+
process.stdout.write(
|
|
318
|
+
` ⚠️ diverges from the source verdict (${expected} expected` +
|
|
319
|
+
`${scoped_pkg_only.length > 0 ? `, ${sum.scoped} before the package-only partition` : ''}).\n` +
|
|
320
|
+
` A projection carries no record of the scope or commit it was generated\n` +
|
|
321
|
+
` at, so this is a reason to regenerate it — never a reading of the\n` +
|
|
322
|
+
` emitter.\n`,
|
|
323
|
+
);
|
|
324
|
+
} else {
|
|
263
325
|
process.stdout.write(
|
|
264
|
-
`
|
|
265
|
-
|
|
266
|
-
` is a reason to regenerate it — never a reading of the emitter.\n`,
|
|
326
|
+
` ✅ consistent with the source verdict (${expected} expected, ` +
|
|
327
|
+
`${projection.with_paths} found).\n`,
|
|
267
328
|
);
|
|
268
329
|
}
|
|
269
330
|
} else if (projection_dir) {
|
|
@@ -228,7 +228,7 @@ export function render(
|
|
|
228
228
|
validation: ValidationResult = validate_targets(byTarget),
|
|
229
229
|
): string {
|
|
230
230
|
const L: string[] = [];
|
|
231
|
-
L.push('<!-- GENERATED by
|
|
231
|
+
L.push('<!-- GENERATED by rule_backlinks — do NOT hand-edit.');
|
|
232
232
|
L.push(' Regenerate after each P4 migration batch. Report-only. -->');
|
|
233
233
|
L.push('');
|
|
234
234
|
L.push('# Rule backlinks — which rules route here');
|