Fix rake steep: the admin ignore never applied
`ignore` keeps separate lists for plain and inline sources, and admin
was enrolled by `check ..., inline: true` — a bare `ignore` fed the
other list, so the files stayed checked while 12 others silently went
unchecked, hiding three stand-in gaps this fills.

Assisted-by: GLM-5.3 via pi
change vluynnosqnvrupqxmqkrssmypmvtmknu
commit ca3dd8c2ff702a4af2b982db79d90fa7bb705fd2
author Alpha Chen <alpha@kejadlen.dev>
date
parent e6a70832
diff --git a/Steepfile b/Steepfile
index c814e37..b24db0d 100644
--- a/Steepfile
+++ b/Steepfile
@@ -13,7 +13,12 @@ target :lib do
   # written stand-ins under sig/gems. Ignored rather than stubbed for
   # now; add sig/gems/phlex.rbs and drop this once the admin surface is
   # worth typing.
-  ignore "lib/pro_tacts/admin"
+  #
+  # inline: true is load-bearing: `ignore` keeps separate lists for
+  # plain and inline sources, and these files were enrolled by
+  # `check ... inline: true`. A bare `ignore` feeds the other list and
+  # the files stay checked.
+  ignore "lib/pro_tacts/admin", inline: true
   signature "sig"
 
   library "digest", "fileutils", "logger", "pathname", "strscan"
diff --git a/sig/gems/roda.rbs b/sig/gems/roda.rbs
index cf6737b..dd70de8 100644
--- a/sig/gems/roda.rbs
+++ b/sig/gems/roda.rbs
@@ -30,11 +30,21 @@ class Roda
     def options: (*untyped matchers) ?{ (*untyped) -> untyped } -> void
     def put: (*untyped matchers) ?{ (*untyped) -> untyped } -> void
 
+    # The :public plugin's file server: answers a GET that names a file
+    # under PUBLIC_ROOT from there, and falls through to the routes
+    # below when it does not.
+    def public: () -> void
+
     # The media type of the request body, without parameters — inherited
     # from Rack::Request in the gem, restated here because the local
     # RodaRequest does not.
     def media_type: () -> String?
 
+    # The request's query and form parameters, inherited from
+    # Rack::Request in the gem and restated here for the same reason as
+    # #media_type. Values stay untyped: repeated keys arrive as arrays.
+    def params: () -> Hash[String, untyped]
+
     # Halts the request, so nothing after it in a route block runs.
     def redirect: (String path, ?Integer status) -> bot
   end
diff --git a/sig/gems/sequel.rbs b/sig/gems/sequel.rbs
index f733a44..20a8b56 100644
--- a/sig/gems/sequel.rbs
+++ b/sig/gems/sequel.rbs
@@ -28,6 +28,10 @@ module Sequel
   # DSL has no spelling for.
   def self.lit: (String sql) -> untyped
 
+  # A column in descending order, for Dataset#order — the ordering the
+  # "recently updated" reads sort by.
+  def self.desc: (Symbol name) -> untyped
+
   class Database
     def []: (Symbol table) -> Dataset
 
diff --git a/sig/pro_tacts/admin.rbs b/sig/pro_tacts/admin.rbs
new file mode 100644
index 0000000..56af7cb
--- /dev/null
+++ b/sig/pro_tacts/admin.rbs
@@ -0,0 +1,17 @@
+# lib/pro_tacts/admin is ignored by the Steepfile — built on Phlex,
+# which ships no signatures — but web.rb still calls its two views, and
+# a checked file cannot reference a constant nothing declares. This
+# holds exactly that entry surface; the views' own files carry none.
+# When Phlex gets a stand-in under sig/gems and admin is checked for
+# real, delete this.
+module ProTacts
+  module Admin
+    class ContactsShow
+      def self.call: (contact: Contact) -> String
+    end
+
+    class ContactsIndex
+      def self.call: (recent: Array[Store::RecentContact], query: String?) -> String
+    end
+  end
+end