@event4u/agent-config 14.12.0 → 14.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +118 -155
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +145 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-comment-discipline.md +6 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
- package/dist/agent-src/scripts/guarded_baseline.ts +343 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +516 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +80 -11
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +58 -58
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2900 -1049
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +634 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4895 -2627
- package/dist/server/schemas/settings.js +3 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +10 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +18 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/llms.txt +2 -2
- package/package.json +5 -2
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
- package/src/agent-src/scripts/guarded_baseline.ts +343 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +516 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +32 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +80 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +57 -36
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +729 -63
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +42 -19
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +16 -15
- package/src/config/preamble-payload-budget.json +12 -4
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +16 -2
- package/src/config/rule-stub-ceilings.json +133 -112
- package/src/config/turnaround-budget.json +66 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +23 -0
- package/src/scripts/_lib/activation_ladder.ts +255 -0
- package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/adr_frontmatter.ts +26 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_pair_delta.ts +349 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/carrier_status.ts +118 -0
- package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/corpus_manifest.ts +726 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +282 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/estate_carrier_cases.ts +72 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_cascade.ts +452 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/evolution_roi.ts +562 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +239 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/lexical_shortlist.ts +215 -0
- package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
- package/src/scripts/_lib/llm_proposer_transport.ts +153 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/pathology_archive.ts +393 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/promotion_capability.ts +315 -0
- package/src/scripts/_lib/promotion_evidence.ts +414 -0
- package/src/scripts/_lib/promotion_review.ts +294 -0
- package/src/scripts/_lib/prompt_shape.ts +92 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/release_highlights.ts +70 -1
- package/src/scripts/_lib/release_material.ts +125 -2
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/routing_corpus.ts +307 -0
- package/src/scripts/_lib/routing_index_input.ts +104 -0
- package/src/scripts/_lib/rule_injection.ts +22 -1
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/semantic_noop.ts +167 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/activation_receipt.ts +258 -0
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/cross_exam.ts +128 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/explain_route.ts +157 -0
- package/src/scripts/ai_council/information_gain.ts +293 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/leakage_corpus.ts +385 -0
- package/src/scripts/ai_council/leakage_patterns.ts +453 -0
- package/src/scripts/ai_council/minority_retention.ts +171 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/recouncil_savings.ts +299 -0
- package/src/scripts/ai_council/replay_route.ts +223 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
- package/src/scripts/ai_council/routing_training_row.ts +197 -0
- package/src/scripts/ai_council/synthesis_strategy.ts +159 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +131 -10
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +34 -1
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +347 -25
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +114 -3
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_release_highlights.ts +96 -13
- package/src/scripts/check_roadmap_trackable.ts +17 -2
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +26 -3
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/corpus_manifest.ts +235 -0
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +1153 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -16
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/comment_discipline_hook.ts +146 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/language_mirror_hook.ts +14 -2
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_carrier_integrity.ts +820 -0
- package/src/scripts/lint_code_comments.ts +643 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_plan_risk_register.ts +39 -19
- package/src/scripts/lint_promotion_paths.ts +779 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/llm_propose.ts +256 -0
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_delivery_sets.ts +361 -0
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/measure_routing_signal.ts +307 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +76 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_council_retention.ts +495 -0
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/release.ts +21 -37
- package/src/scripts/release_drill.ts +143 -0
- package/src/scripts/release_env.ts +35 -0
- package/src/scripts/release_publication.ts +84 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +3 -3
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +5 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Read-only probe: is the declared council-artefact TTL actually honoured?
|
|
4
|
+
*
|
|
5
|
+
* `ai_council.session_retention_days` (default 7 — `ai_council/session.ts:81`)
|
|
6
|
+
* declares a retention window for the three council artefact directories:
|
|
7
|
+
*
|
|
8
|
+
* agents/runtime/council/questions/
|
|
9
|
+
* agents/runtime/council/responses/
|
|
10
|
+
* agents/runtime/council/sessions/
|
|
11
|
+
*
|
|
12
|
+
* Every pruner in the tree that could enforce that window is reached only by an
|
|
13
|
+
* explicit human command:
|
|
14
|
+
*
|
|
15
|
+
* - `prune_all_council_artifacts` (`ai_council/session.ts:468`) has exactly
|
|
16
|
+
* one caller in `src/`, the manual CLI `council_prune.ts:131`, which is
|
|
17
|
+
* bound to `task council-prune` and to no hook, workflow or scheduler.
|
|
18
|
+
* - `save()` (`ai_council/session.ts:506`), the only function that calls
|
|
19
|
+
* `prune_old_artifacts(QUESTIONS_DIR, …)` / `(RESPONSES_DIR, …)`
|
|
20
|
+
* (`:603-604`), has no caller in `src/` at all — `council_cli.ts` writes its
|
|
21
|
+
* own `--output` payload directly (`council_cli.ts:2807`) and never imports
|
|
22
|
+
* the session module.
|
|
23
|
+
* - `janitor.ts` declares `agents/runtime/council/responses` with
|
|
24
|
+
* `ttlDays: 7` (`janitor.ts:55-61`) but defaults to a dry-run report;
|
|
25
|
+
* deletion needs `--apply` (`janitor.ts:12-14`, `:329`), and it declares no
|
|
26
|
+
* entry for `questions/` or `sessions/` at all.
|
|
27
|
+
*
|
|
28
|
+
* So the TTL is a declaration, not a mechanism, and the retained corpus is
|
|
29
|
+
* "every artefact nobody deleted by hand". This probe measures that gap instead
|
|
30
|
+
* of asserting it: it reports how much of the corpus is past its declared TTL,
|
|
31
|
+
* and how much provider-attributed response text that over-TTL slice holds.
|
|
32
|
+
*
|
|
33
|
+
* THIS SCRIPT NEVER WRITES, UNLINKS, MOVES, TRUNCATES, OR MUTATES ANYTHING.
|
|
34
|
+
* It opens files for reading only. There is no `--apply`, no `--fix`, and no
|
|
35
|
+
* code path that calls a mutating `fs` function. The corpus is the measurement
|
|
36
|
+
* subject; destroying it would destroy the instrument.
|
|
37
|
+
*
|
|
38
|
+
* Usage:
|
|
39
|
+
* ./scripts-run src/scripts/probe_council_retention
|
|
40
|
+
* ./scripts-run src/scripts/probe_council_retention --root /path/to/project
|
|
41
|
+
* ./scripts-run src/scripts/probe_council_retention --retention-days 7 --json
|
|
42
|
+
*
|
|
43
|
+
* Exit code: 0 always. This is a report, never a gate — an over-TTL corpus is
|
|
44
|
+
* the finding, not a build failure.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
import * as fs from 'node:fs';
|
|
48
|
+
import * as path from 'node:path';
|
|
49
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
50
|
+
|
|
51
|
+
import { resolve_project_root } from './_lib/agent_settings.js';
|
|
52
|
+
|
|
53
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
54
|
+
|
|
55
|
+
const PROG = 'probe_council_retention';
|
|
56
|
+
|
|
57
|
+
/** The three canonical council dirs, relative to the project root. */
|
|
58
|
+
const COUNCIL_DIRS: readonly string[] = ['responses', 'sessions', 'questions'];
|
|
59
|
+
|
|
60
|
+
/** Mirrors `DEFAULT_RETENTION_DAYS` (`ai_council/session.ts:81`). */
|
|
61
|
+
const DEFAULT_RETENTION_DAYS = 7;
|
|
62
|
+
|
|
63
|
+
const MS_PER_DAY = 86_400_000;
|
|
64
|
+
|
|
65
|
+
const _USAGE = `usage: ${PROG} [-h] [--root PATH] [--retention-days N] [--json]`;
|
|
66
|
+
|
|
67
|
+
const _HELP =
|
|
68
|
+
`${_USAGE}\n\n` +
|
|
69
|
+
'Read-only report on whether the declared council-artefact TTL is honoured.\n' +
|
|
70
|
+
'Never deletes or modifies anything.\n\n' +
|
|
71
|
+
'options:\n' +
|
|
72
|
+
' -h, --help show this help message and exit\n' +
|
|
73
|
+
' --root PATH project root to probe (default: resolved like sibling scripts)\n' +
|
|
74
|
+
` --retention-days N TTL in days (default: ${String(DEFAULT_RETENTION_DAYS)})\n` +
|
|
75
|
+
' --json emit the report as JSON instead of text\n';
|
|
76
|
+
|
|
77
|
+
interface Args {
|
|
78
|
+
root: string | null;
|
|
79
|
+
retention_days: number;
|
|
80
|
+
json: boolean;
|
|
81
|
+
help: boolean;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** One TTL-split pair of counts. */
|
|
85
|
+
interface Split {
|
|
86
|
+
within_ttl: number;
|
|
87
|
+
over_ttl: number;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
interface DirReport {
|
|
91
|
+
/** Directory label (`responses` / `sessions` / `questions`). */
|
|
92
|
+
dir: string;
|
|
93
|
+
/** Absolute path probed. */
|
|
94
|
+
abs_path: string;
|
|
95
|
+
/** Whether the directory exists at all. */
|
|
96
|
+
exists: boolean;
|
|
97
|
+
/** Files found, recursively. */
|
|
98
|
+
files: number;
|
|
99
|
+
/** Files split by mtime against the TTL cutoff. */
|
|
100
|
+
files_split: Split;
|
|
101
|
+
/** JSON files carrying a `responses[]` array. */
|
|
102
|
+
json_with_responses: number;
|
|
103
|
+
/** Files that look like JSON but would not parse. */
|
|
104
|
+
unparseable: number;
|
|
105
|
+
/** Provider-attributed response bodies (provider + text, no error). */
|
|
106
|
+
attributed_bodies: number;
|
|
107
|
+
/** Attributed bodies split by their SOURCE FILE's mtime against the TTL. */
|
|
108
|
+
attributed_split: Split;
|
|
109
|
+
/** Attributed bodies per provider. */
|
|
110
|
+
by_provider: Record<string, number>;
|
|
111
|
+
/** Attributed bodies per provider, over-TTL only. */
|
|
112
|
+
by_provider_over_ttl: Record<string, number>;
|
|
113
|
+
/** Age in days of the oldest file found, or `null` when the dir is empty. */
|
|
114
|
+
oldest_age_days: number | null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
interface Report {
|
|
118
|
+
root: string;
|
|
119
|
+
root_origin: string;
|
|
120
|
+
retention_days: number;
|
|
121
|
+
generated_at_utc: string;
|
|
122
|
+
dirs: DirReport[];
|
|
123
|
+
totals: {
|
|
124
|
+
files: number;
|
|
125
|
+
files_over_ttl: number;
|
|
126
|
+
attributed_bodies: number;
|
|
127
|
+
attributed_bodies_over_ttl: number;
|
|
128
|
+
unparseable: number;
|
|
129
|
+
oldest_age_days: number | null;
|
|
130
|
+
};
|
|
131
|
+
/** `true` when nothing at all is past the declared window. */
|
|
132
|
+
ttl_honoured: boolean;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function _argError(message: string): never {
|
|
136
|
+
process.stderr.write(`${_USAGE}\n`);
|
|
137
|
+
process.stderr.write(`${PROG}: error: ${message}\n`);
|
|
138
|
+
// A malformed invocation is still not a gate failure for the caller's
|
|
139
|
+
// build, but it must not print a report that means nothing.
|
|
140
|
+
process.exitCode = 2;
|
|
141
|
+
throw new _ExitSignal(2);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
class _ExitSignal extends Error {
|
|
145
|
+
constructor(readonly code: number) {
|
|
146
|
+
super(`exit ${code}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function _parseArgs(argv: readonly string[]): Args {
|
|
151
|
+
const args: Args = {
|
|
152
|
+
root: null,
|
|
153
|
+
retention_days: DEFAULT_RETENTION_DAYS,
|
|
154
|
+
json: false,
|
|
155
|
+
help: false,
|
|
156
|
+
};
|
|
157
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
158
|
+
const a = argv[i] as string;
|
|
159
|
+
if (a === '-h' || a === '--help') {
|
|
160
|
+
args.help = true;
|
|
161
|
+
} else if (a === '--json') {
|
|
162
|
+
args.json = true;
|
|
163
|
+
} else if (a === '--root') {
|
|
164
|
+
const v = argv[i + 1];
|
|
165
|
+
if (v === undefined || v.startsWith('-')) {
|
|
166
|
+
_argError('argument --root: expected one argument');
|
|
167
|
+
}
|
|
168
|
+
args.root = v;
|
|
169
|
+
i += 1;
|
|
170
|
+
} else if (a === '--retention-days') {
|
|
171
|
+
const v = argv[i + 1];
|
|
172
|
+
if (v === undefined || v.startsWith('-')) {
|
|
173
|
+
_argError('argument --retention-days: expected one argument');
|
|
174
|
+
}
|
|
175
|
+
const parsed = Number.parseInt(v, 10);
|
|
176
|
+
if (!Number.isFinite(parsed) || String(parsed) !== v.trim() || parsed < 0) {
|
|
177
|
+
_argError(`argument --retention-days: invalid non-negative int value: '${v}'`);
|
|
178
|
+
}
|
|
179
|
+
args.retention_days = parsed;
|
|
180
|
+
i += 1;
|
|
181
|
+
} else {
|
|
182
|
+
_argError(`unrecognized arguments: ${a}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return args;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function _isDir(p: string): boolean {
|
|
189
|
+
try {
|
|
190
|
+
return fs.statSync(p).isDirectory();
|
|
191
|
+
} catch {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Every FILE under `dir`, recursively, sorted for a stable report.
|
|
198
|
+
*
|
|
199
|
+
* Recursive rather than a flat `readdirSync`: `responses/` holds per-debate
|
|
200
|
+
* subdirectories (`<slug>.json/debate-round-N.json`), and a flat listing counts
|
|
201
|
+
* one entry where the corpus holds several artefacts.
|
|
202
|
+
*/
|
|
203
|
+
function _walkFiles(dir: string): string[] {
|
|
204
|
+
const out: string[] = [];
|
|
205
|
+
if (!_isDir(dir)) {
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
let entries: string[];
|
|
209
|
+
try {
|
|
210
|
+
entries = fs.readdirSync(dir).sort();
|
|
211
|
+
} catch {
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
for (const name of entries) {
|
|
215
|
+
const full = path.join(dir, name);
|
|
216
|
+
let st: fs.Stats;
|
|
217
|
+
try {
|
|
218
|
+
st = fs.statSync(full);
|
|
219
|
+
} catch {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (st.isFile()) {
|
|
223
|
+
out.push(full);
|
|
224
|
+
} else if (st.isDirectory()) {
|
|
225
|
+
out.push(..._walkFiles(full));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function _mtimeMs(p: string): number | null {
|
|
232
|
+
try {
|
|
233
|
+
return fs.statSync(p).mtimeMs;
|
|
234
|
+
} catch {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function _bump(map: Record<string, number>, key: string): void {
|
|
240
|
+
map[key] = (map[key] ?? 0) + 1;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* A response body counts as provider-attributed when it names a provider,
|
|
245
|
+
* carries text, and records no error — the shape `recouncil_guard` and the
|
|
246
|
+
* leakage assembler both treat as real captured provider output.
|
|
247
|
+
*/
|
|
248
|
+
function _isAttributed(entry: unknown): { attributed: boolean; provider: string } {
|
|
249
|
+
if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
|
|
250
|
+
return { attributed: false, provider: '' };
|
|
251
|
+
}
|
|
252
|
+
const rec = entry as Record<string, unknown>;
|
|
253
|
+
const provider = typeof rec['provider'] === 'string' ? rec['provider'].trim() : '';
|
|
254
|
+
const text = typeof rec['text'] === 'string' ? rec['text'] : '';
|
|
255
|
+
const error = rec['error'];
|
|
256
|
+
const hasError = error !== null && error !== undefined && error !== '' && error !== false;
|
|
257
|
+
if (provider === '' || text.trim() === '' || hasError) {
|
|
258
|
+
return { attributed: false, provider };
|
|
259
|
+
}
|
|
260
|
+
return { attributed: true, provider };
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function probeDir(root: string, label: string, cutoffMs: number, nowMs: number): DirReport {
|
|
264
|
+
const abs = path.join(root, 'agents', 'runtime', 'council', label);
|
|
265
|
+
const report: DirReport = {
|
|
266
|
+
dir: label,
|
|
267
|
+
abs_path: abs,
|
|
268
|
+
exists: _isDir(abs),
|
|
269
|
+
files: 0,
|
|
270
|
+
files_split: { within_ttl: 0, over_ttl: 0 },
|
|
271
|
+
json_with_responses: 0,
|
|
272
|
+
unparseable: 0,
|
|
273
|
+
attributed_bodies: 0,
|
|
274
|
+
attributed_split: { within_ttl: 0, over_ttl: 0 },
|
|
275
|
+
by_provider: {},
|
|
276
|
+
by_provider_over_ttl: {},
|
|
277
|
+
oldest_age_days: null,
|
|
278
|
+
};
|
|
279
|
+
if (!report.exists) {
|
|
280
|
+
return report;
|
|
281
|
+
}
|
|
282
|
+
const files = _walkFiles(abs);
|
|
283
|
+
report.files = files.length;
|
|
284
|
+
let oldestMs: number | null = null;
|
|
285
|
+
for (const f of files) {
|
|
286
|
+
const mtime = _mtimeMs(f);
|
|
287
|
+
const overTtl = mtime !== null && mtime < cutoffMs;
|
|
288
|
+
if (overTtl) {
|
|
289
|
+
report.files_split.over_ttl += 1;
|
|
290
|
+
} else {
|
|
291
|
+
report.files_split.within_ttl += 1;
|
|
292
|
+
}
|
|
293
|
+
if (mtime !== null && (oldestMs === null || mtime < oldestMs)) {
|
|
294
|
+
oldestMs = mtime;
|
|
295
|
+
}
|
|
296
|
+
// Only JSON-shaped artefacts can carry a `responses[]` array. A `.md`
|
|
297
|
+
// render is a sibling projection, counted as a file and nothing more.
|
|
298
|
+
if (!f.endsWith('.json')) {
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
let payload: unknown;
|
|
302
|
+
try {
|
|
303
|
+
payload = JSON.parse(fs.readFileSync(f, 'utf-8'));
|
|
304
|
+
} catch {
|
|
305
|
+
report.unparseable += 1;
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
const responses = (payload as Record<string, unknown>)['responses'];
|
|
312
|
+
if (!Array.isArray(responses)) {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
report.json_with_responses += 1;
|
|
316
|
+
for (const entry of responses) {
|
|
317
|
+
const { attributed, provider } = _isAttributed(entry);
|
|
318
|
+
if (!attributed) {
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
report.attributed_bodies += 1;
|
|
322
|
+
_bump(report.by_provider, provider);
|
|
323
|
+
if (overTtl) {
|
|
324
|
+
report.attributed_split.over_ttl += 1;
|
|
325
|
+
_bump(report.by_provider_over_ttl, provider);
|
|
326
|
+
} else {
|
|
327
|
+
report.attributed_split.within_ttl += 1;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (oldestMs !== null) {
|
|
332
|
+
report.oldest_age_days = Math.floor((nowMs - oldestMs) / MS_PER_DAY);
|
|
333
|
+
}
|
|
334
|
+
return report;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export function buildReport(opts: {
|
|
338
|
+
root: string;
|
|
339
|
+
root_origin: string;
|
|
340
|
+
retention_days: number;
|
|
341
|
+
now?: Date;
|
|
342
|
+
}): Report {
|
|
343
|
+
const now = opts.now ?? new Date();
|
|
344
|
+
const nowMs = now.getTime();
|
|
345
|
+
const cutoffMs = nowMs - opts.retention_days * MS_PER_DAY;
|
|
346
|
+
const dirs = COUNCIL_DIRS.map((label) => probeDir(opts.root, label, cutoffMs, nowMs));
|
|
347
|
+
const oldest = dirs
|
|
348
|
+
.map((d) => d.oldest_age_days)
|
|
349
|
+
.filter((v): v is number => v !== null)
|
|
350
|
+
.reduce<number | null>((acc, v) => (acc === null || v > acc ? v : acc), null);
|
|
351
|
+
const totals = {
|
|
352
|
+
files: dirs.reduce((s, d) => s + d.files, 0),
|
|
353
|
+
files_over_ttl: dirs.reduce((s, d) => s + d.files_split.over_ttl, 0),
|
|
354
|
+
attributed_bodies: dirs.reduce((s, d) => s + d.attributed_bodies, 0),
|
|
355
|
+
attributed_bodies_over_ttl: dirs.reduce((s, d) => s + d.attributed_split.over_ttl, 0),
|
|
356
|
+
unparseable: dirs.reduce((s, d) => s + d.unparseable, 0),
|
|
357
|
+
oldest_age_days: oldest,
|
|
358
|
+
};
|
|
359
|
+
return {
|
|
360
|
+
root: opts.root,
|
|
361
|
+
root_origin: opts.root_origin,
|
|
362
|
+
retention_days: opts.retention_days,
|
|
363
|
+
generated_at_utc: now.toISOString(),
|
|
364
|
+
dirs,
|
|
365
|
+
totals,
|
|
366
|
+
// A zero over-TTL count is the ONLY reading that shows the window being
|
|
367
|
+
// enforced; anything else means the declaration is not a mechanism.
|
|
368
|
+
ttl_honoured: totals.files_over_ttl === 0,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function _providerLines(map: Record<string, number>, indent: string): string {
|
|
373
|
+
const keys = Object.keys(map).sort((a, b) => {
|
|
374
|
+
const d = (map[b] as number) - (map[a] as number);
|
|
375
|
+
return d !== 0 ? d : a.localeCompare(b);
|
|
376
|
+
});
|
|
377
|
+
if (keys.length === 0) {
|
|
378
|
+
return `${indent}(none)\n`;
|
|
379
|
+
}
|
|
380
|
+
return keys.map((k) => `${indent}${k.padEnd(14)} ${String(map[k])}\n`).join('');
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
export function renderReport(r: Report): string {
|
|
384
|
+
const lines: string[] = [];
|
|
385
|
+
lines.push(`council retention probe — read-only, nothing was deleted`);
|
|
386
|
+
lines.push(`root ${r.root} (origin: ${r.root_origin})`);
|
|
387
|
+
lines.push(`retention_days ${String(r.retention_days)}`);
|
|
388
|
+
lines.push(`generated ${r.generated_at_utc}`);
|
|
389
|
+
lines.push('');
|
|
390
|
+
for (const d of r.dirs) {
|
|
391
|
+
lines.push(`── ${d.dir} ──`);
|
|
392
|
+
if (!d.exists) {
|
|
393
|
+
lines.push(` directory absent: ${d.abs_path}`);
|
|
394
|
+
lines.push('');
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
lines.push(` files ${String(d.files)}`);
|
|
398
|
+
lines.push(
|
|
399
|
+
` within TTL / over TTL ${String(d.files_split.within_ttl)} / ${String(d.files_split.over_ttl)}`,
|
|
400
|
+
);
|
|
401
|
+
lines.push(` JSON records with responses[] ${String(d.json_with_responses)}`);
|
|
402
|
+
lines.push(` unparseable JSON ${String(d.unparseable)}`);
|
|
403
|
+
lines.push(` provider-attributed bodies ${String(d.attributed_bodies)}`);
|
|
404
|
+
lines.push(
|
|
405
|
+
` within TTL / over TTL ${String(d.attributed_split.within_ttl)} / ${String(d.attributed_split.over_ttl)}`,
|
|
406
|
+
);
|
|
407
|
+
lines.push(' by provider (all):');
|
|
408
|
+
lines.push(_providerLines(d.by_provider, ' ').trimEnd());
|
|
409
|
+
lines.push(' by provider (over TTL only):');
|
|
410
|
+
lines.push(_providerLines(d.by_provider_over_ttl, ' ').trimEnd());
|
|
411
|
+
lines.push(
|
|
412
|
+
` oldest file age (days) ${d.oldest_age_days === null ? 'n/a' : String(d.oldest_age_days)}`,
|
|
413
|
+
);
|
|
414
|
+
lines.push('');
|
|
415
|
+
}
|
|
416
|
+
lines.push('── totals ──');
|
|
417
|
+
lines.push(` files ${String(r.totals.files)}`);
|
|
418
|
+
lines.push(` files over TTL ${String(r.totals.files_over_ttl)}`);
|
|
419
|
+
lines.push(` attributed bodies ${String(r.totals.attributed_bodies)}`);
|
|
420
|
+
lines.push(` attributed bodies over TTL ${String(r.totals.attributed_bodies_over_ttl)}`);
|
|
421
|
+
lines.push(` unparseable JSON ${String(r.totals.unparseable)}`);
|
|
422
|
+
lines.push(
|
|
423
|
+
` oldest artefact age (days) ${r.totals.oldest_age_days === null ? 'n/a' : String(r.totals.oldest_age_days)}`,
|
|
424
|
+
);
|
|
425
|
+
lines.push('');
|
|
426
|
+
lines.push(
|
|
427
|
+
r.ttl_honoured
|
|
428
|
+
? `TTL HONOURED — 0 artefacts are older than ${String(r.retention_days)} days.`
|
|
429
|
+
: `TTL NOT HONOURED — ${String(r.totals.files_over_ttl)} of ${String(r.totals.files)} ` +
|
|
430
|
+
`artefacts are older than the declared ${String(r.retention_days)}-day window ` +
|
|
431
|
+
`(oldest ${r.totals.oldest_age_days === null ? 'n/a' : String(r.totals.oldest_age_days)} days). ` +
|
|
432
|
+
`Every pruner in the tree needs an explicit human command; nothing sweeps on its own.`,
|
|
433
|
+
);
|
|
434
|
+
return lines.join('\n') + '\n';
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export function main(argv: readonly string[]): number {
|
|
438
|
+
let args: Args;
|
|
439
|
+
try {
|
|
440
|
+
args = _parseArgs(argv);
|
|
441
|
+
} catch (exc) {
|
|
442
|
+
if (exc instanceof _ExitSignal) {
|
|
443
|
+
// Arg errors already wrote usage + set exitCode; the report itself
|
|
444
|
+
// never fails, so the caller still sees a 0-shaped contract for the
|
|
445
|
+
// reporting path and a 2 only for a malformed invocation.
|
|
446
|
+
return exc.code;
|
|
447
|
+
}
|
|
448
|
+
throw exc;
|
|
449
|
+
}
|
|
450
|
+
if (args.help) {
|
|
451
|
+
process.stdout.write(_HELP);
|
|
452
|
+
return 0;
|
|
453
|
+
}
|
|
454
|
+
const [root, origin] = resolve_project_root(args.root);
|
|
455
|
+
const report = buildReport({
|
|
456
|
+
root,
|
|
457
|
+
root_origin: origin,
|
|
458
|
+
retention_days: args.retention_days,
|
|
459
|
+
});
|
|
460
|
+
if (args.json) {
|
|
461
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
462
|
+
} else {
|
|
463
|
+
process.stdout.write(renderReport(report));
|
|
464
|
+
}
|
|
465
|
+
return 0;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
function _isCliEntry(): boolean {
|
|
469
|
+
if (process.argv[1] === undefined) {
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
473
|
+
if (import.meta.url === argvUrl) {
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
// A symlinked invocation (e.g. via an installed `.augment/` projection,
|
|
477
|
+
// or macOS /var → /private/var temp dirs) makes the raw URLs differ:
|
|
478
|
+
// import.meta.url is the resolved real path while argv[1] keeps the
|
|
479
|
+
// symlink path. Compare realpaths so the entry guard still fires
|
|
480
|
+
// (without this the CLI silently no-ops when run through a symlink).
|
|
481
|
+
try {
|
|
482
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
483
|
+
const argv = fs.realpathSync(path.resolve(process.argv[1]));
|
|
484
|
+
return here === argv;
|
|
485
|
+
} catch {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
491
|
+
process.exitCode = main(process.argv.slice(2));
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
export { COUNCIL_DIRS, DEFAULT_RETENTION_DAYS, PROG };
|
|
495
|
+
export type { Report, DirReport, Split };
|