Repository navigation
Keep unfetchable openai.com cross-posts out of Show Your Work's pool #245
Description
Task
Stop Show Your Work from planning posts that neither its writers nor its validator can read. The OpenAI alignment index's cross-posts live on openai.com/index/..., which returns HTTP 403 to both WebFetch (the writer subagents) and urllib/curl (syw_write.fetch_post_text). After this change, no plan puts an unreadable URL in the feature slot or a brief slot, and a week never fails because of one.
Context
This was measured in the 2026-09-26 rehearsal for #238:
- 7 of 201 lead items were on
openai.com. - The plan made two of them briefs (
/index/an-alien-mind,/index/research-acceleration-view-inside-openai). Both writers were refused on a 403, so 2 of 4 briefs were dropped. - Both URLs returned 403 to a plain
curl -A "Mozilla/5.0"as well.
The dropped briefs only shortened the episode. The worse case is a week whose top-scored feature is an openai.com cross-post: the writer is refused twice, and SKILL.md step 4 ends the run as FAILED feature refused twice even when readable candidates exist.
Reproduction
curl -s -o /dev/null -w '%{http_code}' -A "Mozilla/5.0" https://openai.com/index/an-alien-mindreturns403.- Gather and plan a week where an openai.com cross-post ranks into a slot.
- Expected: that item is not planned, or is planned only if it can be read.
- Actual: it is planned, then the writer refuses it (brief dropped) or the run fails (feature).
Pointers
skills/show-your-work/syw_gather.py:423:parse_openai_alignment. This is where the ↗ cross-posts from the index are unioned in, and a candidate place to tag or skip them.skills/show-your-work/syw_script_plan.py:~170: thebuild_planpool filter, the other candidate place. It already excludes undated items (Harden Show Your Work's unattended edges (8 parked review items) #236).skills/show-your-work/syw_write.py:393:fetch_post_text, the validator's own fetch.skills/show-your-work/prompts/write_feature.md:16andwrite_brief.md:14: the writers read the post with WebFetch only.~/.claude/projects/-Users-cory-clodcast/memory/project_clodcast_webfetch_blocked_feeds.md: the daily show has the same class of blocked hosts.
Decision (Cory)
- Exclude
openai.comcross-posts at gather. This is simplest. The cost is that an OpenAI post published only there never airs. - Probe fetchability at plan time. Try one fetch per slotted candidate and skip anything that fails. This is general across hosts, but it puts a network step in a layer that is pure today.
- Keep them but never feature them. They stay brief-eligible and are dropped when refused.
Recommendation: option 1, recorded as a host list next to the adapter. It keeps build_plan pure and fixes the feature-failure case. Revisit if openai.com stops blocking.
Constraints
build_planstays pure (no network), unless option 2 is chosen deliberately.- URL identity (
normalize_url,seen.jsonkeys) must not change; the host is already seeded. render.py,orchestrate.pyandtests/data/stay unmodified. Tests never touch~/.config/show-your-work.- Write the failing test first.
Acceptance criteria
- A test shows an
openai.com/index/...lead item never reaches the feature slot or a brief (or, under option 2, that an unreadable one is skipped). - alignment.openai.com items, including the misalignment casebook, are unaffected.
- SKILL.md and the spec §2.1 source table state the exclusion.
- The full suite,
ruff check .andruff format --check .are green, with counts in the PR.
Out of scope
- Any other host. File separately if another one is measured failing.
- The daily show's blocked feeds.
Activity
schmug commentedon Sep 27, 2026
Decision: option 1 (exclude at gather), with two refinements. Cory approved it on 2026-09-27.
Research (read-only researcher, 2026-09-27)
parse_openai_alignmentreturned 27 lead items on a fresh fetch: 20 onalignment.openai.comand 7 onopenai.com/index/.... All 7 arekind="research", so they are feature-eligible:/,/news/,/research/and every/index/post tested.robots.txt,sitemap.xmland/news/rss.xmlare reachable. Plain curl also got 403. Python urllib (syw_gather.fetch_text) got 200 on all 7 on 2026-09-27, after 403 on 2026-09-26, which looks like Cloudflare bot scoring. It is not durable, and it doesn't matter anyway, because the writers read only through WebFetch.openai.com/news/rss.xmllists all 7 but carries only 149–338-character summaries, with nocontent:encoded. alignment.openai.com does not host these posts in full.LAB_PENALTY_DAYS(30) is larger thanmax_age_days(21), so an OpenAI item can't outrank a non-penalized item while OpenAI is inrecent_labs. Episode one featured OpenAI, so episodes 2–3 are protected. After that, the estimated exposure is roughly monthly to bimonthly, and each hit is a whole-runFAILED feature refused twice.Second opinion: Codex/Astra (gpt-daybreak-blue-latest, isolated packet)
Astra independently recommended option 1, because writer access is what the pipeline requires. Its objections and their dispositions:
--featureoverride bypasses the poolbuild_planlooks the override up incandidates["lead"], so an item excluded at gather fails withPLAN FAILED … not a gathered lead item.{"openai.com", "www.openai.com"}, viaurllib.parse.urlsplit(url).hostname.dropped.jsonl(stage: "gather", reason citing #245), and put a revisit note on the constant.identity_urlfromcontent_url; backfill refused briefsschmug commentedon Sep 27, 2026
Implemented option 1 in #249.
WRITER_UNREADABLE_HOSTS = {"openai.com", "www.openai.com"}is matched on the exact parsed hostname, and each exclusion is logged todropped.jsonl. Squash auto-merge is on; the PR closes this issue when it merges.The three out-of-scope items are filed as follow-ups:
content_urlfix(syw): exclude writer-unreadable openai.com cross-posts (#245) (#249)