ci(plugin): gate the path that ships straight to users, and fix one more line-oriented cap #84
Reference in New Issue
Block a user
Delete Branch "dev"
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?
Closes #2204. Plugin manifest 0.1.19 → 0.1.20.
plugin/isn't built into the image — installs fetch it from this repo, so a push is the release. It was absent from the workflow'spaths:filter entirely, so plugin changes ran no CI at all. Two defects reached a live install through that gap: #2198 (three broken hook scripts) and #2209 (the fix for #2198 unable to reach an install because the manifest version wasn't bumped).The gate
New
pluginjob runningscripts/check_plugin.py:bash -non every hook.CLAUDE_PLUGIN_OPTION_, line-orientedjq -Rwithout-s,| cut -cas a payload cap. Verified by replay againstc569cdd^: all three caught.scribe_session_context.shmust not, because its static behavioural floor is designed to survive having no credentials. Verified it can fail: injected a non-zero exit and a stray stdout write, each caught.origin/mainrequires the manifest version to differ too. Stated against the base branch, so a batch needs one bump rather than one per commit. Replayed againstc569cdd: correctly fails.It found a live bug on first run
scribe_autoinject.shstill capped the prompt withcut -c1-2000— line-oriented, so never actually a cap. Only the prior-art hook's copy was fixed inc569cdd. Nowhead -c. This is a real user-facing fix, not just CI: it affects long multi-line prompts.It then failed on its own commit for a missing version bump — the third time that rule has mattered and the first time anything but memory enforced it.
Tooling
jq+shellcheckare per-job apt installs, not an image change, per CI-runner'sdocs/process.md: "If only one project needs the dep, prefer that project installing it per-job." Promotion case filed as CI-runner issue #2 rather than assumed.jqis load-bearing rather than convenient — every hook openscommand -v jq || exit 0, so without it the smoke test would pass while exercising nothing.ci-requirements.mdupdated, including two stale entries corrected (it claimed four jobs when there are six, and listeduvas per-job when it's been in the image for some time).Known gaps
with:-block checkout failure on the act_runner (run 3027) is recorded as an observation, not a rule — one occurrence can't distinguish awith:-specific bug from a concurrency race over the action cache.🤖 Generated with Claude Code
https://claude.ai/code/session_01UaYUaouG9jjhATyuxCKrQs
with:from the plugin job's checkoutFirst CI run with shellcheck (run 3029) flagged exactly one thing: scribe_session_context.sh:44 SC1007 Remove space after = if trying to assign a value here=$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) `CDPATH= cd` is the deliberate POSIX idiom for running a single command with CDPATH empty — it stops `cd` resolving through the operator's CDPATH and echoing the resolved path into our stdout, which for a hook whose stdout IS its protocol would be a real bug. shellcheck cannot distinguish that from a typo'd `CDPATH=cd`, so this is a false positive. Scoped `# shellcheck disable=SC1007` with the reason above it, matching how CI-runner's own scripts/install-common.sh handles SC2086. One line-scoped disable, no file-level or blanket suppression — a lint you silence broadly stops being a lint. Everything else in that run passed, including the parts that could only run once jq was installed: all four hooks exit 0 and stay silent unconfigured and against a refused connection, with the session-context hook correctly still emitting its static floor. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UaYUaouG9jjhATyuxCKrQs