Skip to content

Keep unfetchable openai.com cross-posts out of Show Your Work's pool #245

Closed

Description

@schmug

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

  1. curl -s -o /dev/null -w '%{http_code}' -A "Mozilla/5.0" https://openai.com/index/an-alien-mind returns 403.
  2. Gather and plan a week where an openai.com cross-post ranks into a slot.
  3. Expected: that item is not planned, or is planned only if it can be read.
  4. 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: the build_plan pool 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:16 and write_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)

  1. Exclude openai.com cross-posts at gather. This is simplest. The cost is that an OpenAI post published only there never airs.
  2. 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.
  3. 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_plan stays pure (no network), unless option 2 is chosen deliberately.
  • URL identity (normalize_url, seen.json keys) must not change; the host is already seeded.
  • render.py, orchestrate.py and tests/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 . and ruff 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

  1. schmug commented on Sep 27, 2026

    @schmug
    OwnerAuthor

    Decision: option 1 (exclude at gather), with two refinements. Cory approved it on 2026-09-27.

    Research (read-only researcher, 2026-09-27)

    • Scope: parse_openai_alignment returned 27 lead items on a fresh fetch: 20 on alignment.openai.com and 7 on openai.com/index/.... All 7 are kind="research", so they are feature-eligible:
      • an-alien-mind
      • research-acceleration-view-inside-openai
      • hugging-face-incident-and-the-road-ahead
      • how-we-monitor-internal-coding-agents-misalignment
      • reasoning-models-chain-of-thought-controllability
      • advancing-independent-research-ai-alignment
      • evaluating-chain-of-thought-monitorability
    • The block is host-wide for HTML. WebFetch returned 403 on /, /news/, /research/ and every /index/ post tested. robots.txt, sitemap.xml and /news/rss.xml are 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.
    • No official full-text alternative. openai.com/news/rss.xml lists all 7 but carries only 149–338-character summaries, with no content:encoded. alignment.openai.com does not host these posts in full.
    • Frequency: LAB_PENALTY_DAYS (30) is larger than max_age_days (21), so an OpenAI item can't outrank a non-penalized item while OpenAI is in recent_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-run FAILED 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:

    Objection Disposition
    --feature override bypasses the pool Disproved. build_plan looks the override up in candidates["lead"], so an item excluded at gather fails with PLAN FAILED … not a gathered lead item.
    Substring host matching is fragile Adopt. Use an exact parsed-host set, {"openai.com", "www.openai.com"}, via urllib.parse.urlsplit(url).hostname.
    A permanent denylist makes the show silently blind to real OpenAI work Adopt. Log each excluded URL to dropped.jsonl (stage: "gather", reason citing #245), and put a revisit note on the constant.
    WebFetch canary; separate identity_url from content_url; backfill refused briefs Out of scope. Follow-up issues.
  2. schmug commented on Sep 27, 2026

    @schmug
    OwnerAuthor

    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 to dropped.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:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions