@event4u/agent-config 16.2.0 → 16.4.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 +337 -234
- package/README.md +15 -13
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +11 -8
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/bug/investigate.md +1 -1
- package/dist/agent-src/commands/commit/in-chunks.md +40 -31
- package/dist/agent-src/commands/commit.md +72 -33
- package/dist/agent-src/commands/condense.md +2 -8
- package/dist/agent-src/commands/council/debate.md +11 -7
- package/dist/agent-src/commands/council/default.md +10 -9
- package/dist/agent-src/commands/council.md +1 -1
- package/dist/agent-src/commands/estimate-ticket.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +3 -3
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +18 -4
- package/dist/agent-src/commands/fix/commit-messages.md +48 -23
- package/dist/agent-src/commands/fix/pr-comments.md +3 -6
- package/dist/agent-src/commands/implement-ticket.md +4 -4
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/add.md +4 -16
- package/dist/agent-src/commands/memory/load.md +5 -6
- package/dist/agent-src/commands/memory/promote.md +3 -16
- package/dist/agent-src/commands/mission/upgrade.md +3 -2
- package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
- package/dist/agent-src/commands/optimize/deep.md +4 -2
- package/dist/agent-src/commands/optimize/rtk.md +4 -26
- package/dist/agent-src/commands/pr/create/description-only.md +18 -15
- package/dist/agent-src/commands/pr/create.md +42 -34
- package/dist/agent-src/commands/pr/merge.md +136 -9
- package/dist/agent-src/commands/prepare-for-review.md +13 -11
- package/dist/agent-src/commands/project/analyze.md +7 -35
- package/dist/agent-src/commands/refine-ticket.md +1 -1
- package/dist/agent-src/commands/review/changes.md +14 -19
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +56 -42
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/commands/worktree/create.md +7 -3
- package/dist/agent-src/commands/worktree/verify.md +2 -1
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
- package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
- package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
- package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
- package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
- package/dist/agent-src/guidelines/php/git.md +15 -2
- package/dist/agent-src/rules/active-remediation.md +1 -2
- package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
- package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
- package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -1
- package/dist/agent-src/rules/brand-consistency.md +0 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
- package/dist/agent-src/rules/broken-access-control.md +1 -1
- package/dist/agent-src/rules/cli-output-handling.md +0 -1
- package/dist/agent-src/rules/code-comment-discipline.md +0 -1
- package/dist/agent-src/rules/code-provenance.md +0 -1
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
- package/dist/agent-src/rules/commit-conventions.md +1 -2
- package/dist/agent-src/rules/communication-through-line.md +1 -2
- package/dist/agent-src/rules/content-quoting-floor.md +1 -2
- package/dist/agent-src/rules/context-hygiene.md +6 -6
- package/dist/agent-src/rules/copilot-routing.md +1 -2
- package/dist/agent-src/rules/council-availability.md +4 -4
- package/dist/agent-src/rules/cross-source-consistency.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +12 -16
- package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
- package/dist/agent-src/rules/devcontainer-routing.md +1 -2
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/docker-commands.md +0 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/domain-safety-retention.md +1 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/fix-what-you-see.md +6 -32
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +2 -2
- package/dist/agent-src/rules/guidelines.md +0 -1
- package/dist/agent-src/rules/history-discipline.md +0 -1
- package/dist/agent-src/rules/icon-consistency.md +0 -1
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
- package/dist/agent-src/rules/improve-before-implement.md +0 -1
- package/dist/agent-src/rules/invite-challenge.md +0 -1
- package/dist/agent-src/rules/laravel-routing.md +1 -2
- package/dist/agent-src/rules/laravel-translations.md +0 -1
- package/dist/agent-src/rules/legal-safety-floor.md +3 -3
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +13 -17
- package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
- package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/model-recommendation.md +0 -1
- package/dist/agent-src/rules/neighbour-precedence.md +64 -0
- package/dist/agent-src/rules/no-attribution-footers.md +0 -1
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
- package/dist/agent-src/rules/no-roadmap-references.md +0 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
- package/dist/agent-src/rules/onboarding-gate.md +0 -1
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/package-ci-checks.md +0 -1
- package/dist/agent-src/rules/persona-governance.md +4 -5
- package/dist/agent-src/rules/php-coding.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
- package/dist/agent-src/rules/preservation-guard.md +0 -1
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/reviewer-awareness.md +0 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
- package/dist/agent-src/rules/self-repair-loop.md +0 -1
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
- package/dist/agent-src/rules/session-canary.md +7 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
- package/dist/agent-src/rules/size-enforcement.md +0 -1
- package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
- package/dist/agent-src/rules/skill-quality.md +0 -1
- package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
- package/dist/agent-src/rules/source-confidentiality.md +1 -1
- package/dist/agent-src/rules/source-discovery-gate.md +0 -1
- package/dist/agent-src/rules/source-of-truth.md +0 -1
- package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/symfony-routing.md +1 -2
- package/dist/agent-src/rules/think-before-action.md +0 -1
- package/dist/agent-src/rules/token-budget-discipline.md +12 -46
- package/dist/agent-src/rules/token-efficiency.md +0 -1
- package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
- package/dist/agent-src/rules/tool-safety.md +1 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
- package/dist/agent-src/rules/upstream-proposal.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -1
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
- package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
- package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
- package/dist/agent-src/skills/database/data/manifest.json +2 -2
- package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
- package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +46 -129
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/roadmaps.md +6 -1
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/skill.md +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +207 -120
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
- package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
- package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
- package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- package/dist/cli-delegate/cmd_analyze_session.js +223 -43
- package/dist/cli-delegate/cmd_brand_status.js +3 -2
- package/dist/cli-delegate/cmd_conformance.js +1252 -249
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +19 -9
- package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
- package/dist/cli-delegate/cmd_explain.js +45 -21
- package/dist/cli-delegate/cmd_export.js +13 -10
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +44 -22
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +5 -4
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +14 -11
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +10 -8
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +10 -7
- package/dist/cli-delegate/cmd_settings_check.js +54 -7
- package/dist/cli-delegate/cmd_settings_get.js +18 -8
- package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +14 -11
- package/dist/cli-delegate/cmd_uninstall.js +15 -12
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +9 -8
- package/dist/cli-delegate/cmd_validate.js +15 -12
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +3 -3
- package/dist/cli-delegate/roadmap_gates.js +6 -6
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +232 -141
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +26 -9
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +7 -4
- package/dist/hooks/dispatch.js +5655 -6623
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2336 -1249
- package/dist/install/installThinLayer.js +289 -0
- package/dist/install/installedRuleLinks.js +262 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
- package/dist/mcp/registry-manifest.json +5 -5
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +36504 -30986
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +26 -120
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/compile_time_toggles.js +12 -21
- package/dist/scripts/_lib/git_convention.js +232 -0
- package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
- package/dist/scripts/_lib/installed_layer.js +704 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/package_root.js +68 -0
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/thin_rules.js +535 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/app.js +2 -1
- package/dist/server/gitKeysGate.js +105 -0
- package/dist/server/routes/settings.js +67 -8
- package/dist/server/routes/wizard.js +4 -0
- package/dist/server/schemas/settings.js +29 -81
- package/dist/shared/skillRanking.js +103 -16
- package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +72 -1
- package/docs/contracts/settings-classes.md +39 -67
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/docs/guidelines/agent-infra/layered-settings.md +13 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
- package/docs/guidelines/php/git.md +15 -2
- package/package.json +1 -1
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/config/agent-settings.template.yml +141 -334
- package/src/config/agents-paths.yml +16 -0
- package/src/config/assurance-capability-registry.json +7 -3
- package/src/config/ci-local-parity.yml +3 -0
- package/src/config/continuity-surface.json +10 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +23 -10
- package/src/config/gate-coverage.yml +138 -3
- package/src/config/gate-violation-baselines.json +64 -16
- package/src/config/gitignore-block.txt +19 -0
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-token-budget.json +6 -1
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +67 -4
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +105 -0
- package/src/config/rule-obligations.json +833 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +378 -0
- package/src/install/installedRuleLinks.ts +308 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
- package/src/scripts/_cli/cmd_conformance.ts +13 -2
- package/src/scripts/_cli/cmd_doctor.ts +33 -81
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
- package/src/scripts/_cli/cmd_explain.ts +72 -14
- package/src/scripts/_cli/cmd_git_convention.ts +637 -0
- package/src/scripts/_cli/cmd_settings_check.ts +66 -8
- package/src/scripts/_cli/cmd_settings_get.ts +18 -3
- package/src/scripts/_cli/doctor_execution.ts +72 -1
- package/src/scripts/_dispatch.bash +53 -4
- package/src/scripts/_lib/agent_settings.ts +26 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/git_base_ref.ts +92 -0
- package/src/scripts/_lib/git_convention.ts +291 -0
- package/src/scripts/_lib/git_convention_carrier.ts +389 -0
- package/src/scripts/_lib/git_convention_grammar.ts +246 -0
- package/src/scripts/_lib/git_convention_measure.ts +344 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
- package/src/scripts/_lib/graph_feeder_record.ts +437 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +963 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/ratification_artifact.ts +220 -1
- package/src/scripts/_lib/ratification_subject.ts +92 -0
- package/src/scripts/_lib/release_findings_ingest.ts +15 -7
- package/src/scripts/_lib/release_highlights.ts +5 -0
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/rule_obligations.ts +205 -0
- package/src/scripts/_lib/self_repair.ts +1 -1
- package/src/scripts/_lib/settings_removed_keys.ts +173 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +620 -0
- package/src/scripts/_lib/touched_file_quality.ts +570 -0
- package/src/scripts/_lib/turn_end_refusals.ts +77 -2
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +8 -8
- package/src/scripts/ai_council/modification_review.ts +100 -0
- package/src/scripts/ai_council/modification_review_questions.ts +90 -0
- package/src/scripts/ai_council/orchestrator.ts +5 -5
- package/src/scripts/ai_council/spend_gate.ts +18 -7
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/ai_team/config.ts +11 -16
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/audit_user_type_axis.ts +20 -8
- package/src/scripts/before_complete_hook.ts +243 -12
- package/src/scripts/bench_ab_clone.ts +1 -2
- package/src/scripts/bench_concern_spawn_path.ts +129 -0
- package/src/scripts/bench_graph_feeder_latency.ts +584 -0
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/check_agent_artifact_location.ts +36 -0
- package/src/scripts/check_branch_freshness.ts +147 -24
- package/src/scripts/check_enforcement_coverage.ts +130 -0
- package/src/scripts/check_enforcement_matrix.ts +377 -20
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +196 -21
- package/src/scripts/check_gate_coverage.ts +4 -3
- package/src/scripts/check_gate_reachability.ts +48 -1
- package/src/scripts/check_generator_sync.ts +48 -0
- package/src/scripts/check_hook_bundle_composition.ts +477 -0
- package/src/scripts/check_kernel_edit_ratified.ts +132 -14
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_standing_rule_delivery.ts +129 -13
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +42 -5
- package/src/scripts/classify_merge_risk.ts +320 -0
- package/src/scripts/closure_scan.ts +91 -1
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- package/src/scripts/compile_hook_manifest.ts +33 -1
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/consumer_matrix.ts +102 -0
- package/src/scripts/context_hygiene_hook.ts +13 -23
- package/src/scripts/cost/preflight.mjs +12 -1
- package/src/scripts/council_cli.ts +7 -7
- package/src/scripts/dispatch_r2_reviewer.ts +24 -11
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +21 -4
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +175 -15
- package/src/scripts/hooks/block_config_weakening.ts +115 -7
- package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
- package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/dispatch_hook.ts +52 -52
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- package/src/scripts/hooks/exit_codes.ts +2 -1
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.ts +19 -1
- package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
- package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +795 -60
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/table_fingerprint.ts +21 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
- package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +78 -215
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_blocker_citations.ts +198 -0
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- package/src/scripts/lint_hook_manifest.ts +53 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +465 -29
- package/src/scripts/lint_roadmap_blockers.ts +282 -29
- package/src/scripts/lint_roadmap_complexity.ts +4 -2
- package/src/scripts/lint_rule_law_section.ts +647 -0
- package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
- package/src/scripts/lint_settings_classes.ts +1 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
- package/src/scripts/lint_workflow_security.ts +173 -6
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/model_rule_injection.ts +55 -8
- package/src/scripts/onboarding_gate_hook.ts +7 -6
- package/src/scripts/print_required_checks.ts +15 -3
- package/src/scripts/probe_host_compliance.ts +33 -5
- package/src/scripts/probe_turnaround.ts +183 -3
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/ratification_header.ts +77 -0
- package/src/scripts/refusal_envelope.ts +138 -0
- package/src/scripts/release_publication.ts +29 -3
- package/src/scripts/report_dispatch_import_closure.ts +76 -0
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +274 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +228 -0
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_ranker_confusion.ts +543 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/routing_doctor.ts +2 -2
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/review-findings.schema.json +3 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +101 -9
- package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -21
- package/src/server/schemas/settings.ts +42 -176
- package/src/shared/skillRanking.ts +169 -14
- package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
- package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/src/scripts/_lib/config_chain.ts +0 -477
- package/src/scripts/_lib/conformance_report.ts +0 -403
- package/src/scripts/_lib/eval_discrimination.ts +0 -95
- package/src/scripts/_lib/evaluator_promotion.ts +0 -225
- package/src/scripts/_lib/file_slicer.ts +0 -117
- package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
- package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
- package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
- package/src/scripts/_lib/role_split.ts +0 -338
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The record is a COMMITTED ledger — `agents/evidence/release-findings/
|
|
10
10
|
* <version>.json` — never the PR comment (council 2026-08-03: a comment is
|
|
11
|
-
* mutable and unaudited; it is transport, not a record). Every blocking
|
|
12
|
-
* finding in the ledger must carry a complete disposition
|
|
11
|
+
* mutable and unaudited; it is transport, not a record). Every blocking
|
|
12
|
+
* finding in the ledger (see `isBlocking`) must carry a complete disposition
|
|
13
13
|
* `{status: fixed|false_positive|accepted_risk, commit (when fixed),
|
|
14
14
|
* rationale, verified_by}`; the release workflow is red while one does not.
|
|
15
15
|
*
|
|
@@ -75,6 +75,7 @@ import * as path from 'node:path';
|
|
|
75
75
|
import process from 'node:process';
|
|
76
76
|
import { fileURLToPath } from 'node:url';
|
|
77
77
|
|
|
78
|
+
import { coverageLabel } from './_lib/review_coverage.js';
|
|
78
79
|
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
79
80
|
|
|
80
81
|
const _HERE = fileURLToPath(import.meta.url);
|
|
@@ -84,6 +85,26 @@ export const LEDGER_DIR = 'agents/evidence/release-findings';
|
|
|
84
85
|
export const DISPOSITION_STATUSES = ['fixed', 'false_positive', 'accepted_risk'] as const;
|
|
85
86
|
export type DispositionStatus = (typeof DISPOSITION_STATUSES)[number];
|
|
86
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Every status that means a human re-read the finding and decided.
|
|
90
|
+
*
|
|
91
|
+
* `still_open` is the fourth, and it exists so that "give every row a terminal
|
|
92
|
+
* status" does not read as "close every finding". A row re-checked against the
|
|
93
|
+
* merged head and found to be a real, unfixed issue is adjudicated; writing
|
|
94
|
+
* `accepted_risk` over it to make a count reach zero would be the cheapest way
|
|
95
|
+
* to satisfy the requirement and the one that destroys it.
|
|
96
|
+
*
|
|
97
|
+
* It is deliberately NOT in {@link DISPOSITION_STATUSES}: a BLOCKING row may
|
|
98
|
+
* never pass on it. `missing_dispositions` reports a blocking finding marked
|
|
99
|
+
* `still_open` with its own message and the gate stays red — which is the
|
|
100
|
+
* behaviour a blocking finding that is still open should have.
|
|
101
|
+
*
|
|
102
|
+
* `open` from the schema is absent on purpose. The schema documents it as the
|
|
103
|
+
* INITIAL state, so counting it would make the tally reachable without anyone
|
|
104
|
+
* re-reading a finding.
|
|
105
|
+
*/
|
|
106
|
+
export const TERMINAL_STATUSES = [...DISPOSITION_STATUSES, 'still_open'] as const;
|
|
107
|
+
|
|
87
108
|
export interface LedgerFinding {
|
|
88
109
|
finding_id: string;
|
|
89
110
|
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
@@ -120,6 +141,12 @@ export interface Ledger {
|
|
|
120
141
|
assurance?: string;
|
|
121
142
|
reviewers?: string[];
|
|
122
143
|
coverage?: unknown;
|
|
144
|
+
/**
|
|
145
|
+
* Per-run count of findings quoting a supplied fact, written by
|
|
146
|
+
* `self_review_gate` under `--findings-out`. Declared here because ingest
|
|
147
|
+
* now carries it; see {@link INTEGRITY_FIELDS}.
|
|
148
|
+
*/
|
|
149
|
+
fact_claims?: unknown;
|
|
123
150
|
}
|
|
124
151
|
|
|
125
152
|
/**
|
|
@@ -139,7 +166,7 @@ export interface Ledger {
|
|
|
139
166
|
* consumer inferring it from the findings would be inventing the integrity
|
|
140
167
|
* claim the fields exist to record.
|
|
141
168
|
*/
|
|
142
|
-
|
|
169
|
+
const SCHEMA_INTEGRITY_FIELDS = [
|
|
143
170
|
'review_independence',
|
|
144
171
|
'context_relation',
|
|
145
172
|
'acceptance_status',
|
|
@@ -148,6 +175,24 @@ export const INTEGRITY_FIELDS = [
|
|
|
148
175
|
'coverage',
|
|
149
176
|
] as const;
|
|
150
177
|
|
|
178
|
+
/**
|
|
179
|
+
* The carried set: the six above plus `fact_claims`.
|
|
180
|
+
*
|
|
181
|
+
* `fact_claims` is written by `self_review_gate.ts` at `--findings-out` time and
|
|
182
|
+
* was dropped by every ingest, because this list predates it. The field is the
|
|
183
|
+
* falsifier for the supplied-facts change — a count over the next cut — and a
|
|
184
|
+
* falsifier that never reaches the record is not one. It is carried rather than
|
|
185
|
+
* recomputed for the same reason the other six are: only the producing run knows
|
|
186
|
+
* what it quoted.
|
|
187
|
+
*
|
|
188
|
+
* It is NOT in {@link SCHEMA_INTEGRITY_FIELDS}, which is the set the ingest
|
|
189
|
+
* warning names. That warning tells a writer that `check_review_schema` derives
|
|
190
|
+
* `acceptance_status` and `assurance` from `review_independence` and will red on
|
|
191
|
+
* a ledger declaring neither — a sentence that is simply untrue of `fact_claims`,
|
|
192
|
+
* and naming it there would make the warning wrong to buy one shorter list.
|
|
193
|
+
*/
|
|
194
|
+
export const INTEGRITY_FIELDS = [...SCHEMA_INTEGRITY_FIELDS, 'fact_claims'] as const;
|
|
195
|
+
|
|
151
196
|
/**
|
|
152
197
|
* Merge a self-review artifact into a ledger: new findings by id, the integrity
|
|
153
198
|
* fields on first write, and — when the review found nothing — the reason that
|
|
@@ -226,21 +271,74 @@ function _clean_review_reason(artifact: Record<string, unknown>): string {
|
|
|
226
271
|
);
|
|
227
272
|
}
|
|
228
273
|
|
|
274
|
+
export const MEDIUM_SECURITY_BLOCKS_AFTER = '16.3.0';
|
|
275
|
+
|
|
276
|
+
function semverParts(v: string): [number, number, number] | null {
|
|
277
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(v.trim());
|
|
278
|
+
return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** True unless `release` parses and is at or before the cutoff. */
|
|
282
|
+
export function mediumSecurityBinds(release: string | null): boolean {
|
|
283
|
+
if (release === null) return true;
|
|
284
|
+
const r = semverParts(release);
|
|
285
|
+
const cut = semverParts(MEDIUM_SECURITY_BLOCKS_AFTER) as [number, number, number];
|
|
286
|
+
if (r === null) return true;
|
|
287
|
+
for (let i = 0; i < 3; i++) {
|
|
288
|
+
const a = r[i] as number;
|
|
289
|
+
const b = cut[i] as number;
|
|
290
|
+
if (a !== b) return a > b;
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
|
|
229
295
|
/**
|
|
230
|
-
*
|
|
231
|
-
* MINUS anything the tree disproved.
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
296
|
+
* self_review_gate.classifyBlocking (security/claim × critical/high) PLUS
|
|
297
|
+
* security × medium, MINUS anything the tree disproved.
|
|
298
|
+
*
|
|
299
|
+
* Deliberately STRICTER than the merge gate, and the asymmetry is load-bearing
|
|
300
|
+
* rather than drift — do not re-mirror it. The merge gate asks whether a change
|
|
301
|
+
* may enter trunk while work is still integrating; this gate asks whether a
|
|
302
|
+
* known risk may ship to users without an accountable decision. 16.3.0 shipped
|
|
303
|
+
* a medium security finding that had already been open in 16.2.0 with nobody
|
|
304
|
+
* required to decide it, so a medium security finding needs a disposition here
|
|
305
|
+
* while it stays advisory at merge. `accepted_risk` with a rationale satisfies
|
|
306
|
+
* it; `still_open` does not. `claim × medium` stays advisory in both.
|
|
307
|
+
* Council 2026-10-07 (claude-sonnet-4-5 + codex, 2/2 concluded, option a,
|
|
308
|
+
* release gate only). Revisit if medium security findings routinely receive
|
|
309
|
+
* formulaic `accepted_risk` over three consecutive releases, or exceed about
|
|
310
|
+
* ten per release.
|
|
311
|
+
*
|
|
312
|
+
* The widening is prospective: it binds releases after
|
|
313
|
+
* {@link MEDIUM_SECURITY_BLOCKS_AFTER}, the last one published before the
|
|
314
|
+
* decision. A release already shipped cannot be made to wait, and re-gating it
|
|
315
|
+
* would leave exactly two outcomes for a medium security row that is genuinely
|
|
316
|
+
* still open — a red trunk, or an `accepted_risk` written only to turn it
|
|
317
|
+
* green, which is the relabelling this gate exists to refuse. Without a release
|
|
318
|
+
* (a reported finding, a test) the wider rule applies.
|
|
319
|
+
*
|
|
320
|
+
* The cutoff orders by version, not by publication date: a maintenance release
|
|
321
|
+
* on an older line (a 16.2.x cut after the decision) sits at or before the
|
|
322
|
+
* cutoff and is exempt. The council ratified the prospective cutoff and this
|
|
323
|
+
* documented exemption on 2026-10-07 (2/2); cutting a maintenance line is the
|
|
324
|
+
* condition that reopens it.
|
|
325
|
+
*
|
|
326
|
+
* The `contradicted` clause is shared with the merge gate, and has to be or the
|
|
327
|
+
* two disagree: the review would stop counting a disproved deletion claim as
|
|
328
|
+
* blocking while the release kept demanding a disposition for it. A
|
|
329
|
+
* `contradicted` value is written only by `annotateContradicted`, which checks
|
|
330
|
+
* the claim against `git diff --name-status base...HEAD` AND the working tree.
|
|
239
331
|
*/
|
|
240
|
-
export function isBlocking(
|
|
332
|
+
export function isBlocking(
|
|
333
|
+
f: Pick<LedgerFinding, 'kind' | 'severity' | 'contradicted'>,
|
|
334
|
+
release: string | null = null,
|
|
335
|
+
): boolean {
|
|
241
336
|
if ((f.contradicted ?? '').trim() !== '') {
|
|
242
337
|
return false;
|
|
243
338
|
}
|
|
339
|
+
if (f.kind === 'security' && f.severity === 'medium' && mediumSecurityBinds(release)) {
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
244
342
|
return (
|
|
245
343
|
(f.kind === 'security' || f.kind === 'claim') &&
|
|
246
344
|
(f.severity === 'critical' || f.severity === 'high')
|
|
@@ -253,10 +351,13 @@ export function isBlocking(f: Pick<LedgerFinding, 'kind' | 'severity' | 'contrad
|
|
|
253
351
|
* Empty rationale / verified_by is a hygiene violation (waiver precedent:
|
|
254
352
|
* "empty string = hygiene violation"); status `fixed` requires a commit.
|
|
255
353
|
*/
|
|
256
|
-
export function missing_dispositions(
|
|
354
|
+
export function missing_dispositions(
|
|
355
|
+
findings: readonly LedgerFinding[],
|
|
356
|
+
release: string | null = null,
|
|
357
|
+
): string[] {
|
|
257
358
|
const problems: string[] = [];
|
|
258
359
|
for (const f of findings) {
|
|
259
|
-
if (!isBlocking(f)) {
|
|
360
|
+
if (!isBlocking(f, release)) {
|
|
260
361
|
continue;
|
|
261
362
|
}
|
|
262
363
|
const label = `${f.finding_id} (${f.severity} ${f.kind}: ${f.title})`;
|
|
@@ -265,6 +366,10 @@ export function missing_dispositions(findings: readonly LedgerFinding[]): string
|
|
|
265
366
|
problems.push(`${label}: no disposition status`);
|
|
266
367
|
continue;
|
|
267
368
|
}
|
|
369
|
+
if (status === 'still_open') {
|
|
370
|
+
problems.push(`${label}: still_open does not satisfy a blocking finding — fix it, disprove it, or accept the risk with a reason`);
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
268
373
|
if (!(DISPOSITION_STATUSES as readonly string[]).includes(status)) {
|
|
269
374
|
problems.push(`${label}: unknown status ${JSON.stringify(status)}`);
|
|
270
375
|
continue;
|
|
@@ -282,6 +387,69 @@ export function missing_dispositions(findings: readonly LedgerFinding[]): string
|
|
|
282
387
|
return problems;
|
|
283
388
|
}
|
|
284
389
|
|
|
390
|
+
/** What the success line reports, counted over the two populations apart. */
|
|
391
|
+
export interface DispositionTally {
|
|
392
|
+
/** Rows `isBlocking` admits. */
|
|
393
|
+
readonly blockingTotal: number;
|
|
394
|
+
/** Of those, the ones `missing_dispositions` finds nothing wrong with. */
|
|
395
|
+
readonly blockingDispositioned: number;
|
|
396
|
+
/** Every other row. The gate cannot fail on these; it can still count them. */
|
|
397
|
+
readonly nonBlockingTotal: number;
|
|
398
|
+
/** Of those, the ones carrying a {@link TERMINAL_STATUSES} value. */
|
|
399
|
+
readonly nonBlockingTerminal: number;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Count what the gate checked, split by what it can actually require.
|
|
404
|
+
*
|
|
405
|
+
* The recorded failure this exists for: `--release 16.2.0` printed "all 20
|
|
406
|
+
* recorded finding(s) for 16.2.0 dispositioned (blocking ones completely)" over
|
|
407
|
+
* a ledger carrying a `status` on 2 of 20 rows. Both halves of that sentence are
|
|
408
|
+
* individually defensible — the gate did require the blocking ones, and it did
|
|
409
|
+
* complete — and together they say the opposite of the truth, because nobody
|
|
410
|
+
* reads a parenthetical as a retraction of the word in front of it. Eighteen
|
|
411
|
+
* findings had never been adjudicated and the record said they had.
|
|
412
|
+
*
|
|
413
|
+
* The fix is a count, not a new refusal. Exit semantics are untouched: a
|
|
414
|
+
* non-blocking row still cannot fail the gate. What changes is that the line
|
|
415
|
+
* stops claiming the rows it never looked at.
|
|
416
|
+
*
|
|
417
|
+
* An unrecognised status counts as NOT terminal, which is the conservative
|
|
418
|
+
* direction: a typo surfaces as a row the line says is unadjudicated, rather
|
|
419
|
+
* than disappearing into a count that reads as finished.
|
|
420
|
+
*/
|
|
421
|
+
export function disposition_tally(
|
|
422
|
+
findings: readonly LedgerFinding[],
|
|
423
|
+
release: string | null = null,
|
|
424
|
+
): DispositionTally {
|
|
425
|
+
let blockingTotal = 0;
|
|
426
|
+
let blockingDispositioned = 0;
|
|
427
|
+
let nonBlockingTotal = 0;
|
|
428
|
+
let nonBlockingTerminal = 0;
|
|
429
|
+
for (const f of findings) {
|
|
430
|
+
if (isBlocking(f, release)) {
|
|
431
|
+
blockingTotal++;
|
|
432
|
+
if (missing_dispositions([f], release).length === 0) {
|
|
433
|
+
blockingDispositioned++;
|
|
434
|
+
}
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
nonBlockingTotal++;
|
|
438
|
+
if ((TERMINAL_STATUSES as readonly string[]).includes((f.status ?? '').trim())) {
|
|
439
|
+
nonBlockingTerminal++;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return { blockingTotal, blockingDispositioned, nonBlockingTotal, nonBlockingTerminal };
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/** The tally as the success line renders it. Never the word "all". */
|
|
446
|
+
export function disposition_summary(t: DispositionTally): string {
|
|
447
|
+
return (
|
|
448
|
+
`blocking ${String(t.blockingDispositioned)}/${String(t.blockingTotal)} dispositioned · ` +
|
|
449
|
+
`non-blocking ${String(t.nonBlockingTerminal)}/${String(t.nonBlockingTotal)} carry a terminal status`
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
|
|
285
453
|
/**
|
|
286
454
|
* An empty finding set must say why it is empty.
|
|
287
455
|
*
|
|
@@ -434,10 +602,11 @@ export function resolve_release_status(release: string): ReleaseStatus {
|
|
|
434
602
|
export function unrecorded_findings(
|
|
435
603
|
reported: ReadonlyArray<Pick<LedgerFinding, 'finding_id' | 'severity' | 'kind' | 'title' | 'contradicted'>>,
|
|
436
604
|
ledger: readonly LedgerFinding[],
|
|
605
|
+
release: string | null = null,
|
|
437
606
|
): string[] {
|
|
438
607
|
const known = new Set(ledger.map((f) => f.finding_id));
|
|
439
608
|
return reported
|
|
440
|
-
.filter((f) => isBlocking(f) && !known.has(f.finding_id))
|
|
609
|
+
.filter((f) => isBlocking(f, release) && !known.has(f.finding_id))
|
|
441
610
|
.map((f) => `${f.finding_id} (${f.severity} ${f.kind}: ${f.title}) reported by the self-review but not in the ledger`);
|
|
442
611
|
}
|
|
443
612
|
|
|
@@ -577,7 +746,7 @@ function main(argv: readonly string[]): number {
|
|
|
577
746
|
'ledger is a result rather than an absence\n',
|
|
578
747
|
);
|
|
579
748
|
}
|
|
580
|
-
const absent =
|
|
749
|
+
const absent = SCHEMA_INTEGRITY_FIELDS.filter((k) => ledger[k] === undefined);
|
|
581
750
|
if (absent.length > 0) {
|
|
582
751
|
process.stdout.write(
|
|
583
752
|
`⚠️ artifact carried no ${absent.join(', ')} — ` +
|
|
@@ -667,18 +836,24 @@ function main(argv: readonly string[]): number {
|
|
|
667
836
|
throw exc;
|
|
668
837
|
}
|
|
669
838
|
|
|
670
|
-
const problems = missing_dispositions(ledger.findings);
|
|
839
|
+
const problems = missing_dispositions(ledger.findings, release);
|
|
671
840
|
if (pr) {
|
|
672
841
|
const reported = parse_comment_findings(_gh_comment_bodies(pr));
|
|
673
|
-
problems.push(...unrecorded_findings(reported, ledger.findings));
|
|
842
|
+
problems.push(...unrecorded_findings(reported, ledger.findings, release));
|
|
674
843
|
}
|
|
675
844
|
|
|
676
845
|
if (problems.length === 0) {
|
|
677
846
|
const n = ledger.findings.length;
|
|
847
|
+
// The label is appended to BOTH lines, including the zero-findings one:
|
|
848
|
+
// a review that read 65 of 678 files and reported nothing is the case
|
|
849
|
+
// where "no findings" is least informative on its own.
|
|
850
|
+
const partial = coverageLabel(ledger.coverage);
|
|
851
|
+
const suffix = partial === null ? '' : ` — ${partial}`;
|
|
678
852
|
process.stdout.write(
|
|
679
853
|
n === 0
|
|
680
|
-
? `✅ no recorded findings for ${release} (ledger ${fs.existsSync(ledgerPath) ? 'empty' : 'absent'})\n`
|
|
681
|
-
: `✅
|
|
854
|
+
? `✅ no recorded findings for ${release} (ledger ${fs.existsSync(ledgerPath) ? 'empty' : 'absent'})${suffix}\n`
|
|
855
|
+
: `✅ ${String(n)} recorded finding(s) for ${release} — ` +
|
|
856
|
+
`${disposition_summary(disposition_tally(ledger.findings, release))}${suffix}\n`,
|
|
682
857
|
);
|
|
683
858
|
return 0;
|
|
684
859
|
}
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
* definition. It runs the same contract as the review-side canary in
|
|
31
31
|
* `docs/contracts/adversarial-review-protocol.md` § 6 (rotating class, sealed
|
|
32
32
|
* record, NEVER SHIPS) and is deliberately kept OFF the default CI path: it
|
|
33
|
-
* mutates the tree, so it is
|
|
33
|
+
* mutates the tree, so it is a scheduled experiment (`.github/workflows/gate-canary.yml`,
|
|
34
|
+
* monthly, ledger uploaded as a run artifact) or an operator run, never a
|
|
34
35
|
* per-PR gate. Every plant is reverted in a `finally`.
|
|
35
36
|
*
|
|
36
37
|
* CLI:
|
|
@@ -415,8 +416,8 @@ function report_negative_control_inventory(specs: readonly GateSpec[]): void {
|
|
|
415
416
|
// The arithmetic is the guard against skimming: two numbers that reconcile
|
|
416
417
|
// against the enforced total cannot be read as "all of them checked".
|
|
417
418
|
process.stdout.write(
|
|
418
|
-
` ⚠️ declared, not run — the mutating --canary path is
|
|
419
|
-
`so no negative control ran here.\n`,
|
|
419
|
+
` ⚠️ declared, not run — the mutating --canary path is off the per-PR workflow (it runs monthly ` +
|
|
420
|
+
`in .github/workflows/gate-canary.yml), so no negative control ran here.\n`,
|
|
420
421
|
);
|
|
421
422
|
for (const s of without) {
|
|
422
423
|
process.stdout.write(` · ${s.id}: ${s.no_canary_reason ?? '(no reason recorded)'}\n`);
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
resetSourceCache,
|
|
43
43
|
type InventoryVerdict,
|
|
44
44
|
} from './_lib/loop_surfaces.js';
|
|
45
|
+
import { analyseModuleReach, groupCounts } from './_lib/module_reach.js';
|
|
45
46
|
|
|
46
47
|
const REPO_ROOT = process.cwd();
|
|
47
48
|
const TASKFILES_DIR = 'taskfiles';
|
|
@@ -312,6 +313,10 @@ function runGate(root: string): number {
|
|
|
312
313
|
units: 'exemption row(s) + unreachable target(s) + declared loop instrument(s)',
|
|
313
314
|
roots: [EXEMPTIONS_REL, INVENTORY_REL, ROOT_TASKFILE, TASKFILES_DIR],
|
|
314
315
|
});
|
|
316
|
+
// Phase 3.1 of road-to-modules-that-something-calls.md: five numbers beside
|
|
317
|
+
// this gate's existing verdicts, printed whether the gate passes or fails —
|
|
318
|
+
// reported, enforcing nothing, the way the estate gate prints its draft count.
|
|
319
|
+
process.stdout.write(moduleReachLine(moduleReachSummary(root)));
|
|
315
320
|
const inventoryClean = inv.shape.length === 0 && inv.reach.length === 0;
|
|
316
321
|
if (v.unreasoned.length === 0 && v.stale.length === 0 && inventoryClean) {
|
|
317
322
|
process.stdout.write(
|
|
@@ -506,13 +511,54 @@ function selfTest(): number {
|
|
|
506
511
|
}
|
|
507
512
|
}
|
|
508
513
|
|
|
514
|
+
export interface ModuleReachSummary {
|
|
515
|
+
/** The four group counts — the roadmap's "four group counts", over the unreferenced-by-name set only. */
|
|
516
|
+
groups: Record<'contract-test' | 'open-or-deferred-step' | 'named-outside-open-step' | 'named-in-none', number>;
|
|
517
|
+
/** "the total of modules reached by nothing" (import edges + run-by-path) — the fifth number. */
|
|
518
|
+
reachedByNothing: number;
|
|
519
|
+
/**
|
|
520
|
+
* Not one of the five — the size of the unreferenced-by-name set the four
|
|
521
|
+
* groups partition. Kept on the summary because it is a free cross-check
|
|
522
|
+
* (it must equal the sum of `groups`); never printed as a sixth number.
|
|
523
|
+
*/
|
|
524
|
+
unreferencedTotal: number;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* The five module-reach numbers (road-to-modules-that-something-calls.md
|
|
529
|
+
* Phase 3.1) — reported beside this gate's own verdicts, the way the estate
|
|
530
|
+
* gate prints its draft-roadmap count: a number that moves in a change's own
|
|
531
|
+
* gate output, enforcing nothing.
|
|
532
|
+
*/
|
|
533
|
+
export function moduleReachSummary(root: string): ModuleReachSummary {
|
|
534
|
+
const { modules } = analyseModuleReach(root);
|
|
535
|
+
const unreferenced = modules.filter((m) => !m.namedByProduction);
|
|
536
|
+
return {
|
|
537
|
+
groups: groupCounts(unreferenced),
|
|
538
|
+
reachedByNothing: modules.filter((m) => !m.reachedByImportOrPath).length,
|
|
539
|
+
unreferencedTotal: unreferenced.length,
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
export function moduleReachLine(s: ModuleReachSummary): string {
|
|
544
|
+
return (
|
|
545
|
+
`module reach (reported, not gated), src/scripts/_lib: ` +
|
|
546
|
+
`contract-test ${String(s.groups['contract-test'])} · ` +
|
|
547
|
+
`open-or-deferred-step ${String(s.groups['open-or-deferred-step'])} · ` +
|
|
548
|
+
`named-outside-open-step ${String(s.groups['named-outside-open-step'])} · ` +
|
|
549
|
+
`named-in-none ${String(s.groups['named-in-none'])} · ` +
|
|
550
|
+
`REACHED-BY-NOTHING total ${String(s.reachedByNothing)}\n`
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
|
|
509
554
|
export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
|
|
510
555
|
if (argv.includes('--self-test')) return selfTest();
|
|
511
556
|
if (argv.includes('--gate')) return runGate(root);
|
|
512
557
|
const r = analyse(root);
|
|
513
558
|
const inv = inventoryVerdict(root);
|
|
559
|
+
const moduleReach = moduleReachSummary(root);
|
|
514
560
|
if (argv.includes('--json')) {
|
|
515
|
-
process.stdout.write(`${JSON.stringify({ ...r, inventory: inv }, null, 2)}\n`);
|
|
561
|
+
process.stdout.write(`${JSON.stringify({ ...r, inventory: inv, moduleReach }, null, 2)}\n`);
|
|
516
562
|
return 0;
|
|
517
563
|
}
|
|
518
564
|
// Emitted on the DEFAULT invocation too, not only under `--gate`: the
|
|
@@ -538,6 +584,7 @@ export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT):
|
|
|
538
584
|
`prose-bound surfaces ${String(inv.proseBound.length)}\n`,
|
|
539
585
|
);
|
|
540
586
|
for (const f of inv.reach) process.stdout.write(` · ${f.id} — ${f.detail}\n`);
|
|
587
|
+
process.stdout.write(moduleReachLine(moduleReach));
|
|
541
588
|
return 0;
|
|
542
589
|
}
|
|
543
590
|
|
|
@@ -546,11 +546,59 @@ const HOST_LOWERING_TRIPLE: Triple = {
|
|
|
546
546
|
},
|
|
547
547
|
};
|
|
548
548
|
|
|
549
|
+
const GRAMMAR_REFERENCE = 'src/skills/git-workflow/references/commit-subject.md';
|
|
550
|
+
const GRAMMAR_GENERATOR = 'src/scripts/generate_git_convention_grammar.ts';
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* The commit-subject reference is the fallback a command reads when the
|
|
554
|
+
* `agent-config` binary cannot run, so its grammar block has to be the grammar
|
|
555
|
+
* the binary runs. The page itself is a source too: a hand edit to the block is
|
|
556
|
+
* the drift this row exists to catch.
|
|
557
|
+
*/
|
|
558
|
+
const GIT_CONVENTION_GRAMMAR_TRIPLE: Triple = {
|
|
559
|
+
id: 'git-convention-grammar',
|
|
560
|
+
output: GRAMMAR_REFERENCE,
|
|
561
|
+
remedy: './scripts-run src/scripts/generate_git_convention_grammar',
|
|
562
|
+
why: 'the reference carries a grammar and measurement block rendered from the modules the git:convention verb runs',
|
|
563
|
+
sourcesOf() {
|
|
564
|
+
return {
|
|
565
|
+
ok: true,
|
|
566
|
+
sources: [
|
|
567
|
+
{ kind: 'file', value: 'src/scripts/_lib/git_convention_grammar.ts' },
|
|
568
|
+
{ kind: 'file', value: 'src/scripts/_lib/git_convention_measure.ts' },
|
|
569
|
+
{ kind: 'file', value: GRAMMAR_GENERATOR },
|
|
570
|
+
{ kind: 'file', value: GRAMMAR_REFERENCE },
|
|
571
|
+
],
|
|
572
|
+
};
|
|
573
|
+
},
|
|
574
|
+
regenerate(root, workDir) {
|
|
575
|
+
const outFile = path.join(workDir, 'commit-subject.md');
|
|
576
|
+
const tsx = path.join(root, 'node_modules', '.bin', process.platform === 'win32' ? 'tsx.cmd' : 'tsx');
|
|
577
|
+
if (!fs.existsSync(tsx)) {
|
|
578
|
+
return { ok: false, reason: `no tsx at ${path.relative(root, tsx)} — run \`npm ci\` before this gate` };
|
|
579
|
+
}
|
|
580
|
+
const res = spawnSync(tsx, [path.join(root, GRAMMAR_GENERATOR), '--out', outFile], {
|
|
581
|
+
cwd: root,
|
|
582
|
+
encoding: 'utf8',
|
|
583
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
584
|
+
});
|
|
585
|
+
if (res.status !== 0) {
|
|
586
|
+
return { ok: false, reason: `generate_git_convention_grammar exited ${String(res.status)}: ${(res.stderr ?? '').trim()}` };
|
|
587
|
+
}
|
|
588
|
+
try {
|
|
589
|
+
return { ok: true, text: fs.readFileSync(outFile, 'utf8') };
|
|
590
|
+
} catch (e) {
|
|
591
|
+
return { ok: false, reason: `generate_git_convention_grammar reported success but wrote no readable file (${String(e)})` };
|
|
592
|
+
}
|
|
593
|
+
},
|
|
594
|
+
};
|
|
595
|
+
|
|
549
596
|
export const REGISTRY: readonly Triple[] = [
|
|
550
597
|
CENSUS_TRIPLE,
|
|
551
598
|
INSTALL_BUNDLE_TRIPLE,
|
|
552
599
|
HOOK_MANIFEST_TRIPLE,
|
|
553
600
|
HOST_LOWERING_TRIPLE,
|
|
601
|
+
GIT_CONVENTION_GRAMMAR_TRIPLE,
|
|
554
602
|
];
|
|
555
603
|
|
|
556
604
|
// ---------------------------------------------------------------------------
|