Skip to content

feat(gmail): reference sanitized body links as [link:N] markers, resolved on demand with gmail link - #1008

Open
ronny-rentner wants to merge 8 commits into
openclaw:mainfrom
ronny-rentner:feat/gmail-link
Open

feat(gmail): reference sanitized body links as [link:N] markers, resolved on demand with gmail link#1008
ronny-rentner wants to merge 8 commits into
openclaw:mainfrom
ronny-rentner:feat/gmail-link

Conversation

@ronny-rentner

Copy link
Copy Markdown
Contributor

Problem

--sanitize-content loses every link destination: visible URLs are replaced with
[url removed], and anchor hrefs are dropped with the markup. Sanitized mail therefore
cannot be acted on — a task like "open the invoice" or "unsubscribe me from this" needs the
destination. Keeping URLs inline is no answer either: they can be really long (400–1000
chars each) and would dominate the sanitized body.

Change

Attachments already solve this shape of problem: the output carries a compact reference,
and the content is fetched on demand. This PR gives URLs the same treatment.

  • [url removed] in the sanitized body is replaced with [link:N] instead, so you can
    reference the link by its index N when you actually want to fetch it.

  • Indexes are assigned in document order; the same href at several sites shares one index.

  • An anchor without visible text (an image-wrapper link) is named by its image's alt.

  • Script/style content is dropped as before and never numbered.

  • New command, mirroring gmail attachment:

    gog gmail link <messageId> <index>
    

    It re-runs the same deterministic body conversion, so its indexes are the ones in the
    sanitized body. JSON output is {"url": ..., "text": ...} with text being the
    anchor text, omitted for a bare URL; a bad index is a usage error.

  • The readonly and agent-safe profiles allow gmail link; command docs regenerated;
    docs/gmail-workflows.md updated.

Proof (real mailbox, redacted)

A payment notice whose actions are HTML buttons. Sanitized body on v0.37.0 — the button
texts survive, their destinations are silently gone:

... Falls Sie es noch nicht getan haben, fügen Sie einen Beleg hinzu, um Zeit bei der
Buchhaltung zu sparen.   Beleg hinzufügen   Möchten Sie diese Zahlung per Lastschrift
anfechten? Rufen Sie die Zahlung auf und prüfen Sie Ihre Möglichkeiten. ...

Same message with this branch:

$ gog --version
v0.34.2-38-g1b5fbc1f (1b5fbc1fdc64 2026-08-20T10:42:03Z)
$ gog gmail get MSG_ID --json --sanitize-content
... Falls Sie es noch nicht getan haben, fügen Sie einen Beleg hinzu, um Zeit bei der
Buchhaltung zu sparen.   Beleg hinzufügen [link:0]   Möchten Sie diese Zahlung per
Lastschrift anfechten? Rufen Sie die Zahlung [link:1] auf und prüfen Sie Ihre
Möglichkeiten. ...
$ gog gmail link MSG_ID 0 --json
{
  "url": "https://url2820.qonto.com/ls/click?upn=u001.PALJKS45jlsSqfTO[...redacted, 1023 chars total...]",
  "text": "Beleg hinzufügen"
}

The resolved URL is byte-identical to the anchor's href in the message's HTML. No URL
appears anywhere in the sanitized output; the original example message carries six long
tracked URLs which would otherwise add ~5 kB to every read.
Before this change, needing to open even a single one of these links meant giving up on
sanitizing entirely and reading the message unsanitized, with all URLs and the raw
payload, just to get at one href.

Testing

  • Unit: body conversion (anchor text + marker, bare-URL replacement, mailto, duplicate
    href sharing one index, image-anchor alt naming, script/style URLs never numbered).
  • Execute-level: sanitized gmail get emits markers and no URLs; gmail link resolves
    index → exact URL and anchor text; non-numeric / out-of-range indexes are usage errors;
    index parity between get and link on one fixture; thread output numbers per message.
  • Local gate: make fmt-check, make lint, make deadcode, make docs-check, make test all pass.

User-facing changes: the new gmail link command; sanitized bodies now mark links as
[link:N] instead of [url removed]/dropping them.

