Repository navigation
docs(release): reconcile v1.4.0 vs Unreleased moveWithinScope() ordering contract - #61
Conversation
…ing contract (Ref #59, #37) Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Technical Lead — Independent Cumulative Review #1 — CHANGES REQUIRED (2026-10-21)Pinned review identity: Verdict: CHANGES REQUIRED / NO MERGE GO. The main F37-01/02/03 documentation corrections are directionally right, but all findings below need one consolidated correction pass, not serial blocker-by-blocker review. F61-01 — inaccurate combined
|
…tract wording and changelog guards (Ref #59, #37) Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Technical Lead — Fresh Full Re-Review #2, full cumulative PR #61 — CHANGES REQUIRED (2026-10-21)Immutable review refs: exact Exact HEAD verification: GitHub Actions run 39647210305, 10/10 completed SUCCESS, including Unit/Regression PHP 8.2/8.3/8.4/8.5, MySQL 8.4.10 Integration PHP 8.2/8.5, Quality, Lowest dependencies, Workflow lint, CI Gate. The executor's local MySQL RED/GREEN and synthetic release-heading checks are cited execution evidence; I independently inspected the code/diff/CI, not a rerun of those local tests. Previous F61-01, F61-02, F61-03, F61-04 are addressed in the specific originally reviewed locations. The newly added Changelog next-header parser and synthetic next-version unit case repair the originally reported version-boundary weakness. Verdict: CHANGES REQUIRED — NOT MERGE GO. The fresh whole-document review found residual contract contradictions that must be reconciled together in the existing PR, not split into more serial blockers: F61-R2-01 (required) — README still conflates a throwing failure and a
|
…gelog claims (F61-R2-01..03; Ref #59, #37) Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Technical Lead — Fresh Full Re-Review #3: MERGE GO (Owner approval required)Reviewed exact final cumulative state (not fix-only): Base All findings reconciled together:
Exact-head verification now confirmed: Actions run 39650260962 is completed SUCCESS, 10/10 jobs: Workflow lint, Quality, Lowest Dependencies with MySQL 8.4.10, Unit/Regression on PHP 8.2/8.3/8.4/8.5, Integration PHP 8.2/8.5 with MySQL 8.4.10, CI Gate. The executor's local real-MySQL CONTRIBUTING gates, RED (4 guards failed against previous docs), GREEN (49 docs tests/458 assertions) and consumer proof are separately reported in this PR; they were not independently re-executed by the Lead. The GitHub CI and exact HEAD/Tree were independently verified. Non-blocking observation for the later whole-repository standards audit (Issue #37 Step 4): the untouched source docblock in Decision: MERGE GO for this exact Tree only, pending explicit Owner authorization. No version, Tag or Release GO. No runtime follow chart required for a documentation-and-documentation-regression-only PR. If HEAD/Tree or relevant base changes, reassess and renew Fresh Full Re-Review before merge. PR #62 remains independent and does not block merging this reviewed #61. After Owner-authorized merge: reconcile the actual merge SHA, resultant tree, updated |
Documentation only. No change to
src/, CI, runtime or public API; no version chosen or stamped;Unreleasednot globally replaced.What changed
v1.4.0; the fix(ordering): atomic partial-shift rollback in caller-owned moveWithinScope #55 caller-owned change (own shifts undone on failure/falsevs. left forcommit()inv1.4.0) is listed there. The Package Reference header now separates Unreleased API from Unreleased behavior changes ofmoveWithinScope(), with the1:1 2:3 3:4 4:5 5:5example. The How-to guide Availability box points to fix(ordering): atomic partial-shift rollback in caller-owned moveWithinScope #55.moveWithinScope()in a caller-owned transaction can now throwTransactionExecutionException(class exists inv1.4.0; thev1.4.0method never threw it, its runner has no such throw). Sources:SAVEPOINTreturnsfalse, the dead-transaction guard,ROLLBACK TOreturnsfalsebehindfalse,RELEASEreturnsfalseafter a good write. Guard text now says it does not restore a server-ended transaction. README, Reference, ADR 0005 (decision 1) and the guide are aligned. The method docblock already says@throws Throwableand describes the guard, so it is untouched (src stays out of scope).ROLLBACK TO SAVEPOINTand attemptRELEASE.[Unreleased]sections reordered to Added, Changed, Deprecated, Fixed (Keep a Changelog), still on top, no version.MoveWithinScopeSavepointDocumentationTest(4 tests: no "exception types" claim, success-path qualification, README/Reference list fix(ordering): atomic partial-shift rollback in caller-owned moveWithinScope #55 +TransactionExecutionException, section order).Evidence: statement counts, caller-owned transaction, MySQL 8.4.10 (
log_bin_trust_function_creators=1)Script:
FaultInjectingPdo(client-side attempted control statements) plus serverCom_*session counters. "false" injections make the clientexec()returnfalsewithout sending it.truetrue;falsefalsefalse+ ROLLBACK TO failsfalse+ RELEASE failsfalse(Server columns are SAVEPOINT / ROLLBACK TO / RELEASE.) Raw output and script are in the shared notes folder (
issue-59-statement-counts.txt,issue-59-measure.php).v1.4.0check:git show v1.4.0:src/Pdo/Transaction/PdoTransactionRunner.phphas noTransactionExecutionException; itsrun()just calls the callback when a transaction is active.Verification (CONTRIBUTING.md sequence, real MySQL 8.4.10, all exit 0)
composer validate --strict, dump-autoload --strict-psr, check-platform-reqs, audit, analyse (phpstan), test:unit (379 tests), test:regression (90), test:integration (200), test:consumer, php-cs-fixer dry-run (0 of 100), git diff --check.
BC impact: none (documentation and a docs test). Base:
origin/maine4aba20 (unchanged at start). Not touched: packaging,.gitattributes, CI.Review round 1 (F61-01..F61-04) corrections, second commit
falsepath (undo must succeed, thenfalse, no exception; undo failure is thrown). Thev1.4.0cell is qualified: partial shifts persist only if shifts had been executed and the transaction survives. Checked againstScopedOrderingManager.php317-346 andOperationSavepoint::undoOrFail().ROLLBACK TO, thenRELEASEattempted; skipped when the driver reports no active transaction; no universal count). Invalid argument, missing row, no-op and failingSAVEPOINTadd noROLLBACK TO/RELEASE. Applied in README (table and prose), CHANGELOG, Reference, guide, ADR 0005. New measurement: invalid argument inside a caller-owned transaction throwsInvalidOrderingOperationExceptionwith 0 savepoint statements (earlier table already has no-op, missing row andSAVEPOINTfailure).## [heading (not hard-coded[1.4.0]); the fix(ordering): atomic partial-shift rollback in caller-owned moveWithinScope #55 wording guards use a stated transition rule (entry in exactly one section;TBD by the Ownerrequired while under[Unreleased], a real## [x.y.z] - dateheading otherwise); statement-count guard is claim-local (each count sentence needs success-path and post-savepoint cleanup wording within its window); order test rejects unknown headings, skips explicitly when[Unreleased]is empty; unused local removed; synthetic-heading unit test added.v1.4.0method issued no savepoint control statement.RED/GREEN: new tests vs the previous docs: 4 failures (exception wording, count locality, throw/
falsesplit, API vs deprecation); GREEN on the corrected docs (45 docs tests).Release-transition scratch checks (not committed): inserting
## [9.9.9] - 2099-01-01above[1.4.0]with its own Fixed/Added headings: all pass, Unreleased unaffected. Moving everything under a new version heading: pass, order test skipped explicitly. Entry duplicated in two sections: fails. Misspelled heading in Unreleased: fails.Not changed:
DeadlockRetryDocumentationTeststill slices at## [1.4.0]for its own (deprecation) assertion; it stays correct after a release section is added, so it is left alone.Gates re-run on MySQL 8.4.10: validate, dump-autoload, platform, audit, phpstan, unit 379, regression 93, integration 200, consumer, php-cs-fixer, diff --check all exit 0; container removed.
Review round 2 (F61-R2-01..03), third commit
false; undo failure thrown instead offalse). Server-aborted and scope-lock qualifications kept; broken line wrap normalized. Same split applied to the README Reference-style summary, the Reference ownership table and the How-to guide.falsepath an original exception. The docs: correct ordering UNIQUE, transaction rollback, 1213 and unreleased API guidance #46 entry now says the "no savepoint guarantee" text was the interim documentation state superseded by fix(ordering): atomic partial-shift rollback in caller-owned moveWithinScope #55 on this release. The deprecation entry's "keeps its behavior" is scoped to the runner-generation change.falseafter the shifts)" forbidden), changelog entry opening, superseded/unchanged claims, Reference/README summaries.moveWithinScope()docblock (not edited,src/untouched) still groups "a Throwable ... orfalse" in one sentence and says it rethrows the original Throwable; it is comparison only and could get a docblock-only follow-up.RED (new guards vs previous docs): 4 failures of 49. GREEN:
OK (49 tests, 458 assertions).Probes: restoring the old changelog opening while keeping the later qualifying parentheses fails 1 test; regressing the README bullet to "(or
falseafter the shifts)" fails 1 test.Gates on MySQL 8.4.10 (container removed): validate, dump-autoload, platform, audit, phpstan, unit 379, regression 97, integration 200, consumer, php-cs-fixer, diff --check all exit 0.
Ref #59, Ref #37
🤖 Generated with Claude Code