Skip to content

release: prep v0.4.0 (CHANGELOG retitle + login-handler false-positive recipe)#35

Merged
jasperboerhof merged 1 commit into
mainfrom
release/v0.4.0-prep
Jun 15, 2026
Merged

release: prep v0.4.0 (CHANGELOG retitle + login-handler false-positive recipe)#35
jasperboerhof merged 1 commit into
mainfrom
release/v0.4.0-prep

Conversation

@Goosterhof

Copy link
Copy Markdown
Contributor

What

Release-prep for v0.4.0 (tag-then-cascade model). Doc-only diff — no rule source changes.

  • CHANGELOG: [Unreleased][0.4.0] — 2026-06-15, with a release-as-a-whole MAJOR header. v0.4.0 ships four new rules (EnforceCurrentUserAttributeRule, ForbidEloquentMutationInControllersRule, EnforceAuditTransactionScopeRule, EnforceFormRequestToDtoRule) plus the two folded NEON-double-backslash no-op fixes.
  • README: new EnforceCurrentUserAttributeRule — false positives section documenting the login-handler suppression recipe.

Why the model changed from v0.3.0

Unlike v0.3.0 (audited clean fleet-wide before tag), v0.4.0 is tagged known-dirty. The ^0.{minor} caret means ^0.3 excludes 0.4.0, so tagging auto-adopts nobody — each consumer remediates and goes green on its own ^0.3 → ^0.4 bump PR (Phase B). The per-rule "pre-cascade audit" notes are rewritten from before-tag to per-territory Phase-B bump time accordingly.

Login-handler false positive (n=2)

#[CurrentUser] resolves at method-entry DI time; login handlers resolve the user after Auth::attempt() on a guest/throttle-only route, so the attribute would inject null. The rule can't see routes and the package forbids in-rule exceptions → the canonical fix is a consumer-side ignoreErrors, now documented. Confirmed independently on two territories this session (entreezuil AuthenticatedSessionController::store, ublgenie AuthController::store).

After merge

Tag v0.4.0 on the merge commit → release.yml fires (verified the awk release-notes extraction resolves the v0.4.0 block cleanly). Then per-territory Phase-B ^0.3 → ^0.4 bumps. Tag push is Commander-gated.

Test

Doc-only. CHANGELOG awk-extraction for 0.4.0 validated locally (29-line body, stops at [0.3.0]). CI (ci.yml) is authority for format/phpstan/test.

…ve recipe

- CHANGELOG [Unreleased] -> [0.4.0] (2026-06-15), release-as-a-whole MAJOR.
  v0.4.0 ships 4 new rules + 2 folded no-op fixes. Unlike v0.3.0 (clean
  fleet-wide before tag), v0.4.0 tags known-dirty: per-rule pre-cascade
  audits move to per-territory Phase-B bump time. ^0.3 excludes 0.4.0 so
  tagging auto-adopts nobody; each consumer remediates+goes-green on bump.
- README: new EnforceCurrentUserAttributeRule false-positives section —
  login handlers resolve the user after Auth::attempt() on guest routes,
  so #[CurrentUser] (method-entry DI) injects null. Doctrine-correct fix
  is consumer-side ignoreErrors (n=2: entreezuil/ublgenie store()).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Goosterhof Goosterhof requested a review from a team as a code owner June 15, 2026 10:36
@Goosterhof Goosterhof added the Agent Review Requested Requesting review of specialized AI review agents. label Jun 15, 2026

@Goosterhof Goosterhof left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

✅ Approve-worthy

0 blockers · 0 concerns · 1 nit · 1 praise · 1 inline
Round 1. CI green (check (8.4), check (8.5) both pass).

Doc-only release-prep for v0.4.0: retitles the [Unreleased] block to [0.4.0] — 2026-06-15 with a known-dirty tag-then-cascade model, and adds a README login-handler false-positive recipe for EnforceCurrentUserAttributeRule. Scope matches the body exactly — no rule source touched. I verified the load-bearing piece directly: the release.yml awk extractor (.github/workflows/release.yml:66-73) keys on /^## \[/ + [VERSION], so on v0.4.0 it matches ## [0.4.0] — 2026-06-15 and prints through to the next ## [ header ([0.3.0]), capturing the full ### Added / ### Fixed body. The empty ## [Unreleased] sitting above it does not interfere — found stays 0 on that line. The body's "stops at [0.3.0]" claim holds.

Praise: the known-dirty rationale (^0.{minor} caret means ^0.3 excludes 0.4.0, so tagging auto-adopts nobody → per-territory Phase-B remediation) is the honest model for a release that surfaces new errors across the fleet, and it's documented at the point a future reader needs it.

Findings (detail inline)

  • Nit — CHANGELOG.md:7 — dangling empty [Unreleased].

Automated war-room agent review — posted because this PR carries the Agent Review Requested label.

Comment thread CHANGELOG.md
@jasperboerhof

Copy link
Copy Markdown
Contributor

Review Loop · 9/10 · PASS

phpstan-warroom-rules #35 · AC anchor: none (doc-only release prep; no issue/plan/PR-AC anchor) · head ccca727b12

Tip

No findings — clean against the review checklist.

Action

merge-ready

@jasperboerhof jasperboerhof 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.

Auto-approved — review-loop verdict PASS, CI green, no human blocker, no open MAJOR+ threads. See the verdict comment + inline notes.

@jasperboerhof jasperboerhof enabled auto-merge June 15, 2026 12:57
@jasperboerhof jasperboerhof merged commit 64946b7 into main Jun 15, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Agent Review Requested Requesting review of specialized AI review agents.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants