v2.3.0 — doc-honest glob, CI, hardening, mechanical eval
This release tightens the gap between the documented protocol and the actual behavior of the guardrail scripts, adds continuous integration, makes the install path crash-safe, and adds mechanical structural checks for AGENT_HANDOFF.md and SKILL.md.
Added
- CI matrix (P2): new
.github/workflows/ci.ymlwith two jobs.shellcheck(Ubuntu) lints every*.shin the repo.SC2254is excluded becausecheck-ownership.shdeliberately uses dynamiccasepatterns as globs — that is the parser's contract.fixturesmatrix onubuntu-latestandmacos-latestruns the ownership parser fixtures, the install rollback fixture, and the new mechanical eval checks (Python 3 + PyYAML provisioned in the job).
- Atomic install rollback (P3):
install-skill.shnow exits with code3and restores the pre-install backup ifcp -Rfails. The system is left in either the "old target + no backup" or "backup + new target" state, never an intermediate state. Documented inusage(). - Install rollback fixture (P3): new
scripts/test-fixtures/install-rollback-test.shPATH-shadowscpwith a failing stub to assert the rollback contract. - Glob-crosses-slash fixture (P1): new
scripts/test-fixtures/handoff-glob-crosses-slash.mdand correspondingrun-tests.shcase that pins the actual behavior of bashcaseglob matching across/, so the documented semantics cannot drift from the parser again. - Mechanical eval checks (P4): new
evals/run-mechanical-checks.shdriver with an explicit "mechanical guards only" head comment, running the ownership fixtures, the install rollback fixture, the structural lint overAGENT_HANDOFF.md, and a PyYAML-based check thatSKILL.mdfrontmatter parses withnameanddescriptionpresent. - Structural lint (P4): new
evals/lint-handoff.pyverifies required top-level headings, the three ownership subsections (### agent-owned,### user-reserved,### frozen), ISO 8601 timestamps in## History, and that## Next agent starts fromis non-trivial. - Supported Platforms section (P2):
README.mdandREADME_IT.mdnow document the supported target as Bash on Linux and macOS (scripts rely on Bash features likemapfileand[[ ... ]], not strictly POSIXsh); native Windows is unsupported and WSL is not part of the test matrix. - Version metadata (P5):
skills/cli-collaboration/SKILL.mdfrontmatter now carriesversion: "2.3.0". The same version is surfaced inREADME.md,README_IT.md, andCHANGELOG.mdso the source of truth is not solely the frontmatter. - Italian contributors record (P5): new
CONTRIBUTORS_IT.mdmirroringCONTRIBUTORS.mdfor symmetry withREADME_IT.md. - Python ownership parser (PR #4 review cycle): new
skills/cli-collaboration/scripts/parse-ownership.py. See the matching entry under### Changedfor the migration rationale.
Changed
- Doc-honest globs (P1): corrected the documented behavior of
*in ownership patterns.*in a bashcasepattern matches any sequence including/, soscripts/*matches bothscripts/foo.shandscripts/sub/foo.sh. The previously asserted "single directory level" behavior was factually wrong against the parser. - Ownership parser migration to Python (PR #4 review cycle):
check-ownership.shwas reduced to a thin Bash wrapper (exec python3 "$SCRIPT_DIR/parse-ownership.py" "$@") and the full parser + matcher + conflict logic moved to a newscripts/parse-ownership.py. Python 3 is now a runtime dependency of the ownership check. The migration was forced by GitHub Actionsfixtures (macos-latest)failing on Bash 3.2.57 whenever a handoff ownership line contained multibyte UTF-8 bytes (en-dash, em-dash). Seven Bash-side mitigations were attempted and ruled out before the migration. CLI contract (flags, env var, exit codes, conflict-message wording) is preserved verbatim. The new Python parser usesfnmatch.fnmatchcasefor glob matching, preserving the P1 contract in which*crosses/. - Shell hardening (P3, selective):
install-skill.shandsync-skill.shuseset -euo pipefail.check-ownership.shkeepsset -uandset -o pipefail(no-e). evals/evals.jsonhonesty (P4): top-levelstatusfield changed from"tri-cli-complete"to"mechanical-guards-only", with astatus_noteexplaining what CI actually verifies. Each scenario carries a boolean"mechanized"field: scenario C istrue(covered by the ownership parser fixtures); A, B, D, E, F arefalse(would require an LLM-judge harness, out of scope).AGENT_HANDOFF.mdhistory (P5): per the project rule inSKILL.md, the## Historysection was compacted: the last three detailed entries are preserved verbatim and older entries are summarized.
Out of scope (deferred to v3, gated by docs/future-architecture.md)
- Custom segment-bounded glob parser (
**token, single-directory*). - POSIX
flock-based concurrency,.agent/state.jsonsidecar, MCP transport. - LLM-judge harness for behavioral evaluation of scenarios A, B, D, E, F.
- Native Windows support.
Full changelog: https://github.com/Spe1977/cli-collaboration/blob/v2.3.0/CHANGELOG.md