Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v9.0.0

- name: Check every version field agrees
run: uv run --no-project python scripts/sync_version.py --check
- name: Check version fields + the CHANGELOG release contract
run: uv run --no-project python scripts/release.py check

lint:
name: lint (trunk)
Expand All @@ -107,8 +107,11 @@ jobs:
steps:
- uses: actions/checkout@v7
with:
# Trunk needs full history for diff-aware checks.
# Trunk needs full history for diff-aware checks...
fetch-depth: 0
# ...but not a credential helper: it only reads local history. Matches
# every other checkout in this file (zizmor/artipacked).
persist-credentials: false

- name: Trunk Check
uses: trunk-io/trunk-action@v1
Expand Down
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ Two orthogonal seams: **which CLI** (adapter axis: `adapters/base.py` `CodingCLI

## Repo hygiene

- CHANGELOG entries: terse, scannable, imperative, under the Unreleased heading.
- CHANGELOG entries: terse, scannable, imperative, under the `## [Unreleased]` heading. That heading is the contract, not a staging area:
- Every entry lands under `## [Unreleased]`, and only under the six Keep a Changelog subsections — `Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security`.
- A release **promotes** that section: `## [Unreleased]` is renamed to `## [X.Y.Z] — <ISO date>` and a fresh empty `## [Unreleased]` opens above it. The release never authors a new version section from the git log, and never leaves a populated `Unreleased` behind — `scripts/release.py prepare` refuses both, and `release.py check` (CI job `version-sync`) holds the reopened heading and its `compare/v<version>...HEAD` link.
- Never commit session notes, probe records, or run artifacts. Durable facts belong in docstrings; records in git history.
- Review non-convergence is evidence about the approach, not just a defect queue — escalate rather than grind.

Expand Down
2 changes: 1 addition & 1 deletion docs/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ A slice of the suite tests the **repo** rather than the product. The inventory:
| Skill-drift guard | `tests/test_module_skills_sync.py` | The seeded forks in `.claude/skills/` and `.agents/skills/` are byte-identical to canonical `src/bmad_loop/data/skills/`. **Documented limitation: CI-inert** — both trees are gitignored and absent in CI, so every parametrization skips there; the guard bites on dev boxes only. (The canonical-existence assertion runs before the skip and is CI-live.) |
| Schema-version parity | `tests/test_tui_app.py` | The TUI renderer's pinned validate schema version equals `documents.VALIDATE_SCHEMA_VERSION` — deliberate duplication, because an import would auto-follow a CLI bump and silently render a v2 document as v1 |
| Installed-copy drift | `tests/test_hook_script.py`, `tests/test_probe_hook.py` | The hook relays' copies match their source: `test_hook_script.py` re-runs `install_into` and text-compares the project copy against the source; `test_probe_hook.py` compares the packaged resource — which only bites in a wheel-installed run, since an editable install resolves both sides to the same file |
| Version sync | CI only | `scripts/sync_version.py --check` runs as the `version-sync` job; `tests/test_release.py` covers the release helpers' pure logic, not the check |
| Version sync | `tests/test_release.py` + CI | `scripts/release.py check` runs as the `version-sync` job — `sync_version.check()` in-process, plus the CHANGELOG release contract (the canonical version's section exists; `## [Unreleased]` was reopened; its `compare/v<version>...HEAD` link tracks the bump). `tests/test_release.py` covers the release helpers' pure logic **and** drives `cmd_check`/`cmd_prepare` over fixture changelogs; the version-field comparison itself is still CI-only |

Rules for adding or touching a guard:

Expand Down
Loading