Repository navigation
Closed
feat(git-hooks): install hook entries as git config-based hooks under an includeIf, from git 2.54#9775
Feature
Copy link
Labels
agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.Fully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.Triaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Description
Parent
Refs #5948
Depends on
Outcome
/guardrails:setup offers a config-hook install: it writes a user-scope [hook "<name>"] block (event
commit-msg) under an includeIf the operator chooses, pointing at a stable copy of the hook, instead of
copying into .git/hooks. It covers every clone and linked worktree under the tree and runs beside lefthook,
husky, pre-commit or core.hooksPath managers. Bypass never locks out: a one-off environment variable and
git -c hook.<name>.enabled=false, both documented.
Decisions
- Step B (owner, 2026-10-13): yes, with the git 2.54 floor; tests gate on the git version, and the docs say
that gits below 2.54 ignorehook.*silently. - Failure text never suggests
--no-verify.
Key interfaces
lib/git-hooks/install.mjsand copies,plugins/guardrails/skills/setup/(context/install-commit-msg.md),
lib/git-hooks/git-hook-decisions.md.
Done when
- An install test, run twice against a temp
HOMEand a test repo under a temp directory, leaves one[hook "<name>"]block, andgit hook list commit-msgin the repo shows it (skipped with a visibleSKIPline whengit --versionis below 2.54). - In a lefthook-managed test repo, a commit runs both lefthook's hook and the config hook (same version gate).
-
git -c hook.<name>.enabled=false commitin the test repo skips the hook. -
grep -n "2.54" plugins/guardrails/skills/setup/context/install-commit-msg.mdprints the floor and below-floor behavior. -
scripts/sync-shared-copies.sh --checkexits 0. -
scripts/check-changelog-fragments.sh --check-required origin/mainexits 0. - The PR body carries
Hold: a human merges this.
Metadata
Metadata
Assignees
Labels
agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.Fully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.Triaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Type
Fields
No fields configured for Feature.
Activity
melodic-automation-lanes commentedon Oct 24, 2026
Not admitted to the issue lane yet: blocker #9774 is not closed as completed by a listed human or a merge.
melodic-automation-lanes commentedon Oct 25, 2026
The work-resolve-issue lane did not start this issue: it needs a person to make it clearer first.
Why, in the run's own words:
What the run says it did not do:
Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/40208812920
To retry, answer the question here, remove
needs-humanand addagent-readyagain.kyle-sexton commentedon Oct 25, 2026
Decision recorded.
Owner's answer, given in the GitHub Support session on 2026-10-25 at about 20:0xZ: "go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles". It answers the two questions in the lane's pushback (run 40208812920), which the hub put to the owner with these recommendations.
git -c hook.<name>.enabled=falsebypass? No to both.checks.skipmissingstays the only skip.--no-verify, nocore.hooksPathredirect. Guardrails allows exactly this key and keeps blocking the other two."git -c hook.<name>.enabled=false, both documented" is replaced bychecks.skipmissing.[hook "<name>"]friendly name? The implementer chooses both. The review lanes judge the choice.Acceptance criteria that replace or add to the issue's own:
hook.<name>.enabled=falsebypass. The install's docs namechecks.skipmissingas the only skip.git -c hook.<name>.enabled=false commitin the test repo skips the hook" is dropped. In its place, a test showsgit -c checks.skipmissing=<tool> commitskips a check whose tool is absent and still runs it when the tool is installed.docs/conventions/check-placement/README.mdand guardrails' block-no-verify guard are unchanged by this work.[hook "<name>"]friendly name are written in the install's docs.kyle-sexton commentedon Oct 26, 2026
Released for re-triage under the owner's 2026-10-26 rule: a person is involved only for "1. A change in original intent/vision 2. Something comes up during implementation ... that alters intent/vision or the primary design 3. If there is a HIGH/CRITICAL security issue". None applies here, so the hold label came off and intake triage runs again now.
To hold this issue again, add
needs-human(orstatus: needs-decision) and name which of the three applies.github-actions commentedon Oct 26, 2026
Proposed work class: work-class: scoped
Basis: automated intake triage; the lanes App applied this class.
Size: Medium
Complexity: Medium
Uncertainty: Known
Flags: none
Blocked by: none
Decision recorded, quoted from #9775 (comment):
That decision settles the open questions: the install gets no environment-variable bypass and no
hook.<name>.enabled=falsebypass, and the implementer picks the stable copy location and the hook name.Understood: add a git 2.54 config-hook install of the commit-msg hook under an
includeIf, with version-gated tests and docs.I treated #9774 as a dependency but couldn't confirm whether it is open, because it isn't in the open-issues list I was given.
Automated triage, applied by the lanes App.
kyle-sexton commentedon Oct 26, 2026
Released for re-triage under the owner's 2026-10-26 rule: a person is involved only for "1. A change in original intent/vision 2. Something comes up during implementation ... that alters intent/vision or the primary design 3. If there is a HIGH/CRITICAL security issue". None applies here, so the hold label came off and intake triage runs again now.
To hold this issue again, add
needs-human(orstatus: needs-decision) and name which of the three applies.github-actions commentedon Oct 26, 2026
Intake triage did not triage this issue after 2 dispatches, so the sweep no longer dispatches it and labeled it needs-triage for a maintainer. Triage it by hand, and read the runs for why intake did not:
kyle-sexton commentedon Oct 30, 2026
Done-when update. The item "PR body carries
Hold: a human merges this" no longer applies. Owner decisions Q15/Q16 (2026-10-29) removed the person-approval and path-based holds on agent and App PRs. The owner's words: "There should be no path restrictions. We can add that in later." This change merges through the normal lanes: both review lanes, ci-status and pr-verify. Every other done-when item stands.The change is in the owner-login PR that replaces #11082.
Posted by AI under the owner's standing direction for the PR lanes.