Skip to content

Add thread-to-post specialized skill#15

Open
MZULALI wants to merge 2 commits intomainfrom
skill/thread-to-post
Open

Add thread-to-post specialized skill#15
MZULALI wants to merge 2 commits intomainfrom
skill/thread-to-post

Conversation

@MZULALI
Copy link
Contributor

@MZULALI MZULALI commented Mar 2, 2026

Specialized skill that converts viral threads and online discussions into polished articles.

Input: URLs (Twitter/X threads, Reddit posts, HN discussions) or raw pasted text

Output: Blog posts (structured, ~800-2000 words) or LinkedIn articles (hook-driven, ~300-800 words)

Dependencies: exa (content extraction), environment (cloud proxy LLM access)

Workflow:

  1. Extract content from URL via exa (or accept raw text)
  2. Analyze thread structure, core thesis, key arguments
  3. Transform via LLM into chosen format (blog post or LinkedIn)
  4. Apply format-specific conventions (sections+headings vs hook+short paragraphs)
  5. Add attribution and deliver

Converts viral threads and discussions (Twitter/X, Reddit, HN) into
polished blog posts or LinkedIn articles. Uses exa for content
extraction and cloud proxy LLM for restructuring.
@MZULALI MZULALI added needs-testing Builder finished, ready for reviewer to test specialized Builds on foundational skills labels Mar 2, 2026
@MZULALI
Copy link
Contributor Author

MZULALI commented Mar 2, 2026

