9 plugin repos' CI path filters exclude skills/agents/commands trees, so claudecode-linter never runs on them #6
Notifications
Total Time Spent: 14 minutes
oleks
14 minutes
No due date set.
Dependencies
No dependencies set.
Reference: oleks/claude-plugin-cicd-insights#6
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Origin
kotkan/claude-plugin-decision-flow#76 (closed) — fixing that repo's own SKILL.md description-length breakage led to a fleet-wide audit of CI coverage for
claudecode-linter(CCL), which enforcesskill-md/description-max-length(1024 chars) andskill-md/valid-frontmatteron Claude Code plugin artifacts. A SKILL.md whose frontmatter breaks silently stops loading — no error. On decision-flow this already caused real damage: a 1065-char description sat undetected onmain, a later edit took it to 1230, and the pre-push CCL hook then rejected EVERY push to that repo, including a branch deletion.Finding
Read-only audit of all 36 subdirectories of
~/projects/claude-plugins/(2026-08-14): 9 repos have a real Woodpecker pipeline whosewhen: path:filter actively excludesskills/**,agents/**,commands/**and.claude-plugin/**, with no other pipeline in the repo covering them. A change to those trees therefore triggers NO pipeline at all — meaning a broken SKILL.md can merge tomainwith zero CI signal.Affected repos and their actual path filters:
agents-routing:*.go,go.mod,go.sumanti-patterns:*.go,go.mod,go.sumhook-instrument:*.go,go.mod,go.sum,tests/**,.woodpecker/**hooklib:*.go,go.mod,go.sumhyprpanel-state:*.go,go.mod,go.summemory:*.go,go.mod,go.sumsirpa-agents:*.go,go.mod,go.sumspec-kit:*.go,go.mod,go.sumplus a narrow markdownlint-sync pipelinestatusline:*.go,go.mod,go.sumRoot cause worth recording: these are all
hooks-release.yml-shaped pipelines written to gate a Go binary. The filters are correct for their original purpose; nothing was ever written to cover the skills tree. This is a missing-pipeline problem, not a mis-copied-filter problem.Fix template (already shipped and CI-verified)
kotkan/claude-plugin-decision-flow's
.woodpecker/lint.yml(v0.33.2, commitsa532841/5c3e5c1). It runsnpx --yes claudecode-linter@2.1.232 --ignore 'tests/plugin-fixtures/**' .in anode:22-slimimage, filtered toskills/**,commands/**,agents/**,.claude-plugin/**,hooks/hooks.json. Verified: Woodpecker pipeline #7 on a skills-only commit ran that workflow alone, exit 0, 18s. CCL exits non-zero only on ERROR-severity findings, so adopting repos should expect warnings to be non-fatal.Scope note
This is separate from oleks/claude-plugin-cicd-insights (finding 2, filed alongside this one), which covers 3 repos that DO fire on skill/agent changes but never invoke CCL at all — different repos, different remedy (add a step vs. add a pipeline).
Not filed as a finding, context only: 23 further plugin repos have no
.woodpecker/directory whatsoever — weaker/possibly intentional, noting so it isn't re-derived.Done — all 9 repos now lint their component trees in CI, each verified by a real pipeline run
Audit re-verified on disk first (2026-08-14): all 9 repos confirmed to have a
hooks-release.yml-shaped compile gate filtered to*.go/go.mod/go.sum, andgrep -rl claudecode-linter .woodpecker/returned nothing in any of them. The finding was accurate as filed.What shipped
A new
.woodpecker/lint.ymlin each repo, adapted from the decision-flow template with two deliberate deviations:labels: {arch: arm64}added. The template omits it. Three sibling pipelines in this fleet carry that label with a comment stating the single amd64 agent crash-loops on gRPC auth, so an unlabeled workflow can land on it and die — reading red in CI and green by hand. Filed against the template itself as kotkan/claude-plugin-decision-flow#80.pull_requesttrigger added alongsidepush+branch: main, matching the fleet's documented double-run-avoidance convention, so PRs are covered once rather than not at all.Path filter:
skills/**,commands/**,agents/**,.claude-plugin/**,hooks/hooks.json,.claudecode-lint.yaml,.woodpecker/lint.yml. Pinned toclaudecode-linter@2.1.232(confirmed still the current npm version). Kept as a separate pipeline rather than widening the compile gate's filter.The gate would have landed RED on 2 of 9 — so it caught real defects immediately
Ran CCL locally against every repo before writing any pipeline. Seven were already clean (warnings only, which are non-fatal). Two had genuine ERROR-severity findings, fixed in the same commit so the gate is green on arrival:
sirpa-agents— 72 errors. 71×agent-md/mcp-tools-resolve: its agents grantmcp__plugin_cluster_gitea-tools__*whileplugin.jsondeclared no dependency on theclusterplugin. Declared it, matching whatanxiousandspec-kitalready do. Plus 1×marketplace-json/schema-valid:"source": "."fails the schema's^\./.*pattern →"./".statusline— 1 error. Same"source": "."→"./"marketplace defect.Worth recording, because it corrects a note in this fleet:
anxious's.claudecode-lint.yamldowngradesagent-md/mcp-tools-resolveon the stated grounds that "the rule does not consultdependencies". That is no longer true in CCL 2.1.232. Verified directly on sirpa-agents — 71 findings with nodependencieskey, 0 after adding it, 71 again after reverting. So the honest fix was to declare the dependency, not to suppress the rule. Filed as oleks/claude-plugin-anxious#139.Verification — every pipeline actually fired and went green
Not just "committed". Each commit touched
.woodpecker/lint.yml, which is inside its own path filter, so each triggered its own run. This mattered:agents-routing's own pipeline comment records sibling pipelines sitting at zero runs ever despite being committed, andmemory's records a push landing before the repo was registered in Woodpecker.8df77da763b0616b9f89b60d4e2885bf950b5bc1f82655927lintworkflow,claudecode-linterstep exit 0)e8393f5f441d3bNote
hooklibandhyprpanel-statehave noskills/,agents/orcommands/trees today — only.claude-plugin/. The filter is kept uniform across all nine anyway, so those trees are covered the day someone adds one.Closing.
⏱ worked | 14-08-26 | session oleks/8752153d | +14min | session-total 14min (lane-release) | elapsed from timeline