Skip to content

docs(SUP-1648): add v0.1.0 release lane and readiness gate - #35

Closed
levineam wants to merge 2 commits into
mainfrom
sup-1648-release-lane
Closed

docs(SUP-1648): add v0.1.0 release lane and readiness gate#35
levineam wants to merge 2 commits into
mainfrom
sup-1648-release-lane

Conversation

@levineam

@levineam levineam commented May 13, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds the v0.1.0 public preview release lane docs, candidate issue template, and release notes drafts.
  • Adds an executable release readiness gate with a candidate mode for in-progress prep.
  • Updates the Codex review trigger workflow and changelog/release template for the public preview process.

Verification

  • npm run release:check:candidate
  • npm run release:check -- --skip-smoke (expected NOT READY until changelog date is final and the tree is clean)

Summary by CodeRabbit

  • Documentation

    • Added comprehensive release docs (release process, management, and v0.1.0 release notes) and updated the changelog with a v0.1.0 public-preview entry.
    • Added a GitHub release template and versioned release notes draft.
  • Chores

    • Added release-candidate and blank issue templates.
    • Added npm scripts for release readiness and a release-readiness check tool; minor CI workflow error‑handling tweak.

Review Change Stack

@coderabbitai

coderabbitai Bot commented May 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR establishes release management infrastructure for jarvOS v0.1.0 public preview. It adds release process documentation, a GitHub issue template for candidate intake, v0.1.0-specific release notes with readiness checklist, and a changelog entry documenting the new infrastructure.

Changes

v0.1.0 Public Preview Release

Layer / File(s) Summary
Release process definition and v0.1.0 specifications
docs/release-management.md, docs/release-process.md, docs/releases/v0.1.0-public-preview.md, docs/releases/v0.1.0.md, .github/release-template.md, CHANGELOG.md
Release management document defines v0.1.0 metadata, steward coordination rules, candidate classification, pre-publication readiness checklist (version/changelog/release-notes freshness, smoke/unit tests, secrets verification, label checks, classification, approval), and publication steps. Versioned release notes include surface area checklist, draft highlights and known boundaries, verification steps, and active candidate list reference.
Release candidate intake GitHub issue template
.github/ISSUE_TEMPLATE/config.yml, .github/ISSUE_TEMPLATE/release-candidate.yml
Issue template configuration enables blank issues; release-candidate template provides form-based intake with required classification, summary, and release_notes fields plus optional paperclip_issue and verification fields.
Release readiness CLI, npm scripts, and exports
scripts/release-readiness-check.js, package.json
Adds a Node CLI (parseArgs, normalizeVersion, checkReleaseReadiness, main) that validates version/changelog/release-notes/git tag/working-tree cleanliness and can run npm test; exports API functions for reuse and testing; wires release:check and release:check:candidate npm scripts.
Codex workflow comment error handling
.github/workflows/codex-review.yml
Adds try/catch around GitHub comment creation in the Codex review workflow step to treat HTTP 403 as a permission warning and return early, rethrowing other errors.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • levineam/jarvOS#7: smoke-test script and CI job that the release-readiness checks may invoke.
  • levineam/jarvOS#11: changes to the test script that affect what npm test executes during readiness checks.

Suggested labels

jarvis-managed

🐰 I hopped through docs and templates bright,
I nudged the changelog to set the sight,
A CLI checks tags, tests, and tree so neat,
Release candidate forms make intake complete.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly summarizes the main change: adding v0.1.0 release lane documentation and readiness gates, which is confirmed by the file additions (docs/release-management.md, docs/release-process.md, release-candidate template, and readiness check script).
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.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sup-1648-release-lane

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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 and usage tips.

@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

🤖 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/ISSUE_TEMPLATE/release-candidate.yml:
- Around line 4-7: The release-candidate issue template is missing the primary
release label; update the labels array in
.github/ISSUE_TEMPLATE/release-candidate.yml (the labels block defined in that
file) to include "jarvos-release" alongside "jarvos",
"jarvos-release-candidate", and "release-v0.1.0" so release-candidate issues get
the base release label used by release-management flows.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 16b6c385-d3e7-4f87-b522-5798a627ea2c

📥 Commits

Reviewing files that changed from the base of the PR and between 54c6a4f and dbed505.

📒 Files selected for processing (5)
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/release-candidate.yml
  • CHANGELOG.md
  • docs/release-management.md
  • docs/releases/v0.1.0-public-preview.md

Comment on lines +4 to +7
labels:
- jarvos
- jarvos-release-candidate
- release-v0.1.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add the primary release label for consistency with the documented lane.

At Line 4–7, the template applies jarvos, jarvos-release-candidate, and release-v0.1.0, but it does not apply jarvos-release (documented in docs/release-management.md Line 12). That can make release-candidate issues miss release dashboards/queries expecting the base release label.

Suggested fix
 labels:
   - jarvos
