@event4u/agent-config 14.12.0 → 14.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +118 -155
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +145 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-comment-discipline.md +6 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
- package/dist/agent-src/scripts/guarded_baseline.ts +343 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +516 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +80 -11
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +58 -58
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2900 -1049
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +634 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4895 -2627
- package/dist/server/schemas/settings.js +3 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +10 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +18 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/llms.txt +2 -2
- package/package.json +5 -2
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
- package/src/agent-src/scripts/guarded_baseline.ts +343 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +516 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +32 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +80 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +57 -36
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +729 -63
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +42 -19
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +16 -15
- package/src/config/preamble-payload-budget.json +12 -4
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +16 -2
- package/src/config/rule-stub-ceilings.json +133 -112
- package/src/config/turnaround-budget.json +66 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +23 -0
- package/src/scripts/_lib/activation_ladder.ts +255 -0
- package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/adr_frontmatter.ts +26 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_pair_delta.ts +349 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/carrier_status.ts +118 -0
- package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/corpus_manifest.ts +726 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +282 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/estate_carrier_cases.ts +72 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_cascade.ts +452 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/evolution_roi.ts +562 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +239 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/lexical_shortlist.ts +215 -0
- package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
- package/src/scripts/_lib/llm_proposer_transport.ts +153 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/pathology_archive.ts +393 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/promotion_capability.ts +315 -0
- package/src/scripts/_lib/promotion_evidence.ts +414 -0
- package/src/scripts/_lib/promotion_review.ts +294 -0
- package/src/scripts/_lib/prompt_shape.ts +92 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/release_highlights.ts +70 -1
- package/src/scripts/_lib/release_material.ts +125 -2
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/routing_corpus.ts +307 -0
- package/src/scripts/_lib/routing_index_input.ts +104 -0
- package/src/scripts/_lib/rule_injection.ts +22 -1
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/semantic_noop.ts +167 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/activation_receipt.ts +258 -0
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/cross_exam.ts +128 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/explain_route.ts +157 -0
- package/src/scripts/ai_council/information_gain.ts +293 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/leakage_corpus.ts +385 -0
- package/src/scripts/ai_council/leakage_patterns.ts +453 -0
- package/src/scripts/ai_council/minority_retention.ts +171 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/recouncil_savings.ts +299 -0
- package/src/scripts/ai_council/replay_route.ts +223 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
- package/src/scripts/ai_council/routing_training_row.ts +197 -0
- package/src/scripts/ai_council/synthesis_strategy.ts +159 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +131 -10
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +34 -1
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +347 -25
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +114 -3
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_release_highlights.ts +96 -13
- package/src/scripts/check_roadmap_trackable.ts +17 -2
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +26 -3
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/corpus_manifest.ts +235 -0
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +1153 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -16
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/comment_discipline_hook.ts +146 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/language_mirror_hook.ts +14 -2
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_carrier_integrity.ts +820 -0
- package/src/scripts/lint_code_comments.ts +643 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_plan_risk_register.ts +39 -19
- package/src/scripts/lint_promotion_paths.ts +779 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/llm_propose.ts +256 -0
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_delivery_sets.ts +361 -0
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/measure_routing_signal.ts +307 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +76 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_council_retention.ts +495 -0
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/release.ts +21 -37
- package/src/scripts/release_drill.ts +143 -0
- package/src/scripts/release_env.ts +35 -0
- package/src/scripts/release_publication.ts +84 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +3 -3
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +5 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The activation-receipt producer — independent, append-only, zero model calls.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-governed-evidence-production` step 1.1. The receipt SCHEMA
|
|
5
|
+
* ({@link ActivationReceipt}) and the CLASSIFIER ({@link classifyFailure}) both
|
|
6
|
+
* predate this module and are NOT reimplemented here; what was missing was a
|
|
7
|
+
* producer, so nothing ever wrote an `activation` object into an audit line and
|
|
8
|
+
* the receipt-bearing cascade stages had no subject.
|
|
9
|
+
*
|
|
10
|
+
* ## The claims this module is written against
|
|
11
|
+
*
|
|
12
|
+
* Stated once, in `docs/contracts/activation-receipt-trust-boundary.md`, and
|
|
13
|
+
* CITED here rather than restated — step 1.3's verify clause asks for exactly
|
|
14
|
+
* that split, and a second copy of a falsifiable claim is a second thing to
|
|
15
|
+
* keep true.
|
|
16
|
+
*
|
|
17
|
+
* | Claim | Where it binds in this file |
|
|
18
|
+
* |---|---|
|
|
19
|
+
* | TB-1 (no evaluation input decides a STATE) | the import list: no cascade, record, vector or verdict module appears |
|
|
20
|
+
* | TB-2 (an unobserved rung is absent) | {@link buildActivationReceipt} writes only the rungs it was given |
|
|
21
|
+
* | TB-3 (every state names an admitted source) | {@link EVIDENCE_SOURCES} + the refusal in {@link buildActivationReceipt} |
|
|
22
|
+
* | TB-4 (append, never rewrite) | {@link appendActivationLine} opens with `appendFileSync` and mints a fresh `id` |
|
|
23
|
+
* | EC-1 (zero model calls) | no transport import, no spawn, no key read — asserted by this module's test |
|
|
24
|
+
* | EC-3 (a missing observation is never bought) | {@link observeProjection} returns absence and does not retry |
|
|
25
|
+
*
|
|
26
|
+
* ## What is observable today, and what is not
|
|
27
|
+
*
|
|
28
|
+
* Three sources are admitted and all three ship an observer. `adhered` has no
|
|
29
|
+
* admitted source, so this producer CANNOT emit that rung and a real receipt
|
|
30
|
+
* reads `unknown` there. That is a coverage fact recorded rather than papered
|
|
31
|
+
* over: admitting a fourth source with no observer behind it would describe a
|
|
32
|
+
* capability that does not exist, which is the "population of zero" failure the
|
|
33
|
+
* roadmap already flags elsewhere.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import * as fs from 'node:fs';
|
|
37
|
+
import * as path from 'node:path';
|
|
38
|
+
|
|
39
|
+
import {
|
|
40
|
+
LADDER_RUNGS,
|
|
41
|
+
type ActivationReceipt,
|
|
42
|
+
type LadderRung,
|
|
43
|
+
type PrecedenceReason,
|
|
44
|
+
type RungState,
|
|
45
|
+
} from './activation_ladder.js';
|
|
46
|
+
import type { NoFreeForm } from './runtime_journal.js';
|
|
47
|
+
import { type PrivacyClass } from './privacy_class.js';
|
|
48
|
+
|
|
49
|
+
type Assert<T extends true> = T;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The closed set of evidence sources a rung state may come from (TB-3).
|
|
53
|
+
*
|
|
54
|
+
* Each entry names a surface this producer can read without consulting the
|
|
55
|
+
* evaluation side. A source may not be added without an observer: the set
|
|
56
|
+
* describes what can be observed, never what one would like to observe.
|
|
57
|
+
*
|
|
58
|
+
* - `source-tree` — the authored artefact exists under `src/`, so it can match
|
|
59
|
+
* at all. Reads the `eligible` rung.
|
|
60
|
+
* - `discovery-manifest` — the built manifest names the artefact for the active
|
|
61
|
+
* install, i.e. the selector kept it. Reads the `selected` rung.
|
|
62
|
+
* - `host-projection` — a host tree carries a file for the artefact. Reads the
|
|
63
|
+
* `projected` rung.
|
|
64
|
+
*/
|
|
65
|
+
export const EVIDENCE_SOURCES = ['source-tree', 'discovery-manifest', 'host-projection'] as const;
|
|
66
|
+
export type EvidenceSource = (typeof EVIDENCE_SOURCES)[number];
|
|
67
|
+
|
|
68
|
+
/** The rung each admitted source is allowed to speak about. One source, one rung. */
|
|
69
|
+
export const SOURCE_RUNG: Readonly<Record<EvidenceSource, LadderRung>> = {
|
|
70
|
+
'source-tree': 'eligible',
|
|
71
|
+
'discovery-manifest': 'selected',
|
|
72
|
+
'host-projection': 'projected',
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** Rungs no admitted source covers today. Present so the gap is enumerable. */
|
|
76
|
+
export const UNOBSERVED_RUNGS: readonly LadderRung[] = LADDER_RUNGS.filter(
|
|
77
|
+
(r) => !Object.values(SOURCE_RUNG).includes(r),
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* One observation. `state` is the evidence; `evidence_source` is where it came
|
|
82
|
+
* from.
|
|
83
|
+
*
|
|
84
|
+
* The field is `evidence_source` and not `source` on purpose: `source` is a
|
|
85
|
+
* member of `FREE_FORM_KEYS`, so a field of that name would make the privacy
|
|
86
|
+
* assertion at the bottom of this file `Assert<false>` and stop the build. The
|
|
87
|
+
* rename is the cheap half of keeping this input type incapable of carrying
|
|
88
|
+
* content.
|
|
89
|
+
*/
|
|
90
|
+
export interface RungObservation {
|
|
91
|
+
readonly rung: LadderRung;
|
|
92
|
+
readonly state: Exclude<RungState, 'unknown'>;
|
|
93
|
+
readonly evidence_source: EvidenceSource;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface ReceiptBuild {
|
|
97
|
+
readonly receipt: ActivationReceipt | null;
|
|
98
|
+
readonly errors: readonly string[];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Build a receipt from observations.
|
|
103
|
+
*
|
|
104
|
+
* TB-2 in one line: the output's `rungs` map has exactly the keys the caller
|
|
105
|
+
* observed. Nothing is defaulted, nothing is filled in, and a rung nobody looked
|
|
106
|
+
* at is absent — which `rungState` reads as `unknown` and `ladderRate` keeps out
|
|
107
|
+
* of its denominator.
|
|
108
|
+
*
|
|
109
|
+
* TB-3 in the refusals: an unadmitted source, or an admitted source speaking
|
|
110
|
+
* about a rung that is not its own, is an ERROR and yields no receipt. It is
|
|
111
|
+
* not a warning and it is not silently dropped, because a receipt missing a rung
|
|
112
|
+
* is indistinguishable from a receipt whose rung was refused, and only one of
|
|
113
|
+
* those is honest.
|
|
114
|
+
*/
|
|
115
|
+
export function buildActivationReceipt(
|
|
116
|
+
artefact: string,
|
|
117
|
+
observations: readonly RungObservation[],
|
|
118
|
+
reason?: PrecedenceReason,
|
|
119
|
+
): ReceiptBuild {
|
|
120
|
+
const errors: string[] = [];
|
|
121
|
+
if (!artefact) errors.push('artefact id is required');
|
|
122
|
+
|
|
123
|
+
const rungs: Partial<Record<LadderRung, RungState>> = {};
|
|
124
|
+
for (const o of observations) {
|
|
125
|
+
if (!(EVIDENCE_SOURCES as readonly string[]).includes(o.evidence_source)) {
|
|
126
|
+
errors.push(`evidence_source '${o.evidence_source}' is not admitted (TB-3)`);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (SOURCE_RUNG[o.evidence_source] !== o.rung) {
|
|
130
|
+
errors.push(
|
|
131
|
+
`evidence_source '${o.evidence_source}' may only observe rung ` +
|
|
132
|
+
`'${SOURCE_RUNG[o.evidence_source]}', not '${o.rung}' (TB-3)`,
|
|
133
|
+
);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (rungs[o.rung] !== undefined && rungs[o.rung] !== o.state) {
|
|
137
|
+
errors.push(`rung '${o.rung}' observed twice with conflicting states`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
rungs[o.rung] = o.state;
|
|
141
|
+
}
|
|
142
|
+
if (errors.length > 0) return { receipt: null, errors };
|
|
143
|
+
|
|
144
|
+
const receipt: ActivationReceipt = reason === undefined
|
|
145
|
+
? { artefact, rungs }
|
|
146
|
+
: { artefact, rungs, reason };
|
|
147
|
+
return { receipt, errors: [] };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// --- observers ---------------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Observe the `projected` rung: does a host tree carry a file for this artefact?
|
|
154
|
+
*
|
|
155
|
+
* EC-3 is the reason this returns `undefined` rather than probing further when
|
|
156
|
+
* the host root itself is missing. A host tree that does not exist is not
|
|
157
|
+
* evidence that the artefact was not projected into it — it is the absence of a
|
|
158
|
+
* place to look, and the honest output of a missing observation is nothing at
|
|
159
|
+
* all. Escalating from "read a path" to "go find the tree" is the unbounded-cost
|
|
160
|
+
* mistake EC-3 names, and it is the one a reader would forgive.
|
|
161
|
+
*/
|
|
162
|
+
export function observeProjection(
|
|
163
|
+
hostRoot: string,
|
|
164
|
+
artefactRelPath: string,
|
|
165
|
+
): RungObservation | undefined {
|
|
166
|
+
if (!existsQuiet(hostRoot)) return undefined;
|
|
167
|
+
return {
|
|
168
|
+
rung: 'projected',
|
|
169
|
+
state: existsQuiet(path.join(hostRoot, artefactRelPath)) ? 'reached' : 'not-reached',
|
|
170
|
+
evidence_source: 'host-projection',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Observe the `eligible` rung: is the artefact authored in the source tree?
|
|
176
|
+
*
|
|
177
|
+
* Same absence rule as {@link observeProjection}: an unreadable source root
|
|
178
|
+
* yields no observation rather than a negative one.
|
|
179
|
+
*/
|
|
180
|
+
export function observeSourceTree(
|
|
181
|
+
sourceRoot: string,
|
|
182
|
+
artefactRelPath: string,
|
|
183
|
+
): RungObservation | undefined {
|
|
184
|
+
if (!existsQuiet(sourceRoot)) return undefined;
|
|
185
|
+
return {
|
|
186
|
+
rung: 'eligible',
|
|
187
|
+
state: existsQuiet(path.join(sourceRoot, artefactRelPath)) ? 'reached' : 'not-reached',
|
|
188
|
+
evidence_source: 'source-tree',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Observe the `selected` rung from an already-loaded discovery-manifest id set.
|
|
194
|
+
*
|
|
195
|
+
* Takes the id set rather than a path: loading and parsing the manifest is the
|
|
196
|
+
* caller's, so this stays a pure predicate and EC-1's "no I/O beyond a read"
|
|
197
|
+
* holds trivially for it. An EMPTY set is treated as no manifest — not as a
|
|
198
|
+
* manifest that selected nothing — because those are different observations and
|
|
199
|
+
* folding them is exactly TB-2's failure.
|
|
200
|
+
*/
|
|
201
|
+
export function observeSelection(
|
|
202
|
+
selectedIds: ReadonlySet<string>,
|
|
203
|
+
artefactId: string,
|
|
204
|
+
): RungObservation | undefined {
|
|
205
|
+
if (selectedIds.size === 0) return undefined;
|
|
206
|
+
return {
|
|
207
|
+
rung: 'selected',
|
|
208
|
+
state: selectedIds.has(artefactId) ? 'reached' : 'not-reached',
|
|
209
|
+
evidence_source: 'discovery-manifest',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function existsQuiet(p: string): boolean {
|
|
214
|
+
try {
|
|
215
|
+
fs.statSync(p);
|
|
216
|
+
return true;
|
|
217
|
+
} catch {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// --- the audit line ----------------------------------------------------------
|
|
223
|
+
|
|
224
|
+
/** What THIS producer's lines carry: an artefact id, enums, and counts. */
|
|
225
|
+
const PRODUCER_PRIVACY_CLASS: PrivacyClass = 'ids-only';
|
|
226
|
+
|
|
227
|
+
export interface ActivationLineInput {
|
|
228
|
+
/** The artefact the receipt is about. An id, never a path. */
|
|
229
|
+
artefact: string;
|
|
230
|
+
/** The rungs actually observed. Absent rungs stay absent (TB-2). */
|
|
231
|
+
rungs: Readonly<Partial<Record<LadderRung, RungState>>>;
|
|
232
|
+
/**
|
|
233
|
+
* The precedence reason, when there is one.
|
|
234
|
+
*
|
|
235
|
+
* Named `precedence_reason` and NOT `reason`, which is a `FREE_FORM_KEYS`
|
|
236
|
+
* member: a field called `reason` on this type makes the assertion at the
|
|
237
|
+
* bottom of this file `Assert<false>` and stops the build, even though the
|
|
238
|
+
* value it would hold is a closed six-value enum. The emitted JSON key is
|
|
239
|
+
* still `reason`, because that is `ActivationReceipt`'s field name and the
|
|
240
|
+
* ladder module owns the receipt shape. The rename buys the compile-time
|
|
241
|
+
* floor at the cost of one line of mapping, which is the right trade: a
|
|
242
|
+
* guard that only rejects genuinely dangerous names is a guard someone has
|
|
243
|
+
* to keep tuning.
|
|
244
|
+
*/
|
|
245
|
+
precedence_reason?: PrecedenceReason | undefined;
|
|
246
|
+
/** ISO-8601 UTC; the caller supplies it so this stays pure. */
|
|
247
|
+
ts: string;
|
|
248
|
+
/** ULID, UUID or content hash; the caller supplies it. */
|
|
249
|
+
id: string;
|
|
250
|
+
work_id?: string | undefined;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export interface BuiltActivationLine {
|
|
254
|
+
line: Record<string, unknown> | null;
|
|
255
|
+
errors: string[];
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Build ONE audit-log-v1 line carrying an `activation` object.
|
|
260
|
+
*
|
|
261
|
+
* Deliberately the same envelope as `_lib/review_skipped_record.ts` — same
|
|
262
|
+
* mandatory fields, same `{line, errors}` contract, same refusal to return a
|
|
263
|
+
* half-built line. `skills_applied` is omitted for the same reason it is there:
|
|
264
|
+
* this producer has no skill observation to offer, and `[]` would assert one.
|
|
265
|
+
*/
|
|
266
|
+
export function buildActivationLine(input: ActivationLineInput): BuiltActivationLine {
|
|
267
|
+
const errors: string[] = [];
|
|
268
|
+
if (!input.artefact) errors.push('artefact is required');
|
|
269
|
+
if (!input.ts) errors.push('ts (ISO-8601 UTC) is required');
|
|
270
|
+
if (!input.id) errors.push('id (ULID, UUID, or content hash) is required');
|
|
271
|
+
const observed = Object.keys(input.rungs);
|
|
272
|
+
if (observed.length === 0) {
|
|
273
|
+
// A receipt that observed nothing is not a receipt. Writing one would
|
|
274
|
+
// add a line to an append-only ledger that carries no evidence and
|
|
275
|
+
// still counts as a record — the shape a later reader mistakes for
|
|
276
|
+
// coverage.
|
|
277
|
+
errors.push('a receipt must carry at least one observed rung');
|
|
278
|
+
}
|
|
279
|
+
for (const r of observed) {
|
|
280
|
+
if (!(LADDER_RUNGS as readonly string[]).includes(r)) {
|
|
281
|
+
errors.push(`'${r}' is not a ladder rung`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (errors.length) return { line: null, errors };
|
|
285
|
+
|
|
286
|
+
const activation: Record<string, unknown> = { artefact: input.artefact, rungs: { ...input.rungs } };
|
|
287
|
+
if (input.precedence_reason !== undefined) activation['reason'] = input.precedence_reason;
|
|
288
|
+
|
|
289
|
+
const line: Record<string, unknown> = {
|
|
290
|
+
schema_version: 1,
|
|
291
|
+
id: input.id,
|
|
292
|
+
ts: input.ts,
|
|
293
|
+
work_id: input.work_id ?? `activation-${input.ts}`,
|
|
294
|
+
phase: 'report',
|
|
295
|
+
outcome: 'success',
|
|
296
|
+
confidence_band: 'high',
|
|
297
|
+
risk_class: 'low',
|
|
298
|
+
memory: { asks: 0, hits: 0 },
|
|
299
|
+
verify: { claims: 0, first_try_passes: 0 },
|
|
300
|
+
rules_applied: [],
|
|
301
|
+
privacy_class: PRODUCER_PRIVACY_CLASS,
|
|
302
|
+
persona: null,
|
|
303
|
+
input_kind: 'prompt',
|
|
304
|
+
type: 'note',
|
|
305
|
+
activation,
|
|
306
|
+
};
|
|
307
|
+
return { line, errors: [] };
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Append ONE line to the monthly audit log (TB-4).
|
|
312
|
+
*
|
|
313
|
+
* `appendFileSync` and nothing else: no read-modify-write, no truncation, no
|
|
314
|
+
* seek. Returns the file it wrote so a caller can assert the write happened
|
|
315
|
+
* rather than trusting that it did.
|
|
316
|
+
*/
|
|
317
|
+
export function appendActivationLine(
|
|
318
|
+
workspaceRoot: string,
|
|
319
|
+
line: Record<string, unknown>,
|
|
320
|
+
ts: string,
|
|
321
|
+
): string {
|
|
322
|
+
const dir = path.join(workspaceRoot, 'agents', 'runtime', 'state', 'audit');
|
|
323
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
324
|
+
const file = path.join(dir, `${ts.slice(0, 7)}.jsonl`);
|
|
325
|
+
fs.appendFileSync(file, `${JSON.stringify(line)}\n`, 'utf8');
|
|
326
|
+
return file;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* The privacy floor, by construction, on this producer's input type.
|
|
331
|
+
*
|
|
332
|
+
* Same mechanism as the two producers `docs/contracts/audit-log-v1.md`
|
|
333
|
+
* § Privacy floor already names. Adding a `path`, `detail`, `reason_text` or
|
|
334
|
+
* any other `FREE_FORM_KEYS` member below makes this `Assert<false>` and stops
|
|
335
|
+
* the build. `reason` is one of them, which is why the precedence field is
|
|
336
|
+
* called `precedence_reason` here and mapped to `reason` on the way out — see
|
|
337
|
+
* the field's own note.
|
|
338
|
+
*/
|
|
339
|
+
type _ActivationLineInputCarriesNoFreeFormField = Assert<
|
|
340
|
+
[NoFreeForm<ActivationLineInput>] extends [never] ? false : true
|
|
341
|
+
>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The five states a per-asset outcome can occupy, and why three would not do.
|
|
3
|
+
*
|
|
4
|
+
* A per-asset "win rate" computed over two states — worked / did not work —
|
|
5
|
+
* is uninterpretable, and the failure is not cosmetic. Take a skill whose
|
|
6
|
+
* content is excellent and which the router never activates. Its success rate
|
|
7
|
+
* is low. Every fix that number suggests is a change to the skill, and every
|
|
8
|
+
* one of them would improve nothing, because the skill was never reached. The
|
|
9
|
+
* split below is what makes the number point at the right layer.
|
|
10
|
+
*
|
|
11
|
+
* Three rungs are observed independently:
|
|
12
|
+
*
|
|
13
|
+
* available -> was the asset present in this install at all?
|
|
14
|
+
* activated -> did the router/agent actually load it for this task?
|
|
15
|
+
* followed -> did the work that followed conform to what it said?
|
|
16
|
+
*
|
|
17
|
+
* Each rung is `true`, `false`, or `null` for "not observed". `null` is not a
|
|
18
|
+
* pessimistic `false`: an unobserved rung means the instrument did not see,
|
|
19
|
+
* which is a statement about the instrument. Collapsing it into either
|
|
20
|
+
* direction manufactures a signal, so `classify` returns `'unknown'` the moment
|
|
21
|
+
* any rung it would need is unobserved.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** Ordered from least to most engaged. `unknown` is not on that ladder. */
|
|
25
|
+
export const ACTIVATION_STATES = [
|
|
26
|
+
/** The asset is not present in this install. Nothing about its quality follows. */
|
|
27
|
+
'not-available',
|
|
28
|
+
/** Present, and the router never loaded it. A content fix cannot help this case. */
|
|
29
|
+
'available-not-activated',
|
|
30
|
+
/** Loaded, and the work did not conform to it. This is the case a content or clarity fix addresses. */
|
|
31
|
+
'activated-not-followed',
|
|
32
|
+
/** Loaded and conformed to. The only state that may count toward a win rate. */
|
|
33
|
+
'activated-followed',
|
|
34
|
+
/**
|
|
35
|
+
* At least one rung was not observed. Reported as its own share, never
|
|
36
|
+
* folded into a success or a failure — a report that hides its own blind
|
|
37
|
+
* spot is worse than one that has none, because the reader cannot see the
|
|
38
|
+
* hole.
|
|
39
|
+
*/
|
|
40
|
+
'unknown',
|
|
41
|
+
] as const;
|
|
42
|
+
|
|
43
|
+
export type ActivationState = (typeof ACTIVATION_STATES)[number];
|
|
44
|
+
|
|
45
|
+
export function isActivationState(v: unknown): v is ActivationState {
|
|
46
|
+
return typeof v === 'string' && (ACTIVATION_STATES as readonly string[]).includes(v);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** One observation per rung. `null` means "not observed", never "no". */
|
|
50
|
+
export interface ActivationObservation {
|
|
51
|
+
available: boolean | null;
|
|
52
|
+
activated: boolean | null;
|
|
53
|
+
followed: boolean | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Classify one observation.
|
|
58
|
+
*
|
|
59
|
+
* The short-circuits are deliberate and are the reason this is a function
|
|
60
|
+
* rather than a lookup table: once `available` is observed `false`, the other
|
|
61
|
+
* two rungs are IRRELEVANT rather than unknown — an absent asset cannot have
|
|
62
|
+
* been activated — so an unobserved `followed` must not drag the answer to
|
|
63
|
+
* `'unknown'`. The same holds one rung down for `activated: false`.
|
|
64
|
+
*
|
|
65
|
+
* Everywhere else an unobserved rung wins, because the alternative is to invent
|
|
66
|
+
* the observation.
|
|
67
|
+
*/
|
|
68
|
+
export function classify(obs: ActivationObservation): ActivationState {
|
|
69
|
+
if (obs.available === null) return 'unknown';
|
|
70
|
+
if (obs.available === false) return 'not-available';
|
|
71
|
+
|
|
72
|
+
if (obs.activated === null) return 'unknown';
|
|
73
|
+
if (obs.activated === false) return 'available-not-activated';
|
|
74
|
+
|
|
75
|
+
if (obs.followed === null) return 'unknown';
|
|
76
|
+
return obs.followed ? 'activated-followed' : 'activated-not-followed';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* True for the states that may enter a win-rate denominator.
|
|
81
|
+
*
|
|
82
|
+
* `unknown` is excluded because it is not an outcome, and `not-available` is
|
|
83
|
+
* excluded because it is not a fact about the asset's quality. Exported so a
|
|
84
|
+
* report cannot quietly choose a different denominator per column.
|
|
85
|
+
*/
|
|
86
|
+
export function countsTowardWinRate(state: ActivationState): boolean {
|
|
87
|
+
return state === 'activated-followed' || state === 'activated-not-followed';
|
|
88
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic adherence detection, and a hard refusal to guess.
|
|
3
|
+
*
|
|
4
|
+
* Step 5.1 splits a per-asset outcome into five states. The hardest of its
|
|
5
|
+
* rungs to observe is `followed`: whether the work actually conformed to the
|
|
6
|
+
* rule that was loaded. It is tempting to have a model read the transcript and
|
|
7
|
+
* say. That is precisely what this module refuses to do.
|
|
8
|
+
*
|
|
9
|
+
* The rule, from step 5.2: where a rule has an OBSERVABLE FOOTPRINT, adherence
|
|
10
|
+
* is computed from that footprint. Where it has none, adherence is `unknown` —
|
|
11
|
+
* never inferred, never a model's guess. An inferred adherence figure is worse
|
|
12
|
+
* than a missing one, because a missing one is visible in the `unknown` share
|
|
13
|
+
* and an inferred one is not.
|
|
14
|
+
*
|
|
15
|
+
* A DETECTOR ANSWERS FOR ONE CLAUSE, NOT FOR A RULE. Rules in this tree carry
|
|
16
|
+
* many clauses; `think-before-action` alone spans a read set, a verification
|
|
17
|
+
* matrix, and a test-first preference. A detector that observed one clause and
|
|
18
|
+
* reported "rule followed" would be overclaiming by construction, so every
|
|
19
|
+
* registration below names the clause it decides and the registry key is the
|
|
20
|
+
* pair, not the rule id.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type { ActivationState } from './activation_states.js';
|
|
24
|
+
|
|
25
|
+
/** The subset of {@link ActivationState} a detector may return. */
|
|
26
|
+
export type Adherence = Extract<
|
|
27
|
+
ActivationState,
|
|
28
|
+
'activated-followed' | 'activated-not-followed' | 'unknown'
|
|
29
|
+
>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* One observed write, reduced to the two things a detector may see: where it
|
|
33
|
+
* went, and in what order relative to the others.
|
|
34
|
+
*
|
|
35
|
+
* Deliberately carries NO content field — a detector that could read a diff
|
|
36
|
+
* body would be a second place for file contents to travel, and the audit
|
|
37
|
+
* privacy floor exists to stop exactly that.
|
|
38
|
+
*/
|
|
39
|
+
export interface WriteObservation {
|
|
40
|
+
/** Repository-relative path. */
|
|
41
|
+
path: string;
|
|
42
|
+
/** Monotonic ordering key within one task. Absolute time is not required. */
|
|
43
|
+
seq: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface DetectorInput {
|
|
47
|
+
writes: readonly WriteObservation[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ClauseDetector {
|
|
51
|
+
/** The rule whose clause this decides. */
|
|
52
|
+
rule_id: string;
|
|
53
|
+
/** Which clause — a rule has many, and a detector answers for one. */
|
|
54
|
+
clause: string;
|
|
55
|
+
/** Where that clause is written, so a reader can check the detector against it. */
|
|
56
|
+
source: string;
|
|
57
|
+
detect(input: DetectorInput): Adherence;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** A path is a test path when it sits under a `tests/` segment or is named `*.test.*` / `*.spec.*`. */
|
|
61
|
+
export function isTestPath(p: string): boolean {
|
|
62
|
+
const normalized = p.replace(/\\/g, '/');
|
|
63
|
+
if (/(^|\/)tests?(\/|$)/.test(normalized)) return true;
|
|
64
|
+
return /\.(test|spec)\.[cm]?[jt]sx?$/.test(normalized);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* `think-before-action` § "When behavior can be defined → prefer test-first /
|
|
69
|
+
* TDD" (`dist/agent-src/rules/think-before-action.md:43`).
|
|
70
|
+
*
|
|
71
|
+
* The footprint is write ORDER: a test file written before the production file
|
|
72
|
+
* it covers is test-first; the reverse is not.
|
|
73
|
+
*
|
|
74
|
+
* The `unknown` branch is the load-bearing one and is wider than it first
|
|
75
|
+
* looks. If only test writes are observed, no production change happened and
|
|
76
|
+
* the clause did not apply. If only production writes are observed, it is
|
|
77
|
+
* tempting to answer `activated-not-followed` — and that would be a GUESS: the
|
|
78
|
+
* test may have been written in an earlier task, or the change may be one the
|
|
79
|
+
* clause's own "when behavior can be defined" qualifier excludes. Both
|
|
80
|
+
* one-sided cases are therefore `unknown`, which is the honest answer and the
|
|
81
|
+
* conservative one in the direction that matters — it never manufactures a
|
|
82
|
+
* violation.
|
|
83
|
+
*/
|
|
84
|
+
export const testFirstDetector: ClauseDetector = {
|
|
85
|
+
rule_id: 'think-before-action',
|
|
86
|
+
clause: 'prefer test-first / TDD when behavior can be defined',
|
|
87
|
+
source: 'dist/agent-src/rules/think-before-action.md:43',
|
|
88
|
+
detect({ writes }) {
|
|
89
|
+
let firstTest: number | null = null;
|
|
90
|
+
let firstProd: number | null = null;
|
|
91
|
+
for (const w of writes) {
|
|
92
|
+
if (isTestPath(w.path)) {
|
|
93
|
+
if (firstTest === null || w.seq < firstTest) firstTest = w.seq;
|
|
94
|
+
} else if (firstProd === null || w.seq < firstProd) {
|
|
95
|
+
firstProd = w.seq;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Either side missing means the order was never observed, not that it
|
|
99
|
+
// was violated. See the note above on why the production-only case is
|
|
100
|
+
// deliberately NOT a violation.
|
|
101
|
+
if (firstTest === null || firstProd === null) return 'unknown';
|
|
102
|
+
return firstTest < firstProd ? 'activated-followed' : 'activated-not-followed';
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The registry. Keyed `${rule_id}#${clause}` so one rule may gain a second
|
|
108
|
+
* detector later without either silently replacing the other.
|
|
109
|
+
*/
|
|
110
|
+
const DETECTORS: readonly ClauseDetector[] = [testFirstDetector];
|
|
111
|
+
|
|
112
|
+
export function detectorsFor(ruleId: string): readonly ClauseDetector[] {
|
|
113
|
+
return DETECTORS.filter((d) => d.rule_id === ruleId);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Adherence for one rule.
|
|
118
|
+
*
|
|
119
|
+
* A rule with NO registered detector returns `unknown`. That is the whole
|
|
120
|
+
* point: 118 of this tree's 119 rules have no observable footprint today, and
|
|
121
|
+
* the honest report says so rather than filling the column with inference.
|
|
122
|
+
*
|
|
123
|
+
* With several detectors registered for one rule, a single observed violation
|
|
124
|
+
* wins over a `followed` — a rule is not adhered to if any decided clause was
|
|
125
|
+
* broken — and `unknown` only survives when nothing was decided at all.
|
|
126
|
+
*/
|
|
127
|
+
export function detectAdherence(ruleId: string, input: DetectorInput): Adherence {
|
|
128
|
+
const detectors = detectorsFor(ruleId);
|
|
129
|
+
if (detectors.length === 0) return 'unknown';
|
|
130
|
+
|
|
131
|
+
let sawFollowed = false;
|
|
132
|
+
for (const d of detectors) {
|
|
133
|
+
const verdict = d.detect(input);
|
|
134
|
+
if (verdict === 'activated-not-followed') return 'activated-not-followed';
|
|
135
|
+
if (verdict === 'activated-followed') sawFollowed = true;
|
|
136
|
+
}
|
|
137
|
+
return sawFollowed ? 'activated-followed' : 'unknown';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Rule ids that have at least one detector. Everything else reports `unknown`. */
|
|
141
|
+
export function rulesWithDetectors(): readonly string[] {
|
|
142
|
+
return [...new Set(DETECTORS.map((d) => d.rule_id))];
|
|
143
|
+
}
|
|
@@ -308,6 +308,32 @@ export type EvidenceStrength = (typeof EVIDENCE_STRENGTHS)[number];
|
|
|
308
308
|
|
|
309
309
|
export const DISCOVERY_STATES = ['complete', 'incomplete'] as const;
|
|
310
310
|
export const AUTHORITY_BASES = ['evidence', 'owner_intent'] as const;
|
|
311
|
+
export type AuthorityBasis = (typeof AUTHORITY_BASES)[number];
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Reopen-authority vocabulary (`adr-layout.md` § Reopen authority).
|
|
315
|
+
*
|
|
316
|
+
* Moved here from `check_adr_frontmatter.ts` on 2026-08-31 so the ADR gate and
|
|
317
|
+
* `road-to-harness-promotion-bridge` step 7.2 read ONE list. 7.2's whole
|
|
318
|
+
* requirement is "route through the existing gate, not a second governance
|
|
319
|
+
* system"; importing the validator's private constant was not available, and
|
|
320
|
+
* copying it would have created the second system the step forbids.
|
|
321
|
+
*
|
|
322
|
+
* Both fields stay OPTIONAL at the ADR reader — an absent `reopen_policy`
|
|
323
|
+
* resolves to `unclassified`, never to `owner`.
|
|
324
|
+
*/
|
|
325
|
+
export const REOPEN_POLICIES = ['directional', 'owner', 'unclassified'] as const;
|
|
326
|
+
export type ReopenPolicy = (typeof REOPEN_POLICIES)[number];
|
|
327
|
+
|
|
328
|
+
export const PROTECTED_DIMENSIONS = [
|
|
329
|
+
'purpose',
|
|
330
|
+
'security_floor',
|
|
331
|
+
'privacy_floor',
|
|
332
|
+
'external_commitment',
|
|
333
|
+
'governance',
|
|
334
|
+
'none',
|
|
335
|
+
] as const;
|
|
336
|
+
export type ProtectedDimension = (typeof PROTECTED_DIMENSIONS)[number];
|
|
311
337
|
|
|
312
338
|
export interface AdrProvenance {
|
|
313
339
|
kind: string | null;
|