@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,340 @@
|
|
|
1
|
+
// Phase 1B — inline findings, the whole concern in one module.
|
|
2
|
+
//
|
|
3
|
+
// The consensus round's pass 1 asks every member a SECOND time, in a separate
|
|
4
|
+
// paid call, to restate its own analysis as a JSON findings array. Phase 1B of
|
|
5
|
+
// `road-to-inbox-harvest-2026-08-e-council-topology-evidence` asks for that
|
|
6
|
+
// array in the FIRST reply instead, and keeps the extraction call as the
|
|
7
|
+
// repair path.
|
|
8
|
+
//
|
|
9
|
+
// It lives here rather than spread across `orchestrator.ts`, `consensus.ts` and
|
|
10
|
+
// `council_cli.ts` for a reason the source-size budget made concrete: all three
|
|
11
|
+
// are far past the 1500-line ceiling, so a new concern added to them is new
|
|
12
|
+
// budget excess with nowhere to go. Concentrating it also puts the four pieces
|
|
13
|
+
// that have to agree — the contract text's promise, the locator, the harvest
|
|
14
|
+
// and the config predicate — where a reader meets them together.
|
|
15
|
+
import type { ExternalAIClient, CouncilResponse } from './clients.js';
|
|
16
|
+
import type { Finding, FindingsExtraction } from './consensus.js';
|
|
17
|
+
import { _BARE_ARRAY_SRC, _JSON_BLOCK_SRC, parse_findings_outcome } from './consensus.js';
|
|
18
|
+
import { INLINE_FINDINGS_CONTRACT, STANCE_LINE_CONTRACT } from './prompts.js';
|
|
19
|
+
|
|
20
|
+
/** Python `str.strip()` parity, as everywhere else in this package. */
|
|
21
|
+
const _strip = (s: string): string => s.replace(/^\s+|\s+$/g, '');
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Phase 1B — the deliberation reply split into argument and findings block.
|
|
25
|
+
*
|
|
26
|
+
* `deliberation_text` is what every downstream consumer should see: peer
|
|
27
|
+
* review, chairman synthesis, and the rendered artifact evaluate the member's
|
|
28
|
+
* REASONING, and a schema block restating selected conclusions is scaffolding,
|
|
29
|
+
* not argument. Leaving it in amplifies a concise finding simply because it
|
|
30
|
+
* appears twice — the AI council's stated reason (2026-08-30, 2 of 2 seats) for
|
|
31
|
+
* choosing to strip.
|
|
32
|
+
*
|
|
33
|
+
* `block` is the exact consumed span. One locator produces both halves, so the
|
|
34
|
+
* text that is parsed and the text that is removed cannot disagree — the
|
|
35
|
+
* council's other requirement, and the reason there is no separate
|
|
36
|
+
* "find and remove a JSON fence" function anywhere in this change.
|
|
37
|
+
*/
|
|
38
|
+
export interface InlineFindingsSplit {
|
|
39
|
+
/** The reply with the consumed block removed. Equals the input when `found` is false. */
|
|
40
|
+
readonly deliberation_text: string;
|
|
41
|
+
/** The consumed span, ready for `parse_findings_outcome`. `''` when `found` is false. */
|
|
42
|
+
readonly block: string;
|
|
43
|
+
readonly found: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Split a full analysis reply at its TRAILING findings block.
|
|
48
|
+
*
|
|
49
|
+
* A locator, deliberately not a second parser: `parse_findings_outcome` stays
|
|
50
|
+
* the only thing that decides whether a candidate IS a findings block, and this
|
|
51
|
+
* narrows where it looks.
|
|
52
|
+
*
|
|
53
|
+
* The narrowing is not cosmetic. `_extract_json_array` returns the FIRST match,
|
|
54
|
+
* which is correct for an extraction reply (the reply IS the array) and wrong
|
|
55
|
+
* for an analysis reply, where the prose above may legitimately quote a JSON
|
|
56
|
+
* array — the analysis lens exists to critique analyser OUTPUT, so a quoted
|
|
57
|
+
* array is an ordinary thing to find there. First-match would read the quoted
|
|
58
|
+
* array as the member's findings and never reach the real block.
|
|
59
|
+
*
|
|
60
|
+
* `INLINE_FINDINGS_CONTRACT` asks for the block LAST, so LAST is what this
|
|
61
|
+
* reads. `found: false` when nothing array-shaped is present, which the caller
|
|
62
|
+
* treats as "no inline block" and repairs with the extraction call — the same
|
|
63
|
+
* outcome as today, never worse.
|
|
64
|
+
*
|
|
65
|
+
* **Precisely: "last FENCED, else last bare" — not "last in the text."** The
|
|
66
|
+
* two patterns are tried in `_extract_json_array`'s precedence order and the
|
|
67
|
+
* first pattern that matches at all wins, so a reply carrying a quoted FENCED
|
|
68
|
+
* array above its own trailing BARE array selects the quoted one. Stated
|
|
69
|
+
* because the docstring used to claim the simpler rule, which a completion
|
|
70
|
+
* review of 2026-08-30 found untrue against that ordering; the precedence test
|
|
71
|
+
* puts the bare array first and so never exercises the collision.
|
|
72
|
+
*
|
|
73
|
+
* The consequence is bounded rather than eliminated. `_isOwnFindingsBlock`
|
|
74
|
+
* below now rejects any array whose items are not all well-formed findings, so
|
|
75
|
+
* the common shape of a quoted array — evidence rows, log lines, a schema
|
|
76
|
+
* fragment — no longer wins. What survives is a quoted array of well-formed
|
|
77
|
+
* findings sitting fenced above the member's own bare one, and that is recorded
|
|
78
|
+
* as a known residual of 1B.4's gate rather than claimed away.
|
|
79
|
+
*/
|
|
80
|
+
export function split_inline_findings(text: string): InlineFindingsSplit {
|
|
81
|
+
const none: InlineFindingsSplit = { deliberation_text: text, block: '', found: false };
|
|
82
|
+
if (!text) {
|
|
83
|
+
return none;
|
|
84
|
+
}
|
|
85
|
+
// Deliberately the same two patterns `_extract_json_array` uses, in the same
|
|
86
|
+
// precedence order — fenced beats bare — so a block this locator returns is
|
|
87
|
+
// one that function can also read. Only the match SELECTION differs: last,
|
|
88
|
+
// not first.
|
|
89
|
+
for (const src of [_JSON_BLOCK_SRC, _BARE_ARRAY_SRC]) {
|
|
90
|
+
const re = new RegExp(src, 'gs');
|
|
91
|
+
let last: RegExpExecArray | null = null;
|
|
92
|
+
let m: RegExpExecArray | null;
|
|
93
|
+
while ((m = re.exec(text)) !== null) {
|
|
94
|
+
last = m;
|
|
95
|
+
// A zero-length match would spin forever; the patterns cannot produce
|
|
96
|
+
// one (both require at least `[]`), but the guard costs nothing and a
|
|
97
|
+
// future pattern edit is exactly when it would matter.
|
|
98
|
+
if (m.index === re.lastIndex) {
|
|
99
|
+
re.lastIndex += 1;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (last) {
|
|
103
|
+
const start = last.index;
|
|
104
|
+
const end = start + last[0].length;
|
|
105
|
+
return {
|
|
106
|
+
deliberation_text: `${text.slice(0, start)}${text.slice(end)}`,
|
|
107
|
+
block: text.slice(start, end),
|
|
108
|
+
found: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return none;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* How a member's findings were obtained — the RECORDED provenance, wider than
|
|
117
|
+
* `FindingsParseOutcome`, which describes one parse of one piece of text.
|
|
118
|
+
*
|
|
119
|
+
* Typed rather than a bare string because Phase 1B's promotion gate is computed
|
|
120
|
+
* off exactly these values: an untyped `Map<string, string>` makes the number
|
|
121
|
+
* that decides the experiment vulnerable to a misspelling no compiler would
|
|
122
|
+
* catch. The AI council (2026-08-30, 2 of 2 seats) called the pre-existing bare
|
|
123
|
+
* `'parsed-after-reask'` technical debt rather than a precedent to extend.
|
|
124
|
+
*
|
|
125
|
+
* `'parsed'` keeps its shipped meaning — read from the separate extraction
|
|
126
|
+
* call — and is unambiguous now that `'parsed-inline'` names the other source.
|
|
127
|
+
* One seat asked for a rename to `'parsed-extraction'`; renaming a value that
|
|
128
|
+
* is already recorded and compared against is a separate change with its own
|
|
129
|
+
* migration, and is recorded here as declined-with-a-reason, not overlooked.
|
|
130
|
+
*/
|
|
131
|
+
export type RecordedExtractionOutcome =
|
|
132
|
+
| 'parsed'
|
|
133
|
+
| 'empty'
|
|
134
|
+
| 'parse_failed'
|
|
135
|
+
| 'parsed-after-reask'
|
|
136
|
+
| 'parsed-inline';
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Phase 1B — harvest the inline findings block out of each deliberation reply.
|
|
140
|
+
*
|
|
141
|
+
* Runs BETWEEN the deliberation and every consumer of its text. That placement
|
|
142
|
+
* is the load-bearing part and it was a defect the AI council caught
|
|
143
|
+
* (2026-08-30, 2 of 2 seats): peer review and chairman synthesis read the
|
|
144
|
+
* responses BEFORE the consensus round does, so parsing inside
|
|
145
|
+
* `run_consensus_scoring` would have left the schema block in the text those
|
|
146
|
+
* two evaluate — which is precisely the amplification the strip exists to
|
|
147
|
+
* prevent.
|
|
148
|
+
*
|
|
149
|
+
* MUTATES `text` on each response whose block parsed, replacing the consumed
|
|
150
|
+
* span with a one-line marker. Mutation rather than a parallel clean copy
|
|
151
|
+
* because two representations of one response means every downstream consumer
|
|
152
|
+
* has to know which one it holds, and the one that forgets is a silent bug.
|
|
153
|
+
* `CouncilResponse.text` is already mutated on the stance-repair path, so this
|
|
154
|
+
* is the established seam rather than a new one.
|
|
155
|
+
*
|
|
156
|
+
* The marker is deliberately visible. Stripping without an observable trace is
|
|
157
|
+
* a silent mutation of the artifact a reader takes for a transcript, and one
|
|
158
|
+
* seat made an observable marker a condition of its verdict; the other reached
|
|
159
|
+
* the same concern from the auditability side. ~90 characters replaces ~300 of
|
|
160
|
+
* JSON, so the scaffolding is gone and the fact of its removal is not.
|
|
161
|
+
*
|
|
162
|
+
* Returns the per-member extraction keyed by `provider:model` — the same key
|
|
163
|
+
* `run_consensus_scoring` records outcomes under. A member whose block did not
|
|
164
|
+
* parse gets NO entry and its `text` is left exactly as the model wrote it, so
|
|
165
|
+
* the repair extraction call downstream still sees the raw reply.
|
|
166
|
+
*/
|
|
167
|
+
/**
|
|
168
|
+
* Is this extraction the member's OWN findings block, or just some JSON it quoted?
|
|
169
|
+
*
|
|
170
|
+
* `outcome === 'parsed'` was the whole test until a completion review of
|
|
171
|
+
* 2026-08-30 showed it decides nothing: `parse_findings_outcome` returns
|
|
172
|
+
* `'parsed'` for ANY syntactically valid JSON array, and `_collect_findings`
|
|
173
|
+
* silently skips items missing `id` or `text` while the outcome stays `'parsed'`.
|
|
174
|
+
* So a reply carrying no findings block at all, but quoting
|
|
175
|
+
* `[{"file":"src/a.ts","line":42}]` as evidence, was recorded as a successful
|
|
176
|
+
* inline extraction with zero findings — and its quoted evidence was DELETED
|
|
177
|
+
* from the text the peer review, the chairman and the artifact read. Worse, the
|
|
178
|
+
* failure was recorded as a success in the rate the 1B.4 promotion gate reads,
|
|
179
|
+
* so the gate could not see it.
|
|
180
|
+
*
|
|
181
|
+
* Two conjuncts, and both are needed:
|
|
182
|
+
*
|
|
183
|
+
* - **it parsed** — unchanged;
|
|
184
|
+
* - **every item it saw became a finding** — `findings.length === item_count`.
|
|
185
|
+
* A findings block from a member following the contract has well-formed items
|
|
186
|
+
* throughout. An array where some or all items lack `id`/`text` is something
|
|
187
|
+
* else, whatever it parsed to.
|
|
188
|
+
*
|
|
189
|
+
* The bare-`[]` answer keeps working: `item_count` is 0 and `findings.length`
|
|
190
|
+
* is 0, so the conjunction holds and "I found nothing" is still an answer
|
|
191
|
+
* rather than a re-ask.
|
|
192
|
+
*
|
|
193
|
+
* **What this does NOT decide, stated rather than implied away.** A member that
|
|
194
|
+
* quotes ANOTHER member's well-formed `[{"id":…,"text":…}]` array, as the last
|
|
195
|
+
* block in its reply, is indistinguishable from its own by shape — and would
|
|
196
|
+
* still be attributed to the quoting member. Shape cannot separate those; only
|
|
197
|
+
* provenance could, and the reply carries none. It is narrower than the case
|
|
198
|
+
* fixed here (the quote must be well-formed AND last AND the member must have
|
|
199
|
+
* emitted no block of its own), it is visible in the emitted marker, and it is
|
|
200
|
+
* carried into 1B.4's gate as a known residual rather than counted as a success.
|
|
201
|
+
*/
|
|
202
|
+
function _isOwnFindingsBlock(ex: {
|
|
203
|
+
outcome: string;
|
|
204
|
+
findings: readonly unknown[];
|
|
205
|
+
item_count: number;
|
|
206
|
+
}): boolean {
|
|
207
|
+
return ex.outcome === 'parsed' && ex.findings.length === ex.item_count;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function harvest_inline_findings(
|
|
211
|
+
members: readonly ExternalAIClient[],
|
|
212
|
+
responses: readonly CouncilResponse[],
|
|
213
|
+
): Map<string, FindingsExtraction> {
|
|
214
|
+
const out = new Map<string, FindingsExtraction>();
|
|
215
|
+
const model_by_name = new Map<string, string>();
|
|
216
|
+
for (const m of members) {
|
|
217
|
+
model_by_name.set(m.name, m.model);
|
|
218
|
+
}
|
|
219
|
+
for (const resp of responses) {
|
|
220
|
+
const model = model_by_name.get(resp.provider);
|
|
221
|
+
if (model === undefined || resp.error || !_strip(resp.text)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const split = split_inline_findings(resp.text);
|
|
225
|
+
if (!split.found) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const source = `${resp.provider}:${model}`;
|
|
229
|
+
const ex = parse_findings_outcome(split.block, { source });
|
|
230
|
+
if (!_isOwnFindingsBlock(ex)) {
|
|
231
|
+
// Not a findings block after all — most likely a JSON array the member
|
|
232
|
+
// quoted from the artifact. Leave the reply untouched: stripping text
|
|
233
|
+
// we could not read would remove evidence and buy nothing.
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
out.set(source, ex);
|
|
237
|
+
// Retain the reply BEFORE rewriting it — this is the single write of
|
|
238
|
+
// `CouncilResponse.raw_text`, and the reason that field exists.
|
|
239
|
+
//
|
|
240
|
+
// The marker appended below promises "the raw reply is retained in the
|
|
241
|
+
// session record". Until 2026-08-30 that promise was false, and a
|
|
242
|
+
// completion review is what caught it: the persisted record is
|
|
243
|
+
// serialized from these same objects AFTER this harvest runs
|
|
244
|
+
// (`council_cli._serialise_responses`), so the stripped text was the
|
|
245
|
+
// only text that survived anywhere, and the auditability condition the
|
|
246
|
+
// council attached to this feature was unmet.
|
|
247
|
+
//
|
|
248
|
+
// `null` stays the honest value for a reply nothing rewrote — it means
|
|
249
|
+
// "`text` IS the raw reply", never "the raw reply was lost" — which is
|
|
250
|
+
// also why the serializer omits the key entirely in that case rather
|
|
251
|
+
// than writing a duplicate of the reply into every session record.
|
|
252
|
+
resp.raw_text = resp.text;
|
|
253
|
+
const marker = `_[inline findings block extracted: ${String(ex.findings.length)} item(s); the raw reply is retained in the session record.]_`;
|
|
254
|
+
resp.text = `${_strip(split.deliberation_text)}\n\n${marker}`;
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* The FINAL deliberation round's volatile suffix.
|
|
262
|
+
*
|
|
263
|
+
* Two opt-in contracts ride it and their ORDER is load-bearing:
|
|
264
|
+
* `STANCE_LINE_CONTRACT` requires the stance to be the last line of the reply,
|
|
265
|
+
* so it is appended last and the findings block sits above it. A findings block
|
|
266
|
+
* appended after the stance line would contradict the instruction the member is
|
|
267
|
+
* reading, which is the one composition bug this function exists to make
|
|
268
|
+
* impossible to reintroduce.
|
|
269
|
+
*
|
|
270
|
+
* Both off → the caller's suffix is returned unchanged, so the composed default
|
|
271
|
+
* is byte-identical to a run without either feature.
|
|
272
|
+
*/
|
|
273
|
+
export function composeFinalRoundSuffix(
|
|
274
|
+
suffix: string,
|
|
275
|
+
opts: { is_final: boolean; inline_findings: boolean; stance_tally: boolean },
|
|
276
|
+
): string {
|
|
277
|
+
if (!opts.is_final) {
|
|
278
|
+
return suffix;
|
|
279
|
+
}
|
|
280
|
+
let out = suffix;
|
|
281
|
+
if (opts.inline_findings) {
|
|
282
|
+
out = `${out}\n\n---\n\n${INLINE_FINDINGS_CONTRACT}`;
|
|
283
|
+
}
|
|
284
|
+
if (opts.stance_tally) {
|
|
285
|
+
out = `${out}\n\n---\n\n${STANCE_LINE_CONTRACT}`;
|
|
286
|
+
}
|
|
287
|
+
return out;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Consume a member's harvested findings, or report that it has none.
|
|
292
|
+
*
|
|
293
|
+
* Returns `true` when the caller should SKIP its extraction call. An entry in
|
|
294
|
+
* the map is always a short-circuit and never a partial one, because
|
|
295
|
+
* `harvest_inline_findings` records only a member whose block PARSED — a member
|
|
296
|
+
* with no entry had its reply left raw and takes the shipped extraction path
|
|
297
|
+
* over the full text.
|
|
298
|
+
*/
|
|
299
|
+
export function takeInlineFindings(
|
|
300
|
+
inline_extractions: ReadonlyMap<string, FindingsExtraction> | null,
|
|
301
|
+
source: string,
|
|
302
|
+
parse_outcomes: Map<string, RecordedExtractionOutcome>,
|
|
303
|
+
all_findings: Finding[],
|
|
304
|
+
): boolean {
|
|
305
|
+
const inline = inline_extractions?.get(source);
|
|
306
|
+
if (inline === undefined) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
parse_outcomes.set(source, 'parsed-inline');
|
|
310
|
+
all_findings.push(...inline.findings);
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Is the inline-findings contract active for this run?
|
|
316
|
+
*
|
|
317
|
+
* Read BEFORE the deliberation, because the contract is a prompt change and the
|
|
318
|
+
* prompt is built first; the harvest reads the same predicate so the two cannot
|
|
319
|
+
* disagree about whether a member was asked for the block. Three conjuncts, all
|
|
320
|
+
* required: consensus scoring on, this lens in its lens list, and
|
|
321
|
+
* `inline_findings` explicitly on. Any missing → `false`, and `false` is a
|
|
322
|
+
* byte-identical prompt.
|
|
323
|
+
*
|
|
324
|
+
* Reads the SYNTHESISED settings dict, not the typed config. That distinction
|
|
325
|
+
* is not academic: `_lib/council_settings_block.ts` projects the typed config
|
|
326
|
+
* into this dict, and when it did not carry the key a `true` in the YAML
|
|
327
|
+
* resolved to `undefined` and the feature was silently off with every unit test
|
|
328
|
+
* green — found by a live analysis run on 2026-08-30, not by review.
|
|
329
|
+
*/
|
|
330
|
+
export function inlineFindingsActive(
|
|
331
|
+
ai_cfg: Record<string, unknown>,
|
|
332
|
+
mode: string,
|
|
333
|
+
): boolean {
|
|
334
|
+
const cs = (ai_cfg['consensus_scoring'] as Record<string, unknown> | undefined) ?? {};
|
|
335
|
+
if (cs['enabled'] !== true || cs['inline_findings'] !== true) {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
const lenses = (cs['lenses'] as string[] | undefined) ?? ['analysis'];
|
|
339
|
+
return lenses.includes(mode);
|
|
340
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-judge position-consistency — order-swap over sampled pairwise judgments.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-inbox-harvest-2026-08-e-council-topology-evidence` Phase 3, step 3.5:
|
|
5
|
+
* "repeat sampled pairwise judgments with candidate order reversed; emit a
|
|
6
|
+
* per-judge position-consistency metric", verified by "the metric exists per
|
|
7
|
+
* judge and is reported with the verdict".
|
|
8
|
+
*
|
|
9
|
+
* ── What already existed, and why this is not a second copy of it ────────────
|
|
10
|
+
* `check_quality_regression.evaluatePair` (`:84-108`) already judges every pair
|
|
11
|
+
* in both orders and resolves a flip to `inconsistent` rather than to a winner,
|
|
12
|
+
* and `_lib/judge_hygiene.ts:5-9` records that as stronger than the step that
|
|
13
|
+
* asked for it. Two things it does not do, and both are the point here:
|
|
14
|
+
*
|
|
15
|
+
* 1. It is SINGLE-JUDGE. `aggregate` returns one run-wide `inconsistency_rate`
|
|
16
|
+
* (`:216`), so two judges of differing reliability average into one number
|
|
17
|
+
* that describes neither. The step asks for the metric PER JUDGE, which is
|
|
18
|
+
* what makes it actionable: you can drop the flipper.
|
|
19
|
+
* 2. It reports presence, not DIRECTION. A judge that flips at random and a
|
|
20
|
+
* judge that always prefers whatever it was shown first produce the same
|
|
21
|
+
* inconsistency rate and need opposite remedies — the first is noise, the
|
|
22
|
+
* second is a systematic bias that survives averaging and quietly decides
|
|
23
|
+
* verdicts. `first_position_rate` separates them.
|
|
24
|
+
*
|
|
25
|
+
* That module is the thin-vs-eager token gate and is not council code; this one
|
|
26
|
+
* is council-side and stays a pure library — no transport, no fixture path, no
|
|
27
|
+
* `main`. The judge is an injected function, so the whole surface is testable
|
|
28
|
+
* against a scripted judge and costs nothing to exercise.
|
|
29
|
+
*
|
|
30
|
+
* ── Honest scope ────────────────────────────────────────────────────────────
|
|
31
|
+
* The shipped council has NO pairwise judging stage (`grep -rn pairwise
|
|
32
|
+
* src/scripts/ai_council` returns nothing): members deliberate, peer-review and
|
|
33
|
+
* are scored on findings, never compared two at a time. So this module is the
|
|
34
|
+
* metric and its renderer, exercised by the provider-leakage bench that Phase 3
|
|
35
|
+
* builds; it does not claim a live council verdict currently carries the line,
|
|
36
|
+
* because there is currently no live council judgment for it to describe.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import { _sha256_hex } from './blind_review.js';
|
|
40
|
+
|
|
41
|
+
/** A judge's preference between the two PRESENTED candidates — order-relative. */
|
|
42
|
+
export type PairwiseVerdict = 'first' | 'second' | 'tie';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The pluggable judge. `first`/`second` are the candidate bodies in PRESENTED
|
|
46
|
+
* order, so a judge implementation cannot tell which arm it is looking at
|
|
47
|
+
* unless the bodies themselves leak it.
|
|
48
|
+
*/
|
|
49
|
+
export type PairwiseJudge = (ctx: { readonly id: string }, first: string, second: string) => PairwiseVerdict;
|
|
50
|
+
|
|
51
|
+
/** How a pair resolved once both orders were seen. */
|
|
52
|
+
export type PairResolution = 'a' | 'b' | 'tie' | 'inconsistent';
|
|
53
|
+
|
|
54
|
+
export interface SwapObservation {
|
|
55
|
+
readonly id: string;
|
|
56
|
+
/** Verdict with A presented first. */
|
|
57
|
+
readonly forward: PairwiseVerdict;
|
|
58
|
+
/** Verdict with B presented first. */
|
|
59
|
+
readonly reverse: PairwiseVerdict;
|
|
60
|
+
readonly resolution: PairResolution;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Judge one (a, b) pair in BOTH orders.
|
|
65
|
+
*
|
|
66
|
+
* A verdict that does not survive the swap resolves to `inconsistent`, never to
|
|
67
|
+
* a winner — a flagged tie would still be a tie in somebody's denominator,
|
|
68
|
+
* while `inconsistent` is its own bucket with its own reported rate.
|
|
69
|
+
*/
|
|
70
|
+
export function judgeBothOrders(id: string, a: string, b: string, judge: PairwiseJudge): SwapObservation {
|
|
71
|
+
const ctx = { id };
|
|
72
|
+
const forward = judge(ctx, a, b);
|
|
73
|
+
const reverse = judge(ctx, b, a);
|
|
74
|
+
// Normalise each verdict to the CANDIDATE it names, not the position.
|
|
75
|
+
const wf: PairResolution = forward === 'first' ? 'a' : forward === 'second' ? 'b' : 'tie';
|
|
76
|
+
const wr: PairResolution = reverse === 'first' ? 'b' : reverse === 'second' ? 'a' : 'tie';
|
|
77
|
+
const resolution: PairResolution = wf === wr ? wf : 'inconsistent';
|
|
78
|
+
return { id, forward, reverse, resolution };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface JudgeConsistency {
|
|
82
|
+
readonly judge: string;
|
|
83
|
+
/** Pairs actually repeated in both orders. */
|
|
84
|
+
readonly sampled: number;
|
|
85
|
+
/** Both orders named the same candidate, or both said tie. */
|
|
86
|
+
readonly consistent: number;
|
|
87
|
+
/** The two orders disagreed. */
|
|
88
|
+
readonly inconsistent: number;
|
|
89
|
+
/**
|
|
90
|
+
* `consistent / sampled`. `null` at zero pairs — a rate over an empty
|
|
91
|
+
* denominator is not 1.0, and reporting it as 1.0 would make an unrun swap
|
|
92
|
+
* indistinguishable from a perfectly stable judge.
|
|
93
|
+
*/
|
|
94
|
+
readonly position_consistency: number | null;
|
|
95
|
+
/**
|
|
96
|
+
* Share of DECISIVE verdicts (`first`/`second`, both orders pooled) that
|
|
97
|
+
* named whichever candidate was shown FIRST. ~0.5 is unbiased; near 1.0 is
|
|
98
|
+
* primacy, near 0.0 recency. `null` when nothing decisive was said.
|
|
99
|
+
*
|
|
100
|
+
* This is the direction an inconsistency rate cannot show, and the reason a
|
|
101
|
+
* judge that flips at random is a different problem from one that always
|
|
102
|
+
* prefers the top of the list.
|
|
103
|
+
*/
|
|
104
|
+
readonly first_position_rate: number | null;
|
|
105
|
+
/** Decisive verdicts counted for `first_position_rate`. */
|
|
106
|
+
readonly decisive_verdicts: number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Per-judge metric over that judge's own swapped observations. */
|
|
110
|
+
export function positionConsistency(judge: string, obs: readonly SwapObservation[]): JudgeConsistency {
|
|
111
|
+
let consistent = 0;
|
|
112
|
+
let inconsistent = 0;
|
|
113
|
+
let firstWins = 0;
|
|
114
|
+
let decisive = 0;
|
|
115
|
+
for (const o of obs) {
|
|
116
|
+
if (o.resolution === 'inconsistent') {
|
|
117
|
+
inconsistent += 1;
|
|
118
|
+
} else {
|
|
119
|
+
consistent += 1;
|
|
120
|
+
}
|
|
121
|
+
for (const v of [o.forward, o.reverse]) {
|
|
122
|
+
if (v === 'first') {
|
|
123
|
+
decisive += 1;
|
|
124
|
+
firstWins += 1;
|
|
125
|
+
} else if (v === 'second') {
|
|
126
|
+
decisive += 1;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const sampled = obs.length;
|
|
131
|
+
return {
|
|
132
|
+
judge,
|
|
133
|
+
sampled,
|
|
134
|
+
consistent,
|
|
135
|
+
inconsistent,
|
|
136
|
+
position_consistency: sampled > 0 ? consistent / sampled : null,
|
|
137
|
+
first_position_rate: decisive > 0 ? firstWins / decisive : null,
|
|
138
|
+
decisive_verdicts: decisive,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Deterministic sample of `ids` at `rate`, seeded by `seed`.
|
|
144
|
+
*
|
|
145
|
+
* The step says "SAMPLED pairwise judgments", because the swap doubles judge
|
|
146
|
+
* calls and doubling every one of them to measure the judge is a cost the
|
|
147
|
+
* measurement does not need. Deterministic so a published consistency figure is
|
|
148
|
+
* reproducible from the report's own seed — a sample nobody can re-draw is a
|
|
149
|
+
* number nobody can check.
|
|
150
|
+
*
|
|
151
|
+
* `rate <= 0` samples nothing; `rate >= 1` samples everything.
|
|
152
|
+
*/
|
|
153
|
+
export function sampleForSwap(ids: readonly string[], rate: number, seed: string): string[] {
|
|
154
|
+
if (!(rate > 0)) {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
if (rate >= 1) {
|
|
158
|
+
return [...ids];
|
|
159
|
+
}
|
|
160
|
+
return ids.filter((id) => _unitHash(`${seed} ${id}`) < rate);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Stable [0,1) hash of a string.
|
|
165
|
+
*
|
|
166
|
+
* Reuses `blind_review._sha256_hex` rather than carrying a local one. That
|
|
167
|
+
* export exists for exactly this reason — `blind_review.ts:38-44` records that
|
|
168
|
+
* two hashes of one input are two answers to one question and the second is the
|
|
169
|
+
* one nobody updates. A hand-rolled FNV-1a was tried here first and its low bits
|
|
170
|
+
* were skewed enough that a rate of 0.25 sampled half the corpus; the test that
|
|
171
|
+
* caught it is kept.
|
|
172
|
+
*/
|
|
173
|
+
function _unitHash(s: string): number {
|
|
174
|
+
return parseInt(_sha256_hex(s).slice(0, 8), 16) / 4294967296;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* One report line per judge, for emission BESIDE a verdict.
|
|
179
|
+
*
|
|
180
|
+
* `n/a` rather than a number when nothing was sampled: the step's verify is
|
|
181
|
+
* that the metric is reported, and a report that silently prints nothing for an
|
|
182
|
+
* unrun swap satisfies it only by looking like it ran.
|
|
183
|
+
*/
|
|
184
|
+
export function renderPositionConsistency(rows: readonly JudgeConsistency[]): string {
|
|
185
|
+
if (rows.length === 0) {
|
|
186
|
+
return 'position consistency: no judge sampled — order-swap NOT RUN.';
|
|
187
|
+
}
|
|
188
|
+
const pct = (v: number | null): string => (v === null ? 'n/a' : `${(v * 100).toFixed(0)}%`);
|
|
189
|
+
return rows
|
|
190
|
+
.map(
|
|
191
|
+
(r) =>
|
|
192
|
+
`position consistency · ${r.judge}: ${pct(r.position_consistency)} ` +
|
|
193
|
+
`(${String(r.consistent)}/${String(r.sampled)} pairs survived the swap; ` +
|
|
194
|
+
`first-position rate ${pct(r.first_position_rate)} over ${String(r.decisive_verdicts)} decisive verdicts)`,
|
|
195
|
+
)
|
|
196
|
+
.join('\n');
|
|
197
|
+
}
|