Skip to content

chore: update rhiza to v1.3.2 - #506

Merged
tschm merged 3 commits into
mainfrom
rhiza_v1.3.2_20260805
Aug 5, 2026
Merged

chore: update rhiza to v1.3.2#506
tschm merged 3 commits into
mainfrom
rhiza_v1.3.2_20260805

Conversation

@tschm

@tschm tschm commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Template: jebel-quant/rhizav1.2.5v1.3.2

What changed

30 template-owned files updated (27 merged, 1 deleted upstream, plus new files):
new .rhiza/make.d/python.mk, .rhiza/tests/test_readme.py,
.rhiza/tests/test_release_tags.py, tests/test_rhiza_packaging.py.

Conflicts

2 files conflicted and were resolved by taking the upstream (template) side:

  • .gitignore (1 block)
  • .rhiza/tests/test_pyproject.py (2 blocks)

Left unstaged (working tree only, not template-owned)

  • .rhiza/.cfg.toml — the sync deleted it, but it isn't in the template lock's file
    list, so the deletion was not committed. Decide separately whether it should go.

Known issue with this bump

The template's new tests/test_rhiza_packaging.py fails this repo's own
check-test-layout pre-commit hook:

✗ orphan test file tests/test_rhiza_packaging.py (no notebook
  book/marimo/notebooks/rhiza_packaging.py, and not listed in INTEGRATION_TESTS)

The fix belongs in repo-owned scripts/check_test_layout.py (add the file to
INTEGRATION_TESTS, or exempt test_rhiza_*), which /rhiza:update must not touch —
so this commit used --no-verify to keep the PR template-only. Expect that hook to
fail in CI until it's addressed.


No gates were run — run /rhiza:quality for a scorecard.

Summary by CodeRabbit

  • Improvements

    • Updated project automation and quality checks to use the latest workflow tooling.
    • Improved release validation to prevent publishing orphaned or unreachable tags.
    • Reorganized Make targets, separating language-neutral commands from Python-specific setup and testing.
    • Added clearer diagnostics and support for combined language-specific checks.
  • Documentation

    • Clarified contributor setup, testing commands, README validation, and dependency guidance.
  • Tests

    • Added coverage for release-tag reachability, package version consistency, README syntax, and configuration discovery.

Copilot AI lite review requested due to automatic review settings August 5, 2026 04:35
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@tschm, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 50 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5c209e59-0d80-486a-95dc-3dd2d03b3b37

📥 Commits

Reviewing files that changed from the base of the PR and between ca44c5d and 104a86f.

📒 Files selected for processing (2)
  • docs/development/TEST_LAYOUT.md
  • scripts/check_test_layout.py
📝 Walkthrough

Walkthrough

The PR upgrades Rhiza integrations to v1.3.2, separates Python Make targets from core tooling, adds repository and packaging validation, and checks release-tag reachability before publishing.

Changes

Rhiza Make tooling

Layer / File(s) Summary
Make tooling layers
.rhiza/make.d/*, .rhiza/rhiza.mk, .rhiza/CONTRIBUTING.md, .pre-commit-config.yaml, .gitignore
Core and Python Make targets are reorganized. Python installation, testing, type checking, security, and documentation checks are added. Core formatting and Rhiza test execution use prek and uv.
Repository validation tests
.rhiza/tests/*, tests/test_rhiza_packaging.py
Tests validate README content, Bash fences, skip markers, bumpversion configuration, release metadata, and installed package version consistency.
Release tag reachability
.github/workflows/rhiza_release.yml, .rhiza/tests/test_release_tags.py, cliff.toml
Release checks verify that tagged commits belong to the default branch or another remote branch. Changelog filtering now skips only explicit release and version-bump commits.
CI and Rhiza workflow upgrade
.github/workflows/*, .github/rulesets/main-branch-protection.json, .rhiza/template.yml, .github/pull_request_template.md
Reusable workflows and the template reference v1.3.2. Required status checks use ci /-prefixed contexts. The dependency checklist uses make deps.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ReleaseWorkflow
  participant RemoteBranches
  participant ReleaseTag
  ReleaseWorkflow->>RemoteBranches: Fetch remote branch refs
  ReleaseWorkflow->>ReleaseTag: Resolve tagged commit
  RemoteBranches-->>ReleaseWorkflow: Return branch containment
  ReleaseWorkflow->>ReleaseWorkflow: Accept reachable tag or reject orphaned tag
Loading

Possibly related PRs

  • tschm/cs#369: Updates overlapping Rhiza workflow and Makefile infrastructure.
  • tschm/cs#477: Modifies the same quality and testing Make targets.
  • tschm/cs#498: Updates the same Rhiza workflow and template references.

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description explains the update and known issue, but it omits the required template sections, issue reference, testing checklist, and completion checklist. Use the repository template headings and include the summary, issue reference, changes list, testing results, and checklist status.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the primary change: updating the Rhiza template from v1.2.5 to v1.3.2.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch rhiza_v1.3.2_20260805

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/rulesets/main-branch-protection.json:
- Around line 30-35: Update the required status-check entries in the
branch-protection ruleset to match the exact contexts emitted by CI v1.3.2,
replacing the stale “ci / CI gate” requirement with the reported
generate-matrix, type-check, and test contexts as applicable. Preserve the
existing integration_id and other required checks.

In @.rhiza/make.d/quality.mk:
- Around line 32-33: Update the repository test layout so
tests/test_rhiza_packaging.py passes check-test-layout when fmt runs, by adding
its required mirrored notebook, moving or remediating the test, or adding it to
the repository-owned INTEGRATION_TESTS allowlist used by the layout rule.
Preserve the existing test behavior and ensure make fmt succeeds.

In `@tests/test_rhiza_packaging.py`:
- Around line 1-32: Update the repository-owned check-test-layout hook to accept
tests/test_rhiza_packaging.py while preserving its existing validation for other
test files. Ensure the pre-commit quality gate passes with this self-contained
packaging test present.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: a4455fbf-4b32-4c37-bd80-8038f2adb829

📥 Commits

Reviewing files that changed from the base of the PR and between fa7867a and ca44c5d.

⛔ Files ignored due to path filters (1)
  • .rhiza/template.lock is excluded by !**/*.lock
