You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
feat(guardrails): enforce a user-private commit convention only where the team tracks none #9776
An operator can gate their own commits in a repository whose team tracks no commit convention, without changing
the repository's tracked files: a subject_pattern (one POSIX ERE) in the personal layer <home>/source-control.local.yaml (gitignored, or excluded through .git/info/exclude) applies only when the
team layer sets none, and is never merged with a team pattern.
Decisions
Owner, 2026-10-13: fallback-only; a user pattern applies only when the team tracks none and never weakens or
merges with a team pattern. Amend the resolver's policy-floor header and docs/conventions/commit-convention
together, and test all three consumers: block-noncanonical-commit, the Claude Code content gate
(block-convention-violation) and the commit-msg hook.
ADR 0075: the personal layer is <home>/<concern>.local.<ext>, and a personal value may only tighten a policy
floor. Adding enforcement where the team sets none is tightening. A git hook cannot read userConfig, so the
personal file is the source.
Owner standing direction §10, 2026-10-31: person-approval holds against our own actors come off during the
throughput phase. This change only adds a fallback gate and touches no secret, billing or destructive host
action, so the done-when item asking the PR body for Hold: a human merges this is dropped.
Key interfaces
lib/resolve-convention-pattern.sh (canonical) and copies, docs/conventions/commit-convention, the three
consumers above.
Done when
scripts/run-test-file.sh lib/resolve-convention-pattern.test.sh exits 0 with cases: personal pattern used when the team sets none; team pattern used and personal ignored when both exist; neither gives no enforcement.
scripts/run-test-file.sh exits 0 on plugins/guardrails/hooks/block-noncanonical-commit.test.sh, plugins/guardrails/hooks/block-convention-violation.test.sh and plugins/guardrails/git-hooks/commit-msg-convention.test.sh, each with a personal-layer case.
grep -n "local" docs/conventions/commit-convention/README.md prints the amended layer rule, and the resolver header states the fallback-only personal layer.
Not admitted to the issue lane yet: blocker #9774 is not closed as completed by a listed human or a merge; blocker #9727 is not closed as completed by a listed human or a merge.
This records a re-fire of an earlier refusal, not a new refusal. The lanes kill switch stopped run 41221402842, the work-resolve-issue run that agent-ready started, before it did any work; that run ended at 2026-10-31T17:04:41Z. work-unblock has now removed and added agent-ready back to start a fresh run. A kill-switch refusal is no fault in this issue or the lanes, so it never counts against later re-fires; after limits.limit-stops-per-issue of them since a person last added agent-ready or a run last reported, work-unblock waits longer before each one, up to 24 hours.
The lanes App's pull request #11697 for this issue was closed without merging. work-unblock removed status: ready and agent-ready, so the hourly triage sweep sends it back to intake triage, which decides what work is left and admits it again.
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; blocker #9727 is not closed as completed by a listed human or a merge.
melodic-automation-lanes commentedon Oct 31, 2026
This records a re-fire of an earlier refusal, not a new refusal. The lanes kill switch stopped run 41221402842, the work-resolve-issue run that
agent-readystarted, before it did any work; that run ended at 2026-10-31T17:04:41Z. work-unblock has now removed and addedagent-readyback to start a fresh run. A kill-switch refusal is no fault in this issue or the lanes, so it never counts against later re-fires; after limits.limit-stops-per-issue of them since a person last addedagent-readyor a run last reported, work-unblock waits longer before each one, up to 24 hours.github-actions commentedon Oct 31, 2026
github-actions commentedon Oct 31, 2026
melodic-automation-lanes commentedon Nov 1, 2026
The lanes App's pull request #11697 for this issue was closed without merging. work-unblock removed
status: readyandagent-ready, so the hourly triage sweep sends it back to intake triage, which decides what work is left and admits it again.