Skip to content

release: v0.8.3 — github-action default flip + accumulated infra fixes#150

Merged
Raftersecurity merged 6 commits into
prodfrom
main
May 31, 2026
Merged

release: v0.8.3 — github-action default flip + accumulated infra fixes#150
Raftersecurity merged 6 commits into
prodfrom
main

Conversation

@Rome-1

@Rome-1 Rome-1 commented May 31, 2026

Copy link
Copy Markdown
Collaborator

Ship to prod

Promotes mainprod. The publish.yaml workflow fires on this merge and will publish v0.8.3 to npm (via OIDC Trusted Publishing), PyPI (with --skip-existing idempotency), and ClawHub, then create the v0.8.3 GitHub Release (which is what GitHub Marketplace picks up to republish the root /action.yml listing entry), then smoke-test against the live registries.

What ships in this release

User-facing:

Infrastructure (accumulated since v0.8.2):

Pre-flight already green on main

  • validate-release.yml (runs on push to main) — verifies all four version sites at 0.8.3: node/package.json, python/pyproject.toml, both rafter-security-skill.md frontmatter 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.
  • rafter agent 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 → 200
  • curl https://pypi.org/pypi/rafter-cli/0.8.3/json → 200
  • gh release view v0.8.3
  • npm i -g @rafter-security/cli@0.8.3 && rafter --version → 0.8.3
  • Fixture scan, MCP-serve parity check, rm -rf / dry-run classifies critical+blocked
  • Python parity: pip install rafter-cli==0.8.3 && rafter --version → 0.8.3

Cloud-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

Rome-1 and others added 6 commits May 29, 2026 13:25
… 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>
@Raftersecurity
Raftersecurity merged commit 54d34f3 into prod May 31, 2026
27 checks passed
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