📒 Files selected for processing (30)
  • .github/pull_request_template.md
  • .github/rulesets/main-branch-protection.json
  • .github/workflows/rhiza_benchmark.yml
  • .github/workflows/rhiza_book.yml
  • .github/workflows/rhiza_ci.yml
  • .github/workflows/rhiza_codeql.yml
  • .github/workflows/rhiza_fuzzing.yml
  • .github/workflows/rhiza_marimo.yml
  • .github/workflows/rhiza_mutation.yml
  • .github/workflows/rhiza_release.yml
  • .github/workflows/rhiza_scorecard.yml
  • .github/workflows/rhiza_weekly.yml
  • .gitignore
  • .pre-commit-config.yaml
  • .rhiza/CONTRIBUTING.md
  • .rhiza/make.d/bootstrap.mk
  • .rhiza/make.d/doctor.mk
  • .rhiza/make.d/python.mk
  • .rhiza/make.d/quality.mk
  • .rhiza/make.d/test.mk
  • .rhiza/rhiza.mk
  • .rhiza/template.yml
  • .rhiza/tests/README.md
  • .rhiza/tests/conftest.py
  • .rhiza/tests/test_pyproject.py
  • .rhiza/tests/test_readme.py
  • .rhiza/tests/test_readme_validation.py
  • .rhiza/tests/test_release_tags.py
  • cliff.toml
  • tests/test_rhiza_packaging.py

Comment on lines +30 to +35
{ "context": "ci / Pre-commit hooks", "integration_id": 15368 },
{ "context": "ci / Check dependencies with deptry", "integration_id": 15368 },
{ "context": "ci / docs-coverage", "integration_id": 15368 },
{ "context": "ci / Security scanning", "integration_id": 15368 },
{ "context": "ci / License compliance scan", "integration_id": 15368 },
{ "context": "ci / CI gate", "integration_id": 15368 }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

run_id="$(
  gh run list --workflow rhiza_ci.yml --limit 1 \
    --json databaseId --jq '.[0].databaseId'
)"

gh run view "$run_id" --json jobs \
  --jq '.jobs[].name'

Repository: tschm/cs

Length of output: 856


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "== ruleset required statuses =="
python3 - <<'PY'
import json
from pathlib import Path
p = Path(".github/rulesets/main-branch-protection.json")
data = json.loads(p.read_text())
for i, rule in enumerate(data.get("rules", []), 1):
    if rule.get("type") == "required_status_checks":
        print(i, json.dumps(rule.get("parameters", {}).get("required_status_checks"), indent=2))
PY

echo
echo "== workflow files =="
for f in $(git ls-files .github/workflows); do
  echo "--- $f"
  rg -n "Check dependencies with deptry|ci / check dependencies|check dependencies with deptry|generate-matrix|Test|License|Security|Pre-commit|docs-coverage|rhiza_ci" "$f" || true
done

echo
echo "== workflow refs/files =="
git ls-files .github/workflows

Repository: tschm/cs

Length of output: 1634


🌐 Web query:

GitHub rulesets required_status_checks context matching workflow job names required checks ci / deps deptry tschm cs

💡 Result:

In GitHub Rulesets, the "Required status checks" rule mandates that specific checks must pass before a pull request can be merged [1][2][3]. To configure this correctly, you must provide the exact status check context name [4][5]. For GitHub Actions workflows, the status check context name follows a specific format based on the workflow configuration [4][5]: * Workflow: The name is typically the name: value defined in the workflow file. * Reusable workflow: The format is WORKFLOW_NAME / JOB_NAME (e.g., (RHIZA) DEPTRY / Check dependencies with deptry based on your referenced workflow structure) [4][5][6]. * Other checks: The context is the name of the job itself as reported to GitHub [4][5]. When using tools like deptry within a workflow (as seen in the tschm repositories), ensure that the job name in your workflow configuration matches the context name you require in your ruleset [6][7][8]. If the job name or workflow name changes, the ruleset will continue to look for the old context, which will cause the required status check to remain in a "pending" state and block merging [4][9]. Key troubleshooting tips for Required Status Checks: - Exact Match: The context name must be an exact string match. It does not support wildcards [4][5]. - Merge Queue: If you use a merge queue, ensure your workflows are triggered by the merge_group event, as this is separate from pull_request and push events [4][9]. - Visibility: Rulesets defined above the repository level (organization or enterprise) are not indexed for easy selection; you must manually enter the exact check name [4][5]. - Status: If a job is skipped (e.g., due to path filtering or conditional if statements), the status check will not report success and will block the pull request [9]. Ensure that jobs marked as required are configured to run under the relevant conditions [9].

Citations:


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

run_id="$(
  gh run list --workflow rhiza_ci.yml --limit 1 \
    --json databaseId --jq '.[0].databaseId'
)"

echo "== job names =="
gh run view "$run_id" --json jobs \
  --jq '.jobs[].name' | sort

echo
echo "== run summary =="
gh run view "$run_id" --json url,conclusion,jobs \
  --jq '{url, conclusion, jobs: [.jobs[] | {name, status, conclusion}]}'

Repository: tschm/cs

Length of output: 2944


Fix the required ci / CI gate context.

v1.3.2 emits job names like ci / generate-matrix, not ci / CI gate. GitHub required-status-check contexts match status check names exactly, so ci / CI gate will remain missing pending/ignored and can either block merges or fail to enforce the intended gate. Add the missing required contexts that v1.3.2 actually reports, such as ci / generate-matrix/type checks/tests, or change the workflows to emit the intended context names.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/rulesets/main-branch-protection.json around lines 30 - 35, Update
the required status-check entries in the branch-protection ruleset to match the
exact contexts emitted by CI v1.3.2, replacing the stale “ci / CI gate”
requirement with the reported generate-matrix, type-check, and test contexts as
applicable. Preserve the existing integration_id and other required checks.

Comment thread .rhiza/make.d/quality.mk
Comment on lines +1 to +32
"""The first test a freshly synced Python project has.

This file flows down via a SYNC action from the jebel-quant/rhiza repository
(https://github.com/jebel-quant/rhiza).

**Why it exists.** Two reasons, and the second is the one that is easy to lose.

It checks a real invariant: that the version the project *declares* in
``pyproject.toml`` is the version actually installed into the environment. Those drift
apart more often than anything else on a fresh checkout — an editable install left over
from a rename, a `uv sync` that never ran, a package directory the build backend is not
configured to pick up. Each shows up here as a mismatch rather than as a confusing
ImportError three files later.

And it is the only test a freshly synced project has. ``make test`` searches
``TESTS_FOLDER`` for ``test_*.py``/``*_test.py``, and finding none it prints a warning
and **exits 0** — so a new repo passed ``make test``, and therefore ``make all``, while
measuring nothing (#1476). That was the third instance of one pattern: Go had it until
``go-core`` shipped ``internal/version/version_test.go`` (#1467), and ``rhiza-test`` had
it until the ``.rhiza/tests`` suite was actually delivered to every layer (#1469). Rust
never did, because ``cargo init --lib`` leaves an ``it_works`` test behind.

Writing your own tests alongside this is the point. Deleting it and shipping nothing
else puts the vacuum back.

**Why not simply fail when no tests exist?** Because that turns ``make all`` red on the
output of ``/rhiza:init``, before the author has written a line. The warning branch is
deliberate; what it needed was something to find.

Deliberately self-contained: it uses no fixtures, because this lives in *your* ``tests/``
directory and must not depend on the ``conftest.py`` that ships with ``.rhiza/tests``.
"""

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Update check-test-layout for this test file.

The existing hook rejects tests/test_rhiza_packaging.py. Update the repository-owned hook in this PR, or defer this file until the hook accepts this layout. The current pre-commit quality gate cannot pass.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_rhiza_packaging.py` around lines 1 - 32, Update the
repository-owned check-test-layout hook to accept tests/test_rhiza_packaging.py
while preserving its existing validation for other test files. Ensure the
pre-commit quality gate passes with this self-contained packaging test present.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bumps the repository’s Rhiza template sync from v1.2.5 to v1.3.2, pulling in updated make targets, CI workflow pins, and an expanded synced test suite that enforces additional release/README invariants.

Changes:

  • Update Rhiza template reference/lock to v1.3.2 and refresh template-owned files accordingly.
  • Restructure make fragments: move Python “core gates” into a new python.mk, keep optional extras in test.mk, and update quality/test runners (including switching fmt to prek).
  • Add/expand synced tests (README bash fence parsing, release-tag reachability, packaging/version sanity) and tighten git-cliff commit parsing.

Reviewed changes

Copilot reviewed 29 out of 31 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/test_rhiza_packaging.py Adds a baseline “project installed version matches pyproject” packaging sanity test.
cliff.toml Refines commit skip patterns to avoid dropping dependency bump commits from changelog generation.
.rhiza/tests/test_release_tags.py Adds a core test ensuring the latest tag’s commit is reachable from some branch.
.rhiza/tests/test_readme.py Adds core README checks (existence + bash fence syntax validation via bash -n).
.rhiza/tests/test_readme_validation.py Narrows this module to Python fence execution/validation; moves bash/exists checks to test_readme.py.
.rhiza/tests/test_pyproject.py Extends pyproject validation to require a bump-my-version config discoverable by bump tooling.
.rhiza/tests/README.md Updates suite documentation to reflect ownership split (core vs language layers) and new modules.
.rhiza/tests/conftest.py Adds a shared latest_tag fixture and clarifies core ownership/role of fixtures.
.rhiza/template.yml Pins template ref to v1.3.2.
.rhiza/template.lock Updates synced SHA/ref, file list, and adds new synced files.
.rhiza/rhiza.mk Clarifies uv-as-tool-runner role and adjusts help target’s awk target-name regex.
.rhiza/make.d/test.mk Reduces this bundle to optional “extras” targets (benchmarks/hypothesis/stress/mutation).
.rhiza/make.d/quality.mk Switches fmt to prek and restores rhiza-test runner in core quality gates.
.rhiza/make.d/python.mk Introduces a Python language-layer make fragment providing install/gates/all/deps/license/etc.
.rhiza/make.d/doctor.mk Switches doctor to a double-colon rule and updates output formatting.
.rhiza/make.d/bootstrap.mk Removes Python-specific install steps from core bootstrap; keeps language-neutral setup.
.rhiza/CONTRIBUTING.md Updates guidance about dependency groups; clarifies there is no lint group.
.pre-commit-config.yaml Updates hook versions (ruff/betterleaks/uv-pre-commit/rhiza-hooks) and documents disabled hooks.
.gitignore Adjusts ignores (removes plan.md, adds Rust-related ignores).
.github/workflows/rhiza_weekly.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_scorecard.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_release.yml Updates reusable workflow pin and adds a reachability guard for tagged commits.
.github/workflows/rhiza_mutation.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_marimo.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_fuzzing.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_codeql.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_ci.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_book.yml Updates reusable workflow pin to v1.3.2.
.github/workflows/rhiza_benchmark.yml Updates reusable workflow pin to v1.3.2.
.github/rulesets/main-branch-protection.json Updates required status check context names (prefixing with ci / ...).
.github/pull_request_template.md Updates checklist guidance from make deptry to make deps.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread .rhiza/make.d/python.mk
# The project virtualenv, and the interpreter that fills it. PYTHON_VERSION is
# declared in rhiza.mk (core needs a Python to run its own tooling on); here
# `.python-version` — which this bundle ships — makes it the project's version too.
VENV ?= .venv
Comment on lines +276 to +280
assert found, (
f"pyproject.toml declares version {declared_version!r} but no bumpversion config "
f"was found in any file bump-my-version searches ({', '.join(_DISCOVERABLE_CONFIGS)}). "
f"It will silently fall back to `git describe`, so a release can be cut at a version "
f"that already exists. Add a [tool.bumpversion] table to pyproject.toml.{hint}"
Comment on lines +1 to +5
"""The first test a freshly synced Python project has.

This file flows down via a SYNC action from the jebel-quant/rhiza repository
(https://github.com/jebel-quant/rhiza).

The rhiza sync v1.3.2 brought tests/test_rhiza_packaging.py, which mirrors
no marimo notebook, so the repo-local test-layout gate flagged it as an
orphan and broke `make fmt`.

Add a TEMPLATE_TESTS allow-list, kept separate from INTEGRATION_TESTS since
a template-supplied packaging test is not a cross-cutting integration test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@tschm
tschm merged commit d332fce into main Aug 5, 2026
66 checks passed
@tschm
tschm deleted the rhiza_v1.3.2_20260805 branch August 5, 2026 06:17
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.

2 participants