@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,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-host projection reach — does each host's generated tree actually carry
|
|
3
|
+
* artefacts, and when it does not, WHY.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-skill-ecosystem-runtime-enforcement` Phase 3 Step 1. The existing
|
|
6
|
+
* `check_host_loadability.ts` proves two projections PARSE; `smoke_host_loadability.sh`
|
|
7
|
+
* proves one host CLI (claude) ACCEPTS its plugin. Neither answers the question
|
|
8
|
+
* this module exists for: **of the host trees this package generates, how many
|
|
9
|
+
* reach anything, and for each one that does not, is the tool absent or is the
|
|
10
|
+
* projection empty?**
|
|
11
|
+
*
|
|
12
|
+
* Those two are the same green today, and they are opposite findings. A tool
|
|
13
|
+
* nobody has installed producing no artefacts is correct. A tool that IS
|
|
14
|
+
* installed producing no artefacts is a dead projection, and the current gates
|
|
15
|
+
* report it as a clean pass.
|
|
16
|
+
*
|
|
17
|
+
* ── The skip reason is the deliverable ──────────────────────────────────────
|
|
18
|
+
* The step asks to "skip with a recorded reason when the tool is absent, per the
|
|
19
|
+
* completeness ledger". So an absent tool is `skipped` with a NAMED reason, never
|
|
20
|
+
* a silent zero — the distinction this whole roadmap is about.
|
|
21
|
+
*
|
|
22
|
+
* ── What this does NOT do ───────────────────────────────────────────────────
|
|
23
|
+
* It does not install into a throwaway HOME and invoke the host's own loader.
|
|
24
|
+
* That is `smoke_host_loadability.sh`, it exists for claude, and extending it to
|
|
25
|
+
* eight hosts means eight vendor CLIs on the runner — a dependency decision, not
|
|
26
|
+
* a check. This module reports REACH from the tree, and says so rather than
|
|
27
|
+
* implying a host validated anything.
|
|
28
|
+
*/
|
|
29
|
+
import * as fs from 'node:fs';
|
|
30
|
+
import * as os from 'node:os';
|
|
31
|
+
import * as path from 'node:path';
|
|
32
|
+
import process from 'node:process';
|
|
33
|
+
|
|
34
|
+
/** One host's generated surface, and how to tell whether the tool is present. */
|
|
35
|
+
export interface HostSurface {
|
|
36
|
+
/** Tool id, matching `src/install/toolDetection.ts`. */
|
|
37
|
+
id: string;
|
|
38
|
+
/** Executables that indicate the tool is installed. */
|
|
39
|
+
bins: readonly string[];
|
|
40
|
+
/** Home-relative paths that indicate the tool is installed. */
|
|
41
|
+
homePaths: readonly string[];
|
|
42
|
+
/** Repo-relative projection paths this package generates for the host. */
|
|
43
|
+
projections: readonly string[];
|
|
44
|
+
/** Below this the projection is treated as empty rather than thin. */
|
|
45
|
+
minArtefacts: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The host surfaces this package generates, with their detection signals.
|
|
50
|
+
*
|
|
51
|
+
* Deliberately NOT every id in `toolDetection.ts`: that table lists 23 tools
|
|
52
|
+
* the wizard can record, most of which this package writes no dedicated tree
|
|
53
|
+
* for — they read `AGENTS.md`, which is one file and has its own gates. Listing
|
|
54
|
+
* them here would produce twenty rows of "0 artefacts, correctly", which is the
|
|
55
|
+
* padding that makes a report unreadable.
|
|
56
|
+
*/
|
|
57
|
+
export const HOST_SURFACES: readonly HostSurface[] = [
|
|
58
|
+
{
|
|
59
|
+
id: 'claude-code',
|
|
60
|
+
bins: ['claude'],
|
|
61
|
+
homePaths: ['.claude', '.claude.json'],
|
|
62
|
+
projections: ['.claude/skills', '.claude/rules', '.claude/commands'],
|
|
63
|
+
minArtefacts: 1,
|
|
64
|
+
},
|
|
65
|
+
{ id: 'cursor', bins: ['cursor'], homePaths: ['.cursor'], projections: ['.cursor/rules', '.cursor/commands'], minArtefacts: 1 },
|
|
66
|
+
{ id: 'cline', bins: [], homePaths: ['Documents/Cline'], projections: ['.clinerules'], minArtefacts: 1 },
|
|
67
|
+
{ id: 'windsurf', bins: ['windsurf'], homePaths: ['.codeium/windsurf'], projections: ['.windsurf/rules', '.windsurf/workflows'], minArtefacts: 1 },
|
|
68
|
+
{ id: 'gemini-cli', bins: ['gemini'], homePaths: ['.gemini'], projections: ['GEMINI.md'], minArtefacts: 1 },
|
|
69
|
+
{ id: 'copilot', bins: ['copilot'], homePaths: ['.config/github-copilot'], projections: ['.github/copilot-instructions.md'], minArtefacts: 1 },
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
export type ReachStatus = 'ok' | 'empty-projection' | 'skipped-tool-absent';
|
|
73
|
+
|
|
74
|
+
export interface HostReach {
|
|
75
|
+
id: string;
|
|
76
|
+
status: ReachStatus;
|
|
77
|
+
artefacts: number;
|
|
78
|
+
/** Present for every non-`ok` row. A status with no reason is what this replaces. */
|
|
79
|
+
reason: string;
|
|
80
|
+
present: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Count files under a projection path — one file is one artefact, recursively. */
|
|
84
|
+
export function countArtefacts(root: string, rel: string): number {
|
|
85
|
+
const abs = path.join(root, rel);
|
|
86
|
+
let st: fs.Stats;
|
|
87
|
+
try {
|
|
88
|
+
st = fs.statSync(abs);
|
|
89
|
+
} catch {
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
if (st.isFile()) return 1;
|
|
93
|
+
let n = 0;
|
|
94
|
+
const walk = (dir: string): void => {
|
|
95
|
+
for (const ent of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
96
|
+
if (ent.isDirectory()) walk(path.join(dir, ent.name));
|
|
97
|
+
else n += 1;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
walk(abs);
|
|
101
|
+
return n;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** True when any detection signal for the host hits. */
|
|
105
|
+
export function toolPresent(
|
|
106
|
+
surface: HostSurface,
|
|
107
|
+
opts: { home?: string; pathEnv?: string; exists?: (p: string) => boolean } = {},
|
|
108
|
+
): boolean {
|
|
109
|
+
const home = opts.home ?? os.homedir();
|
|
110
|
+
const exists = opts.exists ?? ((p: string) => fs.existsSync(p));
|
|
111
|
+
for (const rel of surface.homePaths) {
|
|
112
|
+
if (exists(path.join(home, rel))) return true;
|
|
113
|
+
}
|
|
114
|
+
const pathEnv = opts.pathEnv ?? process.env['PATH'] ?? '';
|
|
115
|
+
for (const bin of surface.bins) {
|
|
116
|
+
for (const dir of pathEnv.split(path.delimiter)) {
|
|
117
|
+
if (dir !== '' && exists(path.join(dir, bin))) return true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function measureReach(
|
|
124
|
+
root: string,
|
|
125
|
+
surfaces: readonly HostSurface[] = HOST_SURFACES,
|
|
126
|
+
opts: { home?: string; pathEnv?: string; exists?: (p: string) => boolean } = {},
|
|
127
|
+
): HostReach[] {
|
|
128
|
+
return surfaces.map((s) => {
|
|
129
|
+
const artefacts = s.projections.reduce((n, rel) => n + countArtefacts(root, rel), 0);
|
|
130
|
+
const present = toolPresent(s, opts);
|
|
131
|
+
if (artefacts >= s.minArtefacts) {
|
|
132
|
+
return { id: s.id, status: 'ok' as const, artefacts, reason: '', present };
|
|
133
|
+
}
|
|
134
|
+
if (!present) {
|
|
135
|
+
return {
|
|
136
|
+
id: s.id,
|
|
137
|
+
status: 'skipped-tool-absent' as const,
|
|
138
|
+
artefacts,
|
|
139
|
+
reason:
|
|
140
|
+
`no detection signal for ${s.id} on this machine (bins: ${s.bins.join(', ') || 'none'}; ` +
|
|
141
|
+
`home paths: ${s.homePaths.join(', ') || 'none'}) — an unprojected tree for an ` +
|
|
142
|
+
'uninstalled tool is the correct state, not a gap',
|
|
143
|
+
present,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
id: s.id,
|
|
148
|
+
status: 'empty-projection' as const,
|
|
149
|
+
artefacts,
|
|
150
|
+
reason:
|
|
151
|
+
`${s.id} IS installed and its projection carries ${String(artefacts)} artefact(s) ` +
|
|
152
|
+
`(${s.projections.join(', ')}) — a dead projection for a present tool, which the ` +
|
|
153
|
+
'shape gates report as a clean pass because they only read what exists',
|
|
154
|
+
present,
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ignored-blocker detector (`road-to-runtime-event-journal` Phase 3).
|
|
3
|
+
*
|
|
4
|
+
* `outcome_envelope.ts` already refuses to report a failure as a success. The
|
|
5
|
+
* gap it left is one layer up: nothing recorded whether the ORCHESTRATOR did
|
|
6
|
+
* anything with that failure. A `blocked` return the orchestrator dropped and a
|
|
7
|
+
* `blocked` return it read and deliberately set aside were byte-identical, so
|
|
8
|
+
* an ignored blocker was undetectable by construction — not hard to detect,
|
|
9
|
+
* *undetectable*, because the distinguishing fact was never written down.
|
|
10
|
+
*
|
|
11
|
+
* The acknowledgment field set closes that, and this module is the predicate
|
|
12
|
+
* over it. One rule, stated once:
|
|
13
|
+
*
|
|
14
|
+
* a return in a NON-SUCCESS state carrying NO acknowledgment is an
|
|
15
|
+
* IGNORED BLOCKER.
|
|
16
|
+
*
|
|
17
|
+
* Two boundaries follow from it and are load-bearing in opposite directions:
|
|
18
|
+
*
|
|
19
|
+
* 1. **`rejected-with-reason` is NOT a finding.** A reader who read the
|
|
20
|
+
* blocker, weighed it and rejected it with a named reason has consumed the
|
|
21
|
+
* return. Reporting that would make the detector fire on the compliant
|
|
22
|
+
* path, and a detector that punishes the behaviour it wants is a detector
|
|
23
|
+
* people route around.
|
|
24
|
+
* 2. **A success carrying no acknowledgment is NOT a finding.** Requiring an
|
|
25
|
+
* acknowledgment on every return would make the field a formality on the
|
|
26
|
+
* 99 % path and noise on the 1 % that matters. Only a non-success return
|
|
27
|
+
* was ever owed a decision.
|
|
28
|
+
*
|
|
29
|
+
* Nothing here is a gate. It is a predicate plus a query shape, so both the
|
|
30
|
+
* in-session check and the after-the-fact journal query answer the same
|
|
31
|
+
* question with the same rule rather than two that drift.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import { NON_SUCCESS_STATES } from './outcome_envelope.js';
|
|
35
|
+
import type { ConsumptionState, OutcomeEnvelope, TerminalState } from './outcome_envelope.js';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Is this return an ignored blocker?
|
|
39
|
+
*
|
|
40
|
+
* The core condition, in one place so that neutralising it for a sensitivity
|
|
41
|
+
* probe neutralises BOTH the live check and the journal query — a test that can
|
|
42
|
+
* only be broken in one of the two would establish sensitivity for half the
|
|
43
|
+
* mechanism.
|
|
44
|
+
*/
|
|
45
|
+
export function isIgnoredBlocker(env: Pick<OutcomeEnvelope, 'state' | 'acknowledgment'>): boolean {
|
|
46
|
+
return NON_SUCCESS_STATES.has(env.state) && env.acknowledgment === undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Why a return was reported, in a form a caller can print without re-deriving it. */
|
|
50
|
+
export interface IgnoredBlockerFinding {
|
|
51
|
+
readonly state: TerminalState;
|
|
52
|
+
/** The producer's next action — the thing that went unactioned. */
|
|
53
|
+
readonly suggestion: string;
|
|
54
|
+
/** Set when the finding came from a journal row; null for an in-session envelope. */
|
|
55
|
+
readonly episodeId: string | null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Report the ignored blockers in a batch of returns held in memory. */
|
|
59
|
+
export function findIgnoredBlockers(
|
|
60
|
+
envelopes: readonly Pick<OutcomeEnvelope, 'state' | 'suggestion' | 'acknowledgment'>[],
|
|
61
|
+
): IgnoredBlockerFinding[] {
|
|
62
|
+
return envelopes
|
|
63
|
+
.filter((e) => isIgnoredBlocker(e))
|
|
64
|
+
.map((e) => ({ state: e.state, suggestion: e.suggestion, episodeId: null }));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// The journal join (Phase 3.2)
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* One journal row, as far as THIS question needs it.
|
|
73
|
+
*
|
|
74
|
+
* Deliberately a structural type over four field names rather than an import
|
|
75
|
+
* of the journal module's own row type. The journal is written on a sibling
|
|
76
|
+
* track; coupling this predicate to its internal API would make the answer to
|
|
77
|
+
* "was this blocker ignored" un-testable until that module lands, and would
|
|
78
|
+
* couple two things whose only real contract is the four names below.
|
|
79
|
+
*
|
|
80
|
+
* The contract this join depends on, and nothing else:
|
|
81
|
+
*
|
|
82
|
+
* | field | type | source |
|
|
83
|
+
* |----------------|-------------------------------|------------------------------------------|
|
|
84
|
+
* | `episode_id` | `string` | the episode spine (Phase 2.1) |
|
|
85
|
+
* | `state` | `TerminalState` | reused verbatim from `outcome_envelope` |
|
|
86
|
+
* | `consumption` | `ConsumptionState` \| `null` | this phase's field set (Phase 3.1) |
|
|
87
|
+
* | `suggestion` | `string` | the envelope's next action |
|
|
88
|
+
*
|
|
89
|
+
* `consumption` is NULL — not absent — in the journal, because a SQL column
|
|
90
|
+
* has no third state. {@link rowIsIgnoredBlocker} maps that null onto the
|
|
91
|
+
* envelope's absent case, and that mapping is the whole of the impedance
|
|
92
|
+
* between the two representations.
|
|
93
|
+
*/
|
|
94
|
+
export interface JournalConsumptionRow {
|
|
95
|
+
readonly episode_id: string;
|
|
96
|
+
readonly state: TerminalState;
|
|
97
|
+
readonly consumption: ConsumptionState | null;
|
|
98
|
+
readonly suggestion: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The join, as SQL, for the journal's own reader to run once the table exists.
|
|
103
|
+
*
|
|
104
|
+
* Kept beside the predicate rather than in the journal module so the two
|
|
105
|
+
* cannot drift: if this string and {@link rowIsIgnoredBlocker} ever disagree,
|
|
106
|
+
* the disagreement is visible in one file. It is a documented query shape, not
|
|
107
|
+
* a live query — nothing in this module opens a database.
|
|
108
|
+
*/
|
|
109
|
+
export const IGNORED_BLOCKER_QUERY = `
|
|
110
|
+
SELECT episode_id, state, suggestion
|
|
111
|
+
FROM journal_events
|
|
112
|
+
WHERE state IN ('blocked', 'approval-required', 'exhausted', 'stagnated')
|
|
113
|
+
AND consumption IS NULL
|
|
114
|
+
ORDER BY episode_id
|
|
115
|
+
`.trim();
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* The row-level twin of {@link isIgnoredBlocker}, expressed THROUGH it so the
|
|
119
|
+
* two cannot answer the same question differently.
|
|
120
|
+
*/
|
|
121
|
+
export function rowIsIgnoredBlocker(row: JournalConsumptionRow): boolean {
|
|
122
|
+
return isIgnoredBlocker({
|
|
123
|
+
state: row.state,
|
|
124
|
+
...(row.consumption === null ? {} : { acknowledgment: acknowledgmentOfRow(row.consumption) }),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Rehydrate a row's `consumption` column into an acknowledgment.
|
|
130
|
+
*
|
|
131
|
+
* The reason is not carried on this projection — the detector never reads it,
|
|
132
|
+
* and inventing one here would put a fabricated string where a real reason
|
|
133
|
+
* belongs. `rejected-with-reason` therefore gets a locator instead of prose.
|
|
134
|
+
*/
|
|
135
|
+
function acknowledgmentOfRow(consumption: ConsumptionState): NonNullable<OutcomeEnvelope['acknowledgment']> {
|
|
136
|
+
return consumption === 'rejected-with-reason'
|
|
137
|
+
? { consumption, reason: '(recorded in the journal row)' }
|
|
138
|
+
: { consumption };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Report the ignored blockers in a set of journal rows. */
|
|
142
|
+
export function findIgnoredBlockersInJournal(
|
|
143
|
+
rows: readonly JournalConsumptionRow[],
|
|
144
|
+
): IgnoredBlockerFinding[] {
|
|
145
|
+
return rows
|
|
146
|
+
.filter((r) => rowIsIgnoredBlocker(r))
|
|
147
|
+
.map((r) => ({ state: r.state, suggestion: r.suggestion, episodeId: r.episode_id }));
|
|
148
|
+
}
|