Skip to content

Prepare v0.5.0-alpha.1 release - #43

Merged
flyingrobots merged 19 commits into
mainfrom
release/v0.5.0-alpha.1-prep
Jun 25, 2026
Merged

Prepare v0.5.0-alpha.1 release#43
flyingrobots merged 19 commits into
mainfrom
release/v0.5.0-alpha.1-prep

Conversation

@flyingrobots

Copy link
Copy Markdown
Owner

Summary

Prepare v0.5.0-alpha.1 for release and automate the post-merge release path.

What changed

  • Bumped crates/edict-syntax and Cargo.lock to 0.5.0-alpha.1.
  • Cut CHANGELOG.md entries into the dated v0.5.0-alpha.1 section.
  • Added docs/releases/v0.5.0-alpha.1.md for the Gate C admission-boundary alpha.
  • Refreshed README, docs index, ROADMAP, and release-process topic signposts.
  • Added structured release-process policy and xtask tests for the v0.5 admission boundary.
  • Added .github/workflows/auto-release-tag.yml to create immutable release tags after successful main CI on merged release/*-prep PRs.
  • Extended the Release workflow to support workflow_dispatch, verify zero-open matching milestones, publish the GitHub prerelease, and close the matching milestone.

Validation

  • actionlint
  • git diff --check
  • cargo test -p xtask release_
  • cargo xtask verify

Closes #42

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@flyingrobots, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 51 minutes and 49 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more credits in the billing tab to continue.

⌛ How to resolve this issue?

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 credits.

🚦 How do rate 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 see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: ac0926d8-2415-4a97-ae1c-39ed20eae72a

📥 Commits

Reviewing files that changed from the base of the PR and between ca19915 and 538d2a6.

📒 Files selected for processing (2)
  • .github/workflows/auto-release-tag.yml
  • xtask/src/main.rs

Walkthrough

Adds automated release-tag creation after successful main CI, extends release publication to accept manual tags and close milestones, and updates the v0.5.0-alpha.1 release notes, policy/docs/tests, and crate version.

Changes

Release automation and v0.5 rollout

Layer / File(s) Summary
Auto-release tagging flow
.github/workflows/auto-release-tag.yml
The new workflow resolves merged release-prep PRs from main CI, derives the release tag, validates the release notes file, enforces milestone readiness, creates or verifies the annotated tag, and dispatches release publication.
Release publication flow
.github/workflows/release.yml
release.yml accepts a manual tag input, derives the active release tag from the event, validates the matching milestone, publishes the release, and closes the milestone when it remains open.
v0.5 release artifacts
CHANGELOG.md, README.md, ROADMAP.md, docs/README.md, crates/edict-syntax/Cargo.toml, docs/releases/v0.5.0-alpha.1.md
The changelog, crate version, release notes, roadmap, README, and docs index are updated for v0.5.0-alpha.1 and the new release issue and scope framing.
Release-process contracts
docs/topics/release-process/*
The release-process README, policy, runbook, and test plan are revised to describe auto-tagging, workflow dispatch, milestone closure evidence, and the structured v0.5 release boundary.
xtask release guards
xtask/src/main.rs
The xtask checks add workflow dispatch coverage, milestone closure sequencing, auto-release workflow guards, structured release automation policy fields, and v0.5 boundary consistency checks.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • flyingrobots/edict#26 — Also extends xtask/src/main.rs checks for release-process workflow and policy structure.

Poem

A tag was born on main’s clean track,
Then milestones nodded, no turning back.
Notes and gates aligned with care,
A prerelease drifts through the air,
And tests keep time with a steady spark.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately describes the main change: preparing v0.5.0-alpha.1 for release.
Description check ✅ Passed The description matches the release-prep and automation work in the changeset.
Linked Issues check ✅ Passed The PR covers #42's release prep, docs, automation, and zero-open-issues milestone gate.
Out of Scope Changes check ✅ Passed The changes stay within release preparation, documentation, workflow automation, and tests.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/topics/release-process/runbook.md (1)

103-110: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Anchor the fallback tag to refreshed main, not implicit HEAD.

Line 103 removes the old “refresh local main first” guard, but the fallback still uses git tag -a ... with no target. If an operator runs this from a stale checkout or the old release/...-prep branch, the tag can land on the wrong commit, and release.yml would still accept any older commit that is merely reachable from origin/main.

As per coding guidelines, “Documentation is a product interface, not a Markdown inventory.”

Suggested fix
 Manual tagging is now an operator fallback, not the normal path. If automation
 does not run and the release-prep merge commit has been verified on `main`, the
 fallback is:

 ```bash
+git switch main
+git fetch origin
+git merge --ff-only origin/main
-git tag -a vX.Y.Z-alpha.N -m "vX.Y.Z-alpha.N"
+git tag -a vX.Y.Z-alpha.N origin/main -m "vX.Y.Z-alpha.N"
 git push origin vX.Y.Z-alpha.N
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @docs/topics/release-process/runbook.md around lines 103 - 110, The fallback
tagging step in the release-process runbook can tag the wrong commit because
git tag -a is currently using the operator’s implicit HEAD. Update the
instructions around the manual fallback to first refresh local main from
origin/main (for example via the existing release flow context), then make
git tag -a explicitly point at origin/main so the tag is anchored to the
verified commit. Use the existing release-prep fallback section and the git tag -a / git push origin steps as the place to adjust the guidance.


</details>

<!-- cr-comment:v1:df9838fa454661517646e90b -->

_Source: Coding guidelines_

</blockquote></details>

</blockquote></details>
🤖 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/workflows/auto-release-tag.yml:
- Around line 9-12: The workflow_run job is over-privileged because the single
tag-release job currently holds actions: write and contents: write for every
step. Split the logic in auto-release-tag into separate stages or jobs around
the existing identify/tag/dispatch flow so the release-PR lookup runs with only
pull-requests: read and contents: read, the git push step in the tag creation
path gets only contents: write, and the gh workflow run dispatch step gets only
actions: write; keep the permissions scoped to the specific job or stage names
used in the current release tagging flow.

In @.github/workflows/release.yml:
- Around line 65-66: The milestone lookup in the release workflow is only
querying the first page of GitHub results, so it can miss the target milestone
in long-lived repositories. Update the gh api call in the release job to use
pagination so the milestone search in the MILESTONE_JSON assignment traverses
all pages before the jq filter runs, keeping the existing TAG-based lookup
intact.

In `@xtask/src/main.rs`:
- Around line 904-929: The auto-release workflow guard test is missing coverage
for the push-event predicate, so update auto_release_tag_workflow_is_guarded in
xtask/src/main.rs to also assert the workflow contains
github.event.workflow_run.event == 'push'. Keep the existing checks around
workflow_run, CI, main, and success, but add the missing guard string so the
test fails if the auto-tagger starts reacting to non-merge CI runs.
- Around line 880-901: The current guard in
release_workflow_supports_dispatch_and_milestone_closure only checks for
milestone-related text, so it can miss ordering and wiring regressions. Harden
this test by inspecting the release workflow structure around Publish GitHub
release and Close release milestone, and assert that the close step runs only
after the publish step and is driven by steps.release.outputs.* rather than just
matching substrings. Use the existing
release_workflow_supports_dispatch_and_milestone_closure test and the
release.yml workflow contract as the target for the behavior check.

---

Outside diff comments:
In `@docs/topics/release-process/runbook.md`:
- Around line 103-110: The fallback tagging step in the release-process runbook
can tag the wrong commit because `git tag -a` is currently using the operator’s
implicit `HEAD`. Update the instructions around the manual fallback to first
refresh local `main` from `origin/main` (for example via the existing release
flow context), then make `git tag -a` explicitly point at `origin/main` so the
tag is anchored to the verified commit. Use the existing release-prep fallback
section and the `git tag -a` / `git push origin` steps as the place to adjust
the guidance.
🪄 Autofix (Beta)

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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9e7a759d-bc04-4541-bea9-7fa80f31de67

📥 Commits

Reviewing files that changed from the base of the PR and between dcd5677 and 87f3940.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (13)
  • .github/workflows/auto-release-tag.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • README.md
  • ROADMAP.md
  • crates/edict-syntax/Cargo.toml
  • docs/README.md
  • docs/releases/v0.5.0-alpha.1.md
  • docs/topics/release-process/README.md
  • docs/topics/release-process/policy.toml
  • docs/topics/release-process/runbook.md
  • docs/topics/release-process/test-plan.md
  • xtask/src/main.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (3)
**

⚙️ CodeRabbit configuration file

**: # AGENTS

Git Rules

NEVER amend git commits. Make a new commit instead.

NEVER use git rebase unless the user explicitly approves a rare exception.
Use regular merge commits.

NEVER force any git operation. If a force operation appears necessary, stop and
explain what happened and what options remain.

NEVER create draft pull requests.

NEVER use a codex prefix in branch names, PR titles, or commit messages.

Pull request bodies for issue work MUST include GitHub auto-close text such as
Closes #123`` for every issue the PR is intended to close.

Think

Think is durable memory for cross-session coordination.

  • Use codex-think --remember --json when starting a new session, changing into
    this repository, or regaining context after a context shift.
  • Use codex-think "..." --json when a cycle closes or a significant event
    should survive across turns.
  • Treat Think as memory, not repo truth. Anchor strong claims back to files,
    commits, commands, issues, or pull requests.
  • Claude memories are read-only. Use claude-think --remember --json only for
    additional context.

Topic Shelves

docs/topics/ contains the living contract graph for landed behavior. Topic
shelves are not proposals, retrospectives, or design archaeology.

Each shelf may contain:

  • README.md: what is true in HEAD.
  • test-plan.md: how those truths are verified, including requirements, cases,
    fixtures, oracles, implemented evidence, planned cases, and known gaps.
  • architecture.md: optional structure or dataflow notes when the machinery
    earns a separate page.
  • rationale.md: optional still-relevant tradeoffs and rejected approaches.

When To Update Topic Shelves

For every nontrivial behavior, contract, workflow, release, schema, validation,
or public-surface change:

  1. Identify the owning topic shelf before editing code.
  2. If no shelf owns durable behavior, create one.
  3. Update test-plan.md before or alongside tests with requirement IDs, case
    IDs,...

Files:

  • crates/edict-syntax/Cargo.toml
  • CHANGELOG.md
  • docs/releases/v0.5.0-alpha.1.md
  • ROADMAP.md
  • docs/topics/release-process/README.md
  • README.md
  • docs/README.md
  • docs/topics/release-process/policy.toml
  • docs/topics/release-process/runbook.md
  • xtask/src/main.rs
  • docs/topics/release-process/test-plan.md
docs/topics/**/README.md

