Skip to content

chore(deps)(deps): bump the production-dependencies group with 3 updates - #330

Merged
doublegate merged 1 commit into
mainfrom
dependabot/cargo/production-dependencies-1a1f3de9fb
Jul 30, 2026
Merged

chore(deps)(deps): bump the production-dependencies group with 3 updates#330
doublegate merged 1 commit into
mainfrom
dependabot/cargo/production-dependencies-1a1f3de9fb

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jul 27, 2026

Copy link
Copy Markdown
Contributor

Bumps the production-dependencies group with 3 updates: cc, clap and libc.

Updates cc from 1.3.0 to 1.4.0

Release notes

Sourced from cc's releases.

cc-v1.4.0

Added

  • support trim paths with clang-cl.exe (#1799)
Changelog

Sourced from cc's changelog.

1.4.0 - 2026-07-24

Added

  • support trim paths with clang-cl.exe (#1799)
Commits

Updates clap from 4.6.3 to 4.6.4

Release notes

Sourced from clap's releases.

v4.6.4

[4.6.4] - 2026-07-21

Internal

  • Update to syn v3
Changelog

Sourced from clap's changelog.

[4.6.4] - 2026-07-21

Internal

  • Update to syn v3
Commits
  • 87ec1ad chore: Release
  • 78f2529 docs: Update changelog
  • b61f270 Merge pull request #6369 from Metbcy/fix/zsh-completion-ordering
  • 74c6666 fix(complete): Keep zsh candidate order
  • d142d8f Merge pull request #6360 from epage/string
  • ba89563 style: Prefer explicit string operations
  • bea966e Merge pull request #6359 from epage/man
  • b811986 chore(man):Remove unused required-features
  • 0010bf2 Merge pull request #6358 from clap-rs/renovate/crate-ci-typos-1.x
  • bab9b24 chore(deps): Update compatible (dev) (#6357)
  • Additional commits viewable in compare view

Updates libc from 0.2.186 to 0.2.189

Release notes

Sourced from libc's releases.

0.2.189

Added

  • Emscripten: Add pthread_sigmask, sigwait, sigwaitinfo, sigtimedwait, faccessat, and pthread_kill (#5270)
  • Linux SPARC: Enable the clone3 syscall (#4980)
  • Solarish: Add CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID (#5274)

Deprecated

  • Deprecate CLONE_INTO_CGROUP and CLONE_CLEAR_SIGHAND. These overflow their types and will be changed to a larger size in the future. (8c6e6710458d)

Fixed

  • Musl riscv32: Rename padding fields to avoid a conflict and fix the build (2499ff0ad993)
  • NuttX: Fix wchar_t definition under Arm (#5245)
  • Windows: Add back link names for time-related symbols (#5300)

0.2.188

Changed

These were removed in 0.2.187 because libc does not actually make Send and Sync guarantees about DIR (or other extern types), but this caused some crates to break. The traits are added back for now to allow time to migrate, but will be removed again in the future; please make sure your crates are not relying on libc::DIR: Send or libc::DIR: Sync.

0.2.187

This release contains a number of improvements related to 64-bit time_t configuration. Of note the existing RUST_LIBC_UNSTABLE_* environment variables have been replaced with configuration options. The new way to use these is:

RUSTFLAGS='--cfg=libc_unstable_musl_v1_2_3' cargo ...
RUSTFLAGS='--cfg=libc_unstable_gnu_time_bits="64"' cargo ...

Being able to set this via RUSTFLAGS makes it easier to only apply configuration to specific targets (and notably, not the host if build scripts are used).

There are two other notable changes:

  • The 32-bit windows-gnu targets now respect libc_unstable_gnu_time_bits

  • uClibc now supports a similar configuration option:

    RUSTFLAGS='--cfg=libc_unstable_uclibc_time64'

... (truncated)

Changelog

Sourced from libc's changelog.

0.2.189 - 2026-07-21

Added

  • Emscripten: Add pthread_sigmask, sigwait, sigwaitinfo, sigtimedwait, faccessat, and pthread_kill (#5270)
  • Linux SPARC: Enable the clone3 syscall (#4980)
  • Solarish: Add CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID (#5274)

Deprecated

  • Deprecate CLONE_INTO_CGROUP and CLONE_CLEAR_SIGHAND. These overflow their types and will be changed to a larger size in the future. (8c6e6710458d)

Fixed

  • Musl riscv32: Rename padding fields to avoid a conflict and fix the build (2499ff0ad993)
  • NuttX: Fix wchar_t definition under Arm (#5245)
  • Windows: Add back link names for time-related symbols (#5300)

0.2.188 - 2026-07-21

Changed

These were removed in 0.2.187 because libc does not actually make Send and Sync guarantees about DIR (or other extern types), but this caused some crates to break. The traits are added back for now to allow time to migrate, but will be removed again in the future; please make sure your crates are not relying on libc::DIR: Send or libc::DIR: Sync.

0.2.187 - 2026-07-20

This release contains a number of improvements related to 64-bit time_t configuration. Of note the existing RUST_LIBC_UNSTABLE_* environment variables have been replaced with configuration options. The new way to use these is:

RUSTFLAGS='--cfg=libc_unstable_musl_v1_2_3' cargo ...
RUSTFLAGS='--cfg=libc_unstable_gnu_time_bits="64"' cargo ...

Being able to set this via RUSTFLAGS makes it easier to only apply configuration to specific targets (and notably, not the host if build scripts are used).

There are two other notable changes:

  • The 32-bit windows-gnu targets now respect libc_unstable_gnu_time_bits
  • uClibc now supports a similar configuration option:

... (truncated)

Commits
  • ef0906e libc: Release 0.2.189
  • 5a79f76 riscv32-musl: Rename padding fields to avoid a conflict
  • 3e51062 psp: Fix overflowing_literals warnings
  • e352fdd emscripten: add pthread_sigmask, sigwait, sigwaitinfo, sigtimedwait, faccessa...
  • 63221b3 macros: Require safe in safe_f! invocations
  • 707ab52 macros: Require unsafe in f! invocations
  • 8e40c94 Enable clone3() syscall on sparc-linux and sparc64-linux
  • 8427909 windows: Add back link names for time-related symbols
  • b4863fa nuttx: fix wchar_t definition under arm
  • 41c683d nuttx: mirror type definitions
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
  • @dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
  • @dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
  • @dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
  • @dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions

Bumps the production-dependencies group with 3 updates: [cc](https://github.com/rust-lang/cc-rs), [clap](https://github.com/clap-rs/clap) and [libc](https://github.com/rust-lang/libc).


Updates `cc` from 1.3.0 to 1.4.0
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](rust-lang/cc-rs@cc-v1.3.0...cc-v1.4.0)

Updates `clap` from 4.6.3 to 4.6.4
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](clap-rs/clap@clap_complete-v4.6.3...clap_complete-v4.6.4)

Updates `libc` from 0.2.186 to 0.2.189
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.189/CHANGELOG.md)
- [Commits](rust-lang/libc@0.2.186...0.2.189)

---
updated-dependencies:
- dependency-name: cc
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: clap
  dependency-version: 4.6.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
- dependency-name: libc
  dependency-version: 0.2.189
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot
dependabot Bot requested a review from doublegate as a code owner July 27, 2026 10:11
@dependabot @github

dependabot Bot commented on behalf of github Jul 27, 2026

Copy link
Copy Markdown
Contributor Author

Labels

The following labels could not be found: dependencies, rust. Please create them before Dependabot can add them to a pull request.

Please fix the above issues or remove invalid values from dependabot.yml.

Repository owner deleted a comment from github-actions Bot Jul 30, 2026
doublegate added a commit that referenced this pull request Jul 30, 2026
When agy's cached Google OAuth session lapses on the self-hosted runner,
`agy --print` emits its INTERACTIVE login flow to stdout instead of a
review -- a live-shaped `accounts.google.com/o/oauth2/...` authorization
URL plus a "paste the authorization code here" prompt and an
"authentication failed or timed out" tail. That text is non-empty, so
`have_text()` classified it as a valid review and the script posted it
verbatim as a public PR comment. Incident: it landed on PR #330 (a
Dependabot bump) as a "github-actions" review comment carrying the OAuth
URL -- noise, phishing-shaped content, and an advertisement that the
runner's auth had dropped. That comment has been removed.

Root cause: the capture pipeline had no notion of "agy produced output,
but the output is an auth prompt, not a review." `have_text()` only
checks for non-whitespace bytes.

Fix -- two independent layers, plus a helper:

  * is_auth_prompt() (new): true when a captured file carries agy's
    interactive-login signature -- the accounts.google.com OAuth endpoint
    URL, "paste the authorization code", "Authentication required. Please
    visit", "Waiting for authentication", or "authentication failed or
    timed out". Keyed on agy runtime strings a genuine review never
    emits, so a review that merely discusses "authentication" is not
    misclassified (verified against a benign review sample).

  * Layer 1 (retry loop): after CR-normalizing each attempt's capture and
    before the have_text() success break, reject an auth-prompt capture as
    a hard, NON-retryable failure. Re-auth is a human action on the runner
    host, so retrying only thrashes the backoff. Blank the capture (so no
    later path can post it), set auth_failed=1, and break. A dedicated
    post-loop branch then exits non-zero with an actionable message,
    ahead of the generic empty-output path.

  * Layer 3 (pre-post): a final hard guard immediately before
    `gh pr comment` -- if the fully assembled body still trips the
    auth-prompt signature, refuse to post and fail the job. This is the
    last line of defense: a public PR comment must never carry an OAuth
    URL regardless of any upstream change to body assembly.

Behavior on a healthy, authenticated runner is unchanged: a real review
never matches is_auth_prompt, so it posts exactly as before. Only the
lapsed-session path changes -- from "leak the OAuth URL" to "fail loudly
in the job log, post nothing." Syntax-checked (`bash -n`) and the
signature validated against the exact leaked comment text, a benign
authentication-discussing review, and empty output.

Synced byte-identical across the shared reviewer template and RustyNES /
RustySNES / RustyN64 (single source of truth).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
@doublegate
doublegate merged commit 90c74c6 into main Jul 30, 2026
21 checks passed
@doublegate
doublegate deleted the dependabot/cargo/production-dependencies-1a1f3de9fb branch July 30, 2026 04:05
doublegate added a commit to doublegate/RustySNES that referenced this pull request Jul 30, 2026
* fix(reviewer): never post agy's OAuth login prompt to a PR

Sync the shared Antigravity (`agy`) reviewer hardening from the template.
When agy's cached Google OAuth session lapses on the self-hosted runner,
`agy --print` emits its INTERACTIVE login flow to stdout instead of a
review -- a live-shaped `accounts.google.com/o/oauth2/...` authorization
URL plus a "paste the authorization code here" prompt. That text is
non-empty, so `have_text()` classified it as a valid review and the
script posted it verbatim as a public PR comment. The incident surfaced
on doublegate/RustyNES#330 (a Dependabot bump); this keeps the shared
reviewer byte-identical across the template and all three Rusty* repos.

Fix -- two independent layers, plus a helper:
  * is_auth_prompt() (new): detects agy's interactive-login signature
    (the accounts.google.com OAuth endpoint URL + agy's own prompt
    strings). Keyed on runtime strings a genuine review never emits, so a
    review that merely discusses "authentication" is not misclassified.
  * Layer 1 (retry loop): reject an auth-prompt capture as a hard,
    non-retryable failure; blank it, flag it, and exit non-zero with an
    actionable "re-authenticate agy on the runner host" message.
  * Layer 3 (pre-post): a final hard guard immediately before
    `gh pr comment` -- refuse to post any body that trips the signature.

Behavior on a healthy, authenticated runner is unchanged. Syntax-checked
(`bash -n`) and validated against the exact leaked comment text, a benign
authentication-discussing review, and empty output. Byte-identical
(same sha256) with the template and RustyNES scripts/agy-review.sh.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): gate auth-prompt detection on the absence of review structure

Adopt agy's own adversarial review finding (flagged BLOCKING on the sync
PRs): the initial is_auth_prompt() matched the OAuth-login signature
anywhere in agy's output, so a GENUINE review that quotes those strings
-- e.g. one reviewing this very script (whose diff contains them) or a PR
implementing OAuth -- would be wrongly discarded in the retry loop or
blocked from posting.

Require BOTH conditions now: the auth signature present AND the mandated
review structure absent. The reviewer prompt requires a "### Blocking
issues" section in every review (agy writes "None found." when clean),
which agy's raw interactive login flow never contains. A real review thus
keeps its section and posts; only the raw login flow (signature present,
structure absent) is rejected.

Verified against six cases incl. the exact false-positive agy flagged (a
review quoting the auth strings WITH a Blocking-issues section now posts).
bash -n clean; byte-identical across the template and all three Rusty*
repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): anchor the review-structure sentinel to the header line

Adopt agy's second-round BLOCKING finding: the review-structure check
used an unanchored, case-insensitive `grep -qi 'Blocking issues'`, so the
mere phrase appearing in prose or an error line -- alongside an OAuth URL
-- would disarm is_auth_prompt() and let the login flow post (a false
NEGATIVE = a leak).

Anchor to the Markdown section header at line start (`^#{2,4} Blocking
issues`, case-sensitive) instead. This fails SAFE: text without a genuine
header is treated as a possible login flow and blocked, while a real
review's mandated "### Blocking issues" header always matches, so a
review that quotes the auth strings still posts.

Verified against seven cases, incl. the exact bypass agy described (a raw
login flow containing the phrase "blocking issues" in prose + an OAuth
URL is now correctly blocked) and a lowercase-phrase-plus-URL log line.
bash -n clean; byte-identical across template + all three Rusty* repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): key the OAuth-leak guard on the live URL, not review structure

Redesign converging several rounds of agy's own adversarial review, which
oscillated between the guard being too broad (false positive: suppressing
a genuine review that discusses auth or quotes this script) and too narrow
(false negative: an OAuth URL leaking when a section header appeared in the
same output). Both failure modes came from trying to answer "is this a
review?" heuristically.

Key on the one artifact that unambiguously marks agy's login flow instead:
a live Google OAuth authorization URL (the https scheme + host + /o/oauth2/
endpoint path).
  * oauth_url_present() -- Layer 3, now UNCONDITIONAL: refuse to post any
    body carrying such a URL, with no header/structure exemption an
    interleaved URL could disarm (fixes the round-3 leak finding; also
    immune to header case and trailing punctuation).
  * is_auth_prompt() -- Layer 1: a lapsed session is detected by the live
    URL (always present in the flow) plus agy's terminal failure line; it
    gates only the retry / clean-exit UX, never the security guarantee.
A code review quotes this script's BARE regex (host + path, no scheme) or
discusses auth in prose -- neither is a live URL -- so reviewing the
reviewer or an OAuth-related PR no longer false-positives.

Verified against seven cases covering every scenario agy raised across
three rounds: raw login flow (blocked), a review quoting the bare regex
(posts), a title-case header with auth prose (posts), a header+colon with
an interleaved live URL (blocked), a failure-line-only lapse, empty, and a
real review body. bash -n clean; byte-identical across template + all
three Rusty* repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): drop trailing-slash requirement + remove the phrase fallback

Adopt agy's round-4 findings on the OAuth-URL leak guard:

  * OAUTH_URL_RE no longer requires a trailing slash after `/o/oauth2`. A
    URL emitted as `.../o/oauth2?client_id=...` or bare `.../o/oauth2` would
    otherwise slip past oauth_url_present and leak. The scheme (`https?://`)
    is still required, so a review quoting this script's bare host/path
    pattern still does not match -- no safety lost. Matching is also made
    case-insensitive (URL scheme/host are case-insensitive; still self-safe).

  * Removed the secondary `authentication failed or timed out` substring
    fallback and collapsed both layers onto the single oauth_url_present
    check. agy flagged the fallback (correctly) as broad enough to abort a
    genuine review that merely discusses auth-timeout handling. The live URL
    is always present in a real login flow, so it is both necessary and
    sufficient on its own; the same unconditional check now serves Layer 1
    (retry / clean-exit) and Layer 3 (block the post).

Verified: no-slash and query-only URLs are now blocked; a review quoting
the bare pattern or discussing auth timeouts posts normally; the script
does not self-match. bash -n clean; byte-identical across template + all
three Rusty* repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
doublegate added a commit to doublegate/RustyN64 that referenced this pull request Jul 30, 2026
* fix(reviewer): never post agy's OAuth login prompt to a PR

Sync the shared Antigravity (`agy`) reviewer hardening from the template.
When agy's cached Google OAuth session lapses on the self-hosted runner,
`agy --print` emits its INTERACTIVE login flow to stdout instead of a
review -- a live-shaped `accounts.google.com/o/oauth2/...` authorization
URL plus a "paste the authorization code here" prompt. That text is
non-empty, so `have_text()` classified it as a valid review and the
script posted it verbatim as a public PR comment. The incident surfaced
on doublegate/RustyNES#330 (a Dependabot bump); this keeps the shared
reviewer byte-identical across the template and all three Rusty* repos.

Fix -- two independent layers, plus a helper:
  * is_auth_prompt() (new): detects agy's interactive-login signature
    (the accounts.google.com OAuth endpoint URL + agy's own prompt
    strings). Keyed on runtime strings a genuine review never emits, so a
    review that merely discusses "authentication" is not misclassified.
  * Layer 1 (retry loop): reject an auth-prompt capture as a hard,
    non-retryable failure; blank it, flag it, and exit non-zero with an
    actionable "re-authenticate agy on the runner host" message.
  * Layer 3 (pre-post): a final hard guard immediately before
    `gh pr comment` -- refuse to post any body that trips the signature.

Behavior on a healthy, authenticated runner is unchanged. Syntax-checked
(`bash -n`) and validated against the exact leaked comment text, a benign
authentication-discussing review, and empty output. Byte-identical
(same sha256) with the template and RustyNES scripts/agy-review.sh.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): gate auth-prompt detection on the absence of review structure

Adopt agy's own adversarial review finding (flagged BLOCKING on the sync
PRs): the initial is_auth_prompt() matched the OAuth-login signature
anywhere in agy's output, so a GENUINE review that quotes those strings
-- e.g. one reviewing this very script (whose diff contains them) or a PR
implementing OAuth -- would be wrongly discarded in the retry loop or
blocked from posting.

Require BOTH conditions now: the auth signature present AND the mandated
review structure absent. The reviewer prompt requires a "### Blocking
issues" section in every review (agy writes "None found." when clean),
which agy's raw interactive login flow never contains. A real review thus
keeps its section and posts; only the raw login flow (signature present,
structure absent) is rejected.

Verified against six cases incl. the exact false-positive agy flagged (a
review quoting the auth strings WITH a Blocking-issues section now posts).
bash -n clean; byte-identical across the template and all three Rusty*
repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): anchor the review-structure sentinel to the header line

Adopt agy's second-round BLOCKING finding: the review-structure check
used an unanchored, case-insensitive `grep -qi 'Blocking issues'`, so the
mere phrase appearing in prose or an error line -- alongside an OAuth URL
-- would disarm is_auth_prompt() and let the login flow post (a false
NEGATIVE = a leak).

Anchor to the Markdown section header at line start (`^#{2,4} Blocking
issues`, case-sensitive) instead. This fails SAFE: text without a genuine
header is treated as a possible login flow and blocked, while a real
review's mandated "### Blocking issues" header always matches, so a
review that quotes the auth strings still posts.

Verified against seven cases, incl. the exact bypass agy described (a raw
login flow containing the phrase "blocking issues" in prose + an OAuth
URL is now correctly blocked) and a lowercase-phrase-plus-URL log line.
bash -n clean; byte-identical across template + all three Rusty* repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): key the OAuth-leak guard on the live URL, not review structure

Redesign converging several rounds of agy's own adversarial review, which
oscillated between the guard being too broad (false positive: suppressing
a genuine review that discusses auth or quotes this script) and too narrow
(false negative: an OAuth URL leaking when a section header appeared in the
same output). Both failure modes came from trying to answer "is this a
review?" heuristically.

Key on the one artifact that unambiguously marks agy's login flow instead:
a live Google OAuth authorization URL (the https scheme + host + /o/oauth2/
endpoint path).
  * oauth_url_present() -- Layer 3, now UNCONDITIONAL: refuse to post any
    body carrying such a URL, with no header/structure exemption an
    interleaved URL could disarm (fixes the round-3 leak finding; also
    immune to header case and trailing punctuation).
  * is_auth_prompt() -- Layer 1: a lapsed session is detected by the live
    URL (always present in the flow) plus agy's terminal failure line; it
    gates only the retry / clean-exit UX, never the security guarantee.
A code review quotes this script's BARE regex (host + path, no scheme) or
discusses auth in prose -- neither is a live URL -- so reviewing the
reviewer or an OAuth-related PR no longer false-positives.

Verified against seven cases covering every scenario agy raised across
three rounds: raw login flow (blocked), a review quoting the bare regex
(posts), a title-case header with auth prose (posts), a header+colon with
an interleaved live URL (blocked), a failure-line-only lapse, empty, and a
real review body. bash -n clean; byte-identical across template + all
three Rusty* repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(reviewer): drop trailing-slash requirement + remove the phrase fallback

Adopt agy's round-4 findings on the OAuth-URL leak guard:

  * OAUTH_URL_RE no longer requires a trailing slash after `/o/oauth2`. A
    URL emitted as `.../o/oauth2?client_id=...` or bare `.../o/oauth2` would
    otherwise slip past oauth_url_present and leak. The scheme (`https?://`)
    is still required, so a review quoting this script's bare host/path
    pattern still does not match -- no safety lost. Matching is also made
    case-insensitive (URL scheme/host are case-insensitive; still self-safe).

  * Removed the secondary `authentication failed or timed out` substring
    fallback and collapsed both layers onto the single oauth_url_present
    check. agy flagged the fallback (correctly) as broad enough to abort a
    genuine review that merely discusses auth-timeout handling. The live URL
    is always present in a real login flow, so it is both necessary and
    sufficient on its own; the same unconditional check now serves Layer 1
    (retry / clean-exit) and Layer 3 (block the post).

Verified: no-slash and query-only URLs are now blocked; a review quoting
the bare pattern or discussing auth timeouts posts normally; the script
does not self-match. bash -n clean; byte-identical across template + all
three Rusty* repos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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.

1 participant