@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
|
@@ -607,7 +607,13 @@ function _checkAppendOnly(base: string | null, findings: Finding[]): void {
|
|
|
607
607
|
'--no-color',
|
|
608
608
|
ref,
|
|
609
609
|
'--',
|
|
610
|
-
'
|
|
610
|
+
// The JSONL drops, not the directory. `INTAKE_GLOB`, this module's
|
|
611
|
+
// docstring and every fixture in the suite all scope this check to
|
|
612
|
+
// `*.jsonl`; asking git for the directory made it govern the tracked
|
|
613
|
+
// skeleton too, so editing the README that documents the append-only
|
|
614
|
+
// rule was reported as a violation of it. `:(glob)` is explicit rather
|
|
615
|
+
// than relying on the default pathspec magic.
|
|
616
|
+
':(glob)agents/memory/intake/*.jsonl',
|
|
611
617
|
]);
|
|
612
618
|
if (rc !== 0) {
|
|
613
619
|
findings.push(new Finding(INTAKE_GLOB, 0, 'warning', `append-only: git diff failed vs ${ref}`));
|
|
@@ -332,7 +332,7 @@ export function payloadFingerprint(entryPath: string, size: number): string {
|
|
|
332
332
|
* convention and the class is empty by observation.
|
|
333
333
|
*/
|
|
334
334
|
const BOUND_PAYLOAD_EXCEPTIONS: readonly BoundPayloadException[] = [
|
|
335
|
-
{ fingerprint: '
|
|
335
|
+
{ fingerprint: '6de9a60d02af4883ab8f09171673a44924ca78ddadd55518f743e95651d3d257', path: 'agents/templates/.ai-council.yml.example', size: 31548, why: 'shipped council config TEMPLATE — a dotfile because the file it is copied to is one. RE-PINNED 2026-10-06, 30,561 -> 31,548 bytes: the exception is path-AND-size-bound by design, so step 3.1 of road-to-a-spend-bound-only-where-one-was-set moving the template cost_budget and debate ceilings to 0 (ADR-279), removing the stale "always asks before invoking" sentence and explaining both invalidated it and the gate refused the entry as unaccounted. The re-pin excepts the SAME path for the SAME reason at its measured new size — it does not widen the class, raise a cap, or except anything the gate was not already carrying. (Previously RE-PINNED 2026-09-07, 29,872 -> 30,561 bytes, for a `disabled_reason` honest-null block on the gemini seat.)' },
|
|
336
336
|
{ fingerprint: 'd36a53951c184db7481139235056e90b53a853714b3a68b31ba1349ecb95ac1d', path: 'agents/templates/.ai-video.xml.example', size: 9209, why: 'shipped video-provider config template — same reason as the council template' },
|
|
337
337
|
{ fingerprint: 'f83229412cf8cceaadd0cb1934140a0c7c8277df43edc590f370572f6df6da98', path: 'dist/agent-src/templates/agents/.gitattributes.fragment', size: 2140, why: 'gitattributes fragment the installer appends to a consumer repo' },
|
|
338
338
|
{ fingerprint: 'a4f51dba3a66c0f2c3548e77961271ed4d7b5ec8a6661ea359ff044758f0d921', path: 'src/templates/minimal/.agent-settings.yml', size: 1042, why: 'the minimal-install settings template; the dot is the consumer-side filename' },
|
|
@@ -79,6 +79,7 @@ import {
|
|
|
79
79
|
CURATED_HEAD_INSTRUCTION,
|
|
80
80
|
extract_changelog_section,
|
|
81
81
|
} from './_lib/release_material.js';
|
|
82
|
+
import { coverageLimitationNote, ledgerCoverageLabel } from './_lib/review_coverage.js';
|
|
82
83
|
import { assertScanned, assertWatchlistResolves, DeadScopeError } from './_lib/scan_scope.js';
|
|
83
84
|
|
|
84
85
|
const _HERE = fileURLToPath(import.meta.url);
|
|
@@ -339,6 +340,15 @@ export function main(argv: readonly string[]): number {
|
|
|
339
340
|
const contradictions = highlight_contradictions(curated, derived);
|
|
340
341
|
if (contradictions.length === 0) {
|
|
341
342
|
process.stdout.write(`✅ curated head plausible for ${version} (span ${from}..${to})\n`);
|
|
343
|
+
// How much of the change the self-review read, printed where the head's
|
|
344
|
+
// Known-limitations field is decided. Partial coverage IS a known
|
|
345
|
+
// limitation of the record, and the ledger was the only place it was
|
|
346
|
+
// written down. A label, not a floor — the exit code above is already
|
|
347
|
+
// fixed at 0 by the time this runs, deliberately.
|
|
348
|
+
const covNote = coverageLimitationNote(ledgerCoverageLabel(REPO_ROOT, version));
|
|
349
|
+
if (covNote !== null) {
|
|
350
|
+
process.stdout.write(`${covNote}\n`);
|
|
351
|
+
}
|
|
342
352
|
// Risk 2 of the roadmap that made `Known limitations` derivable, paid
|
|
343
353
|
// where it lands rather than in a comment: a self-declared residual is
|
|
344
354
|
// only detectable when somebody WROTE IT DOWN, so a derived `_none_`
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Release-manifest content check — the content half beside
|
|
4
|
+
* `check_release_pr_shape`.
|
|
5
|
+
*
|
|
6
|
+
* The shape check lets a release PR carry `package.json`, `package-lock.json`
|
|
7
|
+
* and the three plugin manifests, and it reads only their NAMES. Smoke is
|
|
8
|
+
* skipped on release heads (`docs/contracts/release-pr-gating.md`), so an added
|
|
9
|
+
* script, a new dependency or a changed `bin` path could ride a release PR with
|
|
10
|
+
* no gate reading it. This compares each manifest against the base and fails on
|
|
11
|
+
* any difference outside the version fields the release writes.
|
|
12
|
+
*
|
|
13
|
+
* Version fields are named per file, never matched by key name anywhere: in
|
|
14
|
+
* `package-lock.json` every dependency also has a `version`, and a key-name
|
|
15
|
+
* rule would wave a dependency bump through as a version bump.
|
|
16
|
+
*
|
|
17
|
+
* Usage: check_release_manifest_content [--base REF] [--root DIR]
|
|
18
|
+
* --base REF ref the head is compared against (default: origin/main)
|
|
19
|
+
* --root DIR repository root to read the head and run git in (testing)
|
|
20
|
+
*
|
|
21
|
+
* Exit codes: 0 = only version fields differ · 1 = other difference · 2 = usage/env.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { spawnSync } from 'node:child_process';
|
|
25
|
+
import * as fs from 'node:fs';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
28
|
+
|
|
29
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
30
|
+
|
|
31
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
32
|
+
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
33
|
+
|
|
34
|
+
type Segment = string;
|
|
35
|
+
/** A JSON path pattern; `*` matches any array index. */
|
|
36
|
+
type Pattern = readonly Segment[];
|
|
37
|
+
|
|
38
|
+
/** The manifests a release PR may carry, and the fields the release writes in each. */
|
|
39
|
+
export const VERSION_FIELDS: Readonly<Record<string, readonly Pattern[]>> = {
|
|
40
|
+
'package.json': [['version']],
|
|
41
|
+
'package-lock.json': [['version'], ['packages', '', 'version']],
|
|
42
|
+
'.claude-plugin/marketplace.json': [['version'], ['metadata', 'version'], ['plugins', '*', 'version']],
|
|
43
|
+
'.augment-plugin/plugin.json': [['version']],
|
|
44
|
+
'.augment-plugin/marketplace.json': [['version'], ['metadata', 'version'], ['plugins', '*', 'version']],
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function _matches(p: readonly Segment[], pat: Pattern): boolean {
|
|
48
|
+
if (p.length !== pat.length) return false;
|
|
49
|
+
return pat.every((seg, i) => seg === p[i] || (seg === '*' && /^\d+$/u.test(p[i] ?? '')));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function _render(p: readonly Segment[]): string {
|
|
53
|
+
return p.length === 0 ? '(root)' : p.map((s) => (/^\d+$/u.test(s) ? `[${s}]` : JSON.stringify(s))).join('.');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function _isObject(v: unknown): v is Record<string, unknown> {
|
|
57
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Every JSON path at which `a` and `b` differ, leaf-first where both are containers. */
|
|
61
|
+
function _diffPaths(a: unknown, b: unknown, at: Segment[] = []): Segment[][] {
|
|
62
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
63
|
+
if (a.length !== b.length) return [at];
|
|
64
|
+
return a.flatMap((v, i) => _diffPaths(v, b[i], [...at, String(i)]));
|
|
65
|
+
}
|
|
66
|
+
if (_isObject(a) && _isObject(b)) {
|
|
67
|
+
const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
68
|
+
const out: Segment[][] = [];
|
|
69
|
+
for (const k of keys) {
|
|
70
|
+
if (!(k in a) || !(k in b)) {
|
|
71
|
+
out.push([...at, k]);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
out.push(..._diffPaths(a[k], b[k], [...at, k]));
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
return JSON.stringify(a) === JSON.stringify(b) ? [] : [at];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The differences between `base` and `head` text of one manifest that are NOT a
|
|
83
|
+
* version-string change in a declared version field. Empty means in shape.
|
|
84
|
+
*/
|
|
85
|
+
export function manifestDifferences(file: string, base: string | null, head: string | null): string[] {
|
|
86
|
+
if (base === null && head === null) return [];
|
|
87
|
+
if (base === null) return [`${file}: added — absent at the base`];
|
|
88
|
+
if (head === null) return [`${file}: removed — present at the base`];
|
|
89
|
+
let a: unknown;
|
|
90
|
+
let b: unknown;
|
|
91
|
+
try {
|
|
92
|
+
a = JSON.parse(base);
|
|
93
|
+
b = JSON.parse(head);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
return [`${file}: not parseable JSON (${(err as Error).message})`];
|
|
96
|
+
}
|
|
97
|
+
const allowed = VERSION_FIELDS[file] ?? [];
|
|
98
|
+
const out: string[] = [];
|
|
99
|
+
for (const p of _diffPaths(a, b)) {
|
|
100
|
+
const atVersion = allowed.some((pat) => _matches(p, pat));
|
|
101
|
+
let before: unknown = a;
|
|
102
|
+
let after: unknown = b;
|
|
103
|
+
for (const s of p) {
|
|
104
|
+
before = (before as Record<string, unknown> | undefined)?.[s];
|
|
105
|
+
after = (after as Record<string, unknown> | undefined)?.[s];
|
|
106
|
+
}
|
|
107
|
+
if (atVersion && typeof before === 'string' && typeof after === 'string') continue;
|
|
108
|
+
out.push(`${file}: ${_render(p)} differs outside the version fields`);
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function _git(args: readonly string[], cwd: string): { status: number; stdout: string } {
|
|
114
|
+
const r = spawnSync('git', args, { cwd, encoding: 'utf8' });
|
|
115
|
+
return { status: r.status ?? 1, stdout: r.stdout ?? '' };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function _readHead(root: string, file: string): string | null {
|
|
119
|
+
const abs = path.join(root, file);
|
|
120
|
+
return fs.existsSync(abs) ? fs.readFileSync(abs, 'utf8') : null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
124
|
+
let base = 'origin/main';
|
|
125
|
+
let root = REPO_ROOT;
|
|
126
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
127
|
+
const a = argv[i];
|
|
128
|
+
if (a === '--base' || a === '--root') {
|
|
129
|
+
const v = argv[i + 1];
|
|
130
|
+
if (v === undefined || v === '') {
|
|
131
|
+
process.stderr.write(`error: ${a} needs a value\n`);
|
|
132
|
+
return 2;
|
|
133
|
+
}
|
|
134
|
+
if (a === '--base') base = v;
|
|
135
|
+
else root = path.resolve(v);
|
|
136
|
+
i += 1;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
process.stderr.write(`error: unknown argument ${String(a)}\n`);
|
|
140
|
+
return 2;
|
|
141
|
+
}
|
|
142
|
+
if (_git(['rev-parse', '--verify', `${base}^{commit}`], root).status !== 0) {
|
|
143
|
+
process.stderr.write(`error: base \`${base}\` does not resolve to a commit in ${root}\n`);
|
|
144
|
+
return 2;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const findings: string[] = [];
|
|
148
|
+
let scanned = 0;
|
|
149
|
+
for (const file of Object.keys(VERSION_FIELDS)) {
|
|
150
|
+
const shown = _git(['show', `${base}:${file}`], root);
|
|
151
|
+
const before = shown.status === 0 ? shown.stdout : null;
|
|
152
|
+
const after = _readHead(root, file);
|
|
153
|
+
if (before !== null || after !== null) scanned += 1;
|
|
154
|
+
findings.push(...manifestDifferences(file, before, after));
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
reportScanned({ gate: 'check_release_manifest_content', scanned, units: 'manifests', roots: [root] });
|
|
158
|
+
} catch (err) {
|
|
159
|
+
if (err instanceof DeadScopeError) {
|
|
160
|
+
process.stderr.write(`${err.message}\n`);
|
|
161
|
+
return 2;
|
|
162
|
+
}
|
|
163
|
+
throw err;
|
|
164
|
+
}
|
|
165
|
+
if (findings.length > 0) {
|
|
166
|
+
process.stdout.write(
|
|
167
|
+
`❌ release manifests differ from ${base} outside their version fields:\n` +
|
|
168
|
+
findings.map((f) => ` · ${f}`).join('\n') +
|
|
169
|
+
'\n A release PR carries version bumps only. Land the other change on main via its own PR.\n',
|
|
170
|
+
);
|
|
171
|
+
return 1;
|
|
172
|
+
}
|
|
173
|
+
process.stdout.write(`✅ release manifests differ from ${base} in version fields only (${String(scanned)} read)\n`);
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function _isCliEntry(): boolean {
|
|
178
|
+
if (process.argv[1] === undefined) return false;
|
|
179
|
+
if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) return true;
|
|
180
|
+
try {
|
|
181
|
+
return fs.realpathSync(_HERE) === fs.realpathSync(path.resolve(process.argv[1]));
|
|
182
|
+
} catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (_isCliEntry()) {
|
|
188
|
+
process.exit(main());
|
|
189
|
+
}
|
|
@@ -45,6 +45,16 @@ const ALLOWLIST_GLOBS = [
|
|
|
45
45
|
// be able to carry the dispositions of its own self-review findings; the
|
|
46
46
|
// finding-dispositions gate is red until blocking ones are recorded here.
|
|
47
47
|
'agents/evidence/release-findings/*.json',
|
|
48
|
+
// Evidence-temperature census — `taskfiles/content.yml` § release-prepare
|
|
49
|
+
// writes one per release, so without this entry the pipeline generates a
|
|
50
|
+
// file its own shape step refuses. Digit classes rather than `?`: fnmatch
|
|
51
|
+
// `?` compiles to `.` under the `s` flag, so it matches any character AND
|
|
52
|
+
// crosses `/` — `????-??-??` admits `evidence-temperature-x/yz-ab-cd.md`,
|
|
53
|
+
// which `[0-9]` cannot. Two reports can appear in one release PR, and
|
|
54
|
+
// both are in shape: `--resume` re-runs release-prepare, so a release
|
|
55
|
+
// carried across UTC midnight writes a second census. What that one
|
|
56
|
+
// contains is the census's business, not this gate's.
|
|
57
|
+
'agents/evidence/analysis/evidence-temperature-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].md', // code-comment-allow provenance-comment -- the glob IS this gate's operand, not where the code came from
|
|
48
58
|
// Project-settings template pin — bumped by release.ts set_template_pin and
|
|
49
59
|
// its regenerated dist twin (kept in lockstep with package.json.version).
|
|
50
60
|
'src/agent-src/templates/agents/agent-project-settings.example.yml',
|
|
@@ -52,16 +62,26 @@ const ALLOWLIST_GLOBS = [
|
|
|
52
62
|
] as const;
|
|
53
63
|
|
|
54
64
|
/**
|
|
55
|
-
* Translate a Python `fnmatch` shell pattern to a RegExp,
|
|
56
|
-
* `fnmatch.translate
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
65
|
+
* Translate a Python `fnmatch` shell pattern to a RegExp, following
|
|
66
|
+
* `fnmatch.translate` for the constructs the allowlist actually uses: `*` and
|
|
67
|
+
* `[0-9]`. No entry uses `?`, and bracket handling beyond that one class is
|
|
68
|
+
* unverified against CPython — see the note at the bracket branch.
|
|
69
|
+
*
|
|
70
|
+
* Matching is case-sensitive, as `fnmatchcase` on a normalized path.
|
|
71
|
+
*
|
|
72
|
+
* THE PROPERTY THE WILDCARD ENTRIES TURN ON — the literal paths are unaffected:
|
|
73
|
+
* in fnmatch, `*` and `?` DO cross path separators.
|
|
74
|
+
* `*` becomes `.*` and `?` becomes `.`, both under the `s` flag, so each matches
|
|
75
|
+
* `/` like any other character. Glob syntax elsewhere (shells, .gitignore) stops
|
|
76
|
+
* `*` at a segment boundary; this does not. So the pack entry admits any depth
|
|
77
|
+
* beneath `src/packs/`, and the census entry uses digit classes precisely
|
|
78
|
+
* because they cannot match a separator. Both sides are pinned in
|
|
79
|
+
* `check_release_pr_shape.test.ts`.
|
|
61
80
|
*/
|
|
62
81
|
function _fnmatchToRegExp(pat: string): RegExp {
|
|
63
|
-
//
|
|
64
|
-
//
|
|
82
|
+
// `*` → `.*`, `?` → `.`, a bracket class kept, everything else escaped.
|
|
83
|
+
// CPython does more inside a class (hyphen and set-operator escaping, `(?!)`
|
|
84
|
+
// for an empty one) and this does not — see the bracket branch below.
|
|
65
85
|
let i = 0;
|
|
66
86
|
const n = pat.length;
|
|
67
87
|
let res = '';
|
|
@@ -87,12 +107,13 @@ function _fnmatchToRegExp(pat: string): RegExp {
|
|
|
87
107
|
res += '\\[';
|
|
88
108
|
} else {
|
|
89
109
|
let stuff = pat.slice(i, j);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
110
|
+
// The two arms this replaces were byte-identical, so the branch
|
|
111
|
+
// implemented nothing. Bracket handling here is checked against
|
|
112
|
+
// `[0-9]`, the only class the allowlist uses; anything else is
|
|
113
|
+
// untested against CPython, whose behaviour also varies by
|
|
114
|
+
// version. Add a bracket glob and verify it rather than assuming
|
|
115
|
+
// this mirrors `fnmatch.translate` beyond that one case.
|
|
116
|
+
stuff = stuff.replace(/\\/g, '\\\\');
|
|
96
117
|
i = j + 1;
|
|
97
118
|
if (stuff.startsWith('!')) {
|
|
98
119
|
stuff = '^' + stuff.slice(1);
|
|
@@ -105,7 +126,9 @@ function _fnmatchToRegExp(pat: string): RegExp {
|
|
|
105
126
|
res += c.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
106
127
|
}
|
|
107
128
|
}
|
|
108
|
-
// Python
|
|
129
|
+
// Full match with dotAll. Python spells the same thing `(?s:%s)\Z`; in JS
|
|
130
|
+
// `$` without the `m` flag does not match before a trailing newline, so
|
|
131
|
+
// `^(?:…)$` is equivalent rather than merely similar.
|
|
109
132
|
return new RegExp(`^(?:${res})$`, 's');
|
|
110
133
|
}
|
|
111
134
|
|
|
@@ -31,26 +31,47 @@
|
|
|
31
31
|
* Exit codes: `0` under cap · `1` over cap or an unstated cap raise · `2` usage
|
|
32
32
|
* error · `3` dead scan scope.
|
|
33
33
|
*
|
|
34
|
-
*
|
|
34
|
+
* THIS IS DELIBERATELY NOT A CI GATE, AND THE REASON IS NARROWER THAN IT WAS.
|
|
35
35
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* **neither** layer exists
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
36
|
+
* **Corrected 2026-10-05 (step 0.1 of
|
|
37
|
+
* `road-to-a-rule-carrier-that-works-outside-the-repo`).** This section used to
|
|
38
|
+
* say "no CI workflow performs a user-scope install, so on a fresh runner
|
|
39
|
+
* **neither** layer exists", and then concluded that making the measurement
|
|
40
|
+
* CI-observable "needs the `InstructionsLoaded` record committed from a real
|
|
41
|
+
* session, which is a different piece of work". The first clause describes a
|
|
42
|
+
* workflow inventory; the second turns it into a capability claim, and that
|
|
43
|
+
* step does not hold. A runner CAN stage a user-scope install: the installer
|
|
44
|
+
* reads `HOME` from the environment, and
|
|
45
|
+
* `tests/install/global_install_hooks_smoke.test.ts` already drives
|
|
46
|
+
* `src/scripts/install --global --tools=claude-code` against a `mkdtemp` HOME
|
|
47
|
+
* and asserts the tree it produced. Nothing about the `InstructionsLoaded`
|
|
48
|
+
* event is required to observe the FILESYSTEM half, which is what this script's
|
|
49
|
+
* `filesystem` input reads.
|
|
45
50
|
*
|
|
46
|
-
* What
|
|
51
|
+
* What stays true, and is the real reason this is not in `gate-coverage.yml`:
|
|
52
|
+
* **this gate measures THIS machine**, by design. `main()` resolves
|
|
53
|
+
* `os.homedir()` and `REPO_ROOT`, and the question it answers — "how much is
|
|
54
|
+
* the developer in front of me actually loading" — is about a machine, not
|
|
55
|
+
* about a commit. A CI run of it would measure the runner, which is a tree
|
|
56
|
+
* nobody works in, so the number would be real and uninteresting. The
|
|
57
|
+
* `measureStandingDelivery` function underneath takes both directories as
|
|
58
|
+
* PARAMETERS and is therefore already temp-HOME-capable; what is missing is a
|
|
59
|
+
* reason to point it at a runner, not a way to.
|
|
60
|
+
*
|
|
61
|
+
* The honest cost is unchanged: the duplicate-delivery defect is not
|
|
47
62
|
* mechanically caught for anyone who never runs this locally. The enforced layer
|
|
48
63
|
* is the installer gate (`install.ts::_gate_rule_layer_overlap`), which refuses
|
|
49
64
|
* to CREATE the doubled state; this script measures a state that already exists.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
65
|
+
*
|
|
66
|
+
* `_lib/installed_layer.ts` is the step-0.1 library that takes the same reading
|
|
67
|
+
* per host rule directory with every input as a parameter, and
|
|
68
|
+
* `installed_layer_report.ts` is its report. The two measure different things —
|
|
69
|
+
* that one counts characters after the frontmatter and block-comment strip,
|
|
70
|
+
* this one counts tokens over whole files against a cap — and neither number
|
|
71
|
+
* converts into the other.
|
|
52
72
|
*/
|
|
53
73
|
|
|
74
|
+
import { createHash } from 'node:crypto';
|
|
54
75
|
import * as fs from 'node:fs';
|
|
55
76
|
import * as os from 'node:os';
|
|
56
77
|
import * as path from 'node:path';
|
|
@@ -60,6 +81,8 @@ import { fileURLToPath } from 'node:url';
|
|
|
60
81
|
import { assertScanned, DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
61
82
|
import { measure, method_note } from './_lib/token_count.js';
|
|
62
83
|
import * as rule_layer_overlap from './_lib/rule_layer_overlap.js';
|
|
84
|
+
import { lawText, ruleBody } from './_lib/rule_law_section.js';
|
|
85
|
+
import { is_thin_entry, lawDigest, STUB_LAW_OPEN } from './_lib/thin_rules.js';
|
|
63
86
|
|
|
64
87
|
const PROG = 'check_standing_rule_delivery';
|
|
65
88
|
const _HERE = fileURLToPath(import.meta.url);
|
|
@@ -185,6 +208,80 @@ export function measureStandingDelivery(
|
|
|
185
208
|
};
|
|
186
209
|
}
|
|
187
210
|
|
|
211
|
+
/** One installed rule, compared against the source it was installed from. */
|
|
212
|
+
export interface ReinstallRow {
|
|
213
|
+
readonly layer: string;
|
|
214
|
+
readonly id: string;
|
|
215
|
+
/** What the two digests are of — named, so a reader knows what "differs" means. */
|
|
216
|
+
readonly compared: 'body' | 'law' | 'none';
|
|
217
|
+
readonly installed: string;
|
|
218
|
+
readonly source: string;
|
|
219
|
+
readonly status: 'current' | 'pending reinstall' | 'no source';
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function bodyDigest(text: string): string {
|
|
223
|
+
return createHash('sha256').update(ruleBody(text), 'utf-8').digest('hex').slice(0, 16);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Per installed rule: its digest against the CURRENT source digest
|
|
228
|
+
* (`road-to-a-default-install-served-once` step 1.2).
|
|
229
|
+
*
|
|
230
|
+
* The cap above measures installed directories only, by design, so a source
|
|
231
|
+
* rule that got smaller is invisible until a reinstall. This names every rule
|
|
232
|
+
* whose installed copy no longer matches its source as `pending reinstall`.
|
|
233
|
+
* It REPORTS and fails nothing — every source edit makes an older install
|
|
234
|
+
* differ, and that is a state to act on, not an error.
|
|
235
|
+
*
|
|
236
|
+
* What is compared depends on the installed form, and the row says which:
|
|
237
|
+
*
|
|
238
|
+
* - **body** — a full-bodied copy: sha256 of the body after the frontmatter
|
|
239
|
+
* and comment strip, because the installer rewrites the frontmatter into
|
|
240
|
+
* host form and the body is what the host reads.
|
|
241
|
+
* - **law** — a stub carrying a copied law: the digest the stub recorded
|
|
242
|
+
* against the digest of the source's law section today.
|
|
243
|
+
* - **none** — a stub with no copied text: its body is read from the package
|
|
244
|
+
* at delivery, so nothing installed can go stale.
|
|
245
|
+
*/
|
|
246
|
+
export function reinstallRows(
|
|
247
|
+
layer: string,
|
|
248
|
+
installed_dir: string,
|
|
249
|
+
source_dir: string,
|
|
250
|
+
): ReinstallRow[] {
|
|
251
|
+
const l = rule_layer_overlap.readRuleLayer(installed_dir);
|
|
252
|
+
if (l === null) return [];
|
|
253
|
+
const rows: ReinstallRow[] = [];
|
|
254
|
+
for (const [name, text] of l.files) {
|
|
255
|
+
const id = name.replace(/\.md$/, '');
|
|
256
|
+
let src: string | null;
|
|
257
|
+
try {
|
|
258
|
+
src = fs.readFileSync(path.join(source_dir, name), 'utf-8');
|
|
259
|
+
} catch {
|
|
260
|
+
src = null;
|
|
261
|
+
}
|
|
262
|
+
let compared: ReinstallRow['compared'] = 'body';
|
|
263
|
+
let installed = bodyDigest(text);
|
|
264
|
+
let source = src === null ? '-' : bodyDigest(src);
|
|
265
|
+
if (is_thin_entry(text)) {
|
|
266
|
+
const at = text.indexOf(STUB_LAW_OPEN);
|
|
267
|
+
if (at === -1) {
|
|
268
|
+
compared = 'none';
|
|
269
|
+
installed = '-';
|
|
270
|
+
source = '-';
|
|
271
|
+
} else {
|
|
272
|
+
compared = 'law';
|
|
273
|
+
installed = text.slice(at + STUB_LAW_OPEN.length).split(' ')[0] ?? '';
|
|
274
|
+
const law = src === null ? null : lawText(ruleBody(src));
|
|
275
|
+
source = law === null ? '-' : lawDigest(law);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const status: ReinstallRow['status'] =
|
|
279
|
+
src === null ? 'no source' : installed === source ? 'current' : 'pending reinstall';
|
|
280
|
+
rows.push({ layer, id, compared, installed, source, status });
|
|
281
|
+
}
|
|
282
|
+
return rows;
|
|
283
|
+
}
|
|
284
|
+
|
|
188
285
|
/**
|
|
189
286
|
* Where the loaded-instruction record would live if the host wrote one.
|
|
190
287
|
*
|
|
@@ -311,6 +408,25 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
|
311
408
|
);
|
|
312
409
|
}
|
|
313
410
|
|
|
411
|
+
// Step 1.2 — the installed copy against the current source, per rule.
|
|
412
|
+
// Reported, never failed: see `reinstallRows`.
|
|
413
|
+
const source_dir = path.join(REPO_ROOT, 'dist', 'agent-src', 'rules');
|
|
414
|
+
const rows = [
|
|
415
|
+
...reinstallRows('global', path.join(os.homedir(), '.claude', 'rules'), source_dir),
|
|
416
|
+
...reinstallRows('project', path.join(REPO_ROOT, '.claude', 'rules'), source_dir),
|
|
417
|
+
];
|
|
418
|
+
const pending = rows.filter((r) => r.status === 'pending reinstall');
|
|
419
|
+
out(
|
|
420
|
+
` reinstall ${pending.length} of ${rows.length} installed rule(s) differ from `
|
|
421
|
+
+ `${path.relative(REPO_ROOT, source_dir)} (installed digest vs current source digest)\n`,
|
|
422
|
+
);
|
|
423
|
+
for (const r of rows) {
|
|
424
|
+
out(
|
|
425
|
+
` ${r.layer.padEnd(8)} ${r.id.padEnd(40)} ${r.compared.padEnd(5)} `
|
|
426
|
+
+ `${r.installed.padEnd(16)} ${r.source.padEnd(16)} ${r.status}\n`,
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
314
430
|
const pct = total / budget.total_cap_tokens;
|
|
315
431
|
out(
|
|
316
432
|
` TOTAL ${String(total).padStart(13)} tok / ${budget.total_cap_tokens} cap `
|
|
@@ -264,11 +264,8 @@ export const SUPPRESSION_INVENTORY: readonly SuppressionSpec[] = [
|
|
|
264
264
|
file: 'src/config/conformance-claim-baseline.json',
|
|
265
265
|
listKey: 'undeclared',
|
|
266
266
|
tier: 'string_list',
|
|
267
|
-
//
|
|
268
|
-
//
|
|
269
|
-
// main — the scan below fails while it is set and the file resolves,
|
|
270
|
-
// so the flag closes itself rather than needing to be remembered.
|
|
271
|
-
newInThisChange: true,
|
|
267
|
+
// `newInThisChange` removed: the baseline resolves at the base ref since
|
|
268
|
+
// 9a013fac5, and the scan reported the stale flag as designed.
|
|
272
269
|
what: 'skill and rule artefacts carrying a standard-conformance claim with no enforced_by declaration',
|
|
273
270
|
},
|
|
274
271
|
];
|