Skip to content

fix(tlon): send fragment image URLs as media#104853

Merged
steipete merged 16 commits into
openclaw:mainfrom
VectorPeak:fix/tlon-image-fragment-url-pr
Jul 15, 2026
Merged

fix(tlon): send fragment image URLs as media#104853
steipete merged 16 commits into
openclaw:mainfrom
VectorPeak:fix/tlon-image-fragment-url-pr

Conversation

@VectorPeak

@VectorPeak VectorPeak commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Related: #104852

AI-assisted PR. I reviewed the diff, focused validation output, and redacted live Tlon proof before updating this PR.

What Problem This Solves

Fixes an issue where Tlon users sending image media URLs with fragment suffixes, such as https://cdn.example/image.png#preview, could have those URLs classified as ordinary links instead of image blocks.

The outbound media story path already treated plain image URLs and query-suffixed image URLs as image blocks. Fragment-bearing image URLs were the missing sibling case when the original URL reaches the story builder, especially after upload fallback preserves the source URL.

Why This Change Was Made

The fix stays inside Tlon's local image URL classifier, but it now follows the reviewer-requested narrower rule: classify image-ness from the parsed URL pathname, not from query or fragment text.

That keeps the desired behavior for https://cdn.example/image.png#preview, while avoiding the false positive called out in review: https://cdn.example/page#preview.png remains a normal link because its pathname is /page, not an image filename.

This does not change upload behavior, URL fetching, auth, gateway routing, persisted state, migrations, schema, upgrade behavior, or emitted URL preservation. The original URL, including query or fragment, is still preserved as the emitted Tlon block.image.src when the path itself is an image.

User Impact

Tlon users can send image URLs that include fragments and still get the expected image media block instead of a plain clickable link when the Tlon send path builds a story from that URL.

For example, https://cdn.example/image.png#preview now follows the same media story classification path as https://cdn.example/image.png and https://cdn.example/image.png?token=1, while https://cdn.example/page#preview.png remains a link.

Evidence

Before the fix, the focused local probe showed the mismatch:

https://cdn.example/a.png          => true
https://cdn.example/a.png?token=1  => true
https://cdn.example/a.png#preview  => false
https://cdn.example/a.webp#v=1     => false

The regression coverage now includes both sides of the reviewer-requested behavior:

buildMediaStory("caption", "https://cdn.example/image.png#preview")
=> emits block.image with the original fragment-bearing src

buildMediaStory("caption", "https://cdn.example/page#preview.png")
=> emits a link verse, not block.image

I also added redacted live proof from a real WSL-hosted Urbit comet/Tlon setup in this PR discussion. That run exercised:

tlonRuntimeOutbound.sendMedia()
→ uploadImageFromUrl()
→ upload fallback preserved the original fragment-bearing URL
→ buildMediaStory()
→ real Urbit chat-dm-action poke
→ Tlon UI showed the delivered DM row as image media

The proof comment includes redacted fallback output, the redacted outgoing chat-dm-action payload containing block.image.src, the media receipt shape, and a redacted Tlon UI observation. Private ship identifiers, login code, cookies, target, and media host details were not exposed.

Possible call chain / impact

The relevant source-level fallback chain is:

extensions/tlon/src/channel.runtime.ts sendMedia
→ extensions/tlon/src/urbit/upload.ts uploadImageFromUrl
→ on upload failure, return the original imageUrl
→ extensions/tlon/src/urbit/send.ts buildMediaStory
→ extensions/tlon/src/urbit/story.ts isImageUrl
→ createImageBlock or createLinkInline

This PR only changes the Tlon-local classifier used by that story-building branch. Sibling behavior for plain image URLs, query-suffixed image URLs, upload success, auth, routing, and non-image URL paths is intentionally unchanged.

Validation

git diff --check
node scripts/run-vitest.mjs run extensions/tlon/src/urbit/send.test.ts extensions/tlon/src/urbit/upload.test.ts

Result:

Test Files  2 passed (2)
Tests       12 passed (12)

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
@openclaw-barnacle openclaw-barnacle Bot added channel: tlon Channel integration: tlon size: XS labels Jul 12, 2026
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
@VectorPeak

Copy link
Copy Markdown
Contributor Author

Added a stronger real-user behavior proof in extensions/tlon/src/outbound-tool-trace-sanitize.test.ts.

The new test exercises the actual outbound plugin send chain:

deliverOutboundPayloads
→ tlon sendMedia
→ uploadImageFromUrl(mediaUrl)
→ buildMediaStory(text, uploadedUrl)
→ Urbit poke payload

It sends mediaUrl: "https://source.example/image.png#preview", returns https://media.example/image.png#preview from the uploader mock, and verifies the final Urbit poke JSON contains "src":"https://media.example/image.png#preview" without a link verse.

Validation:

git diff --check
node scripts/run-vitest.mjs run extensions/tlon/src/urbit/send.test.ts extensions/tlon/src/outbound-tool-trace-sanitize.test.ts

Test Files  2 passed (2)
Tests       5 passed (5)

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels Jul 12, 2026
@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 12, 2026, 1:42 AM ET / 05:42 UTC.

Summary
The PR changes Tlon image URL classification to inspect the parsed pathname and adds positive and negative fragment regression tests.

PR surface: Source +6, Tests +38. Total +44 across 2 files.

Reproducibility: yes. On current main, buildMediaStory("caption", "https://cdn.example/image.png#preview") deterministically fails the existing regex and reaches the link branch; the contributor also supplied after-fix live Tlon proof.

Review metrics: none identified.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #104852
Summary: This PR is the direct candidate fix for the linked Tlon fragment-bearing media URL bug.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Next step before merge

  • [P2] The open PR already contains the complete focused repair and sufficient proof, so no separate ClawSweeper fix branch is appropriate.

Security
Cleared: The classifier and test changes add no dependency, permission, secret, workflow, downloaded-code, package-resolution, or other concrete security concern.

Review details

Best possible solution:

Land the Tlon-local pathname classifier with both regression cases after the normal exact-head checks, then close the linked issue through the merged fix.

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

Yes. On current main, buildMediaStory("caption", "https://cdn.example/image.png#preview") deterministically fails the existing regex and reaches the link branch; the contributor also supplied after-fix live Tlon proof.

Is this the best way to solve the issue?

Yes. Matching the parsed pathname is the narrowest maintainable fix because it accepts fragments after real image paths while rejecting image-looking query or fragment text on non-image paths.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P2: This fixes a clear, bounded Tlon media-delivery defect affecting one channel workflow without broader compatibility or security impact.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): Redacted live output from a real Urbit/Tlon send path shows upload fallback preserving the URL, an image block in the real poke, a media receipt, and the delivered Tlon row rendered as image media.
  • proof: sufficient: Contributor real behavior proof is sufficient. Redacted live output from a real Urbit/Tlon send path shows upload fallback preserving the URL, an image block in the real poke, a media receipt, and the delivered Tlon row rendered as image media.
Evidence reviewed

PR surface:

Source +6, Tests +38. Total +44 across 2 files.

View PR surface stats
Area Files Added Removed Net
Source 1 8 2 +6
Tests 1 38 0 +38
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 2 46 2 +44

What I checked:

Likely related people:

  • arthyn: Authored the major Tlon capability expansion that introduced the image classifier, media story builder, upload support, and related outbound media behavior. (role: introduced behavior; confidence: high; commits: f4682742d9d1; files: extensions/tlon/src/urbit/story.ts, extensions/tlon/src/urbit/send.ts, extensions/tlon/src/urbit/upload.ts)
  • Vincent Koc: Repeatedly maintained the Tlon runtime and plugin boundaries, including recent work around the story, send, upload, and channel runtime paths. (role: recent area contributor; confidence: high; commits: 029f5d642729, 2489913ede77, 63db3443f131; files: extensions/tlon/src/urbit/story.ts, extensions/tlon/src/urbit/send.ts, extensions/tlon/src/urbit/upload.ts)
  • steipete: Introduced the original Tlon channel plugin and later maintained its outbound target resolution and plugin-SDK integration paths. (role: original feature owner and adjacent contributor; confidence: high; commits: 791b568f7825, 966b8656d2d4, 002cc0732253; files: extensions/tlon/src/urbit/send.ts, extensions/tlon/src/channel.runtime.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

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.

How this review workflow works
  • 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.
Review history (8 earlier review cycles)
  • reviewed 2026-07-12T01:46:02.710Z sha f472246 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-12T02:18:16.329Z sha 59983d2 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-12T02:42:40.259Z sha 6bf5165 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-12T02:55:30.003Z sha f06fa62 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-12T04:14:03.714Z sha f06fa62 :: needs changes before merge. :: [P2] Constrain the image extension check to the URL pathname
  • reviewed 2026-07-12T04:55:17.041Z sha 5a2a459 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-12T05:02:56.201Z sha 5a2a459 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-12T05:22:30.685Z sha ef43063 :: needs maintainer review before merge. :: none

Keep the PR evidence scoped to the helper-level regression test until live Tlon proof is available. The mocked outbound test was not sufficient for the reviewer-requested live behavior proof and triggered serialized-state review noise.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 12, 2026
VectorPeak and others added 3 commits July 12, 2026 10:24
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Regenerate docs/docs_map.md after syncing with upstream/main so the docs map check passes on this PR branch.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
@openclaw-barnacle openclaw-barnacle Bot added the docs Improvements or additions to documentation label Jul 12, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. label Jul 12, 2026
@VectorPeak

Copy link
Copy Markdown
Contributor Author

Real Tlon behavior proof

I added a local live proof pass against a real WSL-hosted Urbit comet, not a mocked sender.

Setup

  • Sender: real vere-v4.6 comet booted in WSL Ubuntu-22.04.
  • Sender web interface: http://localhost:8080.
  • Target: redacted real Tlon DM target.
  • Test URL shape: https://[redacted]/javascript.png#preview.
  • Route exercised: tlonRuntimeOutbound.sendMedia() -> uploadImageFromUrl() -> fallback original URL -> buildMediaStory() -> real Urbit chat-dm-action poke.

Runtime fallback proof

The live run hit the upload fallback path and preserved the original fragment-bearing URL:

{
  "ok": true,
  "fallbackPreservedOriginalUrl": true,
  "hasFallbackWarning": true,
  "warnings": [
    "[tlon] Failed to upload image, using original URL: MediaFetchError: Failed to fetch media from <redacted:TLON_MEDIA_URL>: getaddrinfo ENOENT raw.githubusercontent.com"
  ]
}

Real Urbit poke payload proof

The outgoing chat-dm-action payload captured immediately before the real HTTP poke contains an image block, not a link verse:

{
  "mark": "chat-dm-action",
  "json": {
    "diff": {
      "delta": {
        "add": {
          "memo": {
            "content": [
              {
                "inline": [
                  "OpenClaw PR #104853 captured live proof 2026-07-12T03:53:07.183Z"
                ]
              },
              {
                "block": {
                  "image": {
                    "src": "<redacted:TLON_MEDIA_URL>",
                    "height": 0,
                    "width": 0,
                    "alt": ""
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}

The same run reported:

{
  "capturedPokeImageBlocks": [
    {
      "block": {
        "image": {
          "src": "<redacted:TLON_MEDIA_URL>",
          "height": 0,
          "width": 0,
          "alt": ""
        }
      }
    }
  ]
}

Send receipt proof

The live send returned a Tlon media receipt:

{
  "primaryPlatformMessageId": "<redacted:TLON_SHIP>/170.141.184.508.057.993.689.001.489.075.536.727.638",
  "parts": [
    {
      "kind": "media",
      "threadId": "<redacted:TLON_TARGET>"
    }
  ]
}

Tlon UI proof

After logging into the same real comet's Tlon UI, the Groups app showed the delivered DM row as an image message:

{
  "url": "http://localhost:8080/apps/groups/Home",
  "containsProofNeedle": true,
  "containsImageMarker": true,
  "text": "... VectorPeak\n~pilbyt-nidnyt\nOpenClaw PR #104853 captured live proof 2026-07-12T03:53:07.183Z (Image)\n11:53 ..."
}

This verifies the reviewed behavior through a live Tlon stack: a fragment-suffixed image URL survives upload fallback, is classified as an image block, is sent via a real Urbit poke, and appears in Tlon UI as an image message rather than a plain link.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. 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. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 12, 2026
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
@openclaw-barnacle openclaw-barnacle Bot removed the docs Improvements or additions to documentation label Jul 12, 2026
@VectorPeak

Copy link
Copy Markdown
Contributor Author

Updated the PR for the reviewer-requested patch-quality issue.

What changed:

isImageUrl()
- no longer matches image extensions from raw query/fragment text
- parses URL pathname for URL inputs
- preserves existing non-URL path handling
- still emits the original URL unchanged when it becomes block.image.src

I also added the negative regression case from review:

https://cdn.example/page#preview.png => link, not block.image

Validation:

git diff --check
node scripts/run-vitest.mjs run extensions/tlon/src/urbit/send.test.ts extensions/tlon/src/urbit/upload.test.ts

Test Files  2 passed (2)
Tests       12 passed (12)

The earlier redacted live Tlon proof remains valid for the positive behavior; this follow-up narrows the classifier so fragment text cannot create the false-positive media delivery case.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 12, 2026
@VectorPeak

Copy link
Copy Markdown
Contributor Author

Current head has been synced with latest upstream/main and still only changes the Tlon-local classifier/test surface.

The stale review marker is expected after the main sync. Requesting a fresh review for current head 5a2a4591f8f640c815c3535833420cdd08390127.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jul 12, 2026
@VectorPeak

Copy link
Copy Markdown
Contributor Author

Current head is now ef430632cca0d45117f470515d49458d14f72d16 after syncing with latest upstream/main; PR diff still only contains the Tlon classifier and regression tests. Requesting fresh review for the exact head.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@VectorPeak

Copy link
Copy Markdown
Contributor Author

Current head has been synced with latest upstream/main again to clear the BEHIND tail.

Validation after sync:

` ext
git diff --check upstream/main...HEAD
node scripts/run-vitest.mjs run extensions/tlon/src/urbit/send.test.ts extensions/tlon/src/urbit/upload.test.ts

Test Files 2 passed (2)
Tests 12 passed (12)
`

The PR diff remains limited to the Tlon-local classifier/test surface:

ext extensions/tlon/src/urbit/story.ts extensions/tlon/src/urbit/send.test.ts

Requesting fresh exact-head review for $head.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@steipete steipete self-assigned this Jul 15, 2026
@steipete

Copy link
Copy Markdown
Contributor

Land-ready verification (maintainer):

  • Exact PR head: 8849ec52b80b2b48501cd02116d8ee977396c351, merged with current main.
  • Exact-head CI: run 29392849150, complete and green.
  • Maintainer improvement: the pathname split now satisfies current-main noUncheckedIndexedAccess, and a signed-query regression verifies that classification ignores the query while the original fetch URL remains intact.
  • Focused Blacksmith Testbox proof: send.test.ts and upload.test.ts, 13/13 passed (tbx_01kxj4gf3w7a44wdgcfj9adg04).
  • Owner check: urlToStory performs Tlon-local classification; upload/fallback and the emitted URL remain unchanged. Fragment, query, image-looking fragment, and non-image branches are covered.
  • Fresh full-branch structured autoreview: clean, 0.96 confidence. git diff --check passes.

No remaining proof gaps.

@steipete
steipete merged commit 1ac30c8 into openclaw:main Jul 15, 2026
84 checks passed
@steipete

Copy link
Copy Markdown
Contributor

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 15, 2026
* fix(tlon): keep fragment image URLs as media

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* test(tlon): prove fragment image media send path

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* test(tlon): remove mocked fragment outbound proof

Keep the PR evidence scoped to the helper-level regression test until live Tlon proof is available. The mocked outbound test was not sufficient for the reviewer-requested live behavior proof and triggered serialized-state review noise.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* docs: refresh docs map for CI

Regenerate docs/docs_map.md after syncing with upstream/main so the docs map check passes on this PR branch.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* fix(tlon): constrain fragment image URL matching

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* fix(tlon): harden image URL classification

Co-authored-by: VectorPeak <[email protected]>

---------

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Co-authored-by: VectorPeak <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: tlon Channel integration: tlon P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants