@event4u/agent-config 14.11.0 → 14.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +368 -516
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +109 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +400 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +65 -6
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +25 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
- package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +9 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +53 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-236PNQZK.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +42 -10
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +62 -62
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2413 -1087
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +639 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4818 -2645
- package/dist/server/schemas/settings.js +6 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +30 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +2 -2
- package/package.json +10 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/src/agent-src/scripts/guarded_baseline.ts +328 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +400 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +48 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/budgets.yml +19 -0
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +95 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +38 -31
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +731 -30
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +38 -20
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +35 -7
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +43 -0
- package/src/config/rule-stub-ceilings.json +126 -112
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/turnaround-budget.json +66 -0
- package/src/config/web-launch-readiness.json +188 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +27 -0
- package/src/scripts/_lib/activation_ladder.ts +211 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +126 -0
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +195 -7
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +263 -3
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +144 -6
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +528 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +980 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -11
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +378 -0
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_budget_ownership.ts +54 -4
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +752 -0
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +60 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +10 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +0 -17
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -67
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +0 -17
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/operational-readiness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/server-hardening/evals/triggers.json +0 -17
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/workspace-link/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiAudit.js.map +0 -1
- package/dist/cli/commands/uiRender.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/lean_projection_mode.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/ui_surface.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/skillRanking.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/ui_authority.test.ts +0 -251
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -246
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// The two-pass consensus round.
|
|
2
|
+
//
|
|
3
|
+
// Split out of `orchestrator.ts` in the change that made pass 1 conditional
|
|
4
|
+
// (Phase 1B, inline findings). `orchestrator.ts` sits ~750 lines past the
|
|
5
|
+
// 1500-line source-size ceiling, so the budget gate refuses new lines there —
|
|
6
|
+
// correctly: the fix for a bloated file is not a shorter comment, it is the
|
|
7
|
+
// concern moving out. This is the concern that moved, and it is the one the
|
|
8
|
+
// change actually edits.
|
|
9
|
+
//
|
|
10
|
+
// `orchestrator.ts` re-exports `run_consensus_scoring`, so every existing
|
|
11
|
+
// importer is untouched. The import of `consult` below closes a module cycle
|
|
12
|
+
// with that file; it is call-time, not init-time — nothing here runs at module
|
|
13
|
+
// load — which is the shape ESM resolves without a partial-initialization
|
|
14
|
+
// hazard.
|
|
15
|
+
import type { CouncilResponse, ExternalAIClient } from './clients.js';
|
|
16
|
+
import { DEFAULT_MAX_TOKENS } from './clients.js';
|
|
17
|
+
import type { Finding } from './consensus.js';
|
|
18
|
+
import {
|
|
19
|
+
ConsensusBucket,
|
|
20
|
+
FindingScore,
|
|
21
|
+
aggregate_scores,
|
|
22
|
+
anonymize_findings,
|
|
23
|
+
bucket_by_threshold,
|
|
24
|
+
parse_findings_outcome,
|
|
25
|
+
parse_scores_response,
|
|
26
|
+
} from './consensus.js';
|
|
27
|
+
import type { RecordedExtractionOutcome } from './inline_findings.js';
|
|
28
|
+
import { takeInlineFindings } from './inline_findings.js';
|
|
29
|
+
import { consult } from './orchestrator.js';
|
|
30
|
+
import type { RunConsensusScoringOptions } from './orchestrator_results.js';
|
|
31
|
+
import { ConsensusResult, CouncilQuestion } from './orchestrator_results.js';
|
|
32
|
+
import { build_extraction_user_prompt, build_scoring_user_prompt } from './prompts.js';
|
|
33
|
+
|
|
34
|
+
/** Python `str.strip()` parity, as everywhere else in this package. */
|
|
35
|
+
const _pyStrip = (s: string): string => s.replace(/^\s+|\s+$/g, '');
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Two-pass consensus round (Phase 4 / F3).
|
|
39
|
+
*
|
|
40
|
+
* Pass 1 — extraction: each member re-emits its own deliberation as
|
|
41
|
+
* a JSON array of `{id, text}` findings. Pass 2 — scoring: each
|
|
42
|
+
* member sees the *other* members' findings under anonymous labels
|
|
43
|
+
* and rates them 1-10 + agree/disagree + reason.
|
|
44
|
+
*
|
|
45
|
+
* The cost budget is shared across both passes; the daily ledger
|
|
46
|
+
* receives both. Errors in one member's extraction or scoring tag
|
|
47
|
+
* that member but never abort the round.
|
|
48
|
+
*/
|
|
49
|
+
export function run_consensus_scoring(
|
|
50
|
+
members: ExternalAIClient[],
|
|
51
|
+
deliberation_responses: CouncilResponse[],
|
|
52
|
+
opts: RunConsensusScoringOptions = {},
|
|
53
|
+
): ConsensusResult {
|
|
54
|
+
const budget = opts.budget ?? null;
|
|
55
|
+
const table = opts.table ?? null;
|
|
56
|
+
const on_overrun = opts.on_overrun ?? null;
|
|
57
|
+
const project = opts.project ?? null;
|
|
58
|
+
const original_ask = opts.original_ask ?? '';
|
|
59
|
+
const max_tokens = opts.max_tokens ?? DEFAULT_MAX_TOKENS;
|
|
60
|
+
const strong_threshold = opts.strong_threshold ?? 0.7;
|
|
61
|
+
const minority_threshold = opts.minority_threshold ?? 0.4;
|
|
62
|
+
const inline_extractions = opts.inline_extractions ?? null;
|
|
63
|
+
|
|
64
|
+
if (members.length === 0 || deliberation_responses.length === 0) {
|
|
65
|
+
return new ConsensusResult({
|
|
66
|
+
bucket: new ConsensusBucket(),
|
|
67
|
+
findings: [],
|
|
68
|
+
scores: [],
|
|
69
|
+
metadata: new Map(),
|
|
70
|
+
extraction_responses: [],
|
|
71
|
+
scoring_responses: [],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ── Pass 1: extraction ──────────────────────────────────────────
|
|
76
|
+
const member_by_name = new Map<string, ExternalAIClient>();
|
|
77
|
+
for (const m of members) {
|
|
78
|
+
member_by_name.set(m.name, m);
|
|
79
|
+
}
|
|
80
|
+
const extraction_responses: CouncilResponse[] = [];
|
|
81
|
+
const all_findings: Finding[] = [];
|
|
82
|
+
// Per-member extraction outcome — step 2.2. Recorded rather than derived from the
|
|
83
|
+
// findings count, because "zero findings" and "could not be read" are different facts
|
|
84
|
+
// and the count cannot tell them apart. `parsed-after-reask` is kept distinct from
|
|
85
|
+
// `parsed`: a member that needed a second ask is a signal about the prompt or the
|
|
86
|
+
// member, and collapsing it into `parsed` would hide the only evidence that the
|
|
87
|
+
// re-ask is doing anything.
|
|
88
|
+
const parse_outcomes = new Map<string, RecordedExtractionOutcome>();
|
|
89
|
+
for (const resp of deliberation_responses) {
|
|
90
|
+
const member = member_by_name.get(resp.provider);
|
|
91
|
+
if (member === undefined || resp.error || !_pyStrip(resp.text)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const source = `${member.name}:${member.model}`;
|
|
95
|
+
|
|
96
|
+
// Phase 1B replaces the second call, it does not delete it: no harvested
|
|
97
|
+
// block → fall through to the extraction call over untouched text.
|
|
98
|
+
if (takeInlineFindings(inline_extractions, source, parse_outcomes, all_findings)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const question = new CouncilQuestion({
|
|
103
|
+
mode: 'prompt',
|
|
104
|
+
user_prompt: build_extraction_user_prompt(resp.text),
|
|
105
|
+
max_tokens,
|
|
106
|
+
});
|
|
107
|
+
const extracted = consult([member], question, budget, {
|
|
108
|
+
table,
|
|
109
|
+
on_overrun,
|
|
110
|
+
project,
|
|
111
|
+
original_ask,
|
|
112
|
+
});
|
|
113
|
+
extraction_responses.push(...extracted);
|
|
114
|
+
if (extracted.length === 0 || extracted[0]!.error) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
let ex = parse_findings_outcome(extracted[0]!.text, { source });
|
|
118
|
+
|
|
119
|
+
// Step 2.2 — ONE bounded re-ask on `parse_failed`, and one only.
|
|
120
|
+
//
|
|
121
|
+
// A member that said something no parser could read used to be indistinguishable
|
|
122
|
+
// from a member that found nothing: `parse_findings_response` returned `[]` for
|
|
123
|
+
// both, and this loop pushed the empty array with no branch. So an unparseable
|
|
124
|
+
// answer counted as a clean zero-findings review.
|
|
125
|
+
//
|
|
126
|
+
// ONE re-ask, not a loop. A re-ask is a paid call, and an unbounded retry turns
|
|
127
|
+
// one unparseable answer into open-ended spend — the failure mode the N=3
|
|
128
|
+
// validation budget exists for, reached here by a different road. `empty` is NOT
|
|
129
|
+
// re-asked: a member that said nothing has nothing to restate, and re-asking it
|
|
130
|
+
// buys a second silence.
|
|
131
|
+
if (ex.outcome === 'parse_failed') {
|
|
132
|
+
const retry_q = new CouncilQuestion({
|
|
133
|
+
mode: 'prompt',
|
|
134
|
+
user_prompt:
|
|
135
|
+
build_extraction_user_prompt(resp.text) +
|
|
136
|
+
'\n\nYour previous answer could not be parsed. Reply with ONLY a JSON ' +
|
|
137
|
+
'array of {"id": string, "text": string} objects, no prose before or ' +
|
|
138
|
+
'after it. An empty array [] is a valid answer meaning you found nothing.',
|
|
139
|
+
max_tokens,
|
|
140
|
+
});
|
|
141
|
+
const retried = consult([member], retry_q, budget, {
|
|
142
|
+
table,
|
|
143
|
+
on_overrun,
|
|
144
|
+
project,
|
|
145
|
+
original_ask,
|
|
146
|
+
});
|
|
147
|
+
extraction_responses.push(...retried);
|
|
148
|
+
if (retried.length > 0 && !retried[0]!.error) {
|
|
149
|
+
ex = parse_findings_outcome(retried[0]!.text, { source });
|
|
150
|
+
}
|
|
151
|
+
parse_outcomes.set(source, ex.outcome === 'parsed' ? 'parsed-after-reask' : 'parse_failed');
|
|
152
|
+
} else {
|
|
153
|
+
parse_outcomes.set(source, ex.outcome);
|
|
154
|
+
}
|
|
155
|
+
all_findings.push(...ex.findings);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (all_findings.length === 0) {
|
|
159
|
+
return new ConsensusResult({
|
|
160
|
+
bucket: new ConsensusBucket(),
|
|
161
|
+
findings: [],
|
|
162
|
+
scores: [],
|
|
163
|
+
metadata: new Map(),
|
|
164
|
+
parse_outcomes,
|
|
165
|
+
extraction_responses,
|
|
166
|
+
scoring_responses: [],
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ── Pass 2: scoring (each member rates the OTHERS' findings) ────
|
|
171
|
+
const scoring_responses: CouncilResponse[] = [];
|
|
172
|
+
const all_scores: FindingScore[] = [];
|
|
173
|
+
for (const member of members) {
|
|
174
|
+
const scorer = `${member.name}:${member.model}`;
|
|
175
|
+
const others = all_findings.filter((f) => f.source !== scorer);
|
|
176
|
+
if (others.length === 0) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const anon = anonymize_findings(others);
|
|
180
|
+
const label_to_id = new Map<string, string>();
|
|
181
|
+
const anon_text = new Map<string, string>();
|
|
182
|
+
for (const [label, f] of anon) {
|
|
183
|
+
label_to_id.set(label, f.id);
|
|
184
|
+
anon_text.set(label, f.text);
|
|
185
|
+
}
|
|
186
|
+
const question = new CouncilQuestion({
|
|
187
|
+
mode: 'prompt',
|
|
188
|
+
user_prompt: build_scoring_user_prompt(anon_text),
|
|
189
|
+
max_tokens,
|
|
190
|
+
});
|
|
191
|
+
const scored = consult([member], question, budget, {
|
|
192
|
+
table,
|
|
193
|
+
on_overrun,
|
|
194
|
+
project,
|
|
195
|
+
original_ask,
|
|
196
|
+
});
|
|
197
|
+
scoring_responses.push(...scored);
|
|
198
|
+
if (scored.length === 0 || scored[0]!.error) {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
for (const s of parse_scores_response(scored[0]!.text, { scorer })) {
|
|
202
|
+
const real_id = label_to_id.get(s.finding_id);
|
|
203
|
+
if (real_id === undefined) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
all_scores.push(
|
|
207
|
+
new FindingScore(real_id, s.scorer, s.score, s.agree, s.reason),
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const metadata = aggregate_scores(all_findings, all_scores);
|
|
213
|
+
const bucket = bucket_by_threshold(all_findings, metadata, {
|
|
214
|
+
strong: strong_threshold,
|
|
215
|
+
minority: minority_threshold,
|
|
216
|
+
});
|
|
217
|
+
return new ConsensusResult({
|
|
218
|
+
bucket,
|
|
219
|
+
findings: all_findings,
|
|
220
|
+
scores: all_scores,
|
|
221
|
+
metadata,
|
|
222
|
+
parse_outcomes,
|
|
223
|
+
extraction_responses,
|
|
224
|
+
scoring_responses,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The zero-cost structural disagreement signal.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-inbox-harvest-2026-08-e-council-topology-evidence` Phase 6.1: six
|
|
5
|
+
* components — stance divergence, finding overlap, contradiction count,
|
|
6
|
+
* confidence spread, rank uncertainty, novelty / self-similarity — computed from
|
|
7
|
+
* outputs the run **already paid for**.
|
|
8
|
+
*
|
|
9
|
+
* ## The contract is the absence of a call
|
|
10
|
+
*
|
|
11
|
+
* The step's verify is not "the numbers look right"; it is *"no extra model call
|
|
12
|
+
* is issued; call count is unchanged"*. So this module is a pure function of
|
|
13
|
+
* retained output: it imports no client, opens no socket, spawns no process, and
|
|
14
|
+
* reads no file. `argument_exhaustion.ts:40-42` already states that property as
|
|
15
|
+
* 6.1's contract while consuming it; this is the module it was pointing at.
|
|
16
|
+
*
|
|
17
|
+
* Purity is enforced structurally rather than by discipline: every input arrives
|
|
18
|
+
* as an argument, so there is no path from here to a provider even if a future
|
|
19
|
+
* edit wanted one. A test asserts the import surface directly, because a
|
|
20
|
+
* regression here is silent — an added import spends money without changing a
|
|
21
|
+
* single number this module returns.
|
|
22
|
+
*
|
|
23
|
+
* ## Nothing is re-derived
|
|
24
|
+
*
|
|
25
|
+
* Each component reads the verdict the tree already computes rather than a second
|
|
26
|
+
* opinion about the same bytes:
|
|
27
|
+
*
|
|
28
|
+
* - stance divergence and confidence spread read `StanceTallyResult`
|
|
29
|
+
* (`stance_tally.ts:146`) — never a re-parse of the stance lines. Two parses
|
|
30
|
+
* are two chances to disagree.
|
|
31
|
+
* - contradiction count and rank uncertainty read the `ConsensusMetadata` map
|
|
32
|
+
* `aggregate_scores` (`consensus.ts:157`) produced — self-scores already
|
|
33
|
+
* dropped, strengths already rounded.
|
|
34
|
+
* - finding overlap and self-similarity reuse `jaccardSimilarity`
|
|
35
|
+
* (`_lib/text_similarity.ts:33`), the same primitive `debate_gates.ts:40` and
|
|
36
|
+
* `recouncil_guard.ts:29` consume.
|
|
37
|
+
*
|
|
38
|
+
* ## An unavailable component is a result, never a zero
|
|
39
|
+
*
|
|
40
|
+
* A component whose evidence the run does not carry returns
|
|
41
|
+
* `{ available: false, reason }`. It does **not** return `0`, and the reason is
|
|
42
|
+
* an enumerated value rather than prose. A fabricated zero is worse than a
|
|
43
|
+
* declared gap in both directions this signal can be read: `0` divergence reads
|
|
44
|
+
* as unanimity and `0` contradictions reads as agreement, so silently defaulting
|
|
45
|
+
* would make an unmeasured round look like the most convergent one — the same
|
|
46
|
+
* inversion `argument_exhaustion.ts:91-95` guards against for an empty council.
|
|
47
|
+
*
|
|
48
|
+
* ## No composite score, deliberately
|
|
49
|
+
*
|
|
50
|
+
* The six are returned separately and are **not** combined. Two of them —
|
|
51
|
+
* `findingOverlap` and `selfSimilarity` — rise with AGREEMENT while the other
|
|
52
|
+
* four rise with DISAGREEMENT, so a consumer summing them would be adding
|
|
53
|
+
* opposing axes; and weighting them against each other needs numbers no
|
|
54
|
+
* measurement in this tree supplies. Phase 8.4 asks for a score that is
|
|
55
|
+
* "deterministic and inspectable to start" and Phase 10.3 asks which of finding,
|
|
56
|
+
* stance, confidence or evidence a call moved — both want the components, not a
|
|
57
|
+
* scalar that has already discarded which axis moved.
|
|
58
|
+
*
|
|
59
|
+
* `revisit-if`: a benchmark arm produces measured weights for a composite. Then
|
|
60
|
+
* the composite belongs in the consumer that has the measurement, still reading
|
|
61
|
+
* these components as its inputs.
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
import { findMostSimilar, jaccardSimilarity, MERGE_THRESHOLD } from '../_lib/text_similarity.js';
|
|
65
|
+
|
|
66
|
+
import type { ConsensusMetadata, Finding } from './consensus.js';
|
|
67
|
+
import { CONFIDENCE_FACTOR, type StanceTallyResult } from './stance_tally.js';
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The bar at which two members' findings count as the same finding — and it is
|
|
71
|
+
* REUSED, not chosen. `MERGE_THRESHOLD` was fixed by the 2026-07-05 council
|
|
72
|
+
* verdict as the point at which two texts are duplicates, long before this
|
|
73
|
+
* signal existed, which is the same pre-registration argument
|
|
74
|
+
* `recouncil_guard.ts:50` makes for reusing it there.
|
|
75
|
+
*
|
|
76
|
+
* It is a strict bar for prose that says the same thing in different words, so
|
|
77
|
+
* `findingOverlap` UNDER-estimates agreement. That is the fail-safe direction
|
|
78
|
+
* here and the reason a stricter-than-ideal number is acceptable rather than
|
|
79
|
+
* merely tolerated: under-estimating overlap over-estimates disagreement, and
|
|
80
|
+
* Phase 6's failure mode is stopping deliberation too early, not too late.
|
|
81
|
+
*
|
|
82
|
+
* `revisit-if`: two members raise a finding a human calls identical and it
|
|
83
|
+
* scores below this value. The fix then belongs in `text_similarity.ts` where
|
|
84
|
+
* every other consumer can see the number move.
|
|
85
|
+
*/
|
|
86
|
+
export const FINDING_MATCH_THRESHOLD = MERGE_THRESHOLD;
|
|
87
|
+
|
|
88
|
+
/** Why a component carries no value. Enumerated — never free prose. */
|
|
89
|
+
export type SignalGap =
|
|
90
|
+
/** Stance tallying is off for this run, so there is no tally to read. */
|
|
91
|
+
| 'no-stance-tally'
|
|
92
|
+
/** A tally exists and no member backed an option (all abstained or unparsed). */
|
|
93
|
+
| 'no-parsed-stances'
|
|
94
|
+
/** Fewer than two confidence observations; a spread needs two points. */
|
|
95
|
+
| 'too-few-confidence-observations'
|
|
96
|
+
/** Fewer than two sources carried a finding, so there is no pair to compare. */
|
|
97
|
+
| 'too-few-sourced-findings'
|
|
98
|
+
/** No finding was scored by anyone, so no contradiction was observable. */
|
|
99
|
+
| 'no-scored-findings'
|
|
100
|
+
/** Fewer than two scored findings; a ranking needs two positions. */
|
|
101
|
+
| 'too-few-ranked-findings'
|
|
102
|
+
/** No member had a non-empty prior round to be compared against. */
|
|
103
|
+
| 'no-prior-round';
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* One component. `basis` is the observation count the value rests on, so a
|
|
107
|
+
* consumer can tell a 0 measured over 40 pairs from a 0 measured over one — the
|
|
108
|
+
* distinction a bare number destroys, and the reason a degenerate-but-real
|
|
109
|
+
* measurement is reported rather than suppressed.
|
|
110
|
+
*/
|
|
111
|
+
export type SignalComponent =
|
|
112
|
+
| { readonly available: true; readonly value: number; readonly basis: number }
|
|
113
|
+
| { readonly available: false; readonly reason: SignalGap };
|
|
114
|
+
|
|
115
|
+
/** Per present member: this round's text, and its own prior round's. */
|
|
116
|
+
export interface MemberRound {
|
|
117
|
+
readonly member: string;
|
|
118
|
+
readonly current: string;
|
|
119
|
+
/** `null` on round 1 — there is no prior round, which is not an empty one. */
|
|
120
|
+
readonly prior: string | null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export interface DisagreementInputs {
|
|
124
|
+
/** The ONE tally of the round (`tallyFromResponses`), or `null` when off. */
|
|
125
|
+
readonly stance: StanceTallyResult | null;
|
|
126
|
+
/** Findings as already extracted, each carrying its authoring source. */
|
|
127
|
+
readonly findings: readonly Finding[];
|
|
128
|
+
/** The ONE `aggregate_scores` map, keyed by finding id. */
|
|
129
|
+
readonly consensus: ReadonlyMap<string, ConsensusMetadata>;
|
|
130
|
+
/** Present members with their current and prior round texts. */
|
|
131
|
+
readonly memberRounds: readonly MemberRound[];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface DisagreementSignal {
|
|
135
|
+
/**
|
|
136
|
+
* 0..1, rising with disagreement. `1 − topOptionWeight / backedWeight`:
|
|
137
|
+
* 0 when every backer chose one option.
|
|
138
|
+
*/
|
|
139
|
+
readonly stanceDivergence: SignalComponent;
|
|
140
|
+
/**
|
|
141
|
+
* 0..1, rising with AGREEMENT. Mean symmetric share of one source's findings
|
|
142
|
+
* that another source also raised.
|
|
143
|
+
*/
|
|
144
|
+
readonly findingOverlap: SignalComponent;
|
|
145
|
+
/** A count ≥ 0, rising with disagreement: scored `agree: false` votes. */
|
|
146
|
+
readonly contradictionCount: SignalComponent;
|
|
147
|
+
/** 0..1, rising with disagreement: normalised range of backer confidences. */
|
|
148
|
+
readonly confidenceSpread: SignalComponent;
|
|
149
|
+
/** 0..1, rising with disagreement: share of adjacent ranked pairs that tie. */
|
|
150
|
+
readonly rankUncertainty: SignalComponent;
|
|
151
|
+
/**
|
|
152
|
+
* 0..1, rising with AGREEMENT (and with exhaustion): mean similarity of each
|
|
153
|
+
* member's round to its own prior round.
|
|
154
|
+
*/
|
|
155
|
+
readonly selfSimilarity: SignalComponent;
|
|
156
|
+
/** How many of the six carry a value. 0..6. */
|
|
157
|
+
readonly availableCount: number;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const gap = (reason: SignalGap): SignalComponent => ({ available: false, reason });
|
|
161
|
+
const ok = (value: number, basis: number): SignalComponent => ({ available: true, value, basis });
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Spread among the options members actually BACKED.
|
|
165
|
+
*
|
|
166
|
+
* The denominator is the summed option weight, deliberately not the tally's own
|
|
167
|
+
* `w_total`: `w_total` counts abstainers and unparsed responses (see the
|
|
168
|
+
* refusal-preservation invariant at `stance_tally.ts:160-176`), and dividing by
|
|
169
|
+
* it would make a council where half abstained look MORE divergent than one
|
|
170
|
+
* where half disagreed. Abstention and unparsed responses are already surfaced
|
|
171
|
+
* separately by the tally; conflating them into divergence here would double-count
|
|
172
|
+
* them as a position.
|
|
173
|
+
*/
|
|
174
|
+
function stanceDivergence(stance: StanceTallyResult | null): SignalComponent {
|
|
175
|
+
if (stance === null) return gap('no-stance-tally');
|
|
176
|
+
const backedWeight = stance.options.reduce((acc, o) => acc + o.weight, 0);
|
|
177
|
+
const top = stance.options[0];
|
|
178
|
+
if (top === undefined || backedWeight <= 0) return gap('no-parsed-stances');
|
|
179
|
+
const backers = stance.options.reduce((acc, o) => acc + o.backers.length, 0);
|
|
180
|
+
return ok(1 - top.weight / backedWeight, backers);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Normalised range of the confidence tiers the backers declared.
|
|
185
|
+
*
|
|
186
|
+
* Only BACKERS are observable: `tally_stances` counts an abstention and drops
|
|
187
|
+
* its confidence (`stance_tally.ts:182-185`), so an abstainer's declared
|
|
188
|
+
* confidence is not in the tally and is not reconstructed here — re-parsing the
|
|
189
|
+
* reply to recover it would fork the one parse this module refuses to duplicate.
|
|
190
|
+
* The scope is therefore "spread among members who took a position", which is
|
|
191
|
+
* stated rather than implied.
|
|
192
|
+
*
|
|
193
|
+
* The denominator comes from `CONFIDENCE_FACTOR` rather than a literal, so a
|
|
194
|
+
* change to the tier table moves this number with it instead of forking it.
|
|
195
|
+
*/
|
|
196
|
+
function confidenceSpread(stance: StanceTallyResult | null): SignalComponent {
|
|
197
|
+
if (stance === null) return gap('no-stance-tally');
|
|
198
|
+
const factors = stance.options.flatMap((o) => o.backers.map((b) => CONFIDENCE_FACTOR[b.confidence]));
|
|
199
|
+
if (factors.length < 2) return gap('too-few-confidence-observations');
|
|
200
|
+
const span = CONFIDENCE_FACTOR.high - CONFIDENCE_FACTOR.low;
|
|
201
|
+
return ok((Math.max(...factors) - Math.min(...factors)) / span, factors.length);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* How much of what one source raised, another source raised too.
|
|
206
|
+
*
|
|
207
|
+
* Symmetric per pair, because the one-directional share is a different question
|
|
208
|
+
* for each side when the two sources produced different numbers of findings: a
|
|
209
|
+
* source with one finding matched inside a source with twenty scores 1.0 in one
|
|
210
|
+
* direction and 0.05 in the other, and neither alone describes the pair.
|
|
211
|
+
*/
|
|
212
|
+
function findingOverlap(findings: readonly Finding[]): SignalComponent {
|
|
213
|
+
const bySource = new Map<string, Finding[]>();
|
|
214
|
+
for (const f of findings) {
|
|
215
|
+
const bucket = bySource.get(f.source);
|
|
216
|
+
if (bucket === undefined) bySource.set(f.source, [f]);
|
|
217
|
+
else bucket.push(f);
|
|
218
|
+
}
|
|
219
|
+
const sources = [...bySource.values()];
|
|
220
|
+
if (sources.length < 2) return gap('too-few-sourced-findings');
|
|
221
|
+
|
|
222
|
+
/** Share of `from`'s findings with a match at or above the threshold in `to`. */
|
|
223
|
+
const matchedShare = (from: readonly Finding[], to: readonly Finding[]): number => {
|
|
224
|
+
if (from.length === 0) return 0;
|
|
225
|
+
const candidates = to.map((f) => ({ id: f.id, text: f.text }));
|
|
226
|
+
let matched = 0;
|
|
227
|
+
for (const f of from) {
|
|
228
|
+
const best = findMostSimilar(f.text, candidates);
|
|
229
|
+
if (best !== null && best.score >= FINDING_MATCH_THRESHOLD) matched += 1;
|
|
230
|
+
}
|
|
231
|
+
return matched / from.length;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
let total = 0;
|
|
235
|
+
let pairs = 0;
|
|
236
|
+
for (let i = 0; i < sources.length; i += 1) {
|
|
237
|
+
for (let j = i + 1; j < sources.length; j += 1) {
|
|
238
|
+
const a = sources[i] as Finding[];
|
|
239
|
+
const b = sources[j] as Finding[];
|
|
240
|
+
total += (matchedShare(a, b) + matchedShare(b, a)) / 2;
|
|
241
|
+
pairs += 1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return ok(total / pairs, pairs);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Scored findings only — an entry with no scorer is not a zero-contradiction
|
|
249
|
+
* finding, it is an unmeasured one.
|
|
250
|
+
*
|
|
251
|
+
* `aggregate_scores` writes an entry for EVERY finding, including ones nobody
|
|
252
|
+
* scored (`consensus.ts:179-194` sets `dissent_count: 0`). Summing the map
|
|
253
|
+
* wholesale would therefore report a confident `0` for a round where no scoring
|
|
254
|
+
* happened at all, which is the fabricated zero this module exists not to emit.
|
|
255
|
+
*/
|
|
256
|
+
function scoredEntries(consensus: ReadonlyMap<string, ConsensusMetadata>): ConsensusMetadata[] {
|
|
257
|
+
return [...consensus.values()].filter((m) => m.scorers.length > 0);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function contradictionCount(consensus: ReadonlyMap<string, ConsensusMetadata>): SignalComponent {
|
|
261
|
+
const scored = scoredEntries(consensus);
|
|
262
|
+
if (scored.length === 0) return gap('no-scored-findings');
|
|
263
|
+
return ok(
|
|
264
|
+
scored.reduce((acc, m) => acc + m.dissent_count, 0),
|
|
265
|
+
scored.length,
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* How much of the finding ranking the record cannot resolve.
|
|
271
|
+
*
|
|
272
|
+
* The ranking is by `consensus_strength` descending (`consensus.ts:272-274`), and
|
|
273
|
+
* two findings whose strengths are EQUAL have an order that comes from input
|
|
274
|
+
* position rather than from evidence. So the measure is the share of adjacent
|
|
275
|
+
* pairs that tie: 0 when every neighbour is separated, 1 when the whole order is
|
|
276
|
+
* arbitrary.
|
|
277
|
+
*
|
|
278
|
+
* Equality is used rather than a tolerance on purpose — no new tunable. The
|
|
279
|
+
* strengths arrive already rounded to three places by `pyRound`
|
|
280
|
+
* (`consensus.ts:211`), so the record's own resolution is what decides a tie and
|
|
281
|
+
* this module adds no threshold of its own to argue about.
|
|
282
|
+
*
|
|
283
|
+
* Unscored findings are excluded for the same reason as above: they all sit at
|
|
284
|
+
* strength 0 and would report as a near-total tie, which measures the absence of
|
|
285
|
+
* scoring rather than the uncertainty of a ranking.
|
|
286
|
+
*/
|
|
287
|
+
function rankUncertainty(consensus: ReadonlyMap<string, ConsensusMetadata>): SignalComponent {
|
|
288
|
+
const strengths = scoredEntries(consensus)
|
|
289
|
+
.map((m) => m.consensus_strength)
|
|
290
|
+
.sort((a, b) => b - a);
|
|
291
|
+
if (strengths.length < 2) return gap('too-few-ranked-findings');
|
|
292
|
+
let ties = 0;
|
|
293
|
+
for (let i = 1; i < strengths.length; i += 1) {
|
|
294
|
+
if (strengths[i] === strengths[i - 1]) ties += 1;
|
|
295
|
+
}
|
|
296
|
+
return ok(ties / (strengths.length - 1), strengths.length);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Each member against its own prior round — the novelty axis, as a scalar.
|
|
301
|
+
*
|
|
302
|
+
* The boolean gate over the same primitive stays in `debate_gates.ts:32`
|
|
303
|
+
* (`is_near_duplicate`) and is not duplicated here; what this adds is the
|
|
304
|
+
* underlying magnitude, which a stop predicate does not need and an
|
|
305
|
+
* information-gain estimate does.
|
|
306
|
+
*
|
|
307
|
+
* A member with an empty current or prior text contributes nothing rather than a
|
|
308
|
+
* value. That mirrors `is_near_duplicate`'s own guard (`debate_gates.ts:37-39`)
|
|
309
|
+
* and it matters arithmetically: `jaccardSimilarity` defines two empty strings as
|
|
310
|
+
* identical (1.0, `text_similarity.ts:36`), so an errored member would otherwise
|
|
311
|
+
* enter the mean as maximal self-repetition.
|
|
312
|
+
*/
|
|
313
|
+
function selfSimilarity(memberRounds: readonly MemberRound[]): SignalComponent {
|
|
314
|
+
const scores: number[] = [];
|
|
315
|
+
for (const r of memberRounds) {
|
|
316
|
+
if (r.prior === null) continue;
|
|
317
|
+
if (r.prior.trim().length === 0 || r.current.trim().length === 0) continue;
|
|
318
|
+
scores.push(jaccardSimilarity(r.prior, r.current));
|
|
319
|
+
}
|
|
320
|
+
if (scores.length === 0) return gap('no-prior-round');
|
|
321
|
+
return ok(scores.reduce((acc, s) => acc + s, 0) / scores.length, scores.length);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** Compute all six components. Pure: no I/O, no client, no model call. */
|
|
325
|
+
export function computeDisagreementSignal(x: DisagreementInputs): DisagreementSignal {
|
|
326
|
+
const components = {
|
|
327
|
+
stanceDivergence: stanceDivergence(x.stance),
|
|
328
|
+
findingOverlap: findingOverlap(x.findings),
|
|
329
|
+
contradictionCount: contradictionCount(x.consensus),
|
|
330
|
+
confidenceSpread: confidenceSpread(x.stance),
|
|
331
|
+
rankUncertainty: rankUncertainty(x.consensus),
|
|
332
|
+
selfSimilarity: selfSimilarity(x.memberRounds),
|
|
333
|
+
};
|
|
334
|
+
return {
|
|
335
|
+
...components,
|
|
336
|
+
availableCount: Object.values(components).filter((c) => c.available).length,
|
|
337
|
+
};
|
|
338
|
+
}
|