Skip to content

feat(ship-posts): measure via the bulk social scrape (posts=N), not the X connector#72

Merged
sweetmantech merged 3 commits into
mainfrom
feat/ship-posts-scrape-measurement
Jul 2, 2026
Merged

feat(ship-posts): measure via the bulk social scrape (posts=N), not the X connector#72
sweetmantech merged 3 commits into
mainfrom
feat/ship-posts-scrape-measurement

Conversation

@sweetmantech

@sweetmantech sweetmantech commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Updates recoup-internal-social-ship-posts so the measurement steps (1 and 5) use the scrape pipeline shipped in api#741 + api#744 (live on prod 2026-07-02; tracker chat#1836) — one POST /api/artist/socials/scrape with posts=N replaces the connector/syndication patchwork.

Step 1 rewritten:

  • Bulk scrape first: trigger + poll commands, with the credit cost stated (5 + posts, per profile).
  • Per-platform dataset table: X tweets with viewCount impressions, YouTube videos + Shorts (depth per content type), Instagram latestPosts, LinkedIn = profile-only → connector.
  • Setup: link profiles via PATCH /api/artists/{id} profileUrls; ids come from the account workspace (ACCOUNT.md / posts-log.md).
  • Gotchas from shipping: X depth counts timeline items (RTs/replies included), IG public plays ≠ insights views, ~1h token burst rule.
  • Removes the dead X-connector guidanceTWITTER_GET_POST_ANALYTICS 403s (client-not-enrolled) and post lookup 401s, verified live 2026-07-02. LinkedIn's LINKEDIN_LIST_REACTIONS block and its gotchas are kept unchanged.

Step 5: re-measure = one bulk scrape + LinkedIn reactions per post.

Copy/CTA/publish steps untouched.

Verified

Every command and dataset shape in the diff was exercised live while shipping the api changes — deduction amounts (−5/−25/−20 exact), dataset contents (20 tweets w/ impressions; 40 YT items incl. 4 pinned Shorts), and the X-connector failures are all documented with run ids on chat#1836 and the api#744 verification.

🤖 Generated with Claude Code


Summary by cubic

Switches measurement to the bulk social scrape across X, YouTube, Instagram, and LinkedIn. Steps 1 and 5 now run one scrape; use LINKEDIN_LIST_REACTIONS only when you need reactor identities. Also simplifies the measurement section by removing connector-era notes.

  • Refactors
    • Step 1: use POST /api/artist/socials/scrape with posts=N; poll runs; cost is 5 + posts per profile.
    • Data shapes: X includes viewCount impressions; YouTube pulls videos + Shorts; Instagram uses latestPosts; LinkedIn returns post items with likes, comments, shares, and reaction breakdown.
    • Cleanup: removed X connector guidance; trimmed historical notes (e.g., id→timestamp trick, connector failure rationale); dropped the full LINKEDIN_LIST_REACTIONS curl; collapsed the table for brevity.
    • Setup/gotchas: link profiles via PATCH /api/artists/{id} profileUrls and verify with GET /api/artists/{id}/socials; X depth includes RTs/replies; IG public plays ≠ insights views; tokens expire in ~1h.
    • Step 5: re-measure with one bulk scrape; call LINKEDIN_LIST_REACTIONS only to fetch reactor identities; read gated-post comment bodies manually.

Written for commit e7c6f69. Summary will update on new commits.

Review in cubic

…ctor

Step 1 now leads with POST /api/artist/socials/scrape?posts=N — one call
returns per-post metrics for X (incl. viewCount impressions), YouTube
(videos + Shorts), and Instagram (latestPosts); LinkedIn stays on
LINKEDIN_LIST_REACTIONS (its scrape is profile-only). Documents the
per-platform dataset shapes, the 5 + posts per-profile credit cost, the
profile-linking setup (PATCH profileUrls), and the gotchas learned
shipping it: X depth counts timeline items incl. RTs, IG public plays vs
insights views, ~1h token burst rule.

Replaces the dead X-connector guidance — TWITTER_GET_POST_ANALYTICS 403s
(client-not-enrolled) and post lookup 401s; verified 2026-07-02.

Backed by recoupable/api#741 + #744 (shipped to prod 2026-07-02;
tracker: recoupable/chat#1836).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@sweetmantech, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 38 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fce2a773-74b7-4461-83e8-c414f0b61d64

📥 Commits

Reviewing files that changed from the base of the PR and between 006ff76 and e7c6f69.

📒 Files selected for processing (1)
  • skills/recoup-internal-social-ship-posts/SKILL.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/ship-posts-scrape-measurement

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cubic-dev-ai cubic-dev-ai 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.

No issues found across 1 file

Re-trigger cubic

One bulk scrape now covers all four platforms: LinkedIn posts=N returns
post items with engagement (likes, comments, shares, reaction breakdown)
via harvestapi/linkedin-profile-posts — richer than the connector, which
can't see personal-post comments/shares. LINKEDIN_LIST_REACTIONS is
demoted to its remaining real use: pulling reactor identities (the
warm-lead list on comment-gated posts).

Shipped to prod 2026-07-02 (recoupable/api#745, tracker chat#1838).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sweetmantech

Copy link
Copy Markdown
Contributor Author

Updated for api#745 (merged to prod 2026-07-02, tracker chat#1838): one bulk scrape now covers all four platforms — the LinkedIn table row documents the posts-actor dataset (engagement.likes/comments/shares + reaction breakdown, verified live incl. a 12-like/10-comment post the connector could never see), and LINKEDIN_LIST_REACTIONS is reframed to its remaining use: reactor identities for comment-gated lead lists. Step 5 simplified accordingly.

…-era prose

Net reduction vs main. Removed outdated/historical text rather than
stacking additions: the timestamp_ms=id>>22 trick (scrape returns
postedAt), the why-the-X-connector-fails explanation (one clause now),
the LinkedIn personal-post limitation rationale and company-page
reconnect note (justified a workaround we no longer use), and the full
LINKEDIN_LIST_REACTIONS curl block (Step 4 already teaches connector
calls; one gotcha line names the slug + entity format for the
who-reacted lead-list case). Table collapsed to one column per platform.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sweetmantech

Copy link
Copy Markdown
Contributor Author

Refactored per review: removed the connector-era prose instead of stacking additions. Cut: the timestamp_ms = id >> 22 dating trick (the scrape returns postedAt), the why-the-X-connector-fails history (now one clause), the LinkedIn personal-post-limitation rationale + company-page reconnect note (justified a workaround the scrape replaced), and the full LINKEDIN_LIST_REACTIONS curl block (Step 4 already teaches connector calls; the who-reacted case is now one gotcha line naming the slug + entity formats). Platform table collapsed to one column.

Net diff vs main is now +22/−13 on a 111-line skill — the +9 is the new capability itself: the two scrape commands (with the credit cost inline) and the 4-platform metrics table, which replace a LinkedIn-only measurement recipe with a 4-platform one.

@sweetmantech sweetmantech merged commit 5f76d63 into main Jul 2, 2026
3 checks passed
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