@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
|
@@ -67,8 +67,9 @@
|
|
|
67
67
|
"\\bcodeguard\\b",
|
|
68
68
|
"\\bcosai\\b"
|
|
69
69
|
],
|
|
70
|
+
"_deny_digests_README": "DORMANT (road-to-source-silence Phase 1.1). HMAC-SHA256 digests of the deny set, derived from the gitignored private master by src/scripts/build_source_digests.ts. It is EMPTY on purpose: the plaintext `deny` array above stays in force and is not deleted. Provisioning the CI secret SOURCE_DENY_KEY, generating production digests, removing the plaintext array and switching CI to strict mode are ONE ATOMIC MAINTAINER CHANGE (AI council 2026-08-28, blocker `where-the-key-lives`, 2/2) — splitting them leaves the gate either failing every run for want of a key or silently degraded to warn mode, which is the failure this whole programme exists to remove. Recipe: docs/maintainers/source-deny-digests.md",
|
|
71
|
+
"deny_digests": [],
|
|
70
72
|
"skip_paths": [
|
|
71
|
-
"src/scripts/check_no_external_sources.py",
|
|
72
73
|
"src/scripts/check_no_external_sources.ts",
|
|
73
74
|
"src/scripts/external_sources_denylist.json",
|
|
74
75
|
"src/skills/design-intelligence/*",
|
|
@@ -76,8 +77,6 @@
|
|
|
76
77
|
"src/skills/design-tokens/*",
|
|
77
78
|
"src/skills/react-shadcn-ui/*",
|
|
78
79
|
"src/skills/tailwind-engineer/*",
|
|
79
|
-
"src/scripts/cost/*",
|
|
80
|
-
"src/scripts/validate_safe_paths.py",
|
|
81
80
|
"dist/agent-src/skills/design-intelligence/*",
|
|
82
81
|
"dist/agent-src/skills/corpus-grounding/*",
|
|
83
82
|
"dist/agent-src/skills/design-tokens/*",
|
|
@@ -88,31 +87,19 @@
|
|
|
88
87
|
"docs/mcp.md",
|
|
89
88
|
"docs/mcp-registries.md",
|
|
90
89
|
"docs/DISTRIBUTION_CHECKLIST.md",
|
|
91
|
-
"src/templates/marketing-copy.yml",
|
|
92
90
|
"internal/workers/mcp/content.json",
|
|
93
|
-
"internal/workers/mcp/content.json.gz",
|
|
94
|
-
"internal/workers/mcp/manifest.json",
|
|
95
|
-
"src/rules/source-confidentiality.md",
|
|
96
|
-
"dist/agent-src/rules/source-confidentiality.md",
|
|
97
|
-
"agents/roadmaps/archive/road-to-final-state-and-market-readiness.md",
|
|
98
|
-
"agents/roadmaps/archive/road-to-image-brand-typography.md",
|
|
99
|
-
"agents/roadmaps/archive/road-to-subagent-value-realization.md",
|
|
100
|
-
"agents/roadmap-assets/road-to-image-brand-typography.assets.md",
|
|
101
91
|
"CREDITS.md",
|
|
102
|
-
"agents/roadmaps/archive/road-to-ecosystem-harvest-index.md",
|
|
103
92
|
"provenance/borrows.jsonl",
|
|
104
|
-
"docs/THIRD-PARTY-NOTICES.md"
|
|
105
|
-
"agents/evidence/reviews/*.review-input/diff.patch"
|
|
93
|
+
"docs/THIRD-PARTY-NOTICES.md"
|
|
106
94
|
],
|
|
107
95
|
"skip_reason": {
|
|
108
96
|
"vendored_cluster": "design-intelligence/corpus-grounding/design-tokens/react-shadcn-ui/tailwind-engineer + cost/*.mjs ship vendored Apache/MIT code; their upstream attribution is license-required and must NOT be stripped (ADR-061). CREDITS.md is the repo-level attribution file FOR that same cluster — it names the upstreams because the licenses require it, which is the one case source-confidentiality explicitly exempts. It was missing here, so the gate flagged the very attribution the rule mandates.",
|
|
109
97
|
"recommendation_docs": "mcp.md, mcp-registries.md, DISTRIBUTION_CHECKLIST.md, ADR-086, marketing-copy.yml reference registries (Smithery/Glama) as recommendations/distribution targets — allowed.",
|
|
110
98
|
"generated_bundles": "content.json* bundle the vendored-cluster skill bodies above.",
|
|
111
99
|
"self": "the linter + its denylist + the source-confidentiality rule necessarily contain the deny tokens as data.",
|
|
112
|
-
"validate_safe_paths": "telegraph-derived (MIT) ported code; upstream attribution is license-required.",
|
|
113
|
-
"archived_roadmaps_newly_tracked": "Archived roadmaps (and their assets) that predate the source-confidentiality sweep became tracked via the 2026-07 agents-dir gitignore hygiene change. They are frozen historical records; the claudekit mentions are ADR-061 license-attribution work and the remaining names are historical planning references. New roadmaps stay subject to the gate. road-to-ecosystem-harvest-index.md is the sharpest case: the flagged line is its own acceptance criterion, 'No harvest-family artifact names a real external source' — it quotes the names in order to assert their absence, so the gate fires on the sentence that records the cleanup. road-to-opt-retrieval-and-memory.md was REMOVED from this list on 2026-07-28 (road-to-native-code-intelligence Phase 6): its two clear-text mentions named a gitignored borrow-catalogue inbox file, which carries no historical value that a neutral descriptor loses — so the mentions were rewritten and the exception retired rather than kept. Retiring an exception is preferred over holding one whenever the named token is not license-required attribution and not load-bearing for the record.",
|
|
114
100
|
"provenance_ledger": "provenance/borrows.jsonl and the docs/THIRD-PARTY-NOTICES.md it generates are the license-attribution surfaces for CODE borrows, and code-provenance REQUIRES the upstream name in them: the ledger's `source_url` is a mandatory field (provenance/README.md), and lint_provenance fails when the notices file drifts from it. That is the same license-required-attribution case source-confidentiality already exempts for the vendored cluster and CREDITS.md — the rule forbids derivation-attribution, not the notice a license obliges. The collision only surfaced on 2026-08-13 because the ledger had been empty until its first record; before that there was no name to flag. Scope is deliberately these two paths and not `provenance/*`: the harvest ledger next door governs KNOWLEDGE claims, where anonymisation is the rule and no license compels a name.",
|
|
115
|
-
"
|
|
101
|
+
"_dead_entries_removed_2026_08_28": "road-to-source-silence Phase 2.3, first drawdown. Three skip_paths named files that no longer exist and were therefore exempting nothing: src/scripts/check_no_external_sources.py and src/scripts/validate_safe_paths.py (both retired in the ADR-200 Python teardown) and internal/workers/mcp/content.json.gz (a .gz, which the extension skip-list already covers). The roadmap's measurement named ONE dead entry; re-checked at execution there were three. The `validate_safe_paths` reason key went with its path. Removing a dead exemption is pure shrink -- it cannot loosen the gate, and check_suppression_hygiene forbids growth in the other direction.",
|
|
102
|
+
"_entries_removed_2026_08_29": "road-to-source-silence Phases 2.1/2.3/3.4 drew skip_paths from 32 to 22. TEN entries went, and the arithmetic is stated so it can be checked: three DEAD (suppressed zero hits, measured per entry by removal and re-scan), five archived roadmaps plus ONE roadmap-asset file REDACTED in place under ADR-250 (dated markers, mechanical word-diff audit, 0 unexplained changes) = six, one comment rephrased generically, and the review-snapshot diff.patch carve-out replaced by earned per-finding deduplication in _lib/source_snapshot_dedup.ts. 3 + 6 + 1 + 1 = 10, and 32 - 10 = 22. An earlier version of this note said \"Eleven entries went\" by counting the roadmap-asset file separately from the five archived roadmaps AND in the six; the published ledger was right and this sentence was wrong. Full 32-entry ledger with per-entry suppressed-hit counts and dispositions: agents/evidence/reports/source-skip-paths-ledger.md."
|
|
116
103
|
},
|
|
117
104
|
"_excluded_tokens": {
|
|
118
105
|
"agent-os": "collides with our own coined 'Agent-OS primitive' term (universal-skills) — too FP-prone to auto-deny; scrub external 'agent-os' mentions by review.",
|
|
@@ -22,6 +22,8 @@ import * as fs from 'node:fs';
|
|
|
22
22
|
import * as path from 'node:path';
|
|
23
23
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
24
24
|
|
|
25
|
+
import { isPhaseOutcome, PHASE_OUTCOMES } from './_lib/outcome_vocabularies.js';
|
|
26
|
+
|
|
25
27
|
const _HERE = fileURLToPath(import.meta.url);
|
|
26
28
|
// src/scripts/extract_audit_patterns.py → parent.parent.parent == repo root.
|
|
27
29
|
export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
@@ -164,11 +166,22 @@ export function mine(auditDir: string, month: string | null, minCount: number):
|
|
|
164
166
|
const records = _resolveSupersedes([..._iterLines(auditDir, month)]);
|
|
165
167
|
// Preserve insertion order of first-seen keys (Python dict ordering).
|
|
166
168
|
const groups = new Map<string, Pattern>();
|
|
169
|
+
// `outcome` used to be read as a bare `string`, so a typo silently became
|
|
170
|
+
// its own pattern and nothing said so (`road-to-experience-loop-broadening`
|
|
171
|
+
// 1.3; AI council 2026-08-29 named this the consumer-side half). Grouping
|
|
172
|
+
// is UNCHANGED — this file mirrors a retired Python CLI byte-for-byte and
|
|
173
|
+
// dropping a record would change pinned stdout. What changes is that an
|
|
174
|
+
// off-vocabulary value is now observable instead of silent.
|
|
175
|
+
const unknownOutcomes = new Set<string>();
|
|
167
176
|
for (const rec of records) {
|
|
168
177
|
const t = rec.type;
|
|
169
178
|
if (!(t === undefined || t === null || t === 'phase')) {
|
|
170
179
|
continue;
|
|
171
180
|
}
|
|
181
|
+
const rawOutcome = rec.outcome;
|
|
182
|
+
if (rawOutcome !== undefined && rawOutcome !== null && !isPhaseOutcome(rawOutcome)) {
|
|
183
|
+
unknownOutcomes.add(String(rawOutcome));
|
|
184
|
+
}
|
|
172
185
|
const key = _patternKey(rec);
|
|
173
186
|
let pat = groups.get(key);
|
|
174
187
|
if (pat === undefined) {
|
|
@@ -194,6 +207,14 @@ export function mine(auditDir: string, month: string | null, minCount: number):
|
|
|
194
207
|
pat.last_seen = ts;
|
|
195
208
|
}
|
|
196
209
|
}
|
|
210
|
+
if (unknownOutcomes.size > 0) {
|
|
211
|
+
const seen = [...unknownOutcomes].sort().join(', ');
|
|
212
|
+
process.stderr.write(
|
|
213
|
+
`extract_audit_patterns: ${unknownOutcomes.size} off-vocabulary outcome value(s) ` +
|
|
214
|
+
`grouped as-is: ${seen}. Expected one of: ${PHASE_OUTCOMES.join(' | ')} ` +
|
|
215
|
+
`(docs/contracts/audit-log-v1.md, src/scripts/_lib/outcome_vocabularies.ts).\n`,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
197
218
|
const out: Rec[] = [];
|
|
198
219
|
for (const p of groups.values()) {
|
|
199
220
|
if (p.count >= minCount) {
|
|
@@ -16,6 +16,16 @@
|
|
|
16
16
|
* - **Idempotent** — an existing `fold-<id>.md` is skipped, so re-runs are
|
|
17
17
|
* no-ops and interrupted runs resume cleanly.
|
|
18
18
|
*
|
|
19
|
+
* loss_class: recoverable-lossy
|
|
20
|
+
* loss_recovery: the fold page's per-child `<file>:<first-line>-<last-line>` link-backs
|
|
21
|
+
*
|
|
22
|
+
* Named, not changed (`road-to-runtime-context-floors` step 3.1). The fold is
|
|
23
|
+
* smaller than its children and the children are still there, byte-identical,
|
|
24
|
+
* addressable by the link-back range the fold page carries — which is precisely
|
|
25
|
+
* the guarantee `recoverable-lossy` makes and `ephemeral-lossy` does not. The
|
|
26
|
+
* locator is the load-bearing half: without it this class would be
|
|
27
|
+
* indistinguishable from the ephemeral one by anything except intention.
|
|
28
|
+
*
|
|
19
29
|
* MANUAL TRIGGER ONLY (council decision): this script is deliberately NOT
|
|
20
30
|
* wired into hooks or CI. The Phase-0 intake tripwire
|
|
21
31
|
* (`lint_knowledge_scale.ts`, intake > 2000 events) names this script as its
|
|
@@ -36,6 +46,7 @@ import * as fs from 'node:fs';
|
|
|
36
46
|
import * as path from 'node:path';
|
|
37
47
|
import process from 'node:process';
|
|
38
48
|
import { fileURLToPath } from 'node:url';
|
|
49
|
+
import { generatedByQuote } from './_lib/generated_by.js';
|
|
39
50
|
|
|
40
51
|
const PROG = 'fold_intake.ts';
|
|
41
52
|
|
|
@@ -166,7 +177,7 @@ export function renderFold(plan: FoldPlan, batchSize: number): string {
|
|
|
166
177
|
'> Idempotent extractive rollup of a completed intake batch',
|
|
167
178
|
`> (batch ${plan.index}, size ${batchSize}). Children are never mutated —`,
|
|
168
179
|
'> this page is an additive archive with link-backs, not a rewrite.',
|
|
169
|
-
'
|
|
180
|
+
generatedByQuote('fold_intake', '(deterministic, no LLM.)'),
|
|
170
181
|
'',
|
|
171
182
|
`Fold ID: ${plan.id}`,
|
|
172
183
|
`Batch index: ${plan.index}`,
|
|
@@ -192,7 +192,7 @@ export function main(): number {
|
|
|
192
192
|
const out: string[] = [];
|
|
193
193
|
out.push('# Discovery Baseline — Inventory (Phase 0.1)\n');
|
|
194
194
|
out.push(
|
|
195
|
-
'> Generated by `
|
|
195
|
+
'> Generated by `gen_discovery_baseline`. Do not edit. Stamped ' + `${_utcStamp()}.\n`,
|
|
196
196
|
);
|
|
197
197
|
out.push(
|
|
198
198
|
'> Frozen reference for the Phase 2 scanner — the `no domain` tally below must match the\n' +
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Generate `CAPABILITIES.yaml` — the package's capability-coverage index.
|
|
4
4
|
*
|
|
5
|
-
* Ported from the retired Python `
|
|
5
|
+
* Ported from the retired Python `generate_capabilities_index` (ADR-200).
|
|
6
6
|
* The CLI contract is pinned — the `--check` flag, exit codes
|
|
7
7
|
* (0 / 1 / 2), stdout/stderr split, and the byte-identical generated
|
|
8
8
|
* `CAPABILITIES.yaml` (header comment block, `meta:` block, `capability_areas:`
|
|
@@ -44,11 +44,18 @@ import { parse as parseYaml } from 'yaml';
|
|
|
44
44
|
|
|
45
45
|
import { iter_commands } from './_lib/agent_src.js';
|
|
46
46
|
import { parse_frontmatter } from './validate_frontmatter.js';
|
|
47
|
+
import { resolveRepoRoot } from './_lib/repo_root.js';
|
|
47
48
|
|
|
48
49
|
const _HERE = fileURLToPath(import.meta.url);
|
|
49
50
|
|
|
50
|
-
//
|
|
51
|
-
|
|
51
|
+
// generate_capabilities_index → parents[2] is repo root.
|
|
52
|
+
// Root resolution goes through the sentinel resolver rather than a bare `..`
|
|
53
|
+
// walk: `path.resolve(dirname, '..', '..')` is correct until this file moves,
|
|
54
|
+
// and then it addresses a parent directory that also exists — the generator
|
|
55
|
+
// writes nothing, reports success, and nothing fails. `resolveRepoRoot` REFUSES
|
|
56
|
+
// when no directory on the walk carries this package's `package.json`
|
|
57
|
+
// (road-to-skill-ecosystem-runtime-enforcement Phase 2 Step 6).
|
|
58
|
+
const ROOT = resolveRepoRoot(path.dirname(_HERE));
|
|
52
59
|
const OUT = path.join(ROOT, 'CAPABILITIES.yaml');
|
|
53
60
|
const PACKS_YML = path.join(ROOT, 'src', 'config', 'discovery', 'packs.yml');
|
|
54
61
|
const SKILLS_DIR = path.join(ROOT, 'src', 'skills');
|
|
@@ -358,7 +365,7 @@ export function build(): string {
|
|
|
358
365
|
const lines: string[] = [];
|
|
359
366
|
lines.push('# CAPABILITIES.yaml — what agent-config already covers');
|
|
360
367
|
lines.push('#');
|
|
361
|
-
lines.push('# GENERATED by
|
|
368
|
+
lines.push('# GENERATED by generate_capabilities_index — do NOT hand-edit.');
|
|
362
369
|
lines.push('# Drift-checked in CI (`--check`). Regenerate after adding/removing a');
|
|
363
370
|
lines.push('# skill, command, or capability pack.');
|
|
364
371
|
lines.push('#');
|
|
@@ -367,7 +374,7 @@ export function build(): string {
|
|
|
367
374
|
lines.push('# areas with zero backing skills/commands.');
|
|
368
375
|
lines.push('');
|
|
369
376
|
lines.push('meta:');
|
|
370
|
-
lines.push(' generated_by:
|
|
377
|
+
lines.push(' generated_by: generate_capabilities_index');
|
|
371
378
|
lines.push(
|
|
372
379
|
' purpose: ' + _scalar(
|
|
373
380
|
'Machine-readable coverage index so external reviews stop ' +
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Generate the cross-host capability matrix (road-to-competitive-borrow P1.3).
|
|
4
4
|
*
|
|
5
|
-
* Ported from the retired Python `src/
|
|
5
|
+
* Ported from the retired Python `src/generate_capability_matrix` (ADR-200).
|
|
6
6
|
* The CLI contract is pinned — the `--check` / `--quiet` flags,
|
|
7
7
|
* exit codes (0 / 1 / 2), stdout/stderr split, the byte-identical
|
|
8
8
|
* `docs/capability-matrix.md` (heading prose, the host-header table, the glyph
|
|
@@ -222,7 +222,7 @@ export function render_md(matrix: Record<string, Record<string, string>>): strin
|
|
|
222
222
|
const lines: string[] = [
|
|
223
223
|
'# Capability matrix — what works on which host',
|
|
224
224
|
'',
|
|
225
|
-
'> **Generated** by `
|
|
225
|
+
'> **Generated** by `generate_capability_matrix` — do NOT',
|
|
226
226
|
'> hand-edit. Derived from the `generate_tools()` projection logic in',
|
|
227
227
|
'> `condense.py` (each cell traces to a `generate_*` dispatcher call).',
|
|
228
228
|
'> Drift-checked in CI (`--check`).',
|
|
@@ -318,7 +318,7 @@ function _jsonStringAscii(s: string): string {
|
|
|
318
318
|
export function render_json(matrix: Record<string, Record<string, string>>): string {
|
|
319
319
|
const payload: Record<string, unknown> = {
|
|
320
320
|
schema: 'capability-matrix/1',
|
|
321
|
-
generated_by: '
|
|
321
|
+
generated_by: 'generate_capability_matrix',
|
|
322
322
|
hosts: HOSTS,
|
|
323
323
|
artifacts: ARTIFACTS,
|
|
324
324
|
matrix,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Generate `docs/command-flows.md` — the Flows primary view (road-to-6.1.0 Step 9).
|
|
4
4
|
*
|
|
5
|
-
* Ported from the retired Python `src/
|
|
5
|
+
* Ported from the retired Python `src/generate_command_flows` (ADR-200 —
|
|
6
6
|
* Python→TS migration, Phase 8 / Wave 8a). The CLI contract is mirrored
|
|
7
7
|
* EXACTLY: same flag (`--check`), same exit codes, same stdout/stderr
|
|
8
8
|
* split, same byte-identical generated `docs/command-flows.md`. WRITER —
|
|
@@ -111,7 +111,7 @@ export function render(): string {
|
|
|
111
111
|
const idx = _command_index();
|
|
112
112
|
|
|
113
113
|
const out: string[] = [];
|
|
114
|
-
out.push('<!-- GENERATED by
|
|
114
|
+
out.push('<!-- GENERATED by generate_command_flows — do not edit by hand. -->');
|
|
115
115
|
out.push(
|
|
116
116
|
'<!-- Source: src/flows/surface-map.yaml + src/flows/<flow>.yaml. Re-run: task generate-command-flows. -->',
|
|
117
117
|
);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Generate the named cookbook (road-to-competitive-borrow P1.4).
|
|
4
4
|
*
|
|
5
|
-
* Ported from the retired Python `src/
|
|
5
|
+
* Ported from the retired Python `src/generate_cookbook` (ADR-200). Mirrors the
|
|
6
6
|
* Python CLI contract EXACTLY — the `--check` / `--quiet` flags, exit codes
|
|
7
7
|
* (0 / 1 / 2), stdout/stderr split, and the byte-identical generated
|
|
8
8
|
* `docs/cookbook.md` (heading prose, the named-recipe sections, the four
|
|
@@ -152,7 +152,7 @@ export function render(): string {
|
|
|
152
152
|
const lines: string[] = [
|
|
153
153
|
'# Cookbook — things you can do in a minute',
|
|
154
154
|
'',
|
|
155
|
-
'> **Generated** by `
|
|
155
|
+
'> **Generated** by `generate_cookbook` from ' +
|
|
156
156
|
'`src/flows/cookbook.yaml` + `src/flows/<flow>.yaml` — do NOT hand-edit.',
|
|
157
157
|
'> Every command and skill below is validated to exist at generation ' +
|
|
158
158
|
'time; a recipe naming a missing command fails the build.',
|
|
@@ -26,11 +26,18 @@ import {
|
|
|
26
26
|
} from './_lib/agent_src.js';
|
|
27
27
|
import { computeStatus as domainSoundnessStatus } from './domain_soundness_status.js';
|
|
28
28
|
import { skip_compile_disabled_rule } from './condense.js';
|
|
29
|
+
import { resolveRepoRoot } from './_lib/repo_root.js';
|
|
29
30
|
|
|
30
31
|
const _HERE = fileURLToPath(import.meta.url);
|
|
31
32
|
|
|
32
33
|
// src/scripts/generate_index.ts → parents[2] of the .py file is the repo root.
|
|
33
|
-
|
|
34
|
+
// Root resolution goes through the sentinel resolver rather than a bare `..`
|
|
35
|
+
// walk: `path.resolve(dirname, '..', '..')` is correct until this file moves,
|
|
36
|
+
// and then it addresses a parent directory that also exists — the generator
|
|
37
|
+
// writes nothing, reports success, and nothing fails. `resolveRepoRoot` REFUSES
|
|
38
|
+
// when no directory on the walk carries this package's `package.json`
|
|
39
|
+
// (road-to-skill-ecosystem-runtime-enforcement Phase 2 Step 6).
|
|
40
|
+
export const ROOT = resolveRepoRoot(path.dirname(_HERE));
|
|
34
41
|
|
|
35
42
|
// Legacy single-root anchor — kept as fallback for pure-condensed consumer
|
|
36
43
|
// projections. Multi-root discovery uses artefact_roots() per ADR-017.
|
|
@@ -24,6 +24,7 @@ import * as path from 'node:path';
|
|
|
24
24
|
import process from 'node:process';
|
|
25
25
|
import { fileURLToPath } from 'node:url';
|
|
26
26
|
import YAML from 'yaml';
|
|
27
|
+
import { generatedByItalic } from './_lib/generated_by.js';
|
|
27
28
|
|
|
28
29
|
const _HERE = fileURLToPath(import.meta.url);
|
|
29
30
|
const PROG = 'generate_knowledge_index.ts';
|
|
@@ -126,7 +127,7 @@ function renderIndex(knowledgeRoot: string): string {
|
|
|
126
127
|
lines.push('# Knowledge Index');
|
|
127
128
|
lines.push('');
|
|
128
129
|
lines.push(
|
|
129
|
-
'
|
|
130
|
+
generatedByItalic('task generate-knowledge-index'),
|
|
130
131
|
);
|
|
131
132
|
lines.push('');
|
|
132
133
|
lines.push(
|
|
@@ -31,6 +31,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
31
31
|
import { parse as parseYaml } from 'yaml';
|
|
32
32
|
|
|
33
33
|
import { artefact_roots, strip_source_prefix } from './_lib/agent_src.js';
|
|
34
|
+
import { generatedByQuote } from './_lib/generated_by.js';
|
|
34
35
|
|
|
35
36
|
const _HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
36
37
|
export const ROOT = path.resolve(_HERE, '..', '..');
|
|
@@ -425,7 +426,7 @@ function _to_markdown(payload: Json): string {
|
|
|
425
426
|
const lines: string[] = [
|
|
426
427
|
'# File-ownership matrix (regenerated)',
|
|
427
428
|
'',
|
|
428
|
-
'
|
|
429
|
+
generatedByQuote('generate_ownership_matrix'),
|
|
429
430
|
'> Schema: [`docs/contracts/file-ownership-matrix.md`](../../../docs/contracts/file-ownership-matrix.md).',
|
|
430
431
|
'',
|
|
431
432
|
`- Schema version: \`${payload['version']}\``,
|
|
@@ -31,17 +31,25 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
31
31
|
import { parse as parseYaml } from 'yaml';
|
|
32
32
|
|
|
33
33
|
import { SRC_AGENT, iter_all_sources, resolve_logical } from './_lib/agent_src.js';
|
|
34
|
+
import { resolveRepoRoot } from './_lib/repo_root.js';
|
|
35
|
+
import { generatedByComment } from './_lib/generated_by.js';
|
|
34
36
|
|
|
35
37
|
const _HERE = fileURLToPath(import.meta.url);
|
|
36
38
|
// src/scripts/generate_pack_manifests.ts → parents[2] is the repo root (mirrors
|
|
37
39
|
// `Path(__file__).resolve().parents[2]` in the .py).
|
|
38
|
-
|
|
40
|
+
// Root resolution goes through the sentinel resolver rather than a bare `..`
|
|
41
|
+
// walk: `path.resolve(dirname, '..', '..')` is correct until this file moves,
|
|
42
|
+
// and then it addresses a parent directory that also exists — the generator
|
|
43
|
+
// writes nothing, reports success, and nothing fails. `resolveRepoRoot` REFUSES
|
|
44
|
+
// when no directory on the walk carries this package's `package.json`
|
|
45
|
+
// (road-to-skill-ecosystem-runtime-enforcement Phase 2 Step 6).
|
|
46
|
+
const ROOT = resolveRepoRoot(path.dirname(_HERE));
|
|
39
47
|
const PACKAGES = path.join(ROOT, 'packages');
|
|
40
48
|
const SRC_DOMAINS = path.join(ROOT, 'src', 'domains');
|
|
41
49
|
const SRC_PACKS = path.join(ROOT, 'src', 'packs');
|
|
42
50
|
const PACKS_VOCAB = path.join(ROOT, 'src', 'config', 'discovery', 'packs.yml');
|
|
43
51
|
const GENERATED_HEADER =
|
|
44
|
-
'
|
|
52
|
+
`${generatedByComment('generate_pack_manifests')}\n`;
|
|
45
53
|
|
|
46
54
|
type Json = unknown;
|
|
47
55
|
type Dict = Record<string, unknown>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Generate the role-experience catalog (road-to-competitive-borrow P1.0).
|
|
4
4
|
*
|
|
5
|
-
* Ported from the retired Python `src/
|
|
5
|
+
* Ported from the retired Python `src/generate_role_experiences_catalog`
|
|
6
6
|
* (ADR-200). The CLI contract is pinned — the `--check` /
|
|
7
7
|
* `--quiet` flags, exit codes (0 / 1 / 2), stdout/stderr split, and the
|
|
8
8
|
* byte-identical generated `docs/role-experiences.md` (heading prose, the
|
|
@@ -159,7 +159,7 @@ export function render(): string {
|
|
|
159
159
|
const lines: string[] = [
|
|
160
160
|
'# Role experiences — taglines at a glance',
|
|
161
161
|
'',
|
|
162
|
-
'> **Generated** by `
|
|
162
|
+
'> **Generated** by `generate_role_experiences_catalog` from',
|
|
163
163
|
'> `agents/roles/<role>/index.md` — do NOT hand-edit. Taglines are the',
|
|
164
164
|
'> existing role-level strings (validated by `lint_role_experiences.py`,',
|
|
165
165
|
'> rendered in the GUI workspace); this page surfaces them in a catalog.',
|
|
@@ -120,7 +120,7 @@ export function renderPage(rows: readonly ReferenceRow[]): string {
|
|
|
120
120
|
const out: string[] = [];
|
|
121
121
|
out.push('# Settings reference — every key, its class, and its default');
|
|
122
122
|
out.push('');
|
|
123
|
-
out.push('> **Generated** by `
|
|
123
|
+
out.push('> **Generated** by `generate_settings_reference` — do NOT');
|
|
124
124
|
out.push('> hand-edit. Derived from the zod settings schema plus the A/B/C class');
|
|
125
125
|
out.push('> table in [`settings-classes`](contracts/settings-classes.md).');
|
|
126
126
|
out.push('> Drift-checked in CI (`--check`).');
|
|
@@ -38,6 +38,8 @@ import fs from "node:fs";
|
|
|
38
38
|
import path from "node:path";
|
|
39
39
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
40
40
|
|
|
41
|
+
import { humanTypedThisTurn as _humanTypedThisTurn } from "./_lib/machine_wake.js";
|
|
42
|
+
|
|
41
43
|
import { atomic_write_json } from "./hooks/state_io.js";
|
|
42
44
|
import { readHookStdin } from "./hooks/hook_stdin.js";
|
|
43
45
|
|
|
@@ -465,6 +467,14 @@ export function takePending(
|
|
|
465
467
|
}
|
|
466
468
|
}
|
|
467
469
|
|
|
470
|
+
/**
|
|
471
|
+
* Re-exported so the ledger's own tests and callers keep one import site. The
|
|
472
|
+
* predicate lives in `_lib/machine_wake.ts` because the misclassification is a
|
|
473
|
+
* property of the `user_prompt_submit` SLOT, not of this concern — see that
|
|
474
|
+
* file for the discriminator and the captured evidence behind it.
|
|
475
|
+
*/
|
|
476
|
+
export { humanTypedThisTurn } from "./_lib/machine_wake.js";
|
|
477
|
+
|
|
468
478
|
export function run(stdin_text: string, options: { consumer_root: string }): number {
|
|
469
479
|
let envelope: JsonObject = {};
|
|
470
480
|
if (stdin_text.trim()) {
|
|
@@ -491,11 +501,22 @@ export function run(stdin_text: string, options: { consumer_root: string }): num
|
|
|
491
501
|
return EXIT_ALLOW;
|
|
492
502
|
}
|
|
493
503
|
|
|
504
|
+
const session = typeof envelope["session_id"] === "string" ? envelope["session_id"] : "";
|
|
505
|
+
|
|
506
|
+
// A machine wake is not a user turn. Leave every per-turn record standing —
|
|
507
|
+
// the ledger AND the pending refusal — and return before either is touched.
|
|
508
|
+
// Returning early rather than branching per-record is the point: any future
|
|
509
|
+
// per-turn state added to this function inherits the protection instead of
|
|
510
|
+
// needing to remember it (risk 4 — the misclassification is a property of the
|
|
511
|
+
// slot, not of one consumer).
|
|
512
|
+
if (!_humanTypedThisTurn(prompt)) {
|
|
513
|
+
return EXIT_ALLOW;
|
|
514
|
+
}
|
|
515
|
+
|
|
494
516
|
const { authorized, evidence } = classifyAuthorization(prompt);
|
|
495
517
|
|
|
496
518
|
// The answer to the guard's own question. Read (and consume) on EVERY prompt,
|
|
497
519
|
// so the record cannot outlive the turn it was raised in.
|
|
498
|
-
const session = typeof envelope["session_id"] === "string" ? envelope["session_id"] : "";
|
|
499
520
|
const pending = takePending(options.consumer_root, session, Date.now());
|
|
500
521
|
if (pending && !authorized.includes(pending.op) && isAffirmative(prompt)) {
|
|
501
522
|
authorized.push(pending.op);
|
|
@@ -58,6 +58,12 @@ export interface DimensionResult {
|
|
|
58
58
|
grade: Grade | null;
|
|
59
59
|
/** Required when `grade` is null: why detection is impossible, not merely absent. */
|
|
60
60
|
notDetectable?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Facts observed without being scored. An empty array means "nothing was
|
|
63
|
+
* observed", which is NOT the same as a failing grade and NOT the same as
|
|
64
|
+
* `notDetectable` — the three states are kept apart deliberately.
|
|
65
|
+
*/
|
|
66
|
+
observations?: string[];
|
|
61
67
|
evidence: string;
|
|
62
68
|
}
|
|
63
69
|
|
|
@@ -174,18 +180,51 @@ export function grade(root: string): Matrix {
|
|
|
174
180
|
evidence: testCfg ? 'a test-runner config is present' : 'no test-runner config',
|
|
175
181
|
});
|
|
176
182
|
|
|
177
|
-
// 3.
|
|
183
|
+
// 3. advanced testing signals — OBSERVED, never graded.
|
|
184
|
+
//
|
|
185
|
+
// This dimension used to be `test-strength`, graded on config presence. It
|
|
186
|
+
// was unscored on 2026-08-27: a dormant `stryker.conf` and an unused
|
|
187
|
+
// `fast-check` dependency both scored, while a rigorous conventional suite
|
|
188
|
+
// with neither scored 0 — so the number ordered targets by ADOPTION and
|
|
189
|
+
// read as EFFECTIVENESS. Detection is kept because presence is a real fact
|
|
190
|
+
// about the repository; the grade is dropped because the inference from it
|
|
191
|
+
// was not. Three epistemic states are held apart on purpose: a signal was
|
|
192
|
+
// observed, no signal was observed, and effectiveness is not evaluable at
|
|
193
|
+
// all — the last is permanent under static inspection and is why
|
|
194
|
+
// `notDetectable` is emitted whether or not any observation fires.
|
|
178
195
|
const mutation =
|
|
179
196
|
_glob1(root, '.', /^stryker\.conf\./) || _exists(root, 'infection.json', 'infection.json.dist') ||
|
|
180
197
|
/\[tool\.mutmut\]/.test(pyproject) || /\[mutmut\]/.test(_readIfAny(root, 'setup.cfg'));
|
|
181
198
|
const property =
|
|
182
199
|
/fast-check/.test(_readIfAny(root, 'package.json')) || /hypothesis/.test(pyproject + _readIfAny(root, 'requirements.txt'));
|
|
200
|
+
const mutationCi = mutation && _ciBlocks(ci, 'stryker', 'infection', 'mutmut');
|
|
201
|
+
// `ci-reference-detected`, not `ci-enforcement-detected`. Static matching over
|
|
202
|
+
// a workflow file establishes that a mutation tool is REFERENCED there; it
|
|
203
|
+
// cannot establish that the step is enabled, blocking, reached on the required
|
|
204
|
+
// branches, or ever executed. Naming it "enforcement" hands a consumer an
|
|
205
|
+
// assurance token the probe does not earn — and a consumer is entitled to read
|
|
206
|
+
// a token's name, `notDetectable` disclaimer or no disclaimer.
|
|
207
|
+
const observed: string[] = [
|
|
208
|
+
...(mutation ? ['mutation-testing-config-detected'] : []),
|
|
209
|
+
...(property ? ['property-testing-library-detected'] : []),
|
|
210
|
+
...(mutationCi ? ['mutation-testing-ci-reference-detected'] : []),
|
|
211
|
+
];
|
|
183
212
|
dims.push({
|
|
184
|
-
id: '
|
|
185
|
-
label: '
|
|
213
|
+
id: 'advanced-testing-signals',
|
|
214
|
+
label: 'advanced testing signals',
|
|
186
215
|
knockout: false,
|
|
187
|
-
grade:
|
|
188
|
-
|
|
216
|
+
grade: null,
|
|
217
|
+
observations: observed,
|
|
218
|
+
notDetectable:
|
|
219
|
+
'test effectiveness — static config and dependency signals cannot establish mutation sensitivity, ' +
|
|
220
|
+
'property quality, or whether either was ever executed. Outcome evidence would be needed: survivor and ' +
|
|
221
|
+
'timeout counts from a real mutation run, or executed property-test results.',
|
|
222
|
+
// Derived from `observations`, never a parallel ternary. The original
|
|
223
|
+
// ternary reported only the mutation signal when BOTH fired — which the
|
|
224
|
+
// `python` fixture does — so the human-readable string and the machine
|
|
225
|
+
// list disagreed about the same target. Two representations of one fact
|
|
226
|
+
// drift; one is computed from the other.
|
|
227
|
+
evidence: observed.length > 0 ? observed.join(', ') : 'no advanced-testing signal detected',
|
|
189
228
|
});
|
|
190
229
|
|
|
191
230
|
// 4. static analysis & types — KNOCKOUT, and the not-detectable case
|
|
@@ -319,6 +358,10 @@ export function renderMatrix(m: Matrix): string {
|
|
|
319
358
|
for (const d of m.dimensions) {
|
|
320
359
|
const val = d.grade === null ? `not detectable — ${d.notDetectable ?? ''}` : `${String(d.grade)} ${GRADE_WORD[d.grade] ?? ''}`;
|
|
321
360
|
L.push(` ${d.knockout ? '!' : ' '} ${d.label.padEnd(28)} ${val}`);
|
|
361
|
+
// Observations are printed under their dimension, never folded into the
|
|
362
|
+
// level. An unscored dimension that printed nothing would read as an
|
|
363
|
+
// omission rather than as a deliberate refusal to grade.
|
|
364
|
+
for (const o of d.observations ?? []) L.push(` ${' '.repeat(31)} observed: ${o}`);
|
|
322
365
|
}
|
|
323
366
|
L.push('');
|
|
324
367
|
L.push(' ! = knockout dimension. The level is the MINIMUM over knockouts;');
|