Skip to content

feat: v2.5.0 — content_sha256 integrity, tools: frontmatter, upstream contribution, CI hardening#44

Merged
jmlozano1990 merged 9 commits into
mainfrom
release/v2.5.0
May 9, 2026
Merged

feat: v2.5.0 — content_sha256 integrity, tools: frontmatter, upstream contribution, CI hardening#44
jmlozano1990 merged 9 commits into
mainfrom
release/v2.5.0

Conversation

@jmlozano1990
Copy link
Copy Markdown
Owner

Summary

  • F1 (ADR-028): content_sha256 integrity field backfilled across all 110 cowork.lock.json entries. sync-agency.yml verify step aborts on hash mismatch. lock-content-sha-fault-injection and lock-content-sha-cross-check CI jobs added.
  • F2 (ADR-029): 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).
  • F3 (ADR-030): First outbound contribution — meeting-notes skill submitted to msitarzewski/agency-agents#521. upstream-contribution/meeting-notes-upstream.md committed as provenance record. Writing-profile reference stripped (CF-L1-1); attribution line in upstream PR description (CF-L4-1).
  • F4: MF-1/MF-2 CI hardening — set -o pipefail per-step scope + || BAD=0 (replaces || true, CF-v2.4-G). MF-2 awk structural header scan replacing positional $7 (MF-S2 MUST-FIX). Regression fixture tests/fixtures/registry-column-reorder.md.
  • F5: 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

Item Status
CF-L1-1 (compliance MUST-FIX) RESOLVED — writing-profile reference stripped from upstream file
CF-L4-1 (compliance MUST-FIX) RESOLVED — attribution line in upstream PR description
MF-S1 (security MUST-FIX) RESOLVED — multi-line YAML tools: form rejected by MF-3
MF-S2 (security MUST-FIX) RESOLVED — structural awk header scan replacing positional $7
C-v2.5-19 (cross-check) RESOLVED — lock-content-sha-cross-check CI job added
ADR-028 (3-cycle carry-forward) RESOLVED — content_sha256 backfilled + CI enforced

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)

  1. dev: F1 — cowork.lock.json content_sha256 backfill (all 110 entries at pinned commit 783f6a72)
  2. dev: F1 — sync-agency.yml verify step + fault-injection fixture + CI cross-check
  3. dev: F2 — tools: [claude-code] frontmatter on all 20 SKILL.md + MF-3 vocabulary gate
  4. dev: F3 — upstream-contribution/meeting-notes-upstream.md + PR opened
  5. dev: F4 — quality.yml MF-1/MF-2 hardening (pipefail + awk header-name lookup) + regression fixture
  6. dev: F5 + release paperwork — v2.5.0 install-pre-commit, CHANGELOG, VERSION, README

Test plan

  • CI passes all jobs: markdown-lint, link-check, shellcheck, safety-rule-grep, skill-format-check, skill-depth-check (MF-3 + MF-1 + MF-2 + CMP + POOL), lock-content-sha-fault-injection, lock-content-sha-cross-check
  • MF-3 gate: verify BAD_FILES empty for all 20 skills with tools: [claude-code]
  • MF-2: verify grep -c '$7' quality.yml = 0 (structural scan only)
  • MF-2 regression: registry-column-reorder.md fixture fires BAD=1 (goal_tags at col 3)
  • MF-S1: multi-line YAML form test in quality.yml fires error
  • F1 cross-check: lock-content-sha-cross-check job recomputes and matches lock
  • F3: upstream PR Add Meeting Notes Specialist - project-management msitarzewski/agency-agents#521 inspected — attribution line present, writing-profile reference absent
  • F5: scripts/install-pre-commit.sh installs hook; hook runs markdownlint on commit

🤖 Generated with Claude Code

JmLozano and others added 9 commits May 9, 2026 19:23
…0 commits, working branch matches release/v2.5.0 at 7972f0b

Base-sync verified: release/v2.5.0 at 7972f0b, ahead of main by 0 commits, working branch matches release/v2.5.0 at 7972f0b.
…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]>
@jmlozano1990 jmlozano1990 merged commit 7a85ae6 into main May 9, 2026
44 checks passed
@jmlozano1990 jmlozano1990 deleted the release/v2.5.0 branch May 9, 2026 16:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant