release: v0.8.3 — github-action default flip + accumulated infra fixes#150
Merged
Conversation
… with --local (#147) Real Cursor user report 2026-05-27 showed two install-time friction points the rafter SKILL.md and the Cursor recipe were silent on: 1. A Cursor agent hallucinated `npx rafter-cli agent init --all` (the bare `rafter-cli` resolves to an unrelated npm package — ours is `@rafter-security/cli`). The SKILL.md had no Install / bootstrap section so agents that didn't find rafter on PATH had to guess. 2. The same agent hit a Cursor sandbox prompt for writing `~/.rafter` and had to retry with elevated permissions. `rafter agent init --local --with-cursor` writes `./.rafter/` + `./.cursor/` instead and sidesteps the prompt entirely. Changes: - rafter SKILL.md: replace the bare `## Strengthen the Project` block with a `## Setup` block that names the canonical install commands (`npm i -g @rafter-security/cli`, `pip install rafter-cli`), warns off `npx rafter-cli` (use scoped form), and leads with `rafter agent init --local --with-<platform>` for sandboxed sessions. Same content carried into the install-hook / ci init / .rafter.yml / per-platform pointers that the prior section held — single denser paragraph keeps SKILL.md at 118 lines (under the 120-line guard). - node/python parity preserved: `diff -q` on the two SKILL.md files returns clean. - recipes/cursor.md: rebuilt. Now opens with the surface matrix (MCP + hooks + per-skill rules + sub-agent — was just "MCP server" before), then leads with `rafter agent init --local --with-cursor` as the recommended first-run for agent-driven setup, and keeps the global-scope form as the explicit user-scope option. The same install-prerequisite block with the `npx rafter-cli` warning is at the top of the recipe. Tests: 28/28 in `node/tests/brief.test.ts` pass (the `<120 lines` guard still trips on increase, so the SKILL.md edit stays compliant). Closes sable-jnd and sable-dfu.
First-install no longer fails the build. Findings still post as PR comments and upload to the Security tab via SARIF, but the workflow exits 0 regardless of severity. When findings exist and the threshold is the default (none), the PR comment includes a one-line tip pointing to severity-threshold: high for opt-in enforcement. Rationale: rafter spans SAST + SCA + secrets where false positives are common; a first install that breaks the build on day one is the worst first impression and gets the action removed. Aligns with the Snyk / CodeQL / Semgrep default of surfacing through Code Scanning + PR comments rather than blocking. Existing users who set severity-threshold explicitly are unaffected. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…eport-only feat(github-action): default severity-threshold to none (report-only)
Headline change in this release is github-action/ cloud variant default-flip from severity-threshold: high to severity-threshold: none (report-only). See CHANGELOG.md for the full entry and the infrastructure improvements that accumulated since 0.8.2. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Three pure-bash test scripts exercise the exact code paths touched by the severity-threshold: high -> none default flip: - test-threshold-eval.sh: 30 assertions across all 6 threshold values (critical/high/medium/low/none/unknown-fallback) and finding-count permutations. Confirms 'none' never fails the build regardless of findings, and that critical/high/medium/low still fail as before. - test-pr-comment-tip.sh: 9 assertions on the new report-only-tip block. Confirms the tip appears exactly when (findings > 0) AND (threshold == 'none'). - test-action-yml-defaults.sh: drift detector. Asserts (1) the severity-threshold default is literally 'none', (2) the env var passthrough on the Comment-on-PR step is intact (the GitHub-recommended template-injection mitigation), (3) the tip block is gated on both conditions, (4) the 'none' branch of the threshold-eval doesn't set FAIL=1. Each check independently verified against a mutated copy of action.yml. Wired into a new test-github-action.yml workflow that runs on PRs + main pushes touching github-action/**. The Rafter API is not exercised here; that's a future addition that would need an injectable RAFTER_API_KEY secret and a fixture repo. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
chore(release): bump to v0.8.3
Raftersecurity
approved these changes
May 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ship to prod
Promotes
main→prod. Thepublish.yamlworkflow fires on this merge and will publish v0.8.3 to npm (via OIDC Trusted Publishing), PyPI (with--skip-existingidempotency), and ClawHub, then create thev0.8.3GitHub Release (which is what GitHub Marketplace picks up to republish the root/action.ymllisting entry), then smoke-test against the live registries.What ships in this release
User-facing:
github-action/cloud variant:severity-thresholddefaulthigh→none(report-only). PR comment surfaces an opt-in enforcement hint when findings exist under the default. Workflows that setseverity-thresholdexplicitly are unaffected.Infrastructure (accumulated since v0.8.2):
publish.yml→publish.yaml+--skip-existingon PyPI upload (retry-safe).node/package.jsondeclaresrepository/homepage/bugs/license/author.--local.github-action/tests/+.github/workflows/test-github-action.yml).Pre-flight already green on main
validate-release.yml(runs on push to main) — verifies all four version sites at0.8.3:node/package.json,python/pyproject.toml, bothrafter-security-skill.mdfrontmatter copies. CHANGELOG entry present.test-github-action.yml(added in chore(release): bump to v0.8.3 #149) — 4 jobs, all pass in 3-6s. Threshold-eval case statement (30 assertions, all six threshold values × find-count permutations), PR-comment report-only-tip (9 assertions), action.yml drift detector (mutation-tested against 3 deliberate regressions), YAML validity.rafteragent security review on feat(github-action): default severity-threshold to none (report-only) #148's diff — verdict GO, no findings.Post-merge verification plan
Phase 1 + 2 — autonomous, ~5 min:
curl https://registry.npmjs.org/@rafter-security%2Fcli/0.8.3→ 200curl https://pypi.org/pypi/rafter-cli/0.8.3/json→ 200gh release view v0.8.3npm i -g @rafter-security/cli@0.8.3 && rafter --version→ 0.8.3rm -rf /dry-run classifies critical+blockedpip install rafter-cli==0.8.3 && rafter --version→ 0.8.3Cloud-action e2e against the live Rafter API deferred (would consume credits and isn't the behavior being released here — that's already covered by the unit-test suite landed in #149).
🤖 Generated with Claude Code