Commit 6d11464fff

6d11464fff26fbbe3752724b26d33f74c053cbb5

parent: c0b10553a4

Unsigned

cmc <hello@cleberg.net> · 2026-08-07 21:38 UTC

Ingest Q1-Q2 2026: file findings, surface mailingListSubscribe unblock

'What's cooking' ingest (Q1-Q2 2026 posts + live schema introspection with a
test token). Everything the posts flagged is already in Hutch: RIDs,
pronouns, avatars, hub project writes + discovery, deploy keys. Anonymous API
and standardized/connections-spec GraphQL are future upstream work.

New opening found live: MailingList gained a 'subscription' field, removing
the exact blocker Phase 1 named for mailingListSubscribe. Recorded it as a
buildable v3.11.0 bucket; moved the SCOPE.txt entry out of 'out of scope'.

Layout: unified · split

ROADMAP.txt +35 −18
@@ -79,13 +79,14 @@ were never called. Each removes a "why can't I do this here?" moment.
79- ~~`updatePreferences`~~ (todo.sr.ht and lists.sr.ht) — `notifySelf` and 79- ~~`updatePreferences`~~ (todo.sr.ht and lists.sr.ht) — `notifySelf` and
80 `copySelf`, surfaced as an Email section in Settings. 80 `copySelf`, surfaced as an Email section in Settings.
81 81
82`mailingListSubscribe` is deliberately not wired up. `MailingList` has no 82`mailingListSubscribe` was left unwired here because `MailingList` had no
83`subscription` field, unlike `Ticket` and `Tracker`, so per-list state is only 83`subscription` field, unlike `Ticket` and `Tracker`, so per-list state was only
84knowable from the `subscriptions` query — which by definition lists what the 84knowable from the `subscriptions` query — which by definition lists what the
85user is already subscribed to. Subscribing needs a list the user is *not* 85user is already subscribed to. **That has since changed:** live introspection
86subscribed to, and sr.ht exposes no discovery API to find one (see 86during the ingest shows `MailingList.subscription` now exists (type
87[SCOPE.txt](SCOPE.txt) on hub.sr.ht). Revisit if hub.sr.ht ever gains an API, or 87`MailingListSubscription`, present when subscribed), so per-list state is
88alongside Phase 2, which surfaces lists through patchsets. 88readable and the `mailingListSubscribe` / `mailingListUnsubscribe` toggle can
89reflect it. Now buildable — see "mailing list subscribe" below.
89 90
90### Refactors folded in 91### Refactors folded in
91 92
@@ -144,8 +145,9 @@ so "breaking change" does not apply. These buckets track *user-visible scale*.
144| v3.8.1 | SonarCloud triage; housekeeping | No behaviour change at all | 145| v3.8.1 | SonarCloud triage; housekeeping | No behaviour change at all |
145| v3.8.2 | Home system status moved to a title-bar status badge | Small UI relocation, no new surface | 146| v3.8.2 | Home system status moved to a title-bar status badge | Small UI relocation, no new surface |
146| v3.9.0 | ~~hub.sr.ht project writes + discovery (#12–#15); multi-language highlighting (#16); App Intents expansion (#17); man-page catalog sync (#7); checklist / recent-activity / pull-to-refresh fixes (#18, #11, #9)~~ | Shipped — the cut this session | 147| v3.9.0 | ~~hub.sr.ht project writes + discovery (#12–#15); multi-language highlighting (#16); App Intents expansion (#17); man-page catalog sync (#7); checklist / recent-activity / pull-to-refresh fixes (#18, #11, #9)~~ | Shipped — the cut this session |
147| v3.10.0 | ~~git.sr.ht deploy keys~~ (shipped); "What's cooking" ingest; doc truth-up; revisit `mailingListSubscribe` | Ships one feature, corrects the map | 148| v3.10.0 | ~~git.sr.ht deploy keys~~ (shipped); ~~"What's cooking" ingest + doc truth-up~~ (done) | Ships one feature, corrects the map |
148| v3.11.0 | Accessibility | Independent, device-verified | 149| v3.11.0 | Mailing list subscribe/unsubscribe toggle | Ingest-surfaced; `MailingList.subscription` now exists |
150| v3.12.0 | Accessibility | Independent, device-verified |
149| v4.0.0 | Localization *with* translations | The only true re-presentation | 151| v4.0.0 | Localization *with* translations | The only true re-presentation |
150| — | Swift 6 language mode; cache reads | Internal; ride along, no tag | 152| — | Swift 6 language mode; cache reads | Internal; ride along, no tag |
151 153
@@ -295,8 +297,7 @@ flags two openings:
295 resources. ~~Rechecked and shipped~~: project create/edit, resource 297 resources. ~~Rechecked and shipped~~: project create/edit, resource
296 link/unlink, and public discovery landed (#12–#15) — see "hub.sr.ht writes" 298 link/unlink, and public discovery landed (#12–#15) — see "hub.sr.ht writes"
297 below. `SCOPE.txt`'s "hub has no public API / no discovery" claim has since 299 below. `SCOPE.txt`'s "hub has no public API / no discovery" claim has since
298 been corrected. `mailingListSubscribe` was *not* unblocked — that needs a 300 been corrected.
299 per-list subscription field lists.sr.ht still lacks.
300- ~~git.sr.ht deploy keys are complete~~ — **shipped** (v3.10.0). 301- ~~git.sr.ht deploy keys are complete~~ — **shipped** (v3.10.0).
301 `createDeployKey` / `deleteDeployKey` (and `Repository.deployKeys`) are wired 302 `createDeployKey` / `deleteDeployKey` (and `Repository.deployKeys`) are wired
302 into the repository actions menu, owner-only, alongside ACLs. 303 into the repository actions menu, owner-only, alongside ACLs.
@@ -305,9 +306,26 @@ Start from Q1 2026 forward — that is roughly when the current `Docs/API` dumps
305were captured. 306were captured.
306 307
307Deploy keys — the one self-contained feature the ingest had already surfaced and 308Deploy keys — the one self-contained feature the ingest had already surfaced and
308that the SDL confirmed — shipped in v3.10.0, so this bucket is now the ingest 309that the SDL confirmed — shipped in v3.10.0.
309itself: research that files what changed rather than building. Everything else it 310
310turns up gets filed, not built. 311**Ingest run (2026-08, Q1–Q2 posts + live schema introspection with a test
312token):** everything else the posts flagged is already in Hutch — RIDs (used
313throughout), pronouns and avatars (queried and displayed, avatar upload/delete
314in Settings), hub project writes and discovery (shipped), deploy keys (shipped).
315Planned-but-not-yet-shipped upstream, so nothing to build: anonymous API access
316and "standardized / connections-spec" GraphQL (Q2 named both as future work).
317The one *new* opening the introspection turned up is below.
318
319### Mailing list subscribe — buildable
320
321`MailingList` gained a `subscription` field (type `MailingListSubscription`,
322present when the viewer is subscribed) — confirmed live. That removes the exact
323blocker Phase 1 named: per-list state is now readable, so a subscribe /
324unsubscribe toggle can reflect real server state using the existing
325`mailingListSubscribe` / `mailingListUnsubscribe` mutations (unsubscribe already
326shipped in Phase 1). Surface it wherever a list is shown — Lookup results,
327`ProjectMailingListView`, the inbox list header. Small, self-contained write
328feature; its own minor.
311 329
312### hub.sr.ht writes — projects and discovery done 330### hub.sr.ht writes — projects and discovery done
313 331
@@ -326,11 +344,10 @@ confirmed without a token (introspection there is auth-gated), so the mutations
326degrade to a visible error rather than a crash if a field is not yet deployed. 344degrade to a visible error rather than a crash if a field is not yet deployed.
327Verify on a signed-in device. 345Verify on a signed-in device.
328 346
329`mailingListSubscribe` stays out. `MailingList` still has no `subscription` 347`mailingListSubscribe` is now buildable: the ingest found `MailingList` gained a
330field, and public *project* discovery does not help find a mailing list the user 348`subscription` field, so per-list state is readable and the subscribe/unsubscribe
331is *not* subscribed to — the reason Phase 1 declined it. Revisit only if 349toggle can reflect it — see the "mailing list subscribe" bucket below. `SCOPE.txt`
332lists.sr.ht gains per-list subscription state. `SCOPE.txt` still needs its 350has since had its "hub has no public API / no discovery" claim corrected.
333"hub has no public API / no discovery" claim corrected.
334 351
335### App Intent gaps — unscheduled 352### App Intent gaps — unscheduled
336 353
SCOPE.txt +4 −4
@@ -31,10 +31,10 @@
31 unaffected because it filters on `ev.ticket_id`, which is why ticket timelines 31 unaffected because it filters on `ev.ticket_id`, which is why ticket timelines
32 work. Nothing a client can do fixes this; revisit only if sr.ht changes the 32 work. Nothing a client can do fixes this; revisit only if sr.ht changes the
33 resolver. 33 resolver.
34- Subscribe to a mailing list (`mailingListSubscribe` exists, but `MailingList` 34- ~~Subscribe to a mailing list~~ — **now buildable**. `MailingList` gained a
35 has no `subscription` field, and hub.sr.ht's new discovery lists *projects*, 35 `subscription` field (confirmed live during the Q1–Q2 2026 ingest), so per-list
36 not mailing lists, so there is still no way to find a list you are not already 36 subscribe state is readable and `mailingListSubscribe` / `mailingListUnsubscribe`
37 subscribed to) 37 can drive a real toggle. Moved to ROADMAP.txt ("mailing list subscribe").
38- Submitting patches (a `git send-email` flow, not a GraphQL mutation; Hutch 38- Submitting patches (a `git send-email` flow, not a GraphQL mutation; Hutch
39 reviews patchsets but cannot send them) 39 reviews patchsets but cannot send them)
40 40