@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,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,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Targeted cross-examination — step 8.1.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-inbox-harvest-2026-08-e-council-topology-evidence` step 8.1: *"Select
|
|
5
|
+
* a disputed finding, a conflicting pair, or a correct-looking minority claim,
|
|
6
|
+
* and ask focused rebuttal questions"*, verified by *"the cross-exam prompt
|
|
7
|
+
* names the exact disputed claim"*.
|
|
8
|
+
*
|
|
9
|
+
* ## "Names the exact claim" is a byte-level obligation, not a summary
|
|
10
|
+
*
|
|
11
|
+
* The failure this prevents is a composer that paraphrases: *"one reviewer
|
|
12
|
+
* questioned the index approach"* is a description of a dispute and gives the
|
|
13
|
+
* cross-examined model nothing to rebut. The prompt therefore carries the
|
|
14
|
+
* claim's **verbatim text**, unmodified and untruncated, and
|
|
15
|
+
* {@link crossExamNamesClaim} is the predicate that decides it — a substring
|
|
16
|
+
* check on the original string, which is the only form of "exact" that survives
|
|
17
|
+
* a later edit to the prompt's wording.
|
|
18
|
+
*
|
|
19
|
+
* ## The claim is untrusted, and is fenced
|
|
20
|
+
*
|
|
21
|
+
* A disputed claim is model output. It reaches the prompt through
|
|
22
|
+
* `wrapUntrustedBlocks` under a nonce, exactly as `build_peer_review_user_prompt`
|
|
23
|
+
* already does (`prompts.ts:932-942`) — a claim that could close its own fence
|
|
24
|
+
* could inject instructions into the cross-exam. Fencing does not modify the
|
|
25
|
+
* payload, which is what lets it coexist with the verbatim obligation above.
|
|
26
|
+
*
|
|
27
|
+
* ## Selection is deterministic and ordered, and the order is argued
|
|
28
|
+
*
|
|
29
|
+
* `conflicting-pair` outranks `disputed-finding` outranks `minority-claim`. A
|
|
30
|
+
* conflicting pair is the only kind where **at least one side is definitely
|
|
31
|
+
* wrong**, so the rebuttal has the highest information density; a lone disputed
|
|
32
|
+
* finding may resolve to "both are partly right"; a correct-looking minority
|
|
33
|
+
* claim is last because the majority may simply be right and the call buys the
|
|
34
|
+
* least. Ties break on the claim id, so selection is a pure function of input.
|
|
35
|
+
*
|
|
36
|
+
* Pure and offline: composes a prompt, never dispatches one.
|
|
37
|
+
*/
|
|
38
|
+
import { wrapUntrustedBlocks } from '../_lib/untrusted_content.js';
|
|
39
|
+
|
|
40
|
+
/** What kind of thing is being cross-examined. Priority order, strongest first. */
|
|
41
|
+
export const CROSS_EXAM_KINDS = ['conflicting-pair', 'disputed-finding', 'minority-claim'] as const;
|
|
42
|
+
export type CrossExamKind = (typeof CROSS_EXAM_KINDS)[number];
|
|
43
|
+
|
|
44
|
+
/** One candidate for cross-examination. */
|
|
45
|
+
export interface DisputedClaim {
|
|
46
|
+
readonly id: string;
|
|
47
|
+
readonly kind: CrossExamKind;
|
|
48
|
+
/** Neutral label of whoever asserted it (`Response-A`), never a provider name. */
|
|
49
|
+
readonly assertedBy: string;
|
|
50
|
+
/** THE CLAIM, VERBATIM. Never summarised, never truncated. */
|
|
51
|
+
readonly claim: string;
|
|
52
|
+
/** Neutral label of whoever disputes it, when there is one. */
|
|
53
|
+
readonly disputedBy?: string;
|
|
54
|
+
/** The opposing text, verbatim, when there is one. */
|
|
55
|
+
readonly counterClaim?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The focused questions. Fixed and shared across kinds on purpose: a per-kind
|
|
60
|
+
* question set is a second thing to keep in sync with the neutrality contract,
|
|
61
|
+
* and every question below is answerable about any of the three kinds.
|
|
62
|
+
*/
|
|
63
|
+
export const CROSS_EXAM_QUESTIONS: readonly string[] = [
|
|
64
|
+
'Is the claim above true as stated? Answer yes, no, or "true only under a condition" and name the condition.',
|
|
65
|
+
'What specific evidence would settle it? Name a file, a measurement, or a test — not a further opinion.',
|
|
66
|
+
'If it is false, what is the smallest correction that makes it true?',
|
|
67
|
+
'What would you have to believe for the opposing position to be correct?',
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
const PREAMBLE = `You are cross-examining ONE specific claim from a council deliberation.
|
|
71
|
+
Do not review the artefact again, do not restate the debate, and do not
|
|
72
|
+
comment on any claim other than the one quoted below. Your entire reply
|
|
73
|
+
answers the numbered questions about that claim.`;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Pick the claim to cross-examine, or `null`.
|
|
77
|
+
*
|
|
78
|
+
* Deterministic: kind priority first, then claim id.
|
|
79
|
+
*/
|
|
80
|
+
export function selectCrossExamTarget(candidates: readonly DisputedClaim[]): DisputedClaim | null {
|
|
81
|
+
if (candidates.length === 0) return null;
|
|
82
|
+
const ranked = [...candidates].sort((a, b) => {
|
|
83
|
+
const ka = CROSS_EXAM_KINDS.indexOf(a.kind);
|
|
84
|
+
const kb = CROSS_EXAM_KINDS.indexOf(b.kind);
|
|
85
|
+
return ka - kb || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
86
|
+
});
|
|
87
|
+
return ranked[0] as DisputedClaim;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Compose the cross-exam prompt. The claim text is carried verbatim. */
|
|
91
|
+
export function buildCrossExamPrompt(target: DisputedClaim, opts: { readonly nonce?: string } = {}): string {
|
|
92
|
+
const blocks = [{ heading: `### The claim under examination (asserted by ${target.assertedBy})`, content: target.claim }];
|
|
93
|
+
if (target.counterClaim !== undefined) {
|
|
94
|
+
blocks.push({
|
|
95
|
+
heading: `### The opposing position (asserted by ${target.disputedBy ?? 'another reviewer'})`,
|
|
96
|
+
content: target.counterClaim,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const fenced = wrapUntrustedBlocks(blocks, opts.nonce === undefined ? {} : { nonce: opts.nonce });
|
|
100
|
+
const questions = CROSS_EXAM_QUESTIONS.map((q, i) => `${String(i + 1)}. ${q}`).join('\n');
|
|
101
|
+
return [
|
|
102
|
+
PREAMBLE,
|
|
103
|
+
'',
|
|
104
|
+
`Kind: ${target.kind} · claim id: ${target.id}`,
|
|
105
|
+
'',
|
|
106
|
+
fenced,
|
|
107
|
+
'',
|
|
108
|
+
'---',
|
|
109
|
+
'',
|
|
110
|
+
'Answer these, in order:',
|
|
111
|
+
'',
|
|
112
|
+
questions,
|
|
113
|
+
'',
|
|
114
|
+
].join('\n');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Does this prompt name the exact claim?
|
|
119
|
+
*
|
|
120
|
+
* A plain substring check on the ORIGINAL string. Deliberately not a similarity
|
|
121
|
+
* score: "exact" that tolerates a threshold is not exact, and the paraphrase is
|
|
122
|
+
* the failure mode. Both sides of a pair must be present when a pair was given.
|
|
123
|
+
*/
|
|
124
|
+
export function crossExamNamesClaim(prompt: string, target: DisputedClaim): boolean {
|
|
125
|
+
if (!prompt.includes(target.claim)) return false;
|
|
126
|
+
if (target.counterClaim !== undefined && !prompt.includes(target.counterClaim)) return false;
|
|
127
|
+
return true;
|
|
128
|
+
}
|