Commit 0cf4c36a2e

0cf4c36a2e734b488c7d22555af537262110eab9

parent: 30b3be9ba5

Unsigned

cmc <hello@cleberg.net> · 2026-07-16 16:17 UTC

chore: track the two HutchIntents TODOs in the roadmap (S1135)

SearchHutchIntent's route-to-Lookup stopgap and the absent
OpenSavedSearchIntent are both gated on a global search/persistence
layer Hutch lacks. Promote both to ROADMAP § "App Intent gaps" and
replace the inline TODOs with plain references, clearing those two
S1135 issues without losing the design intent.

Layout: unified · split

Hutch/App/HutchIntents.swift +4 −2
@@ -134,7 +134,8 @@ struct SearchHutchIntent: AppIntent {
134134
135135 var route: HutchRoute {
136136 let normalized = query.trimmingCharacters(in: .whitespacesAndNewlines)
137 // TODO: Route to global local search once Hutch has one.
137 // Routes to Lookup for now; repoint at a global content search when Hutch
138 // gains one — tracked in ROADMAP.md § "App Intent gaps".
138139 return normalized.isEmpty ? .lookup : .search(query: normalized)
139140 }
140141
@@ -145,7 +146,8 @@ struct SearchHutchIntent: AppIntent {
145146 }
146147}
147148
148// TODO: Add OpenSavedSearchIntent when Hutch has global saved-search persistence.
149// An OpenSavedSearchIntent belongs here once Hutch has global saved-search
150// persistence — tracked in ROADMAP.md § "App Intent gaps".
149151
150152// MARK: - App Entities
151153
ROADMAP.md +22 −2
@@ -244,8 +244,10 @@ Won't Fix, with reasons (resolve in SonarCloud's web UI, not in code):
244244- **`javascript:S7785`** — prefers top-level `await` for `injectBannerIfEnabled()`,
245245 but `content.js` is a classic content script, not a module. Top-level `await`
246246 would be a syntax error. Not applicable.
247- **5× `swift:S1135`** — TODO comments (INFO). Two in `HutchIntents` name real
248 gaps; leave them until those features land.
247- **5× `swift:S1135`** — TODO comments (INFO). The two in `HutchIntents` named
248 real gaps and are now promoted to "App Intent gaps" below, with the inline
249 `TODO`s replaced by plain references — so those two clear. The remaining three
250 (`DeepLink`, `NotificationPreferencesViewModel` ×2) stay until addressed.
249251
250252The 3 hotspots are the part actually worth thought:
251253
@@ -315,6 +317,24 @@ sequenced after the ingest rather than planned now. Read
315317`api/graph/schema.graphqls` in `hub.sr.ht` before committing the version number.
316318The bucket may be empty.
317319
320### App Intent gaps — unscheduled
321
322Two App Intents in `HutchIntents.swift` are placeholders for features Hutch does
323not have yet. Both are gated on the same missing capability — a global
324search/persistence layer — so neither is schedulable until that lands. (These
325were the two `swift:S1135` TODOs; promoted here so the code carries a reference
326rather than a bare `TODO`.)
327
328- **Global content search.** `SearchHutchIntent` accepts a query but routes to
329 the Lookup screen — sourcehut entity resolution — because Hutch has no
330 full-text search across tickets, repos, and lists. Its own description says
331 "Opens Hutch lookup with a search query." When a real search exists, repoint
332 the `.search` route in `SearchHutchIntent.route`.
333- **`OpenSavedSearchIntent`.** Saved searches are per-tracker only
334 (`TicketSavedFilterStore`, `ScopedSearchHistoryStore`); there is no global
335 saved-search store for an intent to open. Add the intent once global
336 saved-search persistence exists.
337
318338### Swift 6 language mode — no release of its own
319339
320340The project builds in Swift 5 language mode with