+  - jarvos-release
   - jarvos-release-candidate
   - release-v0.1.0
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
labels:
- jarvos
- jarvos-release-candidate
- release-v0.1.0
labels:
- jarvos
- jarvos-release
- jarvos-release-candidate
- release-v0.1.0
🤖 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/ISSUE_TEMPLATE/release-candidate.yml around lines 4 - 7, The
release-candidate issue template is missing the primary release label; update
the labels array in .github/ISSUE_TEMPLATE/release-candidate.yml (the labels
block defined in that file) to include "jarvos-release" alongside "jarvos",
"jarvos-release-candidate", and "release-v0.1.0" so release-candidate issues get
the base release label used by release-management flows.

@levineam
levineam force-pushed the sup-1648-release-lane branch from dbed505 to 3f53c49 Compare May 13, 2026 19:57
@levineam levineam changed the title docs(SUP-1648): add v0.1.0 release lane docs docs(SUP-1648): add v0.1.0 release lane and readiness gate May 13, 2026

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

🧹 Nitpick comments (1)
docs/release-management.md (1)

59-63: ⚡ Quick win

Unify the canonical release-notes source across docs and checks.

This flow uses docs/releases/v0.1.0-public-preview.md, while the release process/check script expect docs/releases/v0.1.0.md. Pick one canonical file (or document an explicit copy/sync step) to avoid release-time mismatch.

