@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
|
@@ -6,10 +6,14 @@
|
|
|
6
6
|
* Python module exactly (snake_case kept deliberately — fidelity over
|
|
7
7
|
* TS idiom).
|
|
8
8
|
*
|
|
9
|
-
* Per `docs/contracts/hook-architecture-v1.md
|
|
10
|
-
* that writes under `agents
|
|
11
|
-
*
|
|
12
|
-
* 1. Acquire an exclusive lock on
|
|
9
|
+
* Per `docs/contracts/hook-architecture-v1.md`, Concurrency, every concern
|
|
10
|
+
* that writes a state file under `agents/` MUST:
|
|
11
|
+
*
|
|
12
|
+
* 1. Acquire an exclusive lock on `<state_dir>/.dispatcher.lock` — the SAME
|
|
13
|
+
* directory the target file lives in, derived from the target's own
|
|
14
|
+
* path (`path.dirname`), never a single fixed location: one concern's
|
|
15
|
+
* target under `agents/runtime/state/` locks there, another's target
|
|
16
|
+
* under `agents/state/` locks there instead.
|
|
13
17
|
* 2. Write to a sibling `<dest>.tmp.<pid>` file in the same directory.
|
|
14
18
|
* 3. Rename(2) (atomic on the same filesystem) tmp → dest.
|
|
15
19
|
* 4. Release the lock.
|
|
@@ -9,6 +9,27 @@ import { createHash } from 'node:crypto';
|
|
|
9
9
|
* dispatcher: `dispatch_hook` → `host_semantics` → `host_lowering` is a live
|
|
10
10
|
* import chain, so the reverse edge would be a cycle.
|
|
11
11
|
*
|
|
12
|
+
* THE RETIRED ARGUMENT, kept because both callers point here for it rather
|
|
13
|
+
* than restating it. `dispatch_hook._manifest_fingerprint` argued AGAINST a
|
|
14
|
+
* cryptographic hash on two grounds, and by the time road-to-blocking-
|
|
15
|
+
* severities 3.1 read that header the body had already been delegating here for
|
|
16
|
+
* a release — so a reader checking whether the dispatcher resists a CRAFTED
|
|
17
|
+
* sibling met a disclaimer the code had stopped making. Both grounds were
|
|
18
|
+
* re-measured when this module was extracted, and both were stale:
|
|
19
|
+
*
|
|
20
|
+
* - "`require('node:crypto')` costs 8 ms of process start, which is most of
|
|
21
|
+
* what the precompiled manifest exists to save." The module is already
|
|
22
|
+
* loaded: `dist/hooks/dispatch.js` carries 23 top-level
|
|
23
|
+
* `import … from "node:crypto"` statements from other parts of the graph,
|
|
24
|
+
* so the cost is paid whether this function uses it or not.
|
|
25
|
+
* - "An FNV-1a loop runs in about 0.2 ms and is the right trade." SHA-256
|
|
26
|
+
* measured FASTER — 0.106 ms against 0.113 ms over the 99,792-byte
|
|
27
|
+
* manifest — because Node's digest is native and the loop was that many
|
|
28
|
+
* interpreted `charCodeAt` calls.
|
|
29
|
+
*
|
|
30
|
+
* Both readers now point here instead of restating it, so the argument and the
|
|
31
|
+
* numbers that retired it cannot part company again.
|
|
32
|
+
*
|
|
12
33
|
* DELIBERATELY CONTENT-DERIVED, NOT MTIME. The first version of the manifest
|
|
13
34
|
* fast path compared mtimes and that was a measured defect, not a theoretical
|
|
14
35
|
* one: on a fresh `actions/checkout` both files carry the checkout timestamp in
|
|
@@ -22,12 +22,19 @@
|
|
|
22
22
|
* activates only when `enabled` is true AND the org pack supplied an
|
|
23
23
|
* endpoint, an org id, and a salt. An external clone of this repository
|
|
24
24
|
* carries the key names and no values, so copying the tree cannot reach the
|
|
25
|
-
* write path. When inactive this concern performs zero
|
|
26
|
-
* operations — no log write, no
|
|
25
|
+
* write path. When inactive this concern performs zero TELEMETRY file
|
|
26
|
+
* operations — no log write, no spool, no directory under the configured
|
|
27
|
+
* output path — and zero network calls.
|
|
27
28
|
* (It does read `.agent-settings.yml`, once per process and memoised: the
|
|
28
29
|
* settings file is how it learns it is off, the same as the artefact-
|
|
29
30
|
* engagement surface it mirrors.)
|
|
30
31
|
*
|
|
32
|
+
* The foreign-MCP tool-name recorder that once branched here lives in its own
|
|
33
|
+
* concern, `mcp-usage-observation` (road-to-neighbours-that-pull-their-weight
|
|
34
|
+
* D12): this concern's `tools: [Skill]` filter meant the dispatcher never
|
|
35
|
+
* called that branch, and default-on local collection does not belong under an
|
|
36
|
+
* opt-in telemetry name.
|
|
37
|
+
*
|
|
31
38
|
* NO OUTBOUND CALL EXISTS HERE, DELIBERATELY. Transport is Phase 2 and is
|
|
32
39
|
* blocked on `sink-choice`; org-wide enablement is Phase 3 and is blocked on
|
|
33
40
|
* `dpo-signoff`. This concern appends to a local JSONL file and stops.
|
|
@@ -247,7 +254,8 @@ function processEnvelope(envelope: JsonValue, consumer_root: string): number {
|
|
|
247
254
|
if (!isObject(envelope)) return EXIT_ALLOW;
|
|
248
255
|
|
|
249
256
|
const payload = unwrapPayload(envelope);
|
|
250
|
-
|
|
257
|
+
const tool = extractToolName(payload);
|
|
258
|
+
if (tool !== SKILL_TOOL_NAME) return EXIT_ALLOW;
|
|
251
259
|
|
|
252
260
|
const { settings, text, root } = readSettingsFor(consumer_root);
|
|
253
261
|
if (!settings.active) return EXIT_ALLOW;
|
|
@@ -339,11 +347,18 @@ export function main(): number {
|
|
|
339
347
|
|
|
340
348
|
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
341
349
|
// every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
|
|
350
|
+
//
|
|
351
|
+
// The bundle test is at the CALL SITE rather than at the top of
|
|
352
|
+
// `_isCliEntry`, and that placement is the whole point. Inside the function
|
|
353
|
+
// esbuild folds the condition to `if (true) return false` and then emits the
|
|
354
|
+
// nine unreachable lines below it anyway — measured at 475 bytes of dead code
|
|
355
|
+
// in a bundle `check_hook_bundle_composition` caps. Guarding the call instead
|
|
356
|
+
// makes the whole statement `if (false)`, which esbuild drops, taking the now
|
|
357
|
+
// unreferenced function with it. Behavior outside the bundle is unchanged:
|
|
358
|
+
// `__AGENT_CONFIG_BUNDLE__` is undeclared there, the first operand is true,
|
|
359
|
+
// and `!__AGENT_CONFIG_BUNDLE__` is never evaluated — so no ReferenceError.
|
|
342
360
|
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
343
361
|
function _isCliEntry(): boolean {
|
|
344
|
-
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
345
|
-
return false;
|
|
346
|
-
}
|
|
347
362
|
if (process.argv[1] === undefined) return false;
|
|
348
363
|
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
349
364
|
if (import.meta.url === argvUrl) return true;
|
|
@@ -353,4 +368,6 @@ function _isCliEntry(): boolean {
|
|
|
353
368
|
return false;
|
|
354
369
|
}
|
|
355
370
|
}
|
|
356
|
-
if (
|
|
371
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ === 'undefined' || !__AGENT_CONFIG_BUNDLE__) {
|
|
372
|
+
if (_isCliEntry()) process.exit(main());
|
|
373
|
+
}
|
|
@@ -186,6 +186,17 @@ export { readTurnRunState };
|
|
|
186
186
|
// Detector E, extracted to `_lib` where its prose costs no ratchet debt.
|
|
187
187
|
// Re-exported so every existing importer of this module is unchanged.
|
|
188
188
|
import { detectDroppedDecision } from '../_lib/dropped_decision.js';
|
|
189
|
+
// Step 3.2 of `road-to-a-graph-that-feeds-the-gate` — the shadow feeder. It
|
|
190
|
+
// lives in `_lib` for the reason every other extraction here does: this file
|
|
191
|
+
// sits against a 1,500-line shrink-only source budget, and the module it would
|
|
192
|
+
// otherwise grow into is one a recall reading has to be able to open on its own.
|
|
193
|
+
import {
|
|
194
|
+
appendFeederRow,
|
|
195
|
+
buildFeederRow,
|
|
196
|
+
type FeederLayer,
|
|
197
|
+
graphUntestedVerdict,
|
|
198
|
+
} from '../_lib/graph_feeder_record.js';
|
|
199
|
+
import { type GraphState, graphState } from '../code_graph/detect.js';
|
|
189
200
|
import { isVerificationCommand } from '../_lib/verification_command.js';
|
|
190
201
|
// Round 8 — the record path detector C prefers over its own regex. The regex
|
|
191
202
|
// reads a command's TEXT and `echo test` matches it; these read what the run
|
|
@@ -215,6 +226,7 @@ import {
|
|
|
215
226
|
readInstallBoundary,
|
|
216
227
|
sessionRefusalFile,
|
|
217
228
|
sessionShadowFile,
|
|
229
|
+
shadowSetBy,
|
|
218
230
|
type RefusalRecord,
|
|
219
231
|
type ShadowLayer,
|
|
220
232
|
type ShadowRecord,
|
|
@@ -1276,6 +1288,66 @@ function runDetectors(inputs: DetectorInputs): Finding[] {
|
|
|
1276
1288
|
return findings;
|
|
1277
1289
|
}
|
|
1278
1290
|
|
|
1291
|
+
/**
|
|
1292
|
+
* Write the graph feeder row for ONE stop (step 3.2).
|
|
1293
|
+
*
|
|
1294
|
+
* Called from both stop paths with the findings that path already computed, so
|
|
1295
|
+
* the F verdict in the row is the SAME verdict the gate acted on — never a
|
|
1296
|
+
* second evaluation written beside it, which is the shape
|
|
1297
|
+
* `obligation_settle_hook.ts` names as measuring nothing.
|
|
1298
|
+
*
|
|
1299
|
+
* It changes no exit code, and the whole body is wrapped: a stop that crashed on
|
|
1300
|
+
* its own instrument would be a new failure mode on a path that is supposed to
|
|
1301
|
+
* cost nothing. The graph half is skipped outright unless the state is `fresh`
|
|
1302
|
+
* or `edited` — an answer from an index that predates the change is not evidence
|
|
1303
|
+
* about the change.
|
|
1304
|
+
*/
|
|
1305
|
+
function recordGraphFeeder(
|
|
1306
|
+
inputs: DetectorInputs,
|
|
1307
|
+
findings: readonly Finding[],
|
|
1308
|
+
layer: FeederLayer,
|
|
1309
|
+
): void {
|
|
1310
|
+
if (is_replay_mode()) return;
|
|
1311
|
+
try {
|
|
1312
|
+
let state: GraphState;
|
|
1313
|
+
try {
|
|
1314
|
+
state = graphState(inputs.workspaceRoot);
|
|
1315
|
+
} catch {
|
|
1316
|
+
return;
|
|
1317
|
+
}
|
|
1318
|
+
// No graph at all is the silent case, exactly as it is for the context
|
|
1319
|
+
// hook: a consumer who never builds one never grows this file.
|
|
1320
|
+
if (state === 'absent') return;
|
|
1321
|
+
// The SAME path set detector F reads, filtered by the SAME predicate.
|
|
1322
|
+
// A completion review found the two arms running over different inputs:
|
|
1323
|
+
// the feeder passed every edit path while F filters to production
|
|
1324
|
+
// source, so the graph arm would have fired on precisely the turns F is
|
|
1325
|
+
// silent for — a recall comparison between two detectors answering
|
|
1326
|
+
// different questions, which is worse than no comparison.
|
|
1327
|
+
const paths = inputs.toolCalls
|
|
1328
|
+
.filter((c) => _EDIT_TOOLS.has(c.name) && c.path !== undefined)
|
|
1329
|
+
.map((c) => c.path as string)
|
|
1330
|
+
.filter(_isProductionSource);
|
|
1331
|
+
const f = findings.find((x) => x.detector === 'untested');
|
|
1332
|
+
appendFeederRow(
|
|
1333
|
+
inputs.workspaceRoot,
|
|
1334
|
+
inputs.sessionKey,
|
|
1335
|
+
buildFeederRow({
|
|
1336
|
+
root: inputs.workspaceRoot,
|
|
1337
|
+
turn: inputs.turnOrdinal,
|
|
1338
|
+
layer,
|
|
1339
|
+
state,
|
|
1340
|
+
fFired: f !== undefined,
|
|
1341
|
+
fMode: f?.mode ?? null,
|
|
1342
|
+
paths,
|
|
1343
|
+
graph: graphUntestedVerdict(inputs.workspaceRoot, state, paths),
|
|
1344
|
+
}),
|
|
1345
|
+
);
|
|
1346
|
+
} catch {
|
|
1347
|
+
// An instrument is never a reason to change what the gate does.
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1279
1351
|
/**
|
|
1280
1352
|
* Record what this retry WOULD have been refused for, then let it end.
|
|
1281
1353
|
*
|
|
@@ -1289,6 +1361,14 @@ function recordShadow(inputs: DetectorInputs, layer: ShadowLayer): void {
|
|
|
1289
1361
|
if (is_replay_mode()) return;
|
|
1290
1362
|
try {
|
|
1291
1363
|
const findings = runDetectors(inputs);
|
|
1364
|
+
// On `refused_turn` the answer is `ours` by construction — that marker
|
|
1365
|
+
// is this gate's own and nothing else writes it. On `stop_hook_active`
|
|
1366
|
+
// the host sets the flag for ANY stop hook's block, so it has to be
|
|
1367
|
+
// read from our own refusal record rather than assumed.
|
|
1368
|
+
const setBy = layer === 'refused_turn'
|
|
1369
|
+
? 'ours'
|
|
1370
|
+
: shadowSetBy(inputs.workspaceRoot, inputs.sessionKey);
|
|
1371
|
+
recordGraphFeeder(inputs, findings, layer);
|
|
1292
1372
|
const file = sessionShadowFile(inputs.workspaceRoot, inputs.sessionKey);
|
|
1293
1373
|
let prev: ShadowRecord | null = null;
|
|
1294
1374
|
try {
|
|
@@ -1303,6 +1383,7 @@ function recordShadow(inputs: DetectorInputs, layer: ShadowLayer): void {
|
|
|
1303
1383
|
turnOrdinal: inputs.turnOrdinal,
|
|
1304
1384
|
at: new Date().toISOString(),
|
|
1305
1385
|
layer,
|
|
1386
|
+
setBy,
|
|
1306
1387
|
}) as unknown as Record<string, unknown>,
|
|
1307
1388
|
);
|
|
1308
1389
|
} catch {
|
|
@@ -1361,6 +1442,10 @@ export function main(): number {
|
|
|
1361
1442
|
// warranted"; there is no second, configurable notion of warranted layered
|
|
1362
1443
|
// on top of it.
|
|
1363
1444
|
const findings = runDetectors(inputs);
|
|
1445
|
+
// The live verdict's own row. It is written BEFORE the branch below, so a
|
|
1446
|
+
// turn the gate allows and a turn it refuses are both in the record — a
|
|
1447
|
+
// recall reading needs the allowed turns as its negative arm.
|
|
1448
|
+
recordGraphFeeder(inputs, findings, 'live');
|
|
1364
1449
|
if (findings.length === 0) return EXIT_ALLOW;
|
|
1365
1450
|
|
|
1366
1451
|
markRefusedTurn(
|
|
@@ -23,11 +23,14 @@ import fs from "node:fs";
|
|
|
23
23
|
import path from "node:path";
|
|
24
24
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
25
25
|
|
|
26
|
+
import { enforcementFor } from "./check_enforcement_matrix.js";
|
|
26
27
|
import {
|
|
27
28
|
type JsonObject,
|
|
28
29
|
type JsonValue,
|
|
29
30
|
_load_yaml,
|
|
30
31
|
} from "./hooks/dispatch_hook.js";
|
|
32
|
+
import { loadHostLowering } from "./hooks/host_lowering.js";
|
|
33
|
+
import { type SlotReading, readSlots } from "./report_enforcement_drift.js";
|
|
31
34
|
|
|
32
35
|
// src/scripts/hooks_status.ts → parents[1] is the repo root (.../parents[2]
|
|
33
36
|
// in the Python which lives one level deeper relative computation).
|
|
@@ -90,6 +93,18 @@ export interface PlatformRow {
|
|
|
90
93
|
*/
|
|
91
94
|
ask: AskShape;
|
|
92
95
|
bindings: Record<string, string[]>;
|
|
96
|
+
/**
|
|
97
|
+
* For each slot that binds at least one `blocking` concern, what that host's
|
|
98
|
+
* slot can actually carry — `refusal`, `warning-only`, `unverified` or
|
|
99
|
+
* `proof-expired` (road-to-blocking-severities 1.2).
|
|
100
|
+
*
|
|
101
|
+
* Slots with no blocking concern are ABSENT rather than present with a
|
|
102
|
+
* value, so a reader cannot mistake "nothing here claims to refuse" for a
|
|
103
|
+
* capability reading. Derived from `host_lowering.yaml`, never from the
|
|
104
|
+
* manifest: the manifest declares intent and only the lowering table records
|
|
105
|
+
* whether a refusal can land.
|
|
106
|
+
*/
|
|
107
|
+
blocking_enforcement: Record<string, string>;
|
|
93
108
|
hint: string | null;
|
|
94
109
|
}
|
|
95
110
|
|
|
@@ -123,10 +138,79 @@ function _bridge_status(project_root: string, rel_path: string): string {
|
|
|
123
138
|
return stat && stat.isFile() ? "installed" : "missing";
|
|
124
139
|
}
|
|
125
140
|
|
|
141
|
+
/**
|
|
142
|
+
* `severity` per concern, read off the manifest this report already loaded.
|
|
143
|
+
*
|
|
144
|
+
* `(undeclared)` is folded into "not blocking": this report publishes the
|
|
145
|
+
* enforcement of concerns that CLAIM to refuse, and a concern that claims
|
|
146
|
+
* nothing has nothing to reconcile. `lint_hook_manifest` is what refuses an
|
|
147
|
+
* undeclared severity; duplicating that judgement here would put two answers
|
|
148
|
+
* in the tree.
|
|
149
|
+
*/
|
|
150
|
+
function _severities(manifest: JsonObject): Map<string, string> {
|
|
151
|
+
const out = new Map<string, string>();
|
|
152
|
+
const concerns = manifest["concerns"];
|
|
153
|
+
if (!_isObject(concerns)) {
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
for (const [name, spec] of Object.entries(concerns)) {
|
|
157
|
+
const sev = _isObject(spec) ? spec["severity"] : undefined;
|
|
158
|
+
if (typeof sev === "string") {
|
|
159
|
+
out.set(name, sev);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* What each slot carrying a `blocking` concern can actually do on this host.
|
|
167
|
+
*
|
|
168
|
+
* road-to-blocking-severities 1.2, the third surface. The decision and the
|
|
169
|
+
* vocabulary live in `check_enforcement_matrix`; this reads them rather than
|
|
170
|
+
* restating them, so the published document and this report cannot drift into
|
|
171
|
+
* two different answers to one question.
|
|
172
|
+
*
|
|
173
|
+
* Failure is SILENT and the field is simply absent. This is a read-only status
|
|
174
|
+
* report that the post-install smoke probe runs, and a malformed or missing
|
|
175
|
+
* lowering table must degrade it, never abort it — the gate is where a broken
|
|
176
|
+
* lowering table is supposed to fail.
|
|
177
|
+
*/
|
|
178
|
+
function _blocking_enforcement(
|
|
179
|
+
platform: string,
|
|
180
|
+
bindings: Record<string, string[]>,
|
|
181
|
+
severities: Map<string, string>,
|
|
182
|
+
): Record<string, string> {
|
|
183
|
+
const out: Record<string, string> = {};
|
|
184
|
+
let slots: SlotReading[];
|
|
185
|
+
try {
|
|
186
|
+
slots = readSlots(loadHostLowering(), platform).slots;
|
|
187
|
+
} catch {
|
|
188
|
+
return out;
|
|
189
|
+
}
|
|
190
|
+
const bySlot = new Map(slots.map((s) => [s.slot, s]));
|
|
191
|
+
for (const [event, concerns] of Object.entries(bindings)) {
|
|
192
|
+
if (!concerns.some((c) => severities.get(c) === "blocking")) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const row = bySlot.get(event);
|
|
196
|
+
out[event] = enforcementFor(
|
|
197
|
+
row === undefined
|
|
198
|
+
? "unlowerable"
|
|
199
|
+
: row.literal === null
|
|
200
|
+
? "null-block"
|
|
201
|
+
: row.effective === null
|
|
202
|
+
? "stale-proof"
|
|
203
|
+
: null,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
|
|
126
209
|
/** Build the runtime matrix as a plain object — JSON-serialisable. */
|
|
127
210
|
export function collect(project_root: string, manifest: JsonObject): StatusMatrix {
|
|
128
211
|
const platformsRaw = manifest["platforms"];
|
|
129
212
|
const platforms = _isObject(platformsRaw) ? platformsRaw : {};
|
|
213
|
+
const severities = _severities(manifest);
|
|
130
214
|
const rows: PlatformRow[] = [];
|
|
131
215
|
for (const platform of Object.keys(PLATFORM_BRIDGES)) {
|
|
132
216
|
const [rel, hint] = PLATFORM_BRIDGES[platform] as [string, string];
|
|
@@ -148,6 +232,7 @@ export function collect(project_root: string, manifest: JsonObject): StatusMatri
|
|
|
148
232
|
rows.push({
|
|
149
233
|
platform,
|
|
150
234
|
status,
|
|
235
|
+
blocking_enforcement: _blocking_enforcement(platform, bindings, severities),
|
|
151
236
|
bridge_path: rel || null,
|
|
152
237
|
fallback_only,
|
|
153
238
|
ask,
|
|
@@ -160,6 +245,23 @@ export function collect(project_root: string, manifest: JsonObject): StatusMatri
|
|
|
160
245
|
return { schema_version: 1, platforms: rows };
|
|
161
246
|
}
|
|
162
247
|
|
|
248
|
+
/**
|
|
249
|
+
* One short line per enforcement value, for the table.
|
|
250
|
+
*
|
|
251
|
+
* `unverified` says what is MISSING, never what the host cannot do — the same
|
|
252
|
+
* wording discipline `docs/enforcement-by-host.md` carries, and the reason this
|
|
253
|
+
* report distinguishes the two values at all.
|
|
254
|
+
*/
|
|
255
|
+
const _ENFORCEMENT_NOTE: Record<string, string> = {
|
|
256
|
+
refusal: "the slot denies, so a blocking verdict stops the call",
|
|
257
|
+
"proof-expired":
|
|
258
|
+
"the slot can deny; this package's `verified` citation has lapsed",
|
|
259
|
+
"warning-only":
|
|
260
|
+
"`block_exit` is null here — they run and warn, they cannot refuse",
|
|
261
|
+
unverified:
|
|
262
|
+
"no lowering row for this slot — nothing bound natively, nothing established",
|
|
263
|
+
};
|
|
264
|
+
|
|
163
265
|
const _STATUS_MARKER: Record<string, string> = {
|
|
164
266
|
installed: "✅ ",
|
|
165
267
|
missing: "❌ ",
|
|
@@ -199,6 +301,16 @@ export function _render_table(matrix: StatusMatrix): string {
|
|
|
199
301
|
for (const event of Object.keys(row.bindings).sort()) {
|
|
200
302
|
const concerns = row.bindings[event]?.join(", ") || "—";
|
|
201
303
|
lines.push(` ${event.padEnd(22)} → ${concerns}`);
|
|
304
|
+
// road-to-blocking-severities 1.2 — printed only where a concern on this
|
|
305
|
+
// slot DECLARES `blocking`, and worded so `unverified` never reads as a
|
|
306
|
+
// claim about the host.
|
|
307
|
+
const enforcement = row.blocking_enforcement[event];
|
|
308
|
+
if (enforcement !== undefined) {
|
|
309
|
+
lines.push(
|
|
310
|
+
` ${" ".repeat(22)} blocking concerns here: ${enforcement} — ` +
|
|
311
|
+
`${_ENFORCEMENT_NOTE[enforcement] ?? "see docs/enforcement-by-host.md"}`,
|
|
312
|
+
);
|
|
313
|
+
}
|
|
202
314
|
}
|
|
203
315
|
if (row.hint) {
|
|
204
316
|
lines.push(` hint: ${row.hint}`);
|
|
@@ -214,6 +214,13 @@ export const OUTPUT_KEYS: readonly string[] = [
|
|
|
214
214
|
"toolResponse",
|
|
215
215
|
"tool_result",
|
|
216
216
|
"toolUseResult",
|
|
217
|
+
// The failure event's result body. A FAILING command on claude carries its
|
|
218
|
+
// stdout and stderr here and carries no `tool_response` at all, so without
|
|
219
|
+
// this line a failed `curl` of a hostile page would reach the model with
|
|
220
|
+
// nothing scanned — the one direction where the output is most likely to be
|
|
221
|
+
// attacker-shaped. Caught by this concern's own coverage test, which pins
|
|
222
|
+
// OUTPUT_KEYS as a superset of what the dispatcher serves.
|
|
223
|
+
"error",
|
|
217
224
|
// Generic spellings accepted since this concern shipped.
|
|
218
225
|
"output",
|
|
219
226
|
"result",
|
|
@@ -70,9 +70,13 @@ cat > "$HOOKS_DIR/pre-push" << 'EOF'
|
|
|
70
70
|
# belongs here; resolution belongs to a step run with the result in front of
|
|
71
71
|
# you. When this hook refuses for staleness, the thing that fixes it is
|
|
72
72
|
#
|
|
73
|
-
# task push-ready # fetch -> integrate the base SET -> regenerate
|
|
74
|
-
#
|
|
75
|
-
# task push-ready DRY=1 # the same six steps, read-only
|
|
73
|
+
# task push-ready BASE=<base> # fetch -> integrate the base SET -> regenerate
|
|
74
|
+
# # -> verify -> re-check freshness -> push
|
|
75
|
+
# task push-ready DRY=1 BASE=<base> # the same six steps, read-only
|
|
76
|
+
#
|
|
77
|
+
# `<base>` is the base the refusal names. Without BASE the base comes from the
|
|
78
|
+
# open pull request (gh pr view), and is the default branch only when there is
|
|
79
|
+
# no open pull request or no gh.
|
|
76
80
|
#
|
|
77
81
|
# The base is a SET: a branch targeting a release line or a stacked parent may
|
|
78
82
|
# also have to integrate the default branch, per the branch-convergence policy
|
|
@@ -141,23 +145,47 @@ fail=0
|
|
|
141
145
|
# no useful second finding to collect from a tree that is about to move.
|
|
142
146
|
#
|
|
143
147
|
# It never merges. `check_branch_freshness` asks the REMOTE (one `ls-remote`,
|
|
144
|
-
# measured 4.5s) and returns 1
|
|
145
|
-
#
|
|
146
|
-
#
|
|
147
|
-
# cannot
|
|
148
|
+
# measured 4.5s) and returns 1 on a VERIFIED behind state, or when the remote
|
|
149
|
+
# answered without the base at all (a misspelled or deleted base); offline, in
|
|
150
|
+
# CI, on a detached HEAD, or standing on the base itself it returns 0 and says
|
|
151
|
+
# so. So an unreachable network cannot block a push, and a stale local tracking
|
|
152
|
+
# ref cannot fake a green. The refusal below names which of the two it was, read
|
|
153
|
+
# from the gate's own lines, so a typo is never reported as staleness.
|
|
148
154
|
echo "🔍 Base freshness — is this branch behind the base it will merge into?"
|
|
149
155
|
if [ "${AGENT_CONFIG_SKIP_PREPUSH_FRESHNESS:-}" = "1" ]; then
|
|
150
156
|
echo "⏭️ skipped via AGENT_CONFIG_SKIP_PREPUSH_FRESHNESS=1"
|
|
151
157
|
elif [ ! -x ./scripts-run ]; then
|
|
152
158
|
echo "⚠️ ./scripts-run not found — skipping the freshness check for this push."
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
159
|
+
else
|
|
160
|
+
fresh_rc=0
|
|
161
|
+
fresh_out=$(./scripts-run src/scripts/check_branch_freshness --quiet 2>&1) || fresh_rc=$?
|
|
162
|
+
[ -z "$fresh_out" ] || printf '%s\n' "$fresh_out"
|
|
163
|
+
fi
|
|
164
|
+
if [ "${fresh_rc:-0}" -ne 0 ]; then
|
|
165
|
+
# The gate prints the base in the spelling `task push-ready` accepts.
|
|
166
|
+
base=$(printf '%s\n' "$fresh_out" | sed -n 's/^ *task push-ready BASE=\([^ ]*\).*/\1/p' | head -n 1)
|
|
167
|
+
absent=$(printf '%s\n' "$fresh_out" | sed -n 's/.*base `\([^`]*\)` does not exist on \([^ ]*\) .*/\2\/\1/p' | head -n 1)
|
|
157
168
|
echo ""
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
169
|
+
if [ -n "$base" ]; then
|
|
170
|
+
echo " Push blocked — the branch is behind its base, and the gates you just"
|
|
171
|
+
echo " passed were answered against a base that no longer exists."
|
|
172
|
+
echo ""
|
|
173
|
+
echo " task push-ready BASE=$base # fetch → integrate the base SET"
|
|
174
|
+
echo " # → regenerate → verify → re-check"
|
|
175
|
+
echo " task push-ready DRY=1 BASE=$base # the same steps, read-only"
|
|
176
|
+
elif printf '%s\n' "$fresh_out" | grep -q 'branch is BEHIND'; then
|
|
177
|
+
# A strategy that does not merge gets no push-ready line; its remedy
|
|
178
|
+
# is printed by the gate itself.
|
|
179
|
+
echo " Push blocked — the branch is behind its base. The remedy for this"
|
|
180
|
+
echo " project's update strategy is printed above."
|
|
181
|
+
elif [ -n "$absent" ]; then
|
|
182
|
+
echo " Push blocked — the base $absent does not exist on the remote: a"
|
|
183
|
+
echo " misspelled or deleted base, not a stale branch. Name a branch the"
|
|
184
|
+
echo " remote has (--base main and --base origin/main are the same branch)."
|
|
185
|
+
else
|
|
186
|
+
echo " Push blocked — the freshness gate refused without a verdict line;"
|
|
187
|
+
echo " its output is above."
|
|
188
|
+
fi
|
|
161
189
|
echo ""
|
|
162
190
|
echo " This hook refuses; it never merges. Bypass a genuine WIP push with"
|
|
163
191
|
echo " AGENT_CONFIG_SKIP_PREPUSH_FRESHNESS=1."
|