Skip to content

chore: recover v0.3.0 CHANGELOG promotion (PR #23 merge anomaly)#25

Merged
Goosterhof merged 1 commit into
mainfrom
chore/v0.3.0-changelog-recovery
May 29, 2026
Merged

chore: recover v0.3.0 CHANGELOG promotion (PR #23 merge anomaly)#25
Goosterhof merged 1 commit into
mainfrom
chore/v0.3.0-changelog-recovery

Conversation

@Goosterhof
Copy link
Copy Markdown
Contributor

Summary

Recovers the v0.3.0 CHANGELOG promotion that PR #23 was supposed to land but didn't reach main due to a merge sequencing race.

Underlying diff is identical to PR #23's reviewed state (cherry-pick of commit 4c804ae). Reopening here against current main only.

What happened

Why this matters

Five downstream work items gate strictly post-v0.3.0-tag (war-room enforcement queue tracking):

  • Phase B ^0.2^0.3 pin sweep across 5 consumer territories
  • kendo Anthropic Managed Agents PHPStan errors investigation (106 errors on development)
  • Queue #46 allowlist denylist-inversion promotion candidate
  • Queue #58 Doctrine LogRule: cover Builder->truncate() on Log-named tables #8 PHPStan rule promotion candidate
  • Queue #74 / #75 / #76 promotion candidates

All have been paused since 2026-05-20 waiting on the v0.3.0 tag that never landed.

What's in this PR

Single-file change: CHANGELOG.md. 9 insertions, 4 deletions. Identical to PR #23's reviewed diff (cherry-pick).

  • Adds ## [0.3.0] — 2026-05-13 heading with the release-as-a-whole MAJOR paragraph
  • Updates three rule entries with audit-verdict sentences citing campaign reports:
    • EnforceResourceDataValidatorOptInRule → 2026-05-08 cascade audit (0 violators across 5 territories)
    • LogRule (BREAKING) → 2026-05-13 cascade audit (0 violators)
    • LogBuilderTruncateRule (BREAKING) → 2026-05-13 cascade audit (0 violators)
  • Adds link footer entry for [0.3.0], updates [Unreleased] compare range

Post-merge

Tag v0.3.0 on the recovery merge commit. Packagist webhook auto-publishes. Phase B pin sweep dispatches.

References

  • Lost merge: chore: release v0.3.0 #23
  • Release-cut campaign: `campaigns/phpstan-warroom-rules/2026-05-13-v0.3.0-release-cut-plan.md`
  • Pre-cascade audit campaigns: `campaigns/phpstan-warroom-rules/2026-05-08-pre-cascade-audit-resource-data-validator-opt-in.md`, `campaigns/phpstan-warroom-rules/2026-05-13-pre-cascade-audit-log-rule-static-call.md`, `campaigns/phpstan-warroom-rules/2026-05-13-pre-cascade-audit-log-builder-truncate.md`

🤖 Generated with Claude Code

Cuts v0.3.0 — collapses three contractual rule widenings into a single
Major bump per ADR-0021 §Versioning:

1. EnforceResourceDataValidatorOptInRule (queue #55 Phase-2 promotion,
   ADR-0009 §EAGER_LOAD validator opt-in) — Phase 2 rule
2. LogRule static-call expansion (issue #4, ADR-0001 §Append-only) —
   Model::destroy() / Model::forceDestroy() shapes
3. LogBuilderTruncateRule (issue #8, ADR-0001 §Append-only) —
   Builder->truncate() on table('<log-named>') chains

Each rule's pre-cascade audit returned 0 violators across all 5
consumer territories (kendo, entreezuil, emmie, ublgenie, brick-inventory-orchestrator):

- ResourceDataValidator audit: campaigns/phpstan-warroom-rules/2026-05-08-pre-cascade-audit-resource-data-validator-opt-in.md
- LogRule static-call audit: campaigns/phpstan-warroom-rules/2026-05-13-pre-cascade-audit-log-rule-static-call.md
- LogBuilderTruncate audit: campaigns/phpstan-warroom-rules/2026-05-13-pre-cascade-audit-log-builder-truncate.md

No consumer-side ignoreErrors migrations required. The Major represents
the contract widening, not empirical violation count.

Phase A pin sweep (^0.1.x → ^0.2) closed pre-release — all 4 laggard
consumers bumped via independent dispatches between 2026-05-06 and
2026-05-08; verified by 4-territory Medic wave 2026-05-13 (no-op).
Phase B pin sweep (^0.2 → ^0.3) follows post-tag as a separate
war-room dispatch.

This PR is STACKED on PR #22 (engineer/log-builder-truncate-rule).
GitHub auto-retargets to main when PR #22 merges. Tag v0.3.0 on the
release-PR merge commit; release.yml's webhook auto-publishes to
Packagist.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jasperboerhof
Copy link
Copy Markdown
Contributor

PR Reviewer · claimed

@jasperboerhof
Copy link
Copy Markdown
Contributor

PR Reviewer · 9/10 · PASS

Findings

  • MINOR · CHANGELOG.md:26 — Out-of-scope (does not affect score): the v0.3.0 entry cites cascade-audit reports at campaigns/phpstan-warroom-rules/2026-05-13-pre-cascade-audit-{log-rule-static-call,log-builder-truncate}.md and the 2026-05-08 resource-data report, but those files live in a separate campaigns tree and are not in this repo's diff, so the '0 violators across 5 territories' claim is unverifiable from this PR alone. Documentation-fidelity note, not a surface-row gap.

Action

merge-ready

Copy link
Copy Markdown
Contributor

@jasperboerhof jasperboerhof left a comment

Choose a reason for hiding this comment

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

Auto-approved by /review-open-prs — review verdict is PASS. See the verdict comment for the per-reviewer breakdown.

@Goosterhof Goosterhof added the Agent Review Requested Requesting review of specialized AI review agents. label May 29, 2026
Copy link
Copy Markdown
Contributor Author

@Goosterhof Goosterhof left a comment

Choose a reason for hiding this comment

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

One concern, one nit, two pieces of praise — zero blockers. I'll be explicit about the blocker I went looking for and did not find, because it's the tempting wrong read of this PR.

No changelog data loss — the clean MERGEABLE status here is genuinely clean. I ran the merge in a throwaway clone against current origin/main and diffed the result: the promotion moves the existing [Unreleased] block (EnforceResourceDataValidatorOptInRule, the LogRule / LogBuilderTruncateRule BREAKING entries, and the CI/governance items) down under a new [0.3.0] heading without dropping any of it. The rules from the in-flight sibling PRs #27 (EnforceAuditTransactionScopeRule) and #28 (ForbidEloquentMutationInControllersRule) are not on main — both PRs are still open — so they were never in this [Unreleased] block and there is nothing for the promotion to clobber. origin/main is still at the PR #22 merge commit 3555946, i.e. this branch's fork point, so there's no stale-base drift either. The boundary is correct as drawn.

Concern

The ## [0.3.0] — 2026-05-13 heading date will not match the commit that actually carries the v0.3.0 tag. The recovery merge (and therefore the tag, per the PR body's "tag on the recovery merge commit") lands 2026-05-29, not 05-13. Keep-a-Changelog dates are by convention the release date, so a backdated 0.3.0 reads oddly against a tag created two weeks later — a future reader cross-referencing the GitHub release timestamp against the changelog will see a 16-day gap with no explanation. Either set the date to the actual tag date, or add a one-line note that 05-13 is the original content-freeze date the merge anomaly delayed. Not a blocker — purely a provenance-legibility call.

Nit

composer.json correctly carries no version field (tag-driven via the Packagist webhook), so there's no version-string consistency check to fail here. Noting it because a reviewer scanning for "did they bump composer.json" should know the absence is intentional, not an omission.

Praise

The PR body's forensic reconstruction of the merge anomaly is load-bearing and correct — tracing ac035f8's unreachability from main through its parent commits and identifying that PR #22 snapshotted the engineer branch before PR #23's merge into it landed is the right diagnosis, not the easier "PR #23 just didn't merge" misread. That diagnosis is what makes this a targeted recovery rather than a guess.

Sequencing note for when #27/#28 land (not a finding): their entries belong in a fresh [Unreleased] block above this [0.3.0] section — the natural changelog flow, no action needed here.

Verdict: COMMENT — ship it. The recovery is sound, the merge is genuinely clean, and the only open item is the cosmetic date-provenance call above.

@Goosterhof Goosterhof merged commit e3572b9 into main May 29, 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