Suggested doc alignment
-2. Confirm the release notes body from
-   `docs/releases/v0.1.0-public-preview.md`.
+2. Confirm the release notes body from
+   `docs/releases/v0.1.0.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 `@docs/release-management.md` around lines 59 - 63, The release notes source is
inconsistent: the docs/release-management.md references
docs/releases/v0.1.0-public-preview.md while the release/check script expects
docs/releases/v0.1.0.md; pick one canonical file name (either
docs/releases/vX.Y.Z.md or docs/releases/vX.Y.Z-public-preview.md), update
release-management.md step text (the line that currently mentions
docs/releases/v0.1.0-public-preview.md) to reference the chosen canonical file,
and update the release process/check script (the script that validates/releases
tags) to read the same canonical path (or add a clear copy/sync step in the
workflow that copies the chosen preview file to the canonical path) so both docs
and automation use the same source.
🤖 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 `@scripts/release-readiness-check.js`:
- Around line 150-156: The current smoke-test step only runs npm test (via
run('npm', ['test'])) which doesn't execute the required scripts/smoke-test.sh;
update the smoke-test branch so when opts.skipSmoke is false it runs the actual
smoke script (e.g., run('bash', ['scripts/smoke-test.sh']) or
run('./scripts/smoke-test.sh')) and treat its exit/status like the existing
smoke variable (call pass('smoke test', ...) on success and fail('smoke test',
...) with the last 20 lines of stdout/stderr on failure); optionally keep the
existing npm test as a separate check by adding another run(...) call and
separate pass/fail handling.
- Around line 120-130: The release-notes check currently hard-fails when
docs/releases/${tag}.md is missing; update the block that uses releaseNotesPath
to also accept a preview draft when candidate mode/--allow-unreleased is
enabled: check for docs/releases/${tag}.md first, then if missing and an
allowUnreleased flag (e.g., allowUnreleased or similar CLI option used by the
script) is true, look for a preview path such as docs/releases/${tag}.preview.md
(or docs/releases/${tag}-preview.md if your project uses that convention) and
validate that file’s sections (using the same required array and placeholder
regex) and call pass/fail using the found path; otherwise keep the existing
failure behavior. Ensure you reference the same variables releaseNotesPath,
required, missing, and the fail/pass calls so the logic reuses the existing
checks.

---

Nitpick comments:
In `@docs/release-management.md`:
- Around line 59-63: The release notes source is inconsistent: the
docs/release-management.md references docs/releases/v0.1.0-public-preview.md
while the release/check script expects docs/releases/v0.1.0.md; pick one
canonical file name (either docs/releases/vX.Y.Z.md or
docs/releases/vX.Y.Z-public-preview.md), update release-management.md step text
(the line that currently mentions docs/releases/v0.1.0-public-preview.md) to
reference the chosen canonical file, and update the release process/check script
(the script that validates/releases tags) to read the same canonical path (or
add a clear copy/sync step in the workflow that copies the chosen preview file
to the canonical path) so both docs and automation use the same source.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7e189fb2-e9a9-458f-97e9-37174eea148e

📥 Commits

Reviewing files that changed from the base of the PR and between dbed505 and 3f53c49.

📒 Files selected for processing (11)
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/release-candidate.yml
  • .github/release-template.md
  • .github/workflows/codex-review.yml
  • CHANGELOG.md
  • docs/release-management.md
  • docs/release-process.md
  • docs/releases/v0.1.0-public-preview.md
  • docs/releases/v0.1.0.md
  • package.json
  • scripts/release-readiness-check.js
✅ Files skipped from review due to trivial changes (7)
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/release-candidate.yml
  • .github/release-template.md
  • package.json
  • docs/releases/v0.1.0-public-preview.md
  • docs/releases/v0.1.0.md
  • .github/workflows/codex-review.yml

Comment on lines +120 to +130
const releaseNotesPath = `docs/releases/${tag}.md`;
if (exists(releaseNotesPath)) {
const notes = readText(releaseNotesPath);
const required = ['## Summary', "## What's Included", '## Known Limitations', '## Install / Update', '## Verification'];
const missing = required.filter((section) => !notes.includes(section));
if (missing.length) fail('release notes draft', `Missing sections in ${releaseNotesPath}: ${missing.join(', ')}`);
else if (/ISSUE\b|VERSION\b/.test(notes)) fail('release notes draft', `${releaseNotesPath} still contains placeholders`);
else pass('release notes draft', releaseNotesPath);
} else {
fail('release notes draft', `${releaseNotesPath} missing`);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Candidate mode still hard-requires final release-notes path.

--allow-unreleased permits in-progress release state, but this block still requires docs/releases/vX.Y.Z.md. During candidate prep, that can fail even when the preview draft is present.

Proposed fix (allow preview draft in candidate mode)
-  const releaseNotesPath = `docs/releases/${tag}.md`;
-  if (exists(releaseNotesPath)) {
-    const notes = readText(releaseNotesPath);
+  const releaseNotesCandidates = opts.allowUnreleased
+    ? [`docs/releases/${tag}-public-preview.md`, `docs/releases/${tag}.md`]
+    : [`docs/releases/${tag}.md`];
+  const releaseNotesPath = releaseNotesCandidates.find((p) => exists(p));
+  if (releaseNotesPath) {
+    const notes = readText(releaseNotesPath);
@@
-  } else {
-    fail('release notes draft', `${releaseNotesPath} missing`);
+  } else {
+    fail('release notes draft', `Missing any of: ${releaseNotesCandidates.join(', ')}`);
   }
🤖 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 `@scripts/release-readiness-check.js` around lines 120 - 130, The release-notes
check currently hard-fails when docs/releases/${tag}.md is missing; update the
block that uses releaseNotesPath to also accept a preview draft when candidate
mode/--allow-unreleased is enabled: check for docs/releases/${tag}.md first,
then if missing and an allowUnreleased flag (e.g., allowUnreleased or similar
CLI option used by the script) is true, look for a preview path such as
docs/releases/${tag}.preview.md (or docs/releases/${tag}-preview.md if your
project uses that convention) and validate that file’s sections (using the same
required array and placeholder regex) and call pass/fail using the found path;
otherwise keep the existing failure behavior. Ensure you reference the same
variables releaseNotesPath, required, missing, and the fail/pass calls so the
logic reuses the existing checks.

Comment on lines +150 to +156
if (opts.skipSmoke) {
pass('smoke test', 'skipped by --skip-smoke');
} else {
const smoke = run('npm', ['test']);
if (smoke.status === 0) pass('smoke test', 'npm test passed');
else fail('smoke test', String(smoke.stdout || smoke.stderr || '').split('\n').slice(-20).join('\n'));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Smoke-test gate is not actually executed.

This check reports smoke test but only runs npm test. That can mark readiness as green without running scripts/smoke-test.sh, which your release docs treat as required.

Proposed fix (run smoke-test script, keep npm test as separate check if desired)
-  if (opts.skipSmoke) {
-    pass('smoke test', 'skipped by --skip-smoke');
-  } else {
-    const smoke = run('npm', ['test']);
-    if (smoke.status === 0) pass('smoke test', 'npm test passed');
-    else fail('smoke test', String(smoke.stdout || smoke.stderr || '').split('\n').slice(-20).join('\n'));
-  }
+  if (opts.skipSmoke) {
+    pass('smoke test', 'skipped by --skip-smoke');
+  } else {
+    const smoke = run('bash', ['scripts/smoke-test.sh']);
+    if (smoke.status === 0) pass('smoke test', 'scripts/smoke-test.sh passed');
+    else fail('smoke test', String(smoke.stdout || smoke.stderr || '').split('\n').slice(-20).join('\n'));
+  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (opts.skipSmoke) {
pass('smoke test', 'skipped by --skip-smoke');
} else {
const smoke = run('npm', ['test']);
if (smoke.status === 0) pass('smoke test', 'npm test passed');
else fail('smoke test', String(smoke.stdout || smoke.stderr || '').split('\n').slice(-20).join('\n'));
}
if (opts.skipSmoke) {
pass('smoke test', 'skipped by --skip-smoke');
} else {
const smoke = run('bash', ['scripts/smoke-test.sh']);
if (smoke.status === 0) pass('smoke test', 'scripts/smoke-test.sh passed');
else fail('smoke test', String(smoke.stdout || smoke.stderr || '').split('\n').slice(-20).join('\n'));
}
🤖 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 `@scripts/release-readiness-check.js` around lines 150 - 156, The current
smoke-test step only runs npm test (via run('npm', ['test'])) which doesn't
execute the required scripts/smoke-test.sh; update the smoke-test branch so when
opts.skipSmoke is false it runs the actual smoke script (e.g., run('bash',
['scripts/smoke-test.sh']) or run('./scripts/smoke-test.sh')) and treat its
exit/status like the existing smoke variable (call pass('smoke test', ...) on
success and fail('smoke test', ...) with the last 20 lines of stdout/stderr on
failure); optionally keep the existing npm test as a separate check by adding
another run(...) call and separate pass/fail handling.

@levineam levineam closed this May 13, 2026
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