📄 CodeRabbit inference engine (AGENTS.md)

docs/topics/**/README.md: Topic shelf README.md files must describe only what is true in HEAD.
Update the topic shelf README.md only after the behavior exists in the branch; do not describe intended future behavior there.
Do not churn topic-shelf README files for purely mechanical edits that do not change a contract.

Files:

  • docs/topics/release-process/README.md
docs/topics/**/test-plan.md

📄 CodeRabbit inference engine (AGENTS.md)

docs/topics/**/test-plan.md: Update a topic shelf test-plan.md before or alongside tests with requirement IDs, case IDs, fixtures, oracles, implemented evidence, planned cases, and known gaps.
Mark planned cases as implemented only when executable evidence exists.
Do not use policy rows in topic-shelf test plans to avoid writing behavior tests for software behavior.
Negative tests in topic-shelf test plans should assert stable error kinds or structured artifacts, not merely is_err() or diagnostic text.
For nontrivial behavior, contract, workflow, release, schema, validation, or public-surface changes, update the owning topic test-plan.md with planned requirement and case rows before or alongside the first test.
Mark planned rows as implemented only after executable evidence exists.

Files:

  • docs/topics/release-process/test-plan.md
🪛 LanguageTool
docs/topics/release-process/README.md

[uncategorized] ~11-~11: The official name of this software platform is spelled with a capital “H”.
Context: ...Edict publishes GitHub releases through .github/workflows/release.yml. A release can b...

(GITHUB)


[uncategorized] ~16-~16: The official name of this software platform is spelled with a capital “H”.
Context: ...p PR merge. When CI passes on main, .github/workflows/auto-release-tag.yml checks ...

(GITHUB)

docs/topics/release-process/runbook.md

[uncategorized] ~90-~90: The official name of this software platform is spelled with a capital “H”.
Context: ...w runs on main. If that run succeeds, .github/workflows/auto-release-tag.yml checks ...

(GITHUB)

docs/topics/release-process/test-plan.md

[uncategorized] ~42-~42: The official name of this software platform is spelled with a capital “H”.
Context: ... and dispatches release publication. | .github/workflows/auto-release-tag.yml, docs/to...

(GITHUB)


[uncategorized] ~43-~43: The official name of this software platform is spelled with a capital “H”.
Context: ... the milestone has zero open issues. | .github/workflows/release.yml, docs/topics/rele...

(GITHUB)


[uncategorized] ~55-~55: The official name of this software platform is spelled with a capital “H”.
Context: ... full tag name after auto-tagging. | | .github/workflows/auto-release-tag.yml | Succes...

(GITHUB)


[uncategorized] ~71-~71: The official name of this software platform is spelled with a capital “H”.
Context: ...ports_dispatch_and_milestone_closure | .github/workflows/auto-release-tag.yml, .github...

(GITHUB)


[uncategorized] ~71-~71: The official name of this software platform is spelled with a capital “H”.
Context: ...github/workflows/auto-release-tag.yml, .github/workflows/release.yml, docs/topics/rele...

(GITHUB)

🪛 zizmor (1.26.1)
.github/workflows/release.yml

[error] 15-15: overly broad permissions (excessive-permissions): contents: write is overly broad at the workflow level

(excessive-permissions)


[error] 16-16: overly broad permissions (excessive-permissions): issues: write is overly broad at the workflow level

(excessive-permissions)


[warning] 15-15: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 131-131: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)


[info] 132-132: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)

.github/workflows/auto-release-tag.yml

[warning] 24-27: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 10-10: overly broad permissions (excessive-permissions): actions: write is overly broad at the workflow level

(excessive-permissions)


[error] 11-11: overly broad permissions (excessive-permissions): contents: write is overly broad at the workflow level

(excessive-permissions)


[error] 3-7: use of fundamentally insecure workflow trigger (dangerous-triggers): workflow_run is almost always used insecurely

(dangerous-triggers)


[warning] 10-10: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)

🔇 Additional comments (8)
docs/releases/v0.5.0-alpha.1.md (1)

1-96: LGTM!

crates/edict-syntax/Cargo.toml (1)

3-3: LGTM!

CHANGELOG.md (1)

11-12: LGTM!

README.md (1)

462-465: LGTM!

Also applies to: 494-495, 514-524

ROADMAP.md (1)

180-181: LGTM!

Also applies to: 195-195, 247-247

docs/README.md (1)

16-19: LGTM!

.github/workflows/auto-release-tag.yml (1)

29-83: LGTM!

Also applies to: 84-113, 115-124

.github/workflows/release.yml (1)

7-53: LGTM!

Also applies to: 73-87, 95-123, 124-142

Comment thread .github/workflows/auto-release-tag.yml Outdated
Comment thread .github/workflows/release.yml Outdated
Comment thread xtask/src/main.rs
Comment thread xtask/src/main.rs

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 87f3940737

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/auto-release-tag.yml Outdated
Comment thread .github/workflows/auto-release-tag.yml Outdated
Comment thread docs/topics/release-process/runbook.md Outdated
@flyingrobots

Copy link
Copy Markdown
Owner Author

Activity Summary

@codex second opinion requested on the resolved review queue.

# Severity Source File Commit Outcome
1 P2 PR .github/workflows/auto-release-tag.yml 1bbc598 Split auto-release into scoped identify/tag/dispatch jobs with least privilege.
2 P2 PR .github/workflows/auto-release-tag.yml 3d6f79d Checked matching milestone and zero open issues before creating immutable tags.
3 P2 PR .github/workflows/auto-release-tag.yml 4699430 Dispatches release.yml from the created tag ref instead of moving main.
4 P2 PR docs/topics/release-process/runbook.md d4ef31e Manual fallback now tags an explicit verified main merge commit.
5 P2 PR .github/workflows/release.yml e646f5f Release milestone lookup now paginates all milestone pages.
6 P3 PR xtask/src/main.rs 01fe756 Release workflow test now asserts publish-before-milestone-close ordering and output wiring.
7 P3 PR xtask/src/main.rs 8c9f779 Auto-release test and policy now assert the workflow_run.event == 'push' guard.
8 P5 Verify xtask/src/main.rs 7aafe0c Applied required cargo fmt formatting follow-up without amending prior commits.

Validation:

  • actionlint
  • git diff --check origin/main...HEAD
  • cargo test -p xtask release_
  • cargo xtask verify

All previously unresolved review threads were resolved via GraphQL after the fixes were pushed.

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
docs/topics/release-process/runbook.md (1)

134-139: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use the real milestone query contract here.

This command is wrong for the post-release state it asks operators to verify. Without state=all, it will usually return nothing once the workflow has closed the milestone, and without pagination it can miss older milestones entirely. Match the workflow’s query instead.

Suggested fix
-gh api repos/flyingrobots/edict/milestones --jq \
-  '.[] | select(.title == "vX.Y.Z-alpha.N") | {title,state,open_issues}'
+gh api --paginate "repos/flyingrobots/edict/milestones?state=all&per_page=100" --jq \
+  '.[] | select(.title == "vX.Y.Z-alpha.N") | {title,state,open_issues}'

As per coding guidelines, documentation is a product interface, not a Markdown inventory.

🤖 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 `@docs/topics/release-process/runbook.md` around lines 134 - 139, The milestone
verification command uses the wrong API contract for the post-release state;
update the runbook’s gh api query to match the workflow’s real milestone lookup
by requesting all states and handling pagination, then filter for the target
milestone title and closed/zero-open-issues result. Locate the command under the
release-process runbook near the milestone check, and make sure the documented
query aligns with the same contract used by the release workflow so operators
can still find closed milestones after release.

Source: Coding guidelines

.github/workflows/release.yml (1)

37-47: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Check out the selected tag before reading release artifacts.

For workflow_dispatch, RELEASE_TAG comes from inputs.tag, but the workspace remains the manually selected dispatch ref. That can publish docs/releases/${TAG}.md from main or another branch instead of the immutable tag being released.

Proposed fix
           TAG="${RELEASE_TAG}"
           VERSION="${TAG#v}"
-          NOTES="docs/releases/${TAG}.md"
-          TAG_COMMIT="$(git rev-parse "${TAG}^{commit}")"
 
           if [[ ! "${TAG}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.]+)?$ ]]; then
             echo "::error::Release tag must look like a SemVer v* tag: ${TAG}"
             exit 1
           fi
+
+          TAG_COMMIT="$(git rev-parse "${TAG}^{commit}")"
@@
           if ! git merge-base --is-ancestor "${TAG_COMMIT}" origin/main; then
             echo "::error::Release tags must target commits reachable from origin/main."
             echo "::error::Tag ${TAG} targets ${TAG_COMMIT}, which is not on origin/main."
             exit 1
           fi
+
+          git checkout --detach "${TAG_COMMIT}"
+          NOTES="docs/releases/${TAG}.md"
🤖 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/workflows/release.yml around lines 37 - 47, The release workflow
reads release notes from the current workspace, but when RELEASE_TAG comes from
inputs.tag in workflow_dispatch it may still be on the dispatch ref instead of
the immutable tag. Update the release job so the checked-out revision matches
TAG before using NOTES or TAG_COMMIT, and keep the logic centered around
RELEASE_TAG, TAG, and TAG_COMMIT in the release shell step.
🤖 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/workflows/auto-release-tag.yml:
- Around line 99-102: The checkout in the auto-release tagging workflow is
persisting write credentials on disk, so update the existing actions/checkout
step to disable credential persistence with persist-credentials: false. Then
harden the Create immutable release tag step by removing any reliance on cached
git auth and using explicit per-command authentication for the git ls-remote,
fetch, and push operations, referring to the checkout and release-tagging logic
so the token is only used transiently in each command.

In `@xtask/src/main.rs`:
- Around line 925-933: The release workflow test is too broad because
release_workflow_paginates_milestone_lookup only checks for any gh api
--paginate usage instead of the milestone lookup specifically. Tighten the
assertion in xtask/src/main.rs so it matches the milestone lookup command in
release.yml, using the existing release_workflow_paginates_milestone_lookup test
and workflow content to verify the paginated call is tied to milestone retrieval
rather than any unrelated API call.
- Around line 973-990: The auto-release workflow permission test is too weak
because it only checks for strings anywhere in the YAML, so it can miss
permissions leaking to a broader scope. Update
auto_release_tag_workflow_scopes_job_permissions to parse and inspect the
workflow structure for the specific job entries identify-release-pr,
create-release-tag, and dispatch-release-publication, and assert their job-local
permissions exactly match the expected scoped values rather than just containing
the text. Use the existing workflow-loading logic in xtask/src/main.rs to locate
the job definitions and verify the permissions map for each job.

---

Outside diff comments:
In @.github/workflows/release.yml:
- Around line 37-47: The release workflow reads release notes from the current
workspace, but when RELEASE_TAG comes from inputs.tag in workflow_dispatch it
may still be on the dispatch ref instead of the immutable tag. Update the
release job so the checked-out revision matches TAG before using NOTES or
TAG_COMMIT, and keep the logic centered around RELEASE_TAG, TAG, and TAG_COMMIT
in the release shell step.

In `@docs/topics/release-process/runbook.md`:
- Around line 134-139: The milestone verification command uses the wrong API
contract for the post-release state; update the runbook’s gh api query to match
the workflow’s real milestone lookup by requesting all states and handling
pagination, then filter for the target milestone title and
closed/zero-open-issues result. Locate the command under the release-process
runbook near the milestone check, and make sure the documented query aligns with
the same contract used by the release workflow so operators can still find
closed milestones after release.
🪄 Autofix (Beta)

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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1c4faddc-db6d-4c68-a415-559708a4ad5e

📥 Commits

Reviewing files that changed from the base of the PR and between 87f3940 and 7aafe0c.

📒 Files selected for processing (5)
  • .github/workflows/auto-release-tag.yml
  • .github/workflows/release.yml
  • docs/topics/release-process/policy.toml
  • docs/topics/release-process/runbook.md
  • xtask/src/main.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

**: # AGENTS

Git Rules

NEVER amend git commits. Make a new commit instead.

NEVER use git rebase unless the user explicitly approves a rare exception.
Use regular merge commits.

NEVER force any git operation. If a force operation appears necessary, stop and
explain what happened and what options remain.

NEVER create draft pull requests.

NEVER use a codex prefix in branch names, PR titles, or commit messages.

Pull request bodies for issue work MUST include GitHub auto-close text such as
Closes #123`` for every issue the PR is intended to close.

Think

Think is durable memory for cross-session coordination.

  • Use codex-think --remember --json when starting a new session, changing into
    this repository, or regaining context after a context shift.
  • Use codex-think "..." --json when a cycle closes or a significant event
    should survive across turns.
  • Treat Think as memory, not repo truth. Anchor strong claims back to files,
    commits, commands, issues, or pull requests.
  • Claude memories are read-only. Use claude-think --remember --json only for
    additional context.

Topic Shelves

docs/topics/ contains the living contract graph for landed behavior. Topic
shelves are not proposals, retrospectives, or design archaeology.

Each shelf may contain:

  • README.md: what is true in HEAD.
  • test-plan.md: how those truths are verified, including requirements, cases,
    fixtures, oracles, implemented evidence, planned cases, and known gaps.
  • architecture.md: optional structure or dataflow notes when the machinery
    earns a separate page.
  • rationale.md: optional still-relevant tradeoffs and rejected approaches.

When To Update Topic Shelves

For every nontrivial behavior, contract, workflow, release, schema, validation,
or public-surface change:

  1. Identify the owning topic shelf before editing code.
  2. If no shelf owns durable behavior, create one.
  3. Update test-plan.md before or alongside tests with requirement IDs, case
    IDs,...

Files:

  • docs/topics/release-process/policy.toml
  • docs/topics/release-process/runbook.md
  • xtask/src/main.rs
🪛 zizmor (1.26.1)
.github/workflows/auto-release-tag.yml

[warning] 23-23: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 99-102: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 96-96: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 158-158: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)

🔇 Additional comments (3)
.github/workflows/auto-release-tag.yml (2)

10-88: LGTM!


150-168: LGTM!

.github/workflows/release.yml (1)

65-87: LGTM!

Also applies to: 95-142

Comment thread .github/workflows/auto-release-tag.yml
Comment thread xtask/src/main.rs
Comment thread xtask/src/main.rs

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7aafe0c052

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/auto-release-tag.yml
Comment thread docs/topics/release-process/runbook.md Outdated
Comment thread .github/workflows/release.yml
@flyingrobots

Copy link
Copy Markdown
Owner Author

Self-Discovered Issue

@codex second opinion requested.

Severity Source File Lines Issue Mitigation
P2 Self .github/workflows/auto-release-tag.yml, .github/workflows/release.yml milestone lookup commands Paginated milestone lookup pipes through head -n 1 while the script uses set -euo pipefail. If gh api --paginate writes additional output after head exits, the producer can receive SIGPIPE and the command substitution can fail even when the target milestone exists. Replace head-based truncation with a single jq selection over the paginated stream, and add xtask coverage that milestone lookups do not depend on head.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7aafe0c052

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/auto-release-tag.yml
@flyingrobots

Copy link
Copy Markdown
Owner Author

@codex Activity Summary for the latest Code Lawyer pass.

Source Severity File(s) Commit(s) Outcome
PR P2 .github/workflows/auto-release-tag.yml, xtask/src/main.rs e6ab7cc, 3e19e44 Disabled checkout credential persistence and moved tag-job Git network operations to explicit per-command ephemeral auth.
PR P2 .github/workflows/auto-release-tag.yml, xtask/src/main.rs 71a1f0e Added explicit repository context for gh workflow run in the dispatch-only job.
PR P2 .github/workflows/release.yml, xtask/src/main.rs e4fd041 Made manual release dispatch check out the tag being published before reading release notes.
PR P3 docs/topics/release-process/runbook.md, docs/topics/release-process/policy.toml, xtask/src/main.rs 922d1c4 Updated post-release milestone verification to query paginated all-state milestones.
PR P3 xtask/src/main.rs, docs/topics/release-process/policy.toml 8c7c413 Bound the pagination regression to the release milestone lookup contract instead of any paginated API call.
PR P3 xtask/src/main.rs, docs/topics/release-process/policy.toml 091f0a0 Hardened release permission tests to inspect top-level and job-local permission blocks.
Self P2 .github/workflows/release.yml, .github/workflows/auto-release-tag.yml, docs/topics/release-process/policy.toml, xtask/src/main.rs 2cbd99b Removed head-based paginated milestone selection under pipefail; both workflows now consume the full stream before selecting the first match.
Self P5 xtask/src/main.rs ca19915 Formatter-only cleanup required by cargo fmt --all --check.

Validation run on the final head 3e19e44:

  • actionlint
  • git diff --check origin/main...HEAD
  • cargo test -p xtask release_
  • cargo xtask verify

All previously unresolved PR review threads were resolved via GraphQL after the fixes landed.

@chatgpt-codex-connector

Copy link
Copy Markdown

Summary

  • Reviewed the latest PR follow-up state and found the requested release-automation hardening already present on the current branch, so I made no additional code changes, did not create a commit, and did not open a new PR.
  • Confirmed the auto-release tag job disables persisted checkout credentials and uses per-command Git authentication for ls-remote, fetch, and push. .github/workflows/auto-release-tag.ymlL99-L151
  • Confirmed the dispatch job provides explicit repository context via GH_REPO and dispatches release.yml from the created tag ref. .github/workflows/auto-release-tag.ymlL154-L173
  • Confirmed the release workflow checks out the selected tag before reading release artifacts and uses the paginated all-state milestone lookup without head. .github/workflows/release.ymlL28-L68
  • Confirmed xtask coverage exists for release tag checkout, paginated milestone lookup, push-event guarding, least-privilege job permissions, ephemeral credentials, milestone-before-tag ordering, tag-ref dispatch, and explicit repository dispatch context. xtask/src/main.rsL936-L1133
  • Confirmed the runbook milestone verification command uses the same paginated all-state query contract operators need after milestone closure. docs/topics/release-process/runbook.mdL134-L139

Testing

  • cargo test -p xtask release_
  • ⚠️ git diff --check origin/main...HEAD — warning due to this local checkout not having origin/main available.
  • ⚠️ actionlint — warning because actionlint is not installed in this environment.
  • ⚠️ codex-think --remember --json — warning because codex-think is not installed in this environment.

View task →

@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: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/topics/release-process/policy.toml (1)

47-54: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Make auto_release_tag_run conditional or define a fallback evidence artifact.

The manual path in docs/topics/release-process/runbook.md Lines 103-113 explicitly allows release publication when auto-tagging never ran, but this policy now requires auto_release_tag_run unconditionally. That makes the documented fallback non-compliant with the machine-checkable contract.

🤖 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 `@docs/topics/release-process/policy.toml` around lines 47 - 54, The release
policy currently requires auto_release_tag_run unconditionally, which conflicts
with the documented manual release path in the release process runbook. Update
the required_evidence list in policy.toml to make auto_release_tag_run
conditional or add an explicit fallback evidence artifact for manual
publication, and ensure the contract still references the existing release
evidence symbols like release_issue, release_prep_pull_request, main_ci_run,
tag_object, and github_release_url.
🤖 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 `@xtask/src/main.rs`:
- Around line 949-956: The release milestone lookup test only checks the policy
text, so it won’t catch workflow regressions that truncate the paginated
milestone stream. Update the existing test function
release_milestone_lookup_consumes_complete_paginated_stream to also inspect the
workflow definitions in .github/workflows/release.yml and
.github/workflows/auto-release-tag.yml, asserting the milestone lookup block
uses the full-stream jq -s '.[0] // empty' pattern and does not include head -n
1 or any equivalent truncation.

---

Outside diff comments:
In `@docs/topics/release-process/policy.toml`:
- Around line 47-54: The release policy currently requires auto_release_tag_run
unconditionally, which conflicts with the documented manual release path in the
release process runbook. Update the required_evidence list in policy.toml to
make auto_release_tag_run conditional or add an explicit fallback evidence
artifact for manual publication, and ensure the contract still references the
existing release evidence symbols like release_issue, release_prep_pull_request,
main_ci_run, tag_object, and github_release_url.
🪄 Autofix (Beta)

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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: d7341a97-9596-41e8-9b7b-c8ab8fd80e15

📥 Commits

Reviewing files that changed from the base of the PR and between 7aafe0c and ca19915.

📒 Files selected for processing (5)
  • .github/workflows/auto-release-tag.yml
  • .github/workflows/release.yml
  • docs/topics/release-process/policy.toml
  • docs/topics/release-process/runbook.md
  • xtask/src/main.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

**: # AGENTS

Git Rules

NEVER amend git commits. Make a new commit instead.

NEVER use git rebase unless the user explicitly approves a rare exception.
Use regular merge commits.

NEVER force any git operation. If a force operation appears necessary, stop and
explain what happened and what options remain.

NEVER create draft pull requests.

NEVER use a codex prefix in branch names, PR titles, or commit messages.

Pull request bodies for issue work MUST include GitHub auto-close text such as
Closes #123`` for every issue the PR is intended to close.

Think

Think is durable memory for cross-session coordination.

  • Use codex-think --remember --json when starting a new session, changing into
    this repository, or regaining context after a context shift.
  • Use codex-think "..." --json when a cycle closes or a significant event
    should survive across turns.
  • Treat Think as memory, not repo truth. Anchor strong claims back to files,
    commits, commands, issues, or pull requests.
  • Claude memories are read-only. Use claude-think --remember --json only for
    additional context.

Topic Shelves

docs/topics/ contains the living contract graph for landed behavior. Topic
shelves are not proposals, retrospectives, or design archaeology.

Each shelf may contain:

  • README.md: what is true in HEAD.
  • test-plan.md: how those truths are verified, including requirements, cases,
    fixtures, oracles, implemented evidence, planned cases, and known gaps.
  • architecture.md: optional structure or dataflow notes when the machinery
    earns a separate page.
  • rationale.md: optional still-relevant tradeoffs and rejected approaches.

When To Update Topic Shelves

For every nontrivial behavior, contract, workflow, release, schema, validation,
or public-surface change:

  1. Identify the owning topic shelf before editing code.
  2. If no shelf owns durable behavior, create one.
  3. Update test-plan.md before or alongside tests with requirement IDs, case
    IDs,...

Files:

  • docs/topics/release-process/policy.toml
  • docs/topics/release-process/runbook.md
  • xtask/src/main.rs
🔇 Additional comments (3)
.github/workflows/auto-release-tag.yml (2)

103-149: Finish the explicit git-auth hardening.

This still leaves the earlier hardening incomplete: after persist-credentials: false, git ls-remote and git fetch rely on unauthenticated origin, while push embeds the token in the remote URL. Use per-command auth for all three git network calls.


119-120: LGTM!

Also applies to: 165-171

.github/workflows/release.yml (1)

32-32: LGTM!

Also applies to: 66-68, 126-144

Comment thread xtask/src/main.rs
@flyingrobots

Copy link
Copy Markdown
Owner Author

@codex Activity Summary for the duplicate-thread Code Lawyer pass.

Source Severity File(s) Commit SHA Outcome
PR P2 .github/workflows/release.yml 2cbd99b Duplicate thread PRRT_kwDOS96-Us6MVSyt verified already fixed: milestone lookup uses full-stream jq -s '.[0] // empty'; no head -n 1 remains in release workflows.
PR P2 .github/workflows/release.yml e4fd041 Duplicate thread PRRT_kwDOS96-Us6MVSyx verified already fixed: release checkout is bound to `${{ github.event_name == 'workflow_dispatch' && inputs.tag
PR P1 .github/workflows/auto-release-tag.yml 71a1f0e Duplicate thread PRRT_kwDOS96-Us6MVSy0 verified already fixed: dispatch job exports GH_REPO: ${{ github.repository }} before gh workflow run.

No new code commits were required in this pass because each unresolved thread was a duplicate of already-landed behavior on head 3e19e44.

Validation run in this pass:

  • cargo test -p xtask release_milestone_lookup_consumes_complete_paginated_stream
  • cargo test -p xtask release_workflow_checks_out_release_tag_for_dispatch
  • cargo test -p xtask auto_release_tag_dispatches_with_explicit_repo
  • actionlint
  • git diff --check origin/main...HEAD
  • cargo test -p xtask release_
  • cargo xtask verify

All unresolved duplicate threads were resolved via GraphQL after verification.

@flyingrobots

Copy link
Copy Markdown
Owner Author

@codex Activity Summary for the latest CodeRabbit follow-up.

Source Severity File Commit SHA Outcome
PR P3 xtask/src/main.rs 538d2a6 Hardened release_milestone_lookup_consumes_complete_paginated_stream so it verifies both checked-in workflow blocks, and added a validator regression proving head -n 1 truncation is rejected.

RED evidence:

  • cargo test -p xtask milestone_lookup_contract_rejects_head_truncation failed before the validator existed with cannot find function milestone_lookup_consumes_complete_stream.

GREEN/VERIFY evidence:

  • cargo test -p xtask milestone_lookup_contract_rejects_head_truncation
  • cargo test -p xtask release_milestone_lookup_consumes_complete_paginated_stream
  • cargo test -p xtask release_
  • actionlint
  • git diff --check origin/main...HEAD
  • cargo xtask verify

Resolved review thread: PRRT_kwDOS96-Us6MVVQO.

@chatgpt-codex-connector

Copy link
Copy Markdown

Summary

  • Reviewed the duplicate-thread follow-up request and confirmed the current branch already contains the referenced fixes, so I made no additional code changes, did not create a commit, and did not open a new PR.
  • Confirmed the release workflow uses the dispatch-selected tag ref before reading release artifacts and uses a paginated all-state milestone lookup that selects after consuming the stream with jq -s '.[0] // empty'. .github/workflows/release.ymlL28-L68
  • Confirmed the auto-release workflow uses the same full-stream milestone selection pattern and has no head -n 1 truncation in the tag-creation milestone lookup. .github/workflows/auto-release-tag.ymlL120-L122
  • Confirmed the auto-release dispatch job provides explicit repository context with GH_REPO before running gh workflow run release.yml. .github/workflows/auto-release-tag.ymlL164-L173
  • Confirmed xtask coverage exists for the release workflow tag-ref checkout, the explicit dispatch repository, and the duplicate-thread milestone lookup policy guard. xtask/src/main.rsL948-L975 xtask/src/main.rsL1125-L1133

Testing

  • cargo test -p xtask release_milestone_lookup_consumes_complete_paginated_stream
  • cargo test -p xtask release_workflow_checks_out_release_tag_for_dispatch
  • cargo test -p xtask auto_release_tag_dispatches_with_explicit_repo
  • cargo test -p xtask release_
  • cargo xtask verify
  • ⚠️ git diff --check origin/main...HEAD — warning because this local checkout does not have origin/main available.
  • ⚠️ actionlint — warning because actionlint is not installed in this environment.
  • ⚠️ codex-think --remember --json — warning because codex-think is not installed in this environment.

View task →

@chatgpt-codex-connector

Copy link
Copy Markdown

Summary

Testing

  • cargo test -p xtask release_runbook_policy_is_structured — RED before policy fields existed, then GREEN after the policy/test-plan update.
  • cargo fmt --all --check
  • cargo test -p xtask release_
  • git diff --check
  • cargo xtask verify
  • ⚠️ actionlint — warning because actionlint is not installed in this environment.
  • ⚠️ codex-think --remember --json — warning because codex-think is not installed in this environment.

View task →

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.

Release v0.5.0-alpha.1

1 participant