Skip to content

Observe x-web replies.create as a parent-bound CreateTweet contract - #98

Closed
0thernet wants to merge 2 commits into
mainfrom
cursor/x-web-replies-create-replay-afe3
Closed

Observe x-web replies.create as a parent-bound CreateTweet contract#98
0thernet wants to merge 2 commits into
mainfrom
cursor/x-web-replies-create-replay-afe3

Conversation

@0thernet

Copy link
Copy Markdown
Member

x-web replies.create@1 is now an observed R3 text-reply contract. A confirmed wrench invoke x-web replies.create --auth x-main publishes exact text to one exact parent without opening the X composer.

This is the fresh descendant replay requested after #95. Closed #94 (2dec179) and #96 (cee11c0) stay on their original base. This branch starts from current main (e092528, #95) and replays those two commits.

What changed

The reserved capture-required reply already sat on the same reviewed CreateTweet mutation as posts.publish@4. This PR makes that path executable and complete:

  • Bind reply.in_reply_to_tweet_id to the confirmed post_id
  • Reject quote IDs, media, and made_with_ai / content-disclosure fields
  • Admit one CreateTweet dispatch and retain the response-bound reply ID
  • Independently read that exact reply through TweetResultByRestId
  • Fail closed if CreateTweet or readback shows a Made with AI sparkle
  • Reconcile an indeterminate reply from the retained target the same way as posts.publish

posts.quote stays capture-required. No composer fallback.

Why this is observed, not a completeness flip

posts.publish was graduated when the code-owned CreateTweet request, response binding, durable accepted-target evidence, and fail-closed TweetResultByRestId readback were executable and covered by deterministic tests. Transaction-header bootstrap is already reviewed on that path.

replies.create now uses that same executable contract plus parent binding. The registry flip matches that standard: the operation is implemented in executeXWebOperation, not reserved behind the capture-required gate.

A separate live reply fixture is not required to mark this observed, because the mutation, transaction header, and readback are the current posts.publish contract. The new work is the parent-binding variables, response/readback echo of in_reply_to_status_id_str, and unlabeled-copy rules on that reply.

Tests

  • Input validation: required post_id + body, digit parent IDs, no media, no quote IDs, no made_with_ai
  • CreateTweet authorization of the exact reply object and rejection of quote/AI extras
  • Parent and viewer binding on the create response
  • Permalink/id projection after independent readback
  • Sparkle fail-closed on CreateTweet and TweetResultByRestId
  • Read-only recovery of one accepted reply
  • Article-draft upgrade baseline pinned to current x-web 1.14.0

Adapter and package budget

Current x-web is 1.14.0. 1.13.0 is archived unchanged. replies.create remains contract version 1 because the input schema did not change.

Remeasured on this descendant of #95 with bun pm pack --ignore-scripts plus scripts/package-artifact.ts:

  • 1,894,058 packed bytes (limit 2,050,000)
  • 11,115,891 unpacked bytes (limit 11,200,000)
  • 435 files (limit 450)

No ceiling change. #95 did not change the published package payload.

Local check notes

This environment's Node 22.14.0 fails test:package on the inert-root-import guard (fs.promises.readFile via the ESM loader). That is existing environment drift, not this contract. CI Required is the merge gate.

Open in Web Open in Cursor 

cursoragent and others added 2 commits August 29, 2026 17:07
…ract

Graduate the reserved R3 reply route onto the reviewed CreateTweet path used
by posts.publish: bind one exact parent, reject quote IDs, media, and
made_with_ai, retain the response-bound reply ID, and independently read it
back through TweetResultByRestId. A live Made with AI sparkle remains a
failed unlabeled-copy publish, and the composer is never a fallback.

Co-authored-by: ben <0thernet@users.noreply.github.com>
The replies.create observation bumped the current authenticated-web adapter to 1.14.0 and archived 1.13.0. Keep the Article draft upgrade-baseline test on that current manifest.

Co-authored-by: ben <0thernet@users.noreply.github.com>
@vercel

vercel Bot commented Aug 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
wrench Ready Ready Preview Aug 29, 2026 5:08pm

Request Review

@0thernet

Copy link
Copy Markdown
Member Author

Held closed to preserve the serialized Wrench prerequisite and reserved full v0.16.3 lane. The fresh descendant branch and exact head 20cf4c8 are preserved for downstream reconciliation and package-cap remeasurement after the final prerequisite handoff; no X adapter, package, or changelog coordinate is merged here.

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.

2 participants