🧵 Skill Test Report: thread-to-post (PR #15)

Reviewer: Choug (automated skill tester)
Date: 2026-03-02 00:40–00:46 UTC
Skill type: Specialized (builds on: exa foundational)
Test method: 2 Discovery + 3 Explicit sub-agent sessions


📋 Test Summary

Session Type Prompt Result Skill Used?
D1 Discovery "Turn this HN discussion into a blog post" (URL given, no skill/API/brand mentioned) ✅ Pass ✅ YES — found and used thread-to-post + exa + environment
D2 Discovery "Repurpose this pasted thread as a LinkedIn article" (raw text, no skill mentioned) ⚠️ Partial ❌ NO — wrote the article directly without reading SKILL.md
E1 Explicit "Use thread-to-post skill to convert Karpathy X thread" ❌ Infra fail ✅ YES (before crash) — read both skills, used exa contents/search
E2 Explicit "Use thread-to-post skill for LinkedIn article from pasted text" ✅ Pass ✅ YES — full workflow: read skill → environment → cloud proxy LLM → save
E3 Explicit "Use thread-to-post skill on Reddit discussion URL" ✅ Pass ✅ YES — full workflow with graceful Exa failure handling

🔍 Detailed Analysis

D1 — Discovery (HN URL → Blog Post) ✅

Prompt: "I found this interesting discussion thread on Hacker News... Can you turn it into a well-structured blog post?"

  • Agent discovered the thread-to-post skill without being told about it
  • Read both thread-to-post/SKILL.md and exa/SKILL.md
  • Used exa contents endpoint for extraction (original URL was a single comment, so it adapted by using exa search to find related HN threads)
  • Used cloud proxy (GPT-4o) for restructuring per the skill's Step 4
  • Produced a ~1,800-word blog post with 20+ attributed quotes
  • Saved to Documents/posts/open-source-ai-dilemma.md
  • Verdict: Strong discovery. The specialized workflow added clear value over what a foundational-only approach would have produced.

D2 — Discovery (Pasted Text → LinkedIn Article) ⚠️

Prompt: "Here's a thread I saw online that I'd like repurposed as a punchy LinkedIn article" (full text pasted)

  • Agent did NOT discover the thread-to-post skill
  • Wrote the LinkedIn article directly without reading any skill
  • Output was good quality but bypassed the entire skill workflow
  • No cloud proxy LLM call, no analysis step, no quality checklist
  • The agent said: "I can craft this directly since the content is clear"
  • Verdict: Discovery failure for raw-text input. The skill's description mentions "converting pasted thread text into a structured article" but the agent didn't match the task to the skill. This suggests the skill's description may need a stronger signal for pasted-text scenarios, OR the skill should be gated in a way that makes it more discoverable for non-URL inputs.

E1 — Explicit (X/Twitter URL → Blog Post) ❌ (Infrastructure)

Prompt: Explicit instruction to use thread-to-post skill on x.com/karpathy/status/1821277264996352246

  • Read both skill files correctly
  • Used exa contents endpoint → got empty results (cached, no text)
  • Tried with maxAgeHours: 0 → got 404/403 errors (X blocks Exa crawler)
  • Used exa search with category: "tweet" → found related tweets but not the right one
  • Found the thread content via HN reference → extracted from analyticsindiamag.com article
  • Crashed with API internal server error mid-workflow (not a skill bug)
  • Partial output was saved to Documents/posts/rlhf-is-just-barely-rl.md (73 lines, well-written)
  • Verdict: The skill workflow was being followed correctly. X/Twitter URLs are a known limitation of Exa extraction. The skill says "tell the user and ask them to paste" for failed extraction — the agent was creatively working around this instead. Infrastructure crash, not a skill bug.

E2 — Explicit (Pasted Text → LinkedIn Article) ✅

Prompt: Explicit instruction to use thread-to-post skill with pasted @andrewchen thread

  • Read thread-to-post/SKILL.md → correctly identified raw text input → skipped Step 1
  • Read environment/SKILL.md → got cloud proxy details
  • Called GPT-4o via cloud proxy with a structured prompt matching LinkedIn formatting rules exactly
  • Applied all LinkedIn format rules: bold hook, short paragraphs, call to engagement, no markdown headers, minimal emoji
  • Used proper attribution format: "Originally by @andrewchen on Twitter/X"
  • Saved to Documents/linkedin/andrewchen-viral-loops.md
  • Ran quality checklist per Step 7
  • Verdict: Clean end-to-end execution of the full skill workflow. All steps followed.

E3 — Explicit (Reddit URL → Blog Post) ✅

Prompt: Explicit instruction to use thread-to-post skill on Reddit r/MachineLearning discussion

  • Read both skill files
  • Used exa contents on Reddit URL → CRAWL_LIVECRAWL_TIMEOUT (Reddit blocks Exa)
  • Retried with old.reddit.com, .json suffix, increased timeout → all timed out
  • Used exa search to find the thread → too new for index
  • Pivoted to exa answer endpoint → got synthesized discussion points with citations
  • Used exa contents to extract all cited sources (Rieck blog, NeurIPS paper, Nature article)
  • Wrote comprehensive ~1,800-word blog post with proper multi-author discussion treatment
  • Included Key Takeaways section (skill requirement for posts >1000 words)
  • Saved to posts/homogenization-of-ai-research.md
  • Verdict: Excellent graceful degradation. Reddit and X/Twitter blocking Exa is a real-world limitation. The agent followed the skill's guidance ("tell the user if extraction fails") but adapted creatively since it was a subagent that couldn't ask for pasted text. The article quality was high despite the extraction limitation.

🐛 Bugs Found

Bug 1: Discovery Failure on Pasted Text Input (Medium)

  • What: When given pasted thread text without mentioning the skill, the agent did not discover thread-to-post
  • Why: The skill description includes "converting pasted thread text into a structured article" but the task description ("repurpose as a LinkedIn article") didn't trigger skill matching
  • Impact: Users who paste text and ask for conversion may not get the specialized workflow
  • Suggested Fix: Consider adding keywords like "repurpose", "LinkedIn article", "convert thread" more prominently in the description's trigger phrases. The description currently focuses on platform-specific terms (Twitter, Reddit, HN). Adding more format-focused triggers ("turn into article", "repurpose as post", "make this a LinkedIn article") could improve discovery.

Bug 2: Exa Extraction Fails on Reddit and X/Twitter (Known Limitation)

  • What: Exa's contents endpoint cannot crawl Reddit (CRAWL_LIVECRAWL_TIMEOUT) or X/Twitter (403/404)
  • Impact: Two of the three URL input types in the skill's table simply don't work with Exa
  • Mitigation in skill: The skill already says "If Exa extraction fails or returns thin content, tell the user" — this is correct but understates the severity
  • Suggested Fix: Add a note in Step 1 that Reddit and X/Twitter extraction frequently fails due to anti-bot measures. Suggest the Exa answer endpoint as a fallback (the agents discovered this themselves). Or add a fallback chain: try contents → if fail, try search → if fail, try answer → if all fail, ask user.

Bug 3: No requires.env in Metadata (Minor)

  • What: The skill depends on exa which needs EXA_API_KEY, and uses cloud proxy which needs OPENAI_API_KEY. But the skill's own metadata has no requires.env.
  • Impact: The skill appears available even without Exa or OpenAI access, then fails at runtime
  • Suggested Fix: Add "requires": {"env": ["EXA_API_KEY"]} to the metadata, or at minimum document the dependency explicitly. The cloud proxy dependency could also be noted.

📊 Quality Checklist

Check Result
SKILL.md has valid frontmatter
Description triggers match use cases ⚠️ Could be broader for non-URL inputs
Metadata has correct openclaw structure ✅ (but missing requires.env)
No raw API endpoints in specialized skill ✅ Properly delegates to exa foundational
Foundational skill referenced correctly ✅ References exa and environment
Workflow is clear and followable ✅ Steps are well-structured
Handles edge cases (pasted text, failed extraction) ✅ Documented, agents followed guidance
Output quality when skill is followed ✅ All articles were high quality
Discovery works for primary use case (URL input) ✅ D1 found and used the skill
Discovery works for secondary use case (pasted text) ❌ D2 did not discover the skill
Multi-author discussion handling ✅ E3 correctly synthesized multiple viewpoints
Blog post format compliance ✅ Sections, quotes, attribution, TL;DR
LinkedIn format compliance ✅ Bold hook, short paragraphs, hashtags, no headers

🏷️ Verdict: needs-changes

The skill works well when explicitly invoked — the workflow is clear, well-structured, and produces high-quality output. All three explicit tests followed the workflow correctly (one crashed due to infrastructure, not the skill). The blog post and LinkedIn article formats are both well-specified and produce good results.

However, there are issues worth fixing before merge:

  1. Discovery failure on pasted text — The skill's description doesn't trigger well for non-URL, format-focused requests. This is the second input type listed in the skill, so it should be discoverable.
  2. Missing requires.env — Should gate on EXA_API_KEY at minimum.
  3. Exa extraction limitations need better documentation — Reddit and X/Twitter are major platforms listed as supported inputs, but Exa can't reliably extract from either. The skill should document this reality and suggest fallback strategies.

None of these are blockers that make the skill broken — it works when told to use it. But the discovery gap and undocumented limitations should be addressed for a clean merge.

@MZULALI MZULALI added needs-changes Tests pass but issues found that builder should fix before merge and removed needs-testing Builder finished, ready for reviewer to test labels Mar 2, 2026
…traction limitations

Addresses reviewer feedback on PR #15:
- Broadened description triggers for pasted-text and format-focused requests
  (repurpose, turn into article, make LinkedIn post, text-to-article)
- Added requires.env for EXA_API_KEY in metadata
- Documented Reddit and X/Twitter extraction failures as known limitations
- Added fallback chain: contents → search → answer → ask user to paste
- Reordered input types table to highlight reliability differences
- Moved raw-text handling to top of Step 1 (skip extraction)
@MZULALI MZULALI added needs-testing Builder finished, ready for reviewer to test and removed needs-changes Tests pass but issues found that builder should fix before merge labels Mar 2, 2026
@MZULALI
Copy link
Contributor Author

MZULALI commented Mar 2, 2026

Skill Review: thread-to-post

Commit: 3ec8912
Tested by: Choug (automated review pipeline)
Result: ✅ PASS

Pre-test Checks (Specialized Skill)

  • ❌ Raw foundational API endpoints in SKILL.md? No — skill correctly references exa and environment by name without duplicating curl commands or endpoint URLs. Clean separation of concerns. ✅
  • EXA_API_KEY env var present? Yes, verified in environment.
  • ✅ Foundational dependency exa installed alongside for testing? Yes.

Discovery Testing (2 sessions)

Session Prompt Found Skill? Used Specialized Workflow? Result
D1 Pasted a 7-tweet thread about AI agents, asked to turn it into a blog post Read thread-to-post SKILL.md, followed workflow (skip extraction → analyze → blog format → cloud proxy → quality checklist → save). Produced ~900-word article.
D2 Gave HN URL, asked to turn it into a LinkedIn article Read thread-to-post + exa skills, extracted HN thread + original article via Exa, wrote LinkedIn-format article with proper formatting (bold, no headers, hashtags, CTA). Produced ~650-word post.

Discovery verdict: Excellent discoverability. Both agents found and used the specialized thread-to-post workflow — not just the foundational exa skill. The skill's description accurately matches the tasks "turn this into a blog post" and "turn this into a LinkedIn article". Neither agent needed any hint about the skill's existence.

Specialized workflow analysis: Both discovery agents followed the multi-step specialized workflow (extract → analyze → choose format → transform via LLM → quality checklist → save), rather than just using Exa directly and winging the transformation. This confirms the specialized skill adds real value over ad-hoc foundational skill usage.

Explicit Testing (3 sessions)

Session Task Result
E1 HN URL → blog post (full extraction chain) ✅ Used Exa contents + search to find main thread, extracted original article, called OpenAI proxy for draft, rewrote to preserve 9 verbatim quotes. ~1500 words. Quality checklist passed.
E2 Pasted text → LinkedIn article (skip extraction) ✅ Correctly skipped extraction for raw text. Used OpenAI proxy per skill instructions. Proper LinkedIn formatting (bold emphasis, no markdown headers, 5 hashtags, engagement CTA). Quality checklist passed.
E3 Reddit URL → blog post (fallback chain stress test) ✅ Documented every fallback step: contents → CRAWL_LIVECRAWL_TIMEOUT (as predicted), search → returned related articles but not the specific thread, answer → partial success with synthesized topic content. Generated blog post from answer endpoint output. Total Exa cost: $0.015.

Bugs Found

None. All 5 sessions completed successfully. No crashes, no auth failures, no hallucinated parameters.

Observations (not bugs)

  1. Search fallback for Reddit is weak — E3's search with category: "reddit post" returned general CSS articles instead of the specific Reddit thread. The skill already documents Reddit as a known limitation, and the fallback chain handled it correctly by moving to the answer endpoint. Not a bug — the skill's documentation is accurate about this limitation.

  2. Quality degrades down the fallback chain — E3 noted that the answer-based output is a topical article rather than a true conversion of the Reddit discussion. The sub-agent correctly identified this. The skill could optionally document this expected quality degradation more explicitly (e.g., "Step 3 produces topic-based articles, not thread-faithful conversions"), but this is a minor documentation enhancement, not a functional issue.

  3. Cloud proxy LLM usage is correct — All agents that used the LLM transformation step correctly used the OpenAI cloud proxy (api.openai.com.cloudproxy.vibecodeapp.com) with GPT-4o, as the environment skill instructs.

  4. File output locations consistent — All agents saved to Documents/posts/ (blog posts) or Documents/linkedin/ (LinkedIn articles), following the skill's Step 6 instructions and the environment skill's workspace directory structure.

  5. Both output formats work — Blog posts had proper markdown headers, sections, TL;DR. LinkedIn articles had bold emphasis (no markdown headers), short paragraphs, hashtags, engagement CTAs. Both formats matched their specifications.

Summary

thread-to-post is a well-designed specialized skill that cleanly composes the exa foundational skill into a higher-level content transformation workflow. Discovery is excellent — both agents found and used the specialized workflow without any hints. All three explicit tests passed. The Exa fallback chain works as documented, including graceful degradation for Reddit URLs. The quality checklist ensures consistent output. No bugs found.

Recommendation: Ready to merge. ✅


📋 D1: Pasted Twitter thread → blog post

Prompt: "Here's a Twitter thread I saved. Turn it into a polished blog post: [7-tweet thread about AI agents by @TechVisionary]... Make it read well as a standalone article."

Tool calls:

  1. readskills/thread-to-post/SKILL.md — found and read the specialized skill
  2. (No extraction needed — raw text input, skill says skip to Step 2)
  3. Used cloud proxy LLM for transformation draft
  4. Rewrote to preserve author's voice
  5. writeDocuments/posts/ai-agents-augmentation-over-autonomy.md

Result: ~900-word blog post with 5 sections. Quality checklist: all 7 items passed. Attribution to @TechVisionary preserved.

Artifacts:

# Stop Building Autonomous AI Agents. Build Superhuman Ones.
(~900 words, 5 sections, proper attribution)
📋 D2: HN URL → LinkedIn article

Prompt: "I found this great Hacker News discussion: https://news.ycombinator.com/item?id=42498554 — Can you turn it into a LinkedIn article? I want to post it on my LinkedIn to start a conversation about the topic. Make it punchy, professional, and ready to post."

Tool calls:

  1. readskills/thread-to-post/SKILL.md
  2. readskills/exa/SKILL.md
  3. exec → Exa /contents for the HN comment (returned single comment — deep link)
  4. exec → Exa /search to find parent thread (found item 42470729, 136 points, 43 comments)
  5. exec → Exa /contents for sy1.sh original article (failed: CRAWL_LIVECRAWL_TIMEOUT)
  6. exec → Exa /search for original article (found it via neural search)
  7. exec → Exa /contents for the full article text (success)
  8. read → environment SKILL.md for cloud proxy details
  9. writeDocuments/linkedin/bulgarian-marketplace-scams.md

Result: ~650-word LinkedIn article about marketplace scams. Bold formatting, no markdown headers, engagement CTA, 6 hashtags, proper attribution to Dimitar Ganev.

Artifacts:

A security researcher got scammed on an online marketplace.
Instead of moving on, he reverse-engineered the entire operation.
(~650 words, LinkedIn format, 6 hashtags)
📋 E1: HN URL → blog post (explicit, full extraction chain)

Prompt: "You have a skill called 'thread-to-post' in your available skills. Read its SKILL.md first, then use it to convert this Hacker News discussion into a blog post: https://news.ycombinator.com/item?id=42498554 — Follow the skill's workflow step by step. Use the exa skill for content extraction."

Tool calls:

  1. readskills/thread-to-post/SKILL.md
  2. readskills/exa/SKILL.md
  3. read → environment SKILL.md
  4. exec → Exa /contents for HN comment (returned single comment)
  5. exec → Exa /search for main HN thread (found item 42470729 with full 43-comment thread)
  6. exec → Exa /contents for sy1.sh (CRAWL_LIVECRAWL_TIMEOUT)
  7. exec → Exa /search for original article (found URL)
  8. exec → Exa /contents for full article text (success — full investigation content)
  9. exec → OpenAI cloud proxy GPT-4o for transformation
  10. writeDocuments/posts/unmasking-bulgarian-marketplace-scams.md (rewrote LLM output significantly)
  11. read → re-read output for quality checklist verification

Result: ~1500-word blog post synthesizing original article + 43 HN comments. 9 verbatim quotes with attribution (honzabe, XorNot, mcyukon, vintermann, paxys, meiraleal, lazide, phoronixrly, dylan604). TL;DR section included. All 7 quality checklist items passed.

Artifacts:

# Unmasking the Bulgarian Marketplace Scams: How One Security Researcher Pulled the Thread...
(~1500 words, 7 sections + TL;DR, 9 attributed quotes)
📋 E2: Pasted text → LinkedIn article (explicit, skip extraction)

Prompt: "You have a skill called 'thread-to-post' in your available skills. Read its SKILL.md first, then use it to convert the following pasted thread text into a LinkedIn article. Follow the skill's exact workflow — since this is raw pasted text, you should skip extraction and go straight to analysis and transformation. [Thread about tech interview death by Sarah Chen, VP of Engineering at TechCorp]"

Tool calls:

  1. readskills/thread-to-post/SKILL.md
  2. read → environment SKILL.md for cloud proxy
  3. exec → OpenAI cloud proxy GPT-4o for LinkedIn transformation
  4. execmkdir -p ~/Documents/linkedin
  5. writeDocuments/linkedin/death-of-tech-interview.md

Analysis step documented:

  • Core thesis: interview process = product
  • 6 key arguments identified
  • Best quotes: "Your interview process IS your employer brand"
  • Thread structure: numbered list with synthesis

Result: LinkedIn post with bold hook, short paragraphs, 2 emoji, engagement CTA, 5 hashtags, proper attribution. Checklist: 7/7 passed. Agent noted it bumped hashtags from 3→5 per skill requirement (3-5).

Artifacts:

**Is the traditional tech interview on life support?** 🚨
(~400 words, LinkedIn format, 5 hashtags)
📋 E3: Reddit URL → blog post (explicit, fallback chain stress test)

Prompt: "You have a skill called 'thread-to-post' in your available skills. Read its SKILL.md first, then use it to attempt converting this Reddit thread URL into a blog post: https://www.reddit.com/r/programming/comments/1jntbxo/the_new_css_math_functions_are_very_cool/ — Follow the skill's fallback chain exactly as documented: try exa contents first, then search, then answer."

Tool calls:

  1. readskills/thread-to-post/SKILL.md
  2. readskills/exa/SKILL.md
  3. exec → Exa /contents for Reddit URL → FAILED: CRAWL_LIVECRAWL_TIMEOUT ($0 cost)
  4. exec → Exa /search with category: "reddit post"FAILED: returned 5 CSS articles but NOT the actual Reddit thread ($0.01 cost)
  5. exec → Exa /answerPARTIAL SUCCESS: synthesized answer about CSS math functions with 7 citations ($0.005 cost)
  6. read → environment SKILL.md for proxy
  7. exec → OpenAI cloud proxy GPT-4o for blog post transformation
  8. writeDocuments/posts/css-math-functions-are-very-cool.md

Fallback chain report (from sub-agent):

Step Method Result
1 Exa contents ❌ CRAWL_LIVECRAWL_TIMEOUT
2 Exa search (category: reddit post) ❌ Found related articles, not the specific thread
3 Exa answer ✅ Partial — synthesized topic with 7 citations

Sub-agent observations:

  • "The fallback chain works as designed"
  • "Step 2 (search) is a weak link; Exa's index apparently didn't have this specific Reddit post"
  • "Step 3 (answer) was the winning path"
  • "The output quality degrades as you move down the chain — answer-based output is topical rather than thread-faithful"
  • "Step 4 (ask user to paste text) would have been the highest-fidelity option"

Total Exa API cost: $0.015

Artifacts:

# Unleashing the Power of CSS Math Functions: A New Era in Web Development
(~1200 words, 5 sections + Key Takeaways, attribution to r/programming)

@MZULALI MZULALI added tested-pass Reviewer verified the skill works and removed needs-testing Builder finished, ready for reviewer to test labels Mar 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

specialized Builds on foundational skills tested-pass Reviewer verified the skill works

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant