krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

f3c70e04148c57dcafead89b4e02b83e5f5635f8

verified · cmc

author: Christian Cleberg <hello@cleberg.net> · 2026-07-16T16:17:45Z

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.
 Hutch/App/HutchIntents.swift |  6 ++++--
 ROADMAP.md                   | 24 ++++++++++++++++++++++--
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/Hutch/App/HutchIntents.swift b/Hutch/App/HutchIntents.swift
index c2f144a..947ec04 100644
--- a/Hutch/App/HutchIntents.swift
+++ b/Hutch/App/HutchIntents.swift
@@ -134,7 +134,8 @@ struct SearchHutchIntent: AppIntent {
 
     var route: HutchRoute {
         let normalized = query.trimmingCharacters(in: .whitespacesAndNewlines)
-        // TODO: Route to global local search once Hutch has one.
+        // Routes to Lookup for now; repoint at a global content search when Hutch
+        // gains one — tracked in ROADMAP.md § "App Intent gaps".
         return normalized.isEmpty ? .lookup : .search(query: normalized)
     }
 
@@ -145,7 +146,8 @@ struct SearchHutchIntent: AppIntent {
     }
 }
 
-// TODO: Add OpenSavedSearchIntent when Hutch has global saved-search persistence.
+// An OpenSavedSearchIntent belongs here once Hutch has global saved-search
+// persistence — tracked in ROADMAP.md § "App Intent gaps".
 
 // MARK: - App Entities
 
diff --git a/ROADMAP.md b/ROADMAP.md
index 8e32355..43c3e7c 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -244,8 +244,10 @@ Won't Fix, with reasons (resolve in SonarCloud's web UI, not in code):
 - **`javascript:S7785`** — prefers top-level `await` for `injectBannerIfEnabled()`,
   but `content.js` is a classic content script, not a module. Top-level `await`
   would be a syntax error. Not applicable.
-- **5× `swift:S1135`** — TODO comments (INFO). Two in `HutchIntents` name real
-  gaps; leave them until those features land.
+- **5× `swift:S1135`** — TODO comments (INFO). The two in `HutchIntents` named
+  real gaps and are now promoted to "App Intent gaps" below, with the inline
+  `TODO`s replaced by plain references — so those two clear. The remaining three
+  (`DeepLink`, `NotificationPreferencesViewModel` ×2) stay until addressed.
 
 The 3 hotspots are the part actually worth thought:
 
@@ -315,6 +317,24 @@ sequenced after the ingest rather than planned now. Read
 `api/graph/schema.graphqls` in `hub.sr.ht` before committing the version number.
 The bucket may be empty.
 
+### App Intent gaps — unscheduled
+
+Two App Intents in `HutchIntents.swift` are placeholders for features Hutch does
+not have yet. Both are gated on the same missing capability — a global
+search/persistence layer — so neither is schedulable until that lands. (These
+were the two `swift:S1135` TODOs; promoted here so the code carries a reference
+rather than a bare `TODO`.)
+
+- **Global content search.** `SearchHutchIntent` accepts a query but routes to
+  the Lookup screen — sourcehut entity resolution — because Hutch has no
+  full-text search across tickets, repos, and lists. Its own description says
+  "Opens Hutch lookup with a search query." When a real search exists, repoint
+  the `.search` route in `SearchHutchIntent.route`.
+- **`OpenSavedSearchIntent`.** Saved searches are per-tracker only
+  (`TicketSavedFilterStore`, `ScopedSearchHistoryStore`); there is no global
+  saved-search store for an intent to open. Add the intent once global
+  saved-search persistence exists.
+
 ### Swift 6 language mode — no release of its own
 
 The project builds in Swift 5 language mode with