@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
|
@@ -48,6 +48,7 @@ import { censusRuleDir, type RuleDirCensus } from './_lib/carrier_divergence.js'
|
|
|
48
48
|
import { DEFAULT_PROJECTS_ROOT, scanTranscripts } from './_lib/cc_transcript.js';
|
|
49
49
|
import { censusDuplicateScope } from './_lib/duplicate_scope_census.js';
|
|
50
50
|
import { computeColdStarts } from './cache_realization_report.js';
|
|
51
|
+
import type { EvidenceBasis } from './_lib/evidence_basis.js';
|
|
51
52
|
|
|
52
53
|
const _HERE = fileURLToPath(import.meta.url);
|
|
53
54
|
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
@@ -81,6 +82,72 @@ function readCharsIfExists(p: string): number {
|
|
|
81
82
|
// scope, and this file uses both below.
|
|
82
83
|
export { censusRuleDir, type RuleDirCensus };
|
|
83
84
|
|
|
85
|
+
/**
|
|
86
|
+
* The user-scope rule payload, DERIVED from the projection instead of read off
|
|
87
|
+
* the developer's machine.
|
|
88
|
+
*
|
|
89
|
+
* `road-to-agent-turnaround` 4.1. `src/config/preamble-payload-budget.json`
|
|
90
|
+
* excludes the user-scope bucket as *"machine-dependent, not CI-checkable"*.
|
|
91
|
+
* That reason is falsifiable and this function falsifies it: the layer is
|
|
92
|
+
* written by this package's own installer out of `dist/agent-src/rules/`, and
|
|
93
|
+
* which rules go to the GLOBAL layer rather than the project one is decided by
|
|
94
|
+
* frontmatter — `workspaces:` naming the package's own maintainer workspace —
|
|
95
|
+
* not by anything on the machine.
|
|
96
|
+
*
|
|
97
|
+
* Verified exactly on 2026-08-30, which is why this is a partition and not an
|
|
98
|
+
* estimate: 119 projected rules, 15 carrying `workspaces: [agent-config-maintainer]`,
|
|
99
|
+
* and 119 − 15 = 104 = the file count of the installed `~/.claude/rules/`. The
|
|
100
|
+
* 15 split further into 13 written to the project `.claude/rules/` and 2 that
|
|
101
|
+
* are `type: manual` and written nowhere — which is why `packageOnly` is
|
|
102
|
+
* reported rather than folded away.
|
|
103
|
+
*
|
|
104
|
+
* The predicate is deliberately narrow: a rule is package-only when its
|
|
105
|
+
* `workspaces:` list exists and contains ONLY the maintainer workspace. A rule
|
|
106
|
+
* with no `workspaces:` key ships everywhere, which is the common case.
|
|
107
|
+
*/
|
|
108
|
+
export interface DeliveredRuleCensus {
|
|
109
|
+
/** Rules the global layer receives — the machine-independent user-scope figure. */
|
|
110
|
+
delivered: RuleDirCensus;
|
|
111
|
+
/** Rules restricted to this package's own workspace. */
|
|
112
|
+
packageOnly: RuleDirCensus;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const MAINTAINER_WORKSPACE = 'agent-config-maintainer';
|
|
116
|
+
|
|
117
|
+
export function censusDeliveredRulePayload(projectionDir: string): DeliveredRuleCensus {
|
|
118
|
+
const empty = (): RuleDirCensus => ({ files: 0, chars: 0 });
|
|
119
|
+
const delivered = empty();
|
|
120
|
+
const packageOnly = empty();
|
|
121
|
+
let names: string[];
|
|
122
|
+
try {
|
|
123
|
+
names = fs.readdirSync(projectionDir).filter((f) => f.endsWith('.md'));
|
|
124
|
+
} catch {
|
|
125
|
+
return { delivered, packageOnly };
|
|
126
|
+
}
|
|
127
|
+
for (const name of names) {
|
|
128
|
+
const abs = path.join(projectionDir, name);
|
|
129
|
+
let text: string;
|
|
130
|
+
try {
|
|
131
|
+
text = fs.readFileSync(abs, 'utf8');
|
|
132
|
+
} catch {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const m = /^workspaces:\s*\[([^\]]*)\]/m.exec(text);
|
|
136
|
+
const listed =
|
|
137
|
+
m === null
|
|
138
|
+
? []
|
|
139
|
+
: m[1]!
|
|
140
|
+
.split(',')
|
|
141
|
+
.map((x) => x.trim())
|
|
142
|
+
.filter((x) => x !== '');
|
|
143
|
+
const isPackageOnly = listed.length > 0 && listed.every((w) => w === MAINTAINER_WORKSPACE);
|
|
144
|
+
const bucket = isPackageOnly ? packageOnly : delivered;
|
|
145
|
+
bucket.files += 1;
|
|
146
|
+
bucket.chars += Buffer.byteLength(text, 'utf8');
|
|
147
|
+
}
|
|
148
|
+
return { delivered, packageOnly };
|
|
149
|
+
}
|
|
150
|
+
|
|
84
151
|
export interface PerRuleCost {
|
|
85
152
|
file: string;
|
|
86
153
|
chars: number;
|
|
@@ -187,12 +254,19 @@ export interface SkillsCatalogCensus {
|
|
|
187
254
|
chars: number;
|
|
188
255
|
}
|
|
189
256
|
|
|
190
|
-
interface RawSkillFrontmatter {
|
|
257
|
+
export interface RawSkillFrontmatter {
|
|
191
258
|
name?: unknown;
|
|
192
259
|
description?: unknown;
|
|
193
260
|
}
|
|
194
261
|
|
|
195
|
-
|
|
262
|
+
/**
|
|
263
|
+
* Exported since `road-to-delivered-cost-truth` 2.1: the per-asset ledger must
|
|
264
|
+
* build the catalogue line the SAME way this census does, or the two disagree
|
|
265
|
+
* about the same corpus. A second regex-based reader was tried and reconciled
|
|
266
|
+
* 17.1 % low, because a `[^\n]+` capture truncates every folded multi-line
|
|
267
|
+
* `description:` — the reconciliation caught it, which is what it is for.
|
|
268
|
+
*/
|
|
269
|
+
export function parseFrontmatter(text: string): RawSkillFrontmatter {
|
|
196
270
|
if (!text.startsWith('---')) return {};
|
|
197
271
|
const end = text.indexOf('\n---', 3);
|
|
198
272
|
if (end === -1) return {};
|
|
@@ -242,14 +316,40 @@ export interface ByteCensusSource {
|
|
|
242
316
|
files: number;
|
|
243
317
|
chars: number;
|
|
244
318
|
tokens_estimate: number;
|
|
245
|
-
/**
|
|
246
|
-
|
|
319
|
+
/**
|
|
320
|
+
* Migrated onto the shared evidence-basis vocabulary
|
|
321
|
+
* (`road-to-delivered-cost-truth` 4.1). `measured_local_file` was this
|
|
322
|
+
* file's private spelling of `measured`, and `residual` was its spelling of
|
|
323
|
+
* a figure derived by subtraction — which the contract calls `estimated`.
|
|
324
|
+
* Two names for one idea is how a vocabulary forks; the old literals are
|
|
325
|
+
* gone rather than aliased.
|
|
326
|
+
*/
|
|
327
|
+
provenance: Extract<EvidenceBasis, 'measured' | 'estimated'>;
|
|
247
328
|
/** How this figure was derived — mandatory for anything not a plain file-size sum. */
|
|
248
329
|
basis: string;
|
|
249
330
|
}
|
|
250
331
|
|
|
251
332
|
export interface ByteCensus {
|
|
252
333
|
sources: ByteCensusSource[];
|
|
334
|
+
/**
|
|
335
|
+
* The projection-derived view of the user-scope bucket — road-to-agent-turnaround 4.1.
|
|
336
|
+
*
|
|
337
|
+
* DELIBERATELY NOT IN `sources`, and the reason is a defect this change made
|
|
338
|
+
* and caught: `sources` is SUMMED into `measurable_tokens_total`, and this is
|
|
339
|
+
* a second VIEW of the user-scope row already in it, not additional payload.
|
|
340
|
+
* Putting it there added ~123k phantom tokens to the total and reddened
|
|
341
|
+
* `check_preamble_payload_budget` on the first run. A non-additive figure
|
|
342
|
+
* belongs beside the sum, never inside it.
|
|
343
|
+
*/
|
|
344
|
+
derived_user_scope: {
|
|
345
|
+
delivered_files: number;
|
|
346
|
+
delivered_chars: number;
|
|
347
|
+
delivered_tokens: number;
|
|
348
|
+
package_only_files: number;
|
|
349
|
+
package_only_chars: number;
|
|
350
|
+
package_only_tokens: number;
|
|
351
|
+
basis: string;
|
|
352
|
+
};
|
|
253
353
|
measurable_tokens_total: number;
|
|
254
354
|
/** Includes the residual bucket — always ≈ measured_cold_start_median by construction (see module doc comment). */
|
|
255
355
|
grand_total_tokens: number;
|
|
@@ -338,6 +438,7 @@ export function buildByteCensus(opts: {
|
|
|
338
438
|
skillsCatalog: SkillsCatalogCensus;
|
|
339
439
|
topRules: PerRuleCost[];
|
|
340
440
|
duplicateScope: ReturnType<typeof censusDuplicateScope>;
|
|
441
|
+
deliveredRules: DeliveredRuleCensus;
|
|
341
442
|
measuredColdStartMedian: number | null;
|
|
342
443
|
coldStartLegs: number;
|
|
343
444
|
}): ByteCensus {
|
|
@@ -358,7 +459,7 @@ export function buildByteCensus(opts: {
|
|
|
358
459
|
files: opts.userRules.files,
|
|
359
460
|
chars: opts.userRules.chars,
|
|
360
461
|
tokens_estimate: tokensFromChars(opts.userRules.chars),
|
|
361
|
-
provenance: '
|
|
462
|
+
provenance: 'measured',
|
|
362
463
|
basis: 'Σ byte size of every .md file in the user-scope rules directory, chars/4.',
|
|
363
464
|
},
|
|
364
465
|
{
|
|
@@ -366,7 +467,7 @@ export function buildByteCensus(opts: {
|
|
|
366
467
|
files: opts.projectRules.files,
|
|
367
468
|
chars: opts.projectRules.chars,
|
|
368
469
|
tokens_estimate: tokensFromChars(opts.projectRules.chars),
|
|
369
|
-
provenance: '
|
|
470
|
+
provenance: 'measured',
|
|
370
471
|
basis: 'Σ byte size of every .md file in the project-scope rules directory, chars/4.',
|
|
371
472
|
},
|
|
372
473
|
{
|
|
@@ -374,7 +475,7 @@ export function buildByteCensus(opts: {
|
|
|
374
475
|
files: claudeMdFiles,
|
|
375
476
|
chars: claudeMdChars,
|
|
376
477
|
tokens_estimate: tokensFromChars(claudeMdChars),
|
|
377
|
-
provenance: '
|
|
478
|
+
provenance: 'measured',
|
|
378
479
|
basis:
|
|
379
480
|
'Byte size of project CLAUDE.md + project CLAUDE.local.md (if present) + user ~/.claude/CLAUDE.md ' +
|
|
380
481
|
'+ every file pulled in by a top-level "@<path>" import line in the user CLAUDE.md, chars/4.',
|
|
@@ -384,7 +485,7 @@ export function buildByteCensus(opts: {
|
|
|
384
485
|
files: opts.globalProfile.present ? 1 : 0,
|
|
385
486
|
chars: opts.globalProfile.chars,
|
|
386
487
|
tokens_estimate: tokensFromChars(opts.globalProfile.chars),
|
|
387
|
-
provenance: '
|
|
488
|
+
provenance: 'measured',
|
|
388
489
|
basis: opts.globalProfile.present
|
|
389
490
|
? `Byte size of ${opts.globalProfile.path as string}, chars/4.`
|
|
390
491
|
: 'Layer not written yet on this machine (resolveGlobalProfilePath() returned null) — treated as 0, per the roadmap\'s own honesty caveat.',
|
|
@@ -394,7 +495,7 @@ export function buildByteCensus(opts: {
|
|
|
394
495
|
files: opts.skillsCatalog.skills,
|
|
395
496
|
chars: opts.skillsCatalog.chars,
|
|
396
497
|
tokens_estimate: tokensFromChars(opts.skillsCatalog.chars),
|
|
397
|
-
provenance: '
|
|
498
|
+
provenance: 'measured',
|
|
398
499
|
basis:
|
|
399
500
|
'Σ "- <name>: <description>\\n" over every SKILL.md frontmatter, chars/4 — the description-text ' +
|
|
400
501
|
'component only; the host\'s exact on-wire catalog format is not independently file-measurable.',
|
|
@@ -411,7 +512,7 @@ export function buildByteCensus(opts: {
|
|
|
411
512
|
files: 0,
|
|
412
513
|
chars: 0,
|
|
413
514
|
tokens_estimate: residualTokens,
|
|
414
|
-
provenance: '
|
|
515
|
+
provenance: 'estimated',
|
|
415
516
|
basis:
|
|
416
517
|
'measured_cold_start_median minus the sum of the file-measurable buckets above. No local transcript ' +
|
|
417
518
|
'or file carries the request\'s raw tool-definition JSON or the per-spawn dispatch-prompt text ' +
|
|
@@ -441,6 +542,21 @@ export function buildByteCensus(opts: {
|
|
|
441
542
|
|
|
442
543
|
return {
|
|
443
544
|
sources,
|
|
545
|
+
derived_user_scope: {
|
|
546
|
+
delivered_files: opts.deliveredRules.delivered.files,
|
|
547
|
+
delivered_chars: opts.deliveredRules.delivered.chars,
|
|
548
|
+
delivered_tokens: tokensFromChars(opts.deliveredRules.delivered.chars),
|
|
549
|
+
package_only_files: opts.deliveredRules.packageOnly.files,
|
|
550
|
+
package_only_chars: opts.deliveredRules.packageOnly.chars,
|
|
551
|
+
package_only_tokens: tokensFromChars(opts.deliveredRules.packageOnly.chars),
|
|
552
|
+
basis:
|
|
553
|
+
'Σ byte size of every dist/agent-src/rules/*.md whose `workspaces:` does not restrict it to ' +
|
|
554
|
+
`the ${MAINTAINER_WORKSPACE} workspace, chars/4 — computed without reading ~/.claude at all. ` +
|
|
555
|
+
'This is the bucket src/config/preamble-payload-budget.json excludes as "machine-dependent, ' +
|
|
556
|
+
'not CI-checkable", and computing it here is what falsifies that reason. A gap against the ' +
|
|
557
|
+
'measured user-scope row is INSTALL DRIFT (the machine carries an older release), never a ' +
|
|
558
|
+
'defect in either number.',
|
|
559
|
+
},
|
|
444
560
|
measurable_tokens_total: measurableTokensTotal,
|
|
445
561
|
grand_total_tokens: grandTotal,
|
|
446
562
|
measured_cold_start_median: median,
|
|
@@ -471,6 +587,7 @@ export function buildReport(opts: Options): ByteCensus {
|
|
|
471
587
|
const skillsCatalog = censusSkillsCatalog(opts.skillsDir);
|
|
472
588
|
const topRules = topRulesByCost(opts.projectRulesDir, 10);
|
|
473
589
|
const duplicateScope = censusDuplicateScope(opts.userRulesDir, opts.projectRulesDir);
|
|
590
|
+
const deliveredRules = censusDeliveredRulePayload(opts.projectRulesDir);
|
|
474
591
|
|
|
475
592
|
const scan = scanTranscripts({ root: opts.root, maxAgeDays: opts.maxAgeDays });
|
|
476
593
|
const coldStart = computeColdStarts(scan.records);
|
|
@@ -484,6 +601,7 @@ export function buildReport(opts: Options): ByteCensus {
|
|
|
484
601
|
skillsCatalog,
|
|
485
602
|
topRules,
|
|
486
603
|
duplicateScope,
|
|
604
|
+
deliveredRules,
|
|
487
605
|
measuredColdStartMedian,
|
|
488
606
|
coldStartLegs: coldStart.legs,
|
|
489
607
|
});
|
|
@@ -504,6 +622,17 @@ export function renderText(r: ByteCensus): string {
|
|
|
504
622
|
out.push(` basis: ${s.basis}`);
|
|
505
623
|
}
|
|
506
624
|
out.push('');
|
|
625
|
+
const d = r.derived_user_scope;
|
|
626
|
+
out.push('');
|
|
627
|
+
out.push('User-scope bucket, DERIVED from the projection (NOT summed — a second view of a row above):');
|
|
628
|
+
out.push(
|
|
629
|
+
` delivered to the global layer: files=${String(d.delivered_files)} chars=${String(d.delivered_chars)} tokens_estimate=${String(d.delivered_tokens)}`,
|
|
630
|
+
);
|
|
631
|
+
out.push(
|
|
632
|
+
` package-only (never delivered): files=${String(d.package_only_files)} chars=${String(d.package_only_chars)} tokens_estimate=${String(d.package_only_tokens)}`,
|
|
633
|
+
);
|
|
634
|
+
out.push(` basis: ${d.basis}`);
|
|
635
|
+
out.push('');
|
|
507
636
|
out.push(`measurable_tokens_total (excludes residual): ${Math.round(r.measurable_tokens_total)}`);
|
|
508
637
|
out.push(`grand_total_tokens (includes residual): ${Math.round(r.grand_total_tokens)}`);
|
|
509
638
|
if (r.measured_cold_start_median !== null) {
|
|
@@ -76,6 +76,8 @@ process.stderr.write(`prepack-check: ${BIN} OK\n`);
|
|
|
76
76
|
// the shipped set is derived from the package.json `files` whitelist.
|
|
77
77
|
// ---------------------------------------------------------------------------
|
|
78
78
|
import { readdirSync } from 'node:fs';
|
|
79
|
+
|
|
80
|
+
import { stripCommentsMjs } from './_lib/strip_comments.mjs';
|
|
79
81
|
import { dirname, join, relative, sep } from 'node:path';
|
|
80
82
|
|
|
81
83
|
const pkg = JSON.parse(readFileSync(resolve('package.json'), 'utf8'));
|
|
@@ -109,6 +111,7 @@ function* walk(dir) {
|
|
|
109
111
|
|
|
110
112
|
const IMPORT_RE = /(?:from\s+|import\s*\(\s*|require\s*\(\s*)['"](\.\.?\/[^'"]+)['"]/g;
|
|
111
113
|
|
|
114
|
+
|
|
112
115
|
function resolveCandidates(fromDir, spec) {
|
|
113
116
|
const base = join(fromDir, spec);
|
|
114
117
|
return [
|
|
@@ -126,7 +129,7 @@ const importErrors = [];
|
|
|
126
129
|
const scanRoots = shippedPrefixes.filter((p) => p.startsWith('src/'));
|
|
127
130
|
for (const root of scanRoots) {
|
|
128
131
|
for (const file of walk(resolve(root))) {
|
|
129
|
-
const text = readFileSync(file, 'utf8');
|
|
132
|
+
const text = stripCommentsMjs(readFileSync(file, 'utf8'));
|
|
130
133
|
for (const m of text.matchAll(IMPORT_RE)) {
|
|
131
134
|
const spec = m[1];
|
|
132
135
|
const candidates = resolveCandidates(dirname(file), spec);
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Turnaround instrument — round-trips, batch size, blocking waits, context floor.
|
|
4
|
+
*
|
|
5
|
+
* WHY IT EXISTS. `agents/evidence/analysis/agent-turnaround-2026-08-30.md`
|
|
6
|
+
* measured that a user request in this package costs 42.6 API round-trips and a
|
|
7
|
+
* file change costs 58 tool calls, and its fifth finding is that NONE of it was
|
|
8
|
+
* measurable before: no instrument in the tree reported round-trips per request,
|
|
9
|
+
* tool-call batch size, or the blocking-wait tail, so no gate could have caught
|
|
10
|
+
* any of them growing. That analysis was a throwaway script. This is the
|
|
11
|
+
* committed form of it — `road-to-agent-turnaround` Phase 1.1.
|
|
12
|
+
*
|
|
13
|
+
* THE UNIT IS `requestId`, NOT THE ROW. The host writes `thinking`, `text` and
|
|
14
|
+
* `tool_use` as SEPARATE JSONL rows that share one `requestId`, so counting rows
|
|
15
|
+
* inflates every per-call figure. That was the first wrong answer the original
|
|
16
|
+
* measurement produced, and it is why this file groups before it counts.
|
|
17
|
+
*
|
|
18
|
+
* WHAT IT REPORTS, per corpus:
|
|
19
|
+
* - API calls per real user request (F1)
|
|
20
|
+
* - mean tool-call batch size (F1 — measured 1.00, i.e. fully serial)
|
|
21
|
+
* - the >60 s blocking tail and its share of tool time (F2)
|
|
22
|
+
* - the first-call context floor (F3 cross-check)
|
|
23
|
+
*
|
|
24
|
+
* A MEASUREMENT, NOT A GATE — by default. `--against-baseline` compares against
|
|
25
|
+
* `src/config/turnaround-budget.json` and is the only mode that can exit
|
|
26
|
+
* non-zero. Whether that mode may run in CI is answered in the config's own
|
|
27
|
+
* `_comment`, because a transcript store is machine-local and a fresh clone has
|
|
28
|
+
* none: a CI gate over it would be green-because-empty, the exact
|
|
29
|
+
* gate-that-scans-nothing-exits-green failure this repository names elsewhere.
|
|
30
|
+
*
|
|
31
|
+
* Usage:
|
|
32
|
+
* ./scripts-run src/scripts/probe_turnaround [--store PATH] [--limit N]
|
|
33
|
+
* ./scripts-run src/scripts/probe_turnaround --json
|
|
34
|
+
* ./scripts-run src/scripts/probe_turnaround --against-baseline
|
|
35
|
+
*
|
|
36
|
+
* The MEASURING session is excluded by default — see `recentSessions`.
|
|
37
|
+
*
|
|
38
|
+
* Exit codes: 0 = reported (or within baseline) · 1 = baseline regression, or an
|
|
39
|
+
* empty corpus under `--against-baseline` · 2 = usage error.
|
|
40
|
+
*/
|
|
41
|
+
import * as fs from 'node:fs';
|
|
42
|
+
import * as path from 'node:path';
|
|
43
|
+
import { fileURLToPath } from 'node:url';
|
|
44
|
+
|
|
45
|
+
import { defaultStore, isInjectedBody, userText } from './conformance_scan.js';
|
|
46
|
+
|
|
47
|
+
const _FILE = fileURLToPath(import.meta.url);
|
|
48
|
+
const REPO_ROOT = path.resolve(path.dirname(_FILE), '..', '..');
|
|
49
|
+
export const BUDGET_REL = 'src/config/turnaround-budget.json';
|
|
50
|
+
|
|
51
|
+
/** The blocking-tail threshold, in seconds. Fixed by the source measurement. */
|
|
52
|
+
export const BLOCKING_SECONDS = 60;
|
|
53
|
+
|
|
54
|
+
type Entry = Record<string, unknown>;
|
|
55
|
+
|
|
56
|
+
function isObj(v: unknown): v is Record<string, unknown> {
|
|
57
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface Turnaround {
|
|
61
|
+
sessions: number;
|
|
62
|
+
userRequests: number;
|
|
63
|
+
apiCalls: number;
|
|
64
|
+
callsPerRequest: number;
|
|
65
|
+
toolCalls: number;
|
|
66
|
+
/** Requests that carried at least one tool_use block. */
|
|
67
|
+
toolUsingRequests: number;
|
|
68
|
+
meanBatchSize: number;
|
|
69
|
+
toolSeconds: number;
|
|
70
|
+
blockingCalls: number;
|
|
71
|
+
blockingSeconds: number;
|
|
72
|
+
blockingShare: number;
|
|
73
|
+
contextFloorMin: number;
|
|
74
|
+
contextFloorMax: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const ZERO: Turnaround = {
|
|
78
|
+
sessions: 0,
|
|
79
|
+
userRequests: 0,
|
|
80
|
+
apiCalls: 0,
|
|
81
|
+
callsPerRequest: 0,
|
|
82
|
+
toolCalls: 0,
|
|
83
|
+
toolUsingRequests: 0,
|
|
84
|
+
meanBatchSize: 0,
|
|
85
|
+
toolSeconds: 0,
|
|
86
|
+
blockingCalls: 0,
|
|
87
|
+
blockingSeconds: 0,
|
|
88
|
+
blockingShare: 0,
|
|
89
|
+
contextFloorMin: 0,
|
|
90
|
+
contextFloorMax: 0,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
function ms(iso: unknown): number | null {
|
|
94
|
+
if (typeof iso !== 'string') return null;
|
|
95
|
+
const t = Date.parse(iso);
|
|
96
|
+
return Number.isNaN(t) ? null : t;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The N most recently modified transcript files under `store`, excluding the
|
|
101
|
+
* MEASURING session.
|
|
102
|
+
*
|
|
103
|
+
* The exclusion is not hygiene, it is correctness, and it was found by the
|
|
104
|
+
* instrument failing its own baseline. Two consecutive runs minutes apart
|
|
105
|
+
* reported `calls_per_request` 81.42 then 81.61: the measuring session was
|
|
106
|
+
* adding API calls to the newest transcript while its user-request denominator
|
|
107
|
+
* stayed at one, so the probe was reading its own execution as a regression.
|
|
108
|
+
* The source analysis excluded the measuring session for the same reason and
|
|
109
|
+
* said so; this reproduces that rather than rediscovering it a third time.
|
|
110
|
+
*
|
|
111
|
+
* Identified by `CLAUDE_CODE_SESSION_ID` where the host exports it — the file
|
|
112
|
+
* is `<sessionId>.jsonl` — and otherwise by dropping the single
|
|
113
|
+
* most-recently-modified file, which is the same session by construction on any
|
|
114
|
+
* machine actually running this. `--include-current` opts back in for an
|
|
115
|
+
* offline corpus where nothing is being written.
|
|
116
|
+
*/
|
|
117
|
+
export function recentSessions(store: string, limit: number, includeCurrent = false): string[] {
|
|
118
|
+
if (!fs.existsSync(store)) return [];
|
|
119
|
+
const all = fs
|
|
120
|
+
.readdirSync(store)
|
|
121
|
+
.filter((f) => f.endsWith('.jsonl'))
|
|
122
|
+
.map((f) => ({ f, m: fs.statSync(path.join(store, f)).mtimeMs }))
|
|
123
|
+
.sort((a, b) => b.m - a.m);
|
|
124
|
+
if (!includeCurrent && all.length > 0) {
|
|
125
|
+
const sid = process.env['CLAUDE_CODE_SESSION_ID'];
|
|
126
|
+
const idx =
|
|
127
|
+
sid !== undefined && sid !== ''
|
|
128
|
+
? all.findIndex((x) => x.f === `${sid}.jsonl`)
|
|
129
|
+
: 0;
|
|
130
|
+
if (idx >= 0) all.splice(idx, 1);
|
|
131
|
+
}
|
|
132
|
+
return all.slice(0, limit).map(({ f }) => path.join(store, f));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function measure(files: readonly string[]): Turnaround {
|
|
136
|
+
const requestIds = new Set<string>();
|
|
137
|
+
/** requestId → tool_use blocks in it. */
|
|
138
|
+
const batch = new Map<string, number>();
|
|
139
|
+
/** tool_use id → the timestamp the assistant emitted it. */
|
|
140
|
+
const emittedAt = new Map<string, number>();
|
|
141
|
+
const durations: number[] = [];
|
|
142
|
+
const contextFloors: number[] = [];
|
|
143
|
+
let userRequests = 0;
|
|
144
|
+
let sessions = 0;
|
|
145
|
+
|
|
146
|
+
for (const file of files) {
|
|
147
|
+
let sawFloor = false;
|
|
148
|
+
let sawAny = false;
|
|
149
|
+
for (const line of fs.readFileSync(file, 'utf8').split('\n')) {
|
|
150
|
+
if (!line.trim()) continue;
|
|
151
|
+
let e: Entry;
|
|
152
|
+
try {
|
|
153
|
+
e = JSON.parse(line) as Entry;
|
|
154
|
+
} catch {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (e['isSidechain'] === true) continue;
|
|
158
|
+
sawAny = true;
|
|
159
|
+
const msg = e['message'];
|
|
160
|
+
|
|
161
|
+
if (e['type'] === 'user') {
|
|
162
|
+
// The SAME predicate the conformance scan uses, imported rather
|
|
163
|
+
// than re-typed: a skill body and a slash-command header arrive
|
|
164
|
+
// in the user role and are not requests. Counting them would
|
|
165
|
+
// deflate calls-per-request by inventing a denominator.
|
|
166
|
+
const text = userText(e);
|
|
167
|
+
if (text !== null && !isInjectedBody(text)) userRequests += 1;
|
|
168
|
+
if (isObj(msg) && Array.isArray(msg['content'])) {
|
|
169
|
+
const at = ms(e['timestamp']);
|
|
170
|
+
for (const b of msg['content']) {
|
|
171
|
+
if (!isObj(b) || b['type'] !== 'tool_result') continue;
|
|
172
|
+
const id = String(b['tool_use_id'] ?? '');
|
|
173
|
+
const started = emittedAt.get(id);
|
|
174
|
+
if (started === undefined || at === null) continue;
|
|
175
|
+
durations.push((at - started) / 1000);
|
|
176
|
+
emittedAt.delete(id);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (e['type'] !== 'assistant') continue;
|
|
183
|
+
const rid = e['requestId'];
|
|
184
|
+
if (typeof rid === 'string' && rid !== '') requestIds.add(rid);
|
|
185
|
+
|
|
186
|
+
if (!sawFloor && isObj(msg) && isObj(msg['usage'])) {
|
|
187
|
+
const u = msg['usage'] as Record<string, unknown>;
|
|
188
|
+
const floor =
|
|
189
|
+
Number(u['input_tokens'] ?? 0) +
|
|
190
|
+
Number(u['cache_read_input_tokens'] ?? 0) +
|
|
191
|
+
Number(u['cache_creation_input_tokens'] ?? 0);
|
|
192
|
+
if (floor > 0) {
|
|
193
|
+
contextFloors.push(floor);
|
|
194
|
+
sawFloor = true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (!isObj(msg) || !Array.isArray(msg['content'])) continue;
|
|
199
|
+
const at = ms(e['timestamp']);
|
|
200
|
+
let n = 0;
|
|
201
|
+
for (const b of msg['content']) {
|
|
202
|
+
if (!isObj(b) || b['type'] !== 'tool_use') continue;
|
|
203
|
+
n += 1;
|
|
204
|
+
const id = String(b['id'] ?? '');
|
|
205
|
+
if (id !== '' && at !== null) emittedAt.set(id, at);
|
|
206
|
+
}
|
|
207
|
+
if (n > 0 && typeof rid === 'string' && rid !== '') {
|
|
208
|
+
batch.set(rid, (batch.get(rid) ?? 0) + n);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (sawAny) sessions += 1;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const toolCalls = [...batch.values()].reduce((a, b) => a + b, 0);
|
|
215
|
+
const toolSeconds = durations.reduce((a, b) => a + b, 0);
|
|
216
|
+
const blocking = durations.filter((d) => d > BLOCKING_SECONDS);
|
|
217
|
+
const blockingSeconds = blocking.reduce((a, b) => a + b, 0);
|
|
218
|
+
const round = (x: number, p = 2): number => Math.round(x * 10 ** p) / 10 ** p;
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
sessions,
|
|
222
|
+
userRequests,
|
|
223
|
+
apiCalls: requestIds.size,
|
|
224
|
+
callsPerRequest: userRequests === 0 ? 0 : round(requestIds.size / userRequests),
|
|
225
|
+
toolCalls,
|
|
226
|
+
toolUsingRequests: batch.size,
|
|
227
|
+
meanBatchSize: batch.size === 0 ? 0 : round(toolCalls / batch.size),
|
|
228
|
+
toolSeconds: round(toolSeconds, 1),
|
|
229
|
+
blockingCalls: blocking.length,
|
|
230
|
+
blockingSeconds: round(blockingSeconds, 1),
|
|
231
|
+
blockingShare: toolSeconds === 0 ? 0 : round(blockingSeconds / toolSeconds, 4),
|
|
232
|
+
contextFloorMin: contextFloors.length === 0 ? 0 : Math.min(...contextFloors),
|
|
233
|
+
contextFloorMax: contextFloors.length === 0 ? 0 : Math.max(...contextFloors),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export interface Budget {
|
|
238
|
+
baseline: {
|
|
239
|
+
calls_per_request: number;
|
|
240
|
+
mean_batch_size: number;
|
|
241
|
+
blocking_share: number;
|
|
242
|
+
context_floor_max: number;
|
|
243
|
+
};
|
|
244
|
+
empty_corpus: 'fail' | 'report';
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function readBudget(root = REPO_ROOT): Budget | null {
|
|
248
|
+
const p = path.join(root, BUDGET_REL);
|
|
249
|
+
if (!fs.existsSync(p)) return null;
|
|
250
|
+
return JSON.parse(fs.readFileSync(p, 'utf8')) as Budget;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Baseline comparison.
|
|
255
|
+
*
|
|
256
|
+
* `calls_per_request` is deliberately ABSENT — see the comment in the body.
|
|
257
|
+
* Direction is DOWN for `blocking_share`, and UP for
|
|
258
|
+
* `mean_batch_size` — a batch of 1.00 is the floor being fixed, so a higher
|
|
259
|
+
* number is the improvement and the ratchet must not read it as a regression.
|
|
260
|
+
* `context_floor_max` is DOWN. Getting one of these directions backwards would
|
|
261
|
+
* make the gate reward the defect, which is why they are listed rather than
|
|
262
|
+
* inferred from a shared helper.
|
|
263
|
+
*/
|
|
264
|
+
export function compare(t: Turnaround, b: Budget): string[] {
|
|
265
|
+
const out: string[] = [];
|
|
266
|
+
// `calls_per_request` is REPORTED, never compared. Twice measured unstable
|
|
267
|
+
// for reasons that are not regressions: it fell 81.42 -> 72.67 when the
|
|
268
|
+
// measuring session was excluded, then drifted 72.67 -> 73.73 within the
|
|
269
|
+
// same afternoon because the corpus is an MTIME WINDOW and other sessions
|
|
270
|
+
// in the same project store keep sliding into it. A ratchet on a number
|
|
271
|
+
// that moves when nothing changed teaches the reader to ignore the gate,
|
|
272
|
+
// which is the failure this repository records for gates that can only
|
|
273
|
+
// block. The three metrics below are stable across the same runs.
|
|
274
|
+
if (t.meanBatchSize < b.baseline.mean_batch_size) {
|
|
275
|
+
out.push(
|
|
276
|
+
`mean batch size ${String(t.meanBatchSize)} < baseline ${String(b.baseline.mean_batch_size)} (direction: UP — 1.00 is fully serial)`,
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
if (t.blockingShare > b.baseline.blocking_share) {
|
|
280
|
+
out.push(
|
|
281
|
+
`blocking share ${String(t.blockingShare)} > baseline ${String(b.baseline.blocking_share)} (direction: DOWN)`,
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
if (t.contextFloorMax > b.baseline.context_floor_max) {
|
|
285
|
+
out.push(
|
|
286
|
+
`context floor max ${String(t.contextFloorMax)} > baseline ${String(b.baseline.context_floor_max)} (direction: DOWN)`,
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
return out;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function render(t: Turnaround, store: string): string {
|
|
293
|
+
const pct = (x: number): string => `${String(Math.round(x * 1000) / 10)} %`;
|
|
294
|
+
return [
|
|
295
|
+
`probe:turnaround · ${String(t.sessions)} session(s) · ${store}`,
|
|
296
|
+
` API calls per user request ${String(t.callsPerRequest)} (${String(t.apiCalls)} calls / ${String(t.userRequests)} requests)`,
|
|
297
|
+
` mean tool-call batch size ${String(t.meanBatchSize)} (${String(t.toolCalls)} tool calls / ${String(t.toolUsingRequests)} tool-using requests)`,
|
|
298
|
+
` blocking tail (>${String(BLOCKING_SECONDS)}s) ${String(t.blockingCalls)} call(s), ${String(Math.round(t.blockingSeconds / 60))} min = ${pct(t.blockingShare)} of ${String(Math.round(t.toolSeconds / 60))} min tool time`,
|
|
299
|
+
` first-call context floor ${String(t.contextFloorMin)}–${String(t.contextFloorMax)} tokens`,
|
|
300
|
+
'',
|
|
301
|
+
].join('\n');
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
305
|
+
const arg = (flag: string, dflt: string): string => {
|
|
306
|
+
const i = argv.indexOf(flag);
|
|
307
|
+
return i >= 0 && argv[i + 1] !== undefined ? (argv[i + 1] as string) : dflt;
|
|
308
|
+
};
|
|
309
|
+
for (const a of argv) {
|
|
310
|
+
if (a.startsWith('-') && !['--store', '--limit', '--json', '--against-baseline', '--include-current', '-h', '--help'].includes(a)) {
|
|
311
|
+
if (!argv.includes('--store') && !argv.includes('--limit')) {
|
|
312
|
+
process.stderr.write(`probe_turnaround: unrecognized argument: ${a}\n`);
|
|
313
|
+
return 2;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (argv.includes('-h') || argv.includes('--help')) {
|
|
318
|
+
process.stdout.write(
|
|
319
|
+
'usage: probe_turnaround [--store PATH] [--limit N] [--json] [--against-baseline] [--include-current]\n',
|
|
320
|
+
);
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
const store = arg('--store', defaultStore(process.cwd()));
|
|
324
|
+
const limit = Number(arg('--limit', '10'));
|
|
325
|
+
if (!Number.isFinite(limit) || limit < 1) {
|
|
326
|
+
process.stderr.write('probe_turnaround: --limit needs a positive integer\n');
|
|
327
|
+
return 2;
|
|
328
|
+
}
|
|
329
|
+
const files = recentSessions(store, limit, argv.includes('--include-current'));
|
|
330
|
+
const t = files.length === 0 ? ZERO : measure(files);
|
|
331
|
+
const gating = argv.includes('--against-baseline');
|
|
332
|
+
|
|
333
|
+
if (argv.includes('--json')) {
|
|
334
|
+
process.stdout.write(`${JSON.stringify({ store, ...t }, null, 2)}\n`);
|
|
335
|
+
} else {
|
|
336
|
+
process.stdout.write(render(t, store));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (!gating) {
|
|
340
|
+
if (files.length === 0) {
|
|
341
|
+
// A REPORT over an empty store is honest and exits 0; only the
|
|
342
|
+
// gating mode treats emptiness as a failure. The distinction is the
|
|
343
|
+
// whole of step 1.3.
|
|
344
|
+
process.stdout.write(
|
|
345
|
+
`probe:turnaround · no transcript store at ${store} — nothing measured (report mode; ` +
|
|
346
|
+
'use --against-baseline for the fail-closed form)\n',
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
return 0;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const budget = readBudget();
|
|
353
|
+
if (budget === null) {
|
|
354
|
+
process.stderr.write(`❌ probe_turnaround: ${BUDGET_REL} is missing — nothing to compare against.\n`);
|
|
355
|
+
return 1;
|
|
356
|
+
}
|
|
357
|
+
if (files.length === 0) {
|
|
358
|
+
if (budget.empty_corpus === 'fail') {
|
|
359
|
+
process.stderr.write(
|
|
360
|
+
`❌ probe_turnaround: empty corpus at ${store}. A baseline comparison over zero ` +
|
|
361
|
+
'sessions certifies nothing, and the config records `empty_corpus: "fail"` so it ' +
|
|
362
|
+
'refuses rather than reporting green.\n',
|
|
363
|
+
);
|
|
364
|
+
return 1;
|
|
365
|
+
}
|
|
366
|
+
process.stdout.write('probe:turnaround · empty corpus, `empty_corpus: "report"` — no verdict.\n');
|
|
367
|
+
return 0;
|
|
368
|
+
}
|
|
369
|
+
const regressions = compare(t, budget);
|
|
370
|
+
if (regressions.length > 0) {
|
|
371
|
+
process.stderr.write('❌ probe_turnaround: regression against the recorded baseline:\n');
|
|
372
|
+
for (const r of regressions) process.stderr.write(` ${r}\n`);
|
|
373
|
+
process.stderr.write(
|
|
374
|
+
` → raising a baseline in ${BUDGET_REL} needs the reason as a sentence in the same commit.\n`,
|
|
375
|
+
);
|
|
376
|
+
return 1;
|
|
377
|
+
}
|
|
378
|
+
process.stdout.write('✅ probe_turnaround: within the recorded baseline on all four metrics.\n');
|
|
379
|
+
return 0;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if (process.argv[1] !== undefined && process.argv[1].includes('probe_turnaround')) {
|
|
383
|
+
process.exit(main());
|
|
384
|
+
}
|