@clawsweeper

clawsweeper Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1b5fbc1fdc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +32 to +33
body, isHTML := gmailcontent.BestBodyForDisplay(msg.Payload)
_, links := sanitizeGmailBodyLinks(body, isHTML)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Read links from the HTML alternative

When a normal multipart/alternative message contains both plain text and HTML, BestBodyForDisplay always selects the plain part (internal/gmailcontent/content.go:70-74). If that part says “Pay now” while the HTML part carries <a href="…">Pay now</a>, sanitized output emits no marker and this command reports zero links, so the feature misses the common case it is intended to support. Marker generation and resolution should consistently inspect a link-bearing HTML alternative when one exists.

Useful? React with 👍 / 👎.

Comment on lines +90 to +93
// NUL delimits the anchor placeholders below and cannot occur in tokenizer output
// (HTML parsing replaces it); strip it from the input so a crafted body cannot
// fabricate a placeholder.
text := strings.ReplaceAll(body, "\x00", "")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Reserve generated marker syntax before numbering

An untrusted body can already contain literal text such as [link:0], and this preprocessing leaves it indistinguishable from a generated marker. For example, Open invoice [link:0]. Footer https://evil.example produces two [link:0] references even though only the footer URL is registered, so resolving the apparent invoice marker returns the unrelated URL. Neutralize or escape pre-existing marker-shaped text before inserting generated markers.

Useful? React with 👍 / 👎.

Comment thread internal/cmd/gmail_link.go Outdated
Comment on lines +67 to +69
u.Out().Linef("url\t%s", link.URL)
if link.Text != "" {
u.Out().Linef("text\t%s", link.Text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Sanitize control characters before text output

For default or --plain output, an email sender can place tabs, newlines, or terminal escape characters in an href, and the resolver writes that attacker-controlled value directly through Linef; JSON escapes these characters, but this path can forge TSV records or emit terminal control sequences. Strip control characters from both URL and text before emitting the non-JSON form so stdout remains parseable.

AGENTS.md reference: AGENTS.md:L18-L22

Useful? React with 👍 / 👎.

Comment thread internal/cmd/gmail_sanitize.go Outdated
Comment on lines +17 to +18
// A NUL-delimited anchor placeholder from extractSanitizedHTMLText, or a bare URL.
sanitizeLinkPattern = regexp.MustCompile("\x00[^\x00]*\x00|" + `https?://[^\s<>"'` + "`" + `\]\)]+`)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve correct boundaries for bare URLs

For bare URLs in prose, this pattern includes ordinary trailing punctuation but categorically excludes closing parentheses. Thus See https://example.com/reset. resolves to a URL ending in ., while https://example.com/wiki/Foo_(bar) resolves only through ...(bar, leaving ) behind. Since these captured strings are now returned as actionable destinations rather than merely removed, the scanner needs punctuation and balanced-delimiter handling to avoid returning altered URLs.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Aug 20, 2026
@clawsweeper

clawsweeper Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed August 20, 2026, 3:54 PM ET / 19:54 UTC.

ClawSweeper review

What this changes

Adds [link:N] markers to sanitized Gmail bodies and a read-only gog gmail link command that resolves a marker to its destination.

Merge readiness

⚠️ Needs maintainer review before merge - 8 items remain

Keep open: the feature has strong real-mailbox proof, but it still misses HTML-only links in ordinary multipart mail and lets sender text forge marker-shaped references.

Priority: P2
Reviewed head: e21adc21d58dd196fe7c508d6c9b50b05e7158e7
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The real-mailbox evidence is strong, but two concrete P1 correctness and safety blockers remain.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (terminal): The PR body provides a redacted real-mailbox terminal transcript showing after-fix markers and resolution; private details are redacted.
Patch quality 🦐 gold shrimp (3/6) Security review found an item that needs attention.

Verification

Check Result Evidence
Real behavior Verified Sufficient (terminal): The PR body provides a redacted real-mailbox terminal transcript showing after-fix markers and resolution; private details are redacted.
Evidence reviewed 7 items Current main lacks the feature: Current main has no GmailLinkCmd, so this PR is not already implemented or obsolete.
Multipart selection drops HTML-only hrefs: The shared selector intentionally returns text/plain before text/html, and its existing regression test asserts that behavior for multipart/alternative input.
Both new paths replay the plain-first selector: Sanitized rendering and gmail link both call BestBodyForDisplay, so a link present only in the HTML alternative has neither a marker nor a resolvable index.
Findings 2 actionable findings [P1] Use the link-bearing HTML alternative consistently
[P1] Escape sender-supplied marker syntax
Security Needs attention Literal marker text can forge a resolver reference: An untrusted message can include [link:N] outside an actual URL. The resolver treats the apparent marker as an index into unrelated captured links, obscuring provenance for an agent consuming sanitized content.

Live Verification

Command: go run ./cmd/gog gmail link --help

Result: FAIL (failed) — execution before step 1 run: sh -lc pnpm install --ignore-scripts --frozen-lockfile failed: ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz

sh -lc pnpm install --ignore-scripts --frozen-lockfile failed: ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz

Assertions:

  • FAIL expect_output: 0-based link index from the sanitized body's [link:N] marker

How this fits together

Gmail read commands select a message body, sanitize it for agent-oriented output, and now emit compact link references. The new resolver replays that selection to return a referenced URL, so both paths must share a safe, link-aware representation.

flowchart LR
A[Gmail message] --> B[Body selection]
B --> C[Sanitized body conversion]
C --> D[Visible link markers]
A --> E[Link lookup command]
E --> B
E --> F[Resolved URL]
Loading

Decision needed

Question Recommendation
Should sanitized Gmail reads switch to a link-aware HTML representation for multipart messages, or should this new marker/resolver feature be deferred until that output contract is defined? Adopt a link-aware multipart contract: Use a consistently selected HTML alternative for marker generation and lookup, preserve safe sanitization, and escape literal marker syntax before merge.

Why: Current behavior deliberately prefers text/plain, while meeting the feature’s goal for common HTML-button mail requires changing what existing sanitized reads display.

Before merge

  • Use the link-bearing HTML alternative consistently (P1) - BestBodyForDisplay returns text/plain before text/html. For normal multipart mail whose plain body says “Pay now” but whose HTML alternative has the href, this PR emits no marker and resolves zero links. Define one link-aware representation for rendering and lookup, with a multipart regression test.
  • Escape sender-supplied marker syntax (P1) - Literal [link:0] text survives this conversion unchanged, so it is indistinguishable from a generated marker and can resolve to an unrelated later URL. Escape pre-existing marker-shaped text before inserting generated references.
  • Resolve security concern: Literal marker text can forge a resolver reference - An untrusted message can include [link:N] outside an actual URL. The resolver treats the apparent marker as an index into unrelated captured links, obscuring provenance for an agent consuming sanitized content.
  • Resolve merge risk (P1) - Existing multipart messages with links only in HTML will show no actionable marker, despite the feature’s stated purpose.
  • Resolve merge risk (P1) - Literal [link:N] text from an untrusted email is indistinguishable from a generated reference and can resolve to an unrelated registered URL.
  • Resolve merge risk (P1) - Changing multipart selection or sanitized marker syntax affects existing consumers of sanitized Gmail output.
  • Complete next step (P2) - A maintainer must choose the multipart body contract before a safe repair can preserve existing sanitized-read behavior.

Findings

  • [P1] Use the link-bearing HTML alternative consistently — internal/cmd/gmail_link.go:33-34
  • [P1] Escape sender-supplied marker syntax — internal/cmd/gmail_sanitize.go:136-144
  • [medium] Literal marker text can forge a resolver reference — internal/cmd/gmail_sanitize.go:136
Agent review details

Security

Needs attention: Quoted line output fixes record injection, but sender-controlled marker-shaped text still breaks reference integrity in an agent-safe read path.

Review metrics

Metric Value Why it matters
Code and coverage delta production +240/-12, tests +353/-8, docs +58/-1 The focused feature has substantial targeted test coverage, but it also changes sanitized output and safety-profile command access.

Merge-risk options

Maintainer options:

  1. Define and repair the link contract (recommended)
    Choose the multipart representation, escape sender-shaped marker text, and add paired rendering/resolution coverage before merge.
  2. Pause the feature
    Defer the new command if preserving the present plain-text-first sanitized output is more important than resolving HTML-only links.

Technical review

Best possible solution:

Define an explicit link-aware multipart contract, escape sender-shaped markers before adding generated ones, and cover both rendering and resolution with multipart regression fixtures.

Do we have a high-confidence way to reproduce the issue?

Yes. A multipart/alternative message with a plain body and an HTML-only href follows the plain-first selector and produces no link marker or lookup result.

Is this the best way to solve the issue?

No. The current approach is deterministic, but it cannot resolve the common HTML-only link case and does not reserve the generated marker syntax from untrusted content.

Full review comments:

  • [P1] Use the link-bearing HTML alternative consistently — internal/cmd/gmail_link.go:33-34
    BestBodyForDisplay returns text/plain before text/html. For normal multipart mail whose plain body says “Pay now” but whose HTML alternative has the href, this PR emits no marker and resolves zero links. Define one link-aware representation for rendering and lookup, with a multipart regression test.
    Confidence: 0.98
  • [P1] Escape sender-supplied marker syntax — internal/cmd/gmail_sanitize.go:136-144
    Literal [link:0] text survives this conversion unchanged, so it is indistinguishable from a generated marker and can resolve to an unrelated later URL. Escape pre-existing marker-shaped text before inserting generated references.
    Confidence: 0.96

Overall correctness: patch is incorrect
Overall confidence: 0.97

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against eb85a99366eb.

Labels

Label changes:

  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.

Label justifications:

  • P2: This is a useful Gmail read-path enhancement with bounded but non-emergency user impact.
  • merge-risk: 🚨 compatibility: It changes existing sanitized body output and may require a multipart-selection behavior change.
  • merge-risk: 🚨 security-boundary: The new agent-safe command resolves destinations extracted from untrusted email content.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (terminal): The PR body provides a redacted real-mailbox terminal transcript showing after-fix markers and resolution; private details are redacted.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body provides a redacted real-mailbox terminal transcript showing after-fix markers and resolution; private details are redacted.

Evidence

Security concerns:

  • [medium] Literal marker text can forge a resolver reference — internal/cmd/gmail_sanitize.go:136
    An untrusted message can include [link:N] outside an actual URL. The resolver treats the apparent marker as an index into unrelated captured links, obscuring provenance for an agent consuming sanitized content.
    Confidence: 0.96

What I checked:

  • Current main lacks the feature: Current main has no GmailLinkCmd, so this PR is not already implemented or obsolete. (internal/cmd/gmail.go, eb85a99366eb)
  • Multipart selection drops HTML-only hrefs: The shared selector intentionally returns text/plain before text/html, and its existing regression test asserts that behavior for multipart/alternative input. (internal/gmailcontent/content.go:70, e21adc21d58d)
  • Both new paths replay the plain-first selector: Sanitized rendering and gmail link both call BestBodyForDisplay, so a link present only in the HTML alternative has neither a marker nor a resolvable index. (internal/cmd/gmail_link.go:33, e21adc21d58d)
  • Marker syntax remains sender-forgeable: The conversion replaces URLs and internal anchor placeholders but does not escape literal [link:N] text that came from the message body. (internal/cmd/gmail_sanitize.go:136, e21adc21d58d)
  • Output-control fix is present: Non-JSON output now applies the existing control-character-safe formatter to URL and text values, with a regression test for entity-encoded newline and tab input. (internal/cmd/gmail_link.go:78, e21adc21d58d)
  • Feature history: History identifies Peter Steinberger’s sanitized-content implementation and Ronny Rentner’s merged indexed-attachment work as the closest established owners. (internal/cmd/gmail_sanitize.go, 33284f03bbdd)

Likely related people:

  • Peter Steinberger: Commit 33284f0 introduced sanitized Gmail content reads, including the body-selection and sanitization path this feature extends. (role: original sanitized-Gmail reader contributor; confidence: high; commits: 33284f03bbdd; files: internal/gmailcontent/content.go, internal/cmd/gmail_sanitize.go)
  • Ronny Rentner: Commit 8b44d0a added indexed Gmail attachment references, the established adjacent pattern for this new link-reference feature. (role: recent adjacent feature contributor; confidence: high; commits: 8b44d0a81f9f; files: internal/cmd/gmail_attachment.go)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Resolve the multipart-selection contract and add a paired plain-plus-HTML fixture.
  • Escape literal sender-provided marker syntax before generated markers are inserted.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (2 earlier review cycles)
  • reviewed 2026-08-20T12:03:41.188Z sha 1b5fbc1 :: needs changes before merge. :: [P1] Read links from the HTML alternative | [P1] Reserve generated marker syntax | [P1] Sanitize untrusted values before line output | [P2] Preserve bare URL boundaries
  • reviewed 2026-08-20T13:55:13.663Z sha 4a0d97c :: needs changes before merge. :: [P1] Select link-bearing HTML alternatives consistently | [P1] Reserve generated marker syntax before inserting markers | [P2] Parse prose URL punctuation instead of returning it

@ronny-rentner

Copy link
Copy Markdown
Contributor Author

Thanks for the review. Here is the status on each finding:

[P1] Read links from the HTML alternative — real, but pre-existing; proposed as
follow-up. Before this PR, sanitized output contained no reachable destination in any
mail: every URL was removed or dropped. The plain-first part selection is existing
behavior (BestBodyForDisplay), unchanged here, and a link present only in the HTML
alternative was equally unreachable before. This PR adds resolvability for every link in
the converted part and removes nothing. Extending coverage to the HTML alternative means
changing which part sanitize converts for multipart mail (or adding a selection option
whose value must match between get and link) — a sanitize-wide design decision that
deserves its own change rather than riding on this one.

[P1] Reserve generated marker syntax — disputed. A sender who can write a literal
[link:0] into their mail can equally write a real anchor with deceptive anchor text
and produce an indistinguishable result through the legitimate path — marker-adjacent
text is sender-controlled either way, with or without this feature. Resolution semantics
are unaffected by body text: index N always returns the N-th captured link, and a
fabricated out-of-range index is a clean usage error. The defense against deceptive mail
content is the existing untrusted-content handling, not marker syntax.

[P1] Sanitize untrusted values before line output — fixed in 2066386. The non-JSON
path now quotes both values with tsvSafeValue, as the attachment printer does; a
regression test covers an href carrying an entity-encoded newline and tab. The JSON path
already escapes control characters per the JSON spec.

[P2] Preserve bare URL boundaries — fixed in 4a0d97c. ) is URL-legal and now
stays in a captured bare URL like any other character. Nothing is trimmed: where a bare
URL ends inside prose is context no pattern can judge, and a reader can drop a trailing
character it recognizes as punctuation, while nobody can restore a character the pattern
cut off. When a text-captured URL ends in . or ), resolution adds a note that the
trailing character may be sentence punctuation; anchor hrefs are byte-exact and get no
note. Tests cover balanced parentheses, prose parentheses, and the note.

Resolve security concern: untrusted link values can forge CLI records — fixed by the
same change as the line-output finding above (2066386).

Resolve merge risk: compatibility — the shape change is disclosed in the PR body and
is the maintainer's call; if you want the markers gated behind an option instead, say so.

@ronny-rentner

Copy link
Copy Markdown
Contributor Author

On the punctuation finding: trimming before registering the marker would alter the
sanitized body and destroy characters nothing downstream can restore, and a trailing .
or ) can be legitimate URL data, so url keeps the exact capture. The note is gone;
instead gmail link --trim-punctuation returns the directly usable value on request:
trailing sentence punctuation stripped (. , ; : ! ?, and ) only while the
URL's parentheses are unbalanced, since a balanced pair is likely path data). Anchor
hrefs are byte-exact and unaffected by the flag. Unit tests cover the punctuation set,
balanced parentheses, mixed trailing runs, and the degenerate cases.

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant