feat: v2.5.0 — content_sha256 integrity, tools: frontmatter, upstream contribution, CI hardening#44
Merged
Merged
Conversation
…t pinned commit 783f6a72) ADR-028 ACCEPTED. Adds content_sha256 field as sibling to sha256 on every files[] entry in cowork.lock.json. Values computed from upstream content at pinned commit 783f6a72bfd7f3135700ac273c619d92821b419a via one-shot local backfill. At v2.5 cutover: content_sha256 == sha256 for every entry (same byte stream, same pin). They diverge only on a tampered upstream. schema_version remains '1.0' (additive field). AC-F1-1: PASS (110/110 entries have content_sha256) AC-F1-4: PASS (schema_version = '1.0') C-v2.5-1: PASS C-v2.5-4: PASS
…cross-check
ADR-028 implementation (verify pass):
- sync-agency.yml: adds content_sha256 verify step inside existing fetch loop, ordered
AFTER per-file SHA-256 compute and BEFORE accumulator append. Fail-closed: mismatch
exits loop before partial state reaches lock rewrite. Distinct error message:
'::error::Integrity mismatch on ${file_path}' vs 'WARNING: Failed to fetch'.
- tests/fixtures/sha-fault-injection.json: fault-injection fixture with DEADBEEF
content_sha256 on one entry. Triggers non-zero exit on the verify logic.
- quality.yml lock-content-sha-fault-injection step: runs verify logic against fixture,
asserts MISMATCH=1 fires. Confirms error message shape (AC-F1-3).
- quality.yml lock-content-sha-cross-check step (C-v2.5-19): cross-environment trust
anchor — fetches every files[] entry in clean GHA runner, asserts SHA-256 matches
stored content_sha256. Runs on every PR.
SCAN_PATTERNS block byte-unchanged (C-v2.5-5 preserved via git diff confirmation).
AC-F1-2: PASS (grep -c content_sha256 sync-agency.yml = 3, >= 2)
AC-F1-3: PASS (fixture + fault-injection step both present)
C-v2.5-2: PASS
C-v2.5-3: PASS
C-v2.5-19: PASS (grep -c lock-content-sha-cross-check quality.yml = 4, >= 2)
…vocabulary gate ADR-029 ACCEPTED. Adds 'tools: [claude-code]' field to all 20 skills/ pool SKILL.md files. Example copies updated to maintain byte-mirror (C-v2.4-3). quality.yml MF-3 step added: closed vocabulary gate [claude-code, copilot, cursor, windsurf] validated against every skills/*/SKILL.md frontmatter. MF-S1 MUST-FIX applied: multi-line YAML form rejected with explicit error message. upstream-contribution/ excluded by path-glob shape (not targeted). AC-F2-1: PASS (grep -rl '^tools:' skills/ | wc -l = 20) AC-F2-2: PASS (all 20 set to tools: [claude-code]) AC-F2-3: PASS (MF-3 step present; fault-injection via unknown-tool fires exit 1) AC-F2-4: PASS (grep -c 'tools:' docs/architecture.md >= 4; ADR-029 present) AC-F2-5: PASS (ls skills/ | wc -l = 20; byte-mirrors updated) C-v2.5-6: PASS C-v2.5-7: PASS C-v2.5-8: PASS (MF-S1 multi-line rejection included)
ADR-030 ACCEPTED. Adds upstream-contribution/ directory with meeting-notes-upstream.md reformatted to msitarzewski/agency-agents persona-centric format. Upstream PR: msitarzewski/agency-agents#521 PR opened: 2026-05-09 v3.0 trigger clock started: 60-day acknowledgment window begins. CF-L1-1: PASS (grep -ciE writing.profile = 0) AC-F3-1: PASS (frontmatter fences = 2) AC-F3-3: PASS (no Cowork-specific terms) AC-F3-5: PASS (valid GitHub PR URL, HTTP 200, state=OPEN) C-v2.5-10: PASS C-v2.5-11: PASS C-v2.5-12: PASS CF-L4-1: PASS (PR description carries attribution line — see PR #521)
… lookup) + regression fixture - MF-3: closed vocab gate [claude-code, copilot, cursor, windsurf] with MF-S1 multi-line YAML rejection (present-but-unparseable form fires error) - MF-1: set -o pipefail per-step + || BAD=0 pattern (replaces || true, CF-v2.4-G / AC-F4-1) - MF-2: structural header scan replacing positional $7 (MF-S2 MUST-FIX / AC-F4-3) awk finds goal_tags column by name; skips backtick-wrapped doc rows - MF-2: set -o pipefail per-step + || BAD=0 (AC-F4-2) - Regression fixture tests/fixtures/registry-column-reorder.md (AC-F4-5): goal_tags moved to column 3 with BAD_TOKEN! to verify structural scan still fires - lock-content-sha-cross-check and lock-content-sha-fault-injection CI jobs (C-v2.5-19, AC-F1-3) Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…ERSION, README - scripts/install-pre-commit.sh: markdownlint pre-commit hook installer (F5 / AC-F5-4) Same ruleset as CI markdown-lint step; backup existing hook to .bak; set -euo pipefail - CONTRIBUTING.md: "Local Development" section with install-pre-commit usage + manual procedure - VERSION: 2.4.0 -> 2.5.0 - CHANGELOG.md: [2.5.0] block — F1 content_sha256, F2 tools: field, F3 upstream PR (msitarzewski/agency-agents#521), F4 CI hardening, F5 pre-commit - README.md: version badge 2.4.0 -> 2.5.0; "Next up" block replaced with v2.5 shipping summary + v2.6 teaser (multi-tool skill authoring) - docs/architecture.md: AC-F3-4 PR URL added to ADR-030 implementation note - docs/compliance-review-v2.5.md, docs/security-review-v2.5.md: Phase 2 review docs tracked Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Step name "MF-3 — skills/*/SKILL.md tools: vocabulary gate" had an unquoted colon after "tools" that the YAML parser interpreted as a mapping value. Wrap in double quotes. Run #25605017229 failed at 0s with "workflow file issue" — this is the root cause. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Run #25605205856 surfaced 4 content failures masked by the prior YAML parse error. All fixes are within v2.5 scope. - CHANGELOG.md:18: bare URL → markdown link (MD034) - tests/fixtures/registry-column-reorder.md: scope MD025/MD026 disable to the comment block (preserves fixture content for awk test) - upstream-contribution/meeting-notes-upstream.md: file-scope disable MD003/MD026 (upstream-format conventions per ADR-030) - docs/compliance-review-v2.5.md: replace [repo-url] and [URL] placeholders with concrete cowork repo URL Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
content_sha256integrity field backfilled across all 110cowork.lock.jsonentries.sync-agency.ymlverify step aborts on hash mismatch.lock-content-sha-fault-injectionandlock-content-sha-cross-checkCI jobs added.tools:SKILL.md frontmatter field (closed vocab[claude-code, copilot, cursor, windsurf]) added to all 20 pool skills and 21 example copies. MF-3 CI gate blocks vocab violations and multi-line YAML form (MF-S1 MUST-FIX).upstream-contribution/meeting-notes-upstream.mdcommitted as provenance record. Writing-profile reference stripped (CF-L1-1); attribution line in upstream PR description (CF-L4-1).set -o pipefailper-step scope +|| BAD=0(replaces|| true, CF-v2.4-G). MF-2 awk structural header scan replacing positional$7(MF-S2 MUST-FIX). Regression fixturetests/fixtures/registry-column-reorder.md.scripts/install-pre-commit.sh— local markdownlint pre-commit hook installer closing the v2.3.0 MD058 gap.CONTRIBUTING.md"Local Development" section added.Binding items resolved
Upstream PR (F3)
msitarzewski/agency-agents#521 — meeting-notes skill,
project-management/category, opened 2026-05-09. Status at Phase-4 close: OPEN.Commits (6 — binding topology)
dev: F1 — cowork.lock.json content_sha256 backfill (all 110 entries at pinned commit 783f6a72)dev: F1 — sync-agency.yml verify step + fault-injection fixture + CI cross-checkdev: F2 — tools: [claude-code] frontmatter on all 20 SKILL.md + MF-3 vocabulary gatedev: F3 — upstream-contribution/meeting-notes-upstream.md + PR openeddev: F4 — quality.yml MF-1/MF-2 hardening (pipefail + awk header-name lookup) + regression fixturedev: F5 + release paperwork — v2.5.0 install-pre-commit, CHANGELOG, VERSION, READMETest plan
tools: [claude-code]grep -c '$7' quality.yml = 0(structural scan only)scripts/install-pre-commit.shinstalls hook; hook runs markdownlint on commit🤖 Generated with Claude Code