@event4u/agent-config 14.12.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 +234 -0
- 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/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/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 +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 +57 -57
- 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 +1836 -712
- 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 +4818 -2645
- 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/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 +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 +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 +38 -36
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +579 -63
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +37 -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 +8 -8
- 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 +126 -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 +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/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/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/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 +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 +142 -1
- 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_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/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 +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 +98 -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 +4 -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/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_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 +426 -23
- 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/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/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,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-registered guards for the governed harness-evolution programme.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-governed-harness-evolution` Phase 0, steps 0.4, 0.5 and 0.6. All
|
|
5
|
+
* three are PRE-REGISTRATION: the runner they guard does not exist yet (Phases
|
|
6
|
+
* 1-7 are unbuilt), and that is the point — a budget invariant written after
|
|
7
|
+
* the first run is a description of what was spent, and a leakage abort written
|
|
8
|
+
* after the first leak is a post-mortem.
|
|
9
|
+
*
|
|
10
|
+
* The three guards, and the failure each exists to make impossible:
|
|
11
|
+
*
|
|
12
|
+
* 0.4 EVALUATOR TRUST BOUNDARY. The parent design named which fields are
|
|
13
|
+
* proposer-visible and which are evaluator-private, and stopped at the
|
|
14
|
+
* naming. A declared boundary that nothing checks is a boundary that
|
|
15
|
+
* holds until the first convenient exception. {@link discloseToProposer}
|
|
16
|
+
* refuses a holdout field and records every field it did release.
|
|
17
|
+
*
|
|
18
|
+
* 0.5 BUDGET INVARIANT. Candidate count, trial repetitions and a spend
|
|
19
|
+
* ceiling, fixed BEFORE the run and aborting rather than truncating. A
|
|
20
|
+
* truncated run yields `underpowered`, which `paired_verdict` refuses to
|
|
21
|
+
* call a pass (`_lib/paired_verdict.ts:26`) and which a reader mistakes
|
|
22
|
+
* for one.
|
|
23
|
+
*
|
|
24
|
+
* 0.6 EPISTEMIC STOP CONDITIONS. A spend cap stops on cost; most of the
|
|
25
|
+
* reasons to stop are about VALIDITY. Each condition below carries a
|
|
26
|
+
* detector or is explicitly marked model-carried — never implied to be
|
|
27
|
+
* checked when it is not.
|
|
28
|
+
*
|
|
29
|
+
* Nothing here spends, fetches, or writes. The guards are pure functions over
|
|
30
|
+
* declared state so a future runner can call them before it does any of those.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* What a field may be shown to.
|
|
35
|
+
*
|
|
36
|
+
* `holdout` is the load-bearing member: it names a value whose disclosure
|
|
37
|
+
* INVALIDATES the run rather than merely leaking information, which is why
|
|
38
|
+
* {@link discloseToProposer} aborts on it instead of redacting.
|
|
39
|
+
*/
|
|
40
|
+
export type VisibilityClass =
|
|
41
|
+
/** The proposer may read it. Candidate text, public metric names, the task. */
|
|
42
|
+
| 'proposer-visible'
|
|
43
|
+
/** The evaluator reads it; the proposer never does. Per-trial raw scores. */
|
|
44
|
+
| 'evaluator-private'
|
|
45
|
+
/** Sealed-partition truth. Disclosure invalidates the run, not just the trial. */
|
|
46
|
+
| 'holdout';
|
|
47
|
+
|
|
48
|
+
/** One observation field and the boundary it sits behind. */
|
|
49
|
+
export interface FieldVisibility {
|
|
50
|
+
readonly field: string;
|
|
51
|
+
readonly visibility: VisibilityClass;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** A field released to a proposer, with the class it was released under. */
|
|
55
|
+
export interface DisclosureRecord {
|
|
56
|
+
readonly field: string;
|
|
57
|
+
readonly visibility: VisibilityClass;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class HoldoutLeakError extends Error {
|
|
61
|
+
readonly field: string;
|
|
62
|
+
constructor(field: string) {
|
|
63
|
+
super(
|
|
64
|
+
`holdout leakage: field '${field}' is class 'holdout' and reached proposer context. ` +
|
|
65
|
+
'The run is INVALID, not degraded — a proposer that has seen sealed truth cannot ' +
|
|
66
|
+
'be evaluated against it, and no later stage can undo that. Abort, do not redact.',
|
|
67
|
+
);
|
|
68
|
+
this.name = 'HoldoutLeakError';
|
|
69
|
+
this.field = field;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Release an observation to a proposer, recording every field released.
|
|
75
|
+
*
|
|
76
|
+
* Fails CLOSED on an undeclared field: a field with no `visibility_class` is
|
|
77
|
+
* treated as `holdout`, because the alternative — defaulting to visible —
|
|
78
|
+
* makes forgetting to classify a new field silently equivalent to publishing
|
|
79
|
+
* it. Step 0.4's whole subject is that a declared boundary nothing checks is
|
|
80
|
+
* not a boundary.
|
|
81
|
+
*
|
|
82
|
+
* @throws {HoldoutLeakError} on the first holdout or undeclared field.
|
|
83
|
+
*/
|
|
84
|
+
export function discloseToProposer(
|
|
85
|
+
observation: Readonly<Record<string, unknown>>,
|
|
86
|
+
schema: readonly FieldVisibility[],
|
|
87
|
+
log: DisclosureRecord[],
|
|
88
|
+
): Record<string, unknown> {
|
|
89
|
+
const byField = new Map(schema.map((f) => [f.field, f.visibility]));
|
|
90
|
+
const out: Record<string, unknown> = {};
|
|
91
|
+
for (const field of Object.keys(observation)) {
|
|
92
|
+
const visibility = byField.get(field) ?? 'holdout';
|
|
93
|
+
if (visibility === 'holdout') throw new HoldoutLeakError(field);
|
|
94
|
+
if (visibility !== 'proposer-visible') continue;
|
|
95
|
+
log.push({ field, visibility });
|
|
96
|
+
out[field] = observation[field];
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The budget fixed before a run. Every field is a ceiling, never a target. */
|
|
102
|
+
export interface RunBudget {
|
|
103
|
+
readonly maxCandidates: number;
|
|
104
|
+
readonly maxTrialsPerCandidate: number;
|
|
105
|
+
/** Spend ceiling in whole cents, so no float ever decides an abort. */
|
|
106
|
+
readonly maxSpendCents: number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** What a run intends to do, as declared before it starts. */
|
|
110
|
+
export interface RunPlan {
|
|
111
|
+
readonly candidates: number;
|
|
112
|
+
readonly trialsPerCandidate: number;
|
|
113
|
+
readonly estimatedSpendCents: number;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export class BudgetExceededError extends Error {
|
|
117
|
+
readonly dimension: 'candidates' | 'trials' | 'spend';
|
|
118
|
+
constructor(dimension: 'candidates' | 'trials' | 'spend', planned: number, ceiling: number) {
|
|
119
|
+
super(
|
|
120
|
+
`budget invariant: planned ${dimension} ${String(planned)} exceeds the pre-registered ` +
|
|
121
|
+
`ceiling ${String(ceiling)}. ABORTING BEFORE THE RUN, not truncating it — a ` +
|
|
122
|
+
'truncated run yields `underpowered`, which paired_verdict refuses to call a pass ' +
|
|
123
|
+
'and which a reader mistakes for one.',
|
|
124
|
+
);
|
|
125
|
+
this.name = 'BudgetExceededError';
|
|
126
|
+
this.dimension = dimension;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Check a plan against the pre-registered budget, BEFORE anything is spent.
|
|
132
|
+
*
|
|
133
|
+
* The order is deliberate — candidates, then trials, then spend. The first two
|
|
134
|
+
* are free to check and the third is the one an operator argues about; failing
|
|
135
|
+
* on a countable dimension first makes the message actionable without any
|
|
136
|
+
* pricing discussion.
|
|
137
|
+
*
|
|
138
|
+
* @throws {BudgetExceededError} on the first dimension over its ceiling.
|
|
139
|
+
*/
|
|
140
|
+
export function assertWithinBudget(plan: RunPlan, budget: RunBudget): void {
|
|
141
|
+
if (plan.candidates > budget.maxCandidates) {
|
|
142
|
+
throw new BudgetExceededError('candidates', plan.candidates, budget.maxCandidates);
|
|
143
|
+
}
|
|
144
|
+
if (plan.trialsPerCandidate > budget.maxTrialsPerCandidate) {
|
|
145
|
+
throw new BudgetExceededError('trials', plan.trialsPerCandidate, budget.maxTrialsPerCandidate);
|
|
146
|
+
}
|
|
147
|
+
if (plan.estimatedSpendCents > budget.maxSpendCents) {
|
|
148
|
+
throw new BudgetExceededError('spend', plan.estimatedSpendCents, budget.maxSpendCents);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* A stop condition, and whether anything actually checks it.
|
|
154
|
+
*
|
|
155
|
+
* `detector: null` means MODEL-CARRIED and is written out rather than left to
|
|
156
|
+
* inference. This repository's own records name the coverage-inflation failure
|
|
157
|
+
* — a condition listed as if it were enforced when nothing enforces it — often
|
|
158
|
+
* enough that the honest field is cheaper than the audit that finds it later.
|
|
159
|
+
*/
|
|
160
|
+
export interface StopCondition {
|
|
161
|
+
readonly id: string;
|
|
162
|
+
readonly why: string;
|
|
163
|
+
/** The exported detector's name, or `null` for model-carried. */
|
|
164
|
+
readonly detector: string | null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* The four epistemic stop conditions, from the roadmap's step 0.6.
|
|
169
|
+
*
|
|
170
|
+
* Both parent designs carried eight or nine stop conditions; the master
|
|
171
|
+
* compressed them into the budget cap. A spend cap stops on COST, and these
|
|
172
|
+
* stop on VALIDITY — stopping with INDETERMINATE is a valid result, and an
|
|
173
|
+
* honest null is a success when it prevents unnecessary architecture.
|
|
174
|
+
*/
|
|
175
|
+
export const STOP_CONDITIONS: readonly StopCondition[] = [
|
|
176
|
+
{
|
|
177
|
+
id: 'holdout-underpowered',
|
|
178
|
+
why: 'the sealed partition no longer carries enough discordant trials for the exact sign test to resolve, so every verdict it produces is `underpowered` by construction',
|
|
179
|
+
detector: 'holdoutUnderpowered',
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'evaluator-leakage',
|
|
183
|
+
why: 'a holdout field reached proposer context; the run is invalid rather than degraded, and no later stage can undo it',
|
|
184
|
+
detector: 'discloseToProposer',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: 'diversity-collapse',
|
|
188
|
+
why: 'the candidate set has collapsed to semantic duplicates, so the trials measure sampling noise rather than a difference between candidates',
|
|
189
|
+
detector: 'diversityCollapsed',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
id: 'cross-component-interference',
|
|
193
|
+
why: 'two components changed in one run and credit cannot be assigned to either',
|
|
194
|
+
// Honest null: deciding whether two changes interfere needs a causal
|
|
195
|
+
// model of the components, and this programme has none. Marked
|
|
196
|
+
// model-carried rather than given a detector that would pattern-match
|
|
197
|
+
// on file paths and report confidence it does not have.
|
|
198
|
+
detector: null,
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Has the candidate set collapsed to semantic duplicates?
|
|
204
|
+
*
|
|
205
|
+
* Deterministic and deliberately crude: normalise, then count DISTINCT
|
|
206
|
+
* candidates. Below `minDistinct` the set is collapsed. No embedding, no model
|
|
207
|
+
* call — a detector that needs a model to decide whether to stop a model run is
|
|
208
|
+
* a detector that can fail in the same way as the thing it watches.
|
|
209
|
+
*
|
|
210
|
+
* Normalisation is case- and whitespace-folding only. Two candidates differing
|
|
211
|
+
* by a synonym read as distinct here, which UNDER-detects; that direction is
|
|
212
|
+
* chosen on purpose, because a false stop discards a valid run while a missed
|
|
213
|
+
* stop is caught by the verdict coming back `no-change`.
|
|
214
|
+
*/
|
|
215
|
+
export function diversityCollapsed(candidates: readonly string[], minDistinct = 2): boolean {
|
|
216
|
+
const normalised = new Set(candidates.map((c) => c.trim().toLowerCase().replace(/\s+/g, ' ')));
|
|
217
|
+
return normalised.size < minDistinct;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Is the holdout partition too small for the exact sign test to resolve?
|
|
222
|
+
*
|
|
223
|
+
* Mirrors `paired_verdict`'s own floor rather than restating a number:
|
|
224
|
+
* `MIN_DISCORDANT` there is DERIVED from the exact test at ALPHA, not chosen,
|
|
225
|
+
* so a second hard-coded constant here would be a fork of a derivation.
|
|
226
|
+
*/
|
|
227
|
+
export function holdoutUnderpowered(discordantTrials: number, minDiscordant: number): boolean {
|
|
228
|
+
return discordantTrials < minDiscordant;
|
|
229
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does any of this configuration take effect here?
|
|
3
|
+
* (`road-to-delivered-cost-truth` Phase 3.)
|
|
4
|
+
*
|
|
5
|
+
* `doctorShell` states its own scope: Node version, package-root resolution,
|
|
6
|
+
* whether the Bash dispatcher exists. That is an ENVIRONMENT probe. It cannot
|
|
7
|
+
* answer whether a bound hook actually fires on this host — which is the
|
|
8
|
+
* question that decides whether any of the configuration this suite ships is
|
|
9
|
+
* doing anything here.
|
|
10
|
+
*
|
|
11
|
+
* FIVE STATES, NOT FOUR. The roadmap named four binding states; both council
|
|
12
|
+
* seats (2026-08-28, 2/2, resolving `how-far-the-effect-probe-may-reach` as
|
|
13
|
+
* option (c)) split one of them, and the split is real:
|
|
14
|
+
*
|
|
15
|
+
* effective fired, and a deny would have been honoured
|
|
16
|
+
* bound-discarded fired, and the host discards its output
|
|
17
|
+
* bound-not-fired the manifest binds it, and no dispatch was observed
|
|
18
|
+
* unbound the manifest does not bind it on this host
|
|
19
|
+
* unknown it was not safe to probe
|
|
20
|
+
*
|
|
21
|
+
* `bound-not-fired` and `unknown` were one bucket in the four-state model, and
|
|
22
|
+
* collapsing them hides the difference between "the host ignored it" and "we
|
|
23
|
+
* declined to look".
|
|
24
|
+
*
|
|
25
|
+
* ELIGIBILITY IS MEASURED, NOT DECLARED. Option (c) as written restricts
|
|
26
|
+
* dispatch to concerns that DECLARE themselves side-effect free, and both seats
|
|
27
|
+
* then said the same thing from different directions: a self-declared property
|
|
28
|
+
* nothing verifies is a weak control this repository flags as a defect
|
|
29
|
+
* elsewhere, and the dispatch should be sandboxed even for declared-safe
|
|
30
|
+
* concerns. Taken together that makes the declaration redundant — so this module
|
|
31
|
+
* measures the property instead: run the concern against a scratch root, compare
|
|
32
|
+
* the tree before and after, and treat any write as ineligible. A concern that
|
|
33
|
+
* writes is reported `unknown`, which is the honest answer and never a success.
|
|
34
|
+
*
|
|
35
|
+
* `unknown` IS NEVER RENDERED AS `effective`. That is the one rule every seat
|
|
36
|
+
* stated independently, and it is what the three coverage metrics exist to keep
|
|
37
|
+
* visible: a report can be truthful about each concern and still mislead, if
|
|
38
|
+
* almost nothing was actually probed.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
export const PROBE_STATES = ['effective', 'bound-discarded', 'bound-not-fired', 'unbound', 'unknown'] as const;
|
|
42
|
+
export type ProbeState = (typeof PROBE_STATES)[number];
|
|
43
|
+
|
|
44
|
+
/** The verdict a whole host gets. */
|
|
45
|
+
export const HOST_VERDICTS = ['effective', 'partial', 'inert', 'unknown'] as const;
|
|
46
|
+
export type HostVerdict = (typeof HOST_VERDICTS)[number];
|
|
47
|
+
|
|
48
|
+
export interface ConcernProbe {
|
|
49
|
+
concern: string;
|
|
50
|
+
slot: string;
|
|
51
|
+
state: ProbeState;
|
|
52
|
+
/** Always populated — for `unknown` it is the reason the probe declined. */
|
|
53
|
+
reason: string;
|
|
54
|
+
/** Did the sandbox observe a write? `null` when no dispatch was attempted. */
|
|
55
|
+
wrote_in_sandbox: boolean | null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface Coverage {
|
|
59
|
+
/** dispatched / total — tests the control itself. */
|
|
60
|
+
dispatch_rate: number;
|
|
61
|
+
/** non-unknown / total — where an answer exists at all. */
|
|
62
|
+
known_state_rate: number;
|
|
63
|
+
/** (effective + bound-discarded) / total — actual observed confidence. */
|
|
64
|
+
verified_rate: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface HostReport {
|
|
68
|
+
host: string;
|
|
69
|
+
probes: ConcernProbe[];
|
|
70
|
+
coverage: Coverage;
|
|
71
|
+
verdict: HostVerdict;
|
|
72
|
+
/** For `partial`, the slots that are inert. Empty otherwise. */
|
|
73
|
+
inert_slots: string[];
|
|
74
|
+
reason: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function rate(n: number, d: number): number {
|
|
78
|
+
return d === 0 ? 0 : n / d;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function coverageOf(probes: readonly ConcernProbe[]): Coverage {
|
|
82
|
+
const total = probes.length;
|
|
83
|
+
const dispatched = probes.filter((p) => p.wrote_in_sandbox !== null).length;
|
|
84
|
+
const known = probes.filter((p) => p.state !== 'unknown').length;
|
|
85
|
+
const verified = probes.filter((p) => p.state === 'effective' || p.state === 'bound-discarded').length;
|
|
86
|
+
return {
|
|
87
|
+
dispatch_rate: rate(dispatched, total),
|
|
88
|
+
known_state_rate: rate(known, total),
|
|
89
|
+
verified_rate: rate(verified, total),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* One verdict for the host.
|
|
95
|
+
*
|
|
96
|
+
* The ordering is the honesty: `unknown` is checked BEFORE `effective`, so a run
|
|
97
|
+
* that could not establish anything can never present itself as a working
|
|
98
|
+
* configuration. A single `effective` among a hundred `unknown`s is `unknown`,
|
|
99
|
+
* not `partial` — because the hundred were not measured, and `partial` is a
|
|
100
|
+
* claim about what IS inert rather than about what was not looked at.
|
|
101
|
+
*/
|
|
102
|
+
export function hostVerdict(probes: readonly ConcernProbe[]): { verdict: HostVerdict; inert: string[]; reason: string } {
|
|
103
|
+
if (probes.length === 0) {
|
|
104
|
+
return { verdict: 'unknown', inert: [], reason: 'no concern is bound on this host, so there is nothing to probe' };
|
|
105
|
+
}
|
|
106
|
+
const known = probes.filter((p) => p.state !== 'unknown');
|
|
107
|
+
if (known.length === 0) {
|
|
108
|
+
return {
|
|
109
|
+
verdict: 'unknown',
|
|
110
|
+
inert: [],
|
|
111
|
+
reason: `none of the ${String(probes.length)} bound concern(s) could be probed safely — no state was established`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const effective = known.filter((p) => p.state === 'effective');
|
|
115
|
+
const inertProbes = known.filter((p) => p.state === 'bound-discarded' || p.state === 'bound-not-fired' || p.state === 'unbound');
|
|
116
|
+
const inert = [...new Set(inertProbes.map((p) => p.slot))].sort();
|
|
117
|
+
|
|
118
|
+
if (effective.length === 0) {
|
|
119
|
+
return {
|
|
120
|
+
verdict: 'inert',
|
|
121
|
+
inert,
|
|
122
|
+
reason: `no probed concern reached the model on this host (${String(known.length)} of ${String(probes.length)} probed)`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (inertProbes.length === 0 && known.length === probes.length) {
|
|
126
|
+
return { verdict: 'effective', inert: [], reason: `every bound concern (${String(probes.length)}) took effect` };
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
verdict: 'partial',
|
|
130
|
+
inert,
|
|
131
|
+
reason:
|
|
132
|
+
`${String(effective.length)} of ${String(probes.length)} bound concern(s) took effect; ` +
|
|
133
|
+
`inert slot(s): ${inert.length === 0 ? 'none' : inert.join(', ')}` +
|
|
134
|
+
(known.length < probes.length ? ` · ${String(probes.length - known.length)} could not be probed` : ''),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function buildHostReport(host: string, probes: readonly ConcernProbe[]): HostReport {
|
|
139
|
+
const v = hostVerdict(probes);
|
|
140
|
+
return { host, probes: [...probes], coverage: coverageOf(probes), verdict: v.verdict, inert_slots: v.inert, reason: v.reason };
|
|
141
|
+
}
|