Repository navigation
1.9.79: the re-click backfill counts only a click's own failures towards a step-over, from the first of them - #329
tracking202 wants to merge 3 commits into
Conversation
1.9.79's PHPStan job has been red since the merges at 15:46Z. #308 extended ForbidNumericCastOfRequestParamRule to the pages and baselined the casts already there. Three PRs merged beside it each added a cast that its baseline does not count, and each PR passed on its own: - Personal settings (#283) cast the same-IP fallback after checking it is a key of its choices. It now stores 1 for '1' and 0 for '0', the two keys the check admits. - Setup > Offline Conversions (#293) cast a feed id after a regex test. It now reads it with PostedId::read(). - Setup > Traffic Sources (#271) cast the edited account's id to read its stored postbacks. The page's own ownership check compares the raw value in SQL, where MySQL reads '12abc' as 12. So a save from ?edit_ppc_account_id=12abc changed account 12 (one of the account's own, not the one named) and held that account's postbacks. Measured on a live instance: the old page saved the tampered edit onto account 1. The id is now read exactly, and anything else is refused in the page's words before anything is read or written. The baseline counts are unchanged: each file now holds only the casts they counted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VRoS2SViuxaucFaKWsFnLr
…rds a step-over, from the first of them The adversarial review of #282 (findings 1-4 and 6): - A failure that names no cause (no errno, no value of the click's: a type error, a wrapper that dropped the errno) counted towards stepping the click over for good. It counts in none now, and 1158-1161, 1030, 1297 and 1180 join the errors of the moment. - The hour before a step-over ran from the click's first failure of any kind, so ten minutes of its own errors after two hours of lock waits stepped it over. failing_since is the first failure of its own now. - The classifier is held on the chains no trigger raises, and the moment cases run under both mysqli report modes. - LandingConsentReaderTest runs landing.php's consent reader and link decorator under node and holds them to parse_str() on 45 spellings; CLAUDE.md said 36, from a scratch run nothing could repeat. - SchemaVersionIntegrationTest checks its own reads, restores the report mode, and covers a missing row and a missing table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U3VVstdYdz5zwv5MUbkDjT
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Two kinds of red check on this PR, neither from its change. PHPStan (custom rules): fix ported in 90715f4. 1.9.79 itself fails PHPStan with five errors (c6d5167, cold result cache). They come from three request-value casts that 1.9.79's own merges left in #328 fixes all three. Its branch is merged into this one: a merge commit, nothing rewritten, and no change to its fix. With it, claude-review and adversarial-review: "did not run". Since #275 merged, 1.9.79's two review workflows differ from master's. The Claude app gives its token only to a workflow identical to the default branch's copy, so every PR into 1.9.79 gets this answer until 1.9.79 reaches master. #275's description says so under "Merge order". The new steps make that failure loud instead of a silent CLEAN, as intended. A re-run would get the same answer, and nothing in this PR can change it. Generated by Claude Code |
…'s PHPStan job refuses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U3VVstdYdz5zwv5MUbkDjT
The adversarial review of #282 (6 non-blocking findings) is addressed here for findings 1–4 and 6. The reports stay encrypted. Finding 5 waits on the owner's call and is not in this PR.
This branch also merges #328 (90715f4), the fix for the three request-value casts that left 1.9.79's own PHPStan job red. It becomes a no-op once #328 lands on 1.9.79.
What changes
1. Only a failure shown to be the click's counts towards stepping it over.
UnexpectedValueExceptionfor a value the click's rows hold.GET /system/dataenginenames it too.2. The hour starts at the first failure of the click's own.
failing_sinceused to start at the click's first failure of any kind.failing_sinceis now the first run that failed with the click's own error, and it stays null while only passing problems stop the walk.3. Tests for the paths the review named.
MYSQLI_REPORT_STRICTalone, asconnect.phpsets it, and so do the existing tests. A failed statement reaches the classifier as Connection's[errno N]tag.mysqli_sql_exception's code.ReClickBackfillFailureTestholds the classifier on 14 exception chains no trigger can raise: wrapped, nested, untagged, a type error, a logic error.run()before anything is counted. That is loud and counts nothing; this PR leaves it as it is.4. The consent reader's parity with PHP is a committed test.
LandingConsentReaderTestrunslanding.php's own reader and link decorator under node, on 45 spellings.parse_str()andRequestSignals::consentGiven(): absent, consent or refusal.0; given, it reads nop202_consent.CIis set it fails rather than skips ifnodeis missing.6.
SchemaVersionIntegrationTest202_versionrow, and no table. Neither claims an upgrade, and the sync worker's refusal names each.CLAUDE.md #35 records both halves of finding 1 and 2's shape. Pattern #11 records finding 4's.
Testing
On this PR (90715f4): CI is green, including:
integrationon MySQL 8.0;test,upgrade-equals-installandagent-evals;The two review checks report "did not run". Since #275, every PR into 1.9.79 gets that answer, until 1.9.79 reaches master (see the comment below).
Locally on PHP 8.3.6 and MariaDB 10.11, full
vendor/, on 1.9.79 at c6d5167, before #328 was merged in.The ladder (
verify.sh --changed):phpstan analyse -c phpstan.neon.distreports 0 errors.Integration, each suite on its own fresh database:
ReClickBackfillIntegrationTest21/21SchemaVersionIntegrationTest11/11ReClickRollupUpgradeIntegrationTest3/3UpgradePendingAnswerServedIntegrationTest11/11Live:
tests/live/reclick-backfill-cron.shpassed 12/12 through the real cron job (202-cronjobs/index.php) andGET /system/dataengine. It ran against a 1.9.79 instance served from this tree. In that run the refused click is stopped at, then stepped over once its own failures are an hour old.Each fix was planted against, and a named test fails:
mysqli_sql_exceptionbranch removedtrim()1.0.21.0.2🤖 Generated with Claude Code
https://claude.ai/code/session_01U3VVstdYdz5zwv5MUbkDjT