Skip to content

Fetch /feed/comments so the discussion desk can name instances #187

Description

@schmug

Task

Give Surface Tension's discussion desk the instance provenance the design spec promises it, by actually reading /feed/comments and matching its entries to the episode's posts — or, if the answer is that the extra fetch is not worth it, trim spec §4.4's table so the show stops promising something it can never say. Today the code path exists and is never fed, so the desk can only ever report a bare count.

Context

st_write.board_facts(post, comment_entries) already accepts parsed /feed/comments entries and derives instance hosts and thread positions from them, and st_write.comments_for(post, entries) already matches entries to a post by title. scene_violations allows a named host only when it appears in those facts. But nothing in the weekly run ever supplies comment_entries: st_gather deliberately reads the post feeds and /feed/new only, and #176's SKILL.md procedure never fetches the comments feed.

The result is that the hosts list is always empty, so every named server in a switchboard line is refused as invented, and the desk's entire vocabulary is "somebody commented, and that is all I can tell you". That is honest — it is exactly what the guards are for — but it is a thinner scene than spec §4.4's table describes, and the "which instances called" row is currently aspirational rather than implemented.

Worth deciding deliberately rather than leaving as a silent gap: the desk is the show's most fragile scene, and volume-without-provenance is close to the minimum that justifies the seat existing at all.

Motivation

Pointers

  • skills/surface-tension/st_write.pyboard_facts, comments_for, _permalink_host, _thread_position. All already written and unit-tested against the fixture; they need a caller.
  • skills/surface-tension/st_write.pyscene_violations, whose _HOSTISH_RE check is what currently refuses every named instance.
  • skills/surface-tension/st_gather.py:279feed_specs, and :662 gather, where a comments fetch would go if the answer is "gather it".
  • skills/surface-tension/st_gather.py:218DEFAULT_CONFIG. Note it has no comments_feed key; spec §4.1's example does. Adding one means updating tests/test_st_skill_md.py::test_skill_md_documents_every_config_key_and_no_phantom_ones, which asserts the Setup block and DEFAULT_CONFIG agree in both directions.
  • tests/data/bubbles_feed_comments.xml — the real capture, with both content shapes (a first comment, and an Nth carrying "Earlier comments").
  • tests/test_switchboard.py::test_a_host_the_comments_feed_confirms_is_allowed — already proves the whole chain works when entries are supplied.
  • docs/superpowers/specs/2026-08-24-surface-tension-design.md §2.3, §4.4 — the recon finding and the amended desk role.

Constraints

  • No comment bodies, ever. The feed does not carry them and fetching a permalink to recover one is explicitly out of scope in spec §9 — it is a separate decision with consent and third-party-fetch implications. This issue is about hosts and counts only.
  • Host, never handle. The permalink path contains the handle; only its host may be used. The existing guards enforce this and must not be relaxed.
  • The count must stay fetch-free. Whether a switchboard turn renders at all is decided by slash:comments on the post's own entry, with no second request. A comments-feed failure must degrade to "count only", never to a dead run or a skipped scene.
  • One bad feed must not kill the run — the same posture as gather_candidates, which logs, records a drop, and continues.
  • Matching must stay tolerant. The comments entry title is New comment on: <post title> (1st, 1 total); the candidate schema does not carry the bubbles entry id, so the title is the only key available. Do not silently drop a post whose title fails to match — log it.

Acceptance criteria

  • A decision is recorded in the issue or the spec: fetch it, or trim §4.4's provenance row. If trimmed, close with the doc change and skip the rest.
  • If fetched: a weekly run supplies comment_entries to fill_scene_prompt and build_scene_segment, and a scene built from a post with real comments accepts a line naming one of that post's actual instance hosts.
  • A line naming an instance that did not comment on that post is still refused — tested.
  • A comments-feed fetch failure degrades to count-only and the episode still ships — tested against a raising parser, not an absent mock.
  • DEFAULT_CONFIG, SKILL.md's Setup block and the drift test stay in agreement.
  • Full pytest + ruff check . + ruff format --check . green with counts in the PR body.

Out of scope

  • Fetching Fediverse comment permalinks to recover comment bodies (spec §9). Permanently separate.
  • Any use of a commenter's handle, display name, or position.
  • Timing claims ("these came in overnight") — published is available on the comment entries, but every clock-shaped claim needs its own guard and this issue is already about provenance.

Activity

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

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions