@@ -766,7 +766,10 @@ disabled (or independently revalidated and rejected unless the destination is
766766the same exact host). It sends GitHub's required API version/accept/user-agent
767767headers but no authorization, token, cookie, board fact, or user source. It
768768does not follow ` download_url ` , HTML links, or any arbitrary URL returned in a
769- response (SEC-10).
769+ response. A response rejected from headers alone (including status or declared
770+ body length) has its body stream cancelled before the adapter publishes the
771+ typed failure, so repeated hostile responses cannot strand transport resources
772+ (SEC-10).
770773
771774Resolution is a two-step logical operation:
772775
@@ -782,6 +785,10 @@ from that tree. Thus every object is derived from the resolved commit without
782785reading through the original moving ref or trusting a response URL. An
783786explicit ** Refresh ref** starts a new operation generation, resolves again, and
784787clears directories, selection, candidate bytes, conflicts, and consent.
788+ Tree response bodies are capped at 2 MiB and each decoded non-recursive tree is
789+ rejected above 512 direct entries before the directory model reaches the eager
790+ tablet view. These are hard resource ceilings, not pagination: the subset never
791+ silently presents a partial folder.
785792
786793### 10.3 Lazy browse, selection, and adaptive state
787794
@@ -795,9 +802,10 @@ enterRepository → resolving → browsing → selecting → reviewing
795802
796803The implementation does not introduce a second Riverpod workflow controller.
797804The adaptive ` StatefulWidget ` owns presentation-only state: a
798- ` browse | review | result ` surface step, ` resolving | loadingDirectory `
799- network phase, directory stack, selection, failure/retry/focus data, and the
800- current progress/result. Resolve/list operations capture the view's increasing
805+ ` browse | review | result ` surface step,
806+ ` resolving | loadingDirectory | checkingBoardTargets ` operation phase,
807+ directory stack, selection, failure/retry/focus data, and the current
808+ progress/result. Resolve/list operations capture the view's increasing
801809epoch and a ` GithubCancellation ` ; cancel, ref refresh, directory change, or
802810disposal advances that epoch, and a late completion cannot repopulate the
803811view. ` GithubBoardImporter ` separately owns its fetch/commit generation,
@@ -942,9 +950,14 @@ never echo fetched bytes.
942950For ` 403 ` /` 429 ` , the REST adapter captures bounded numeric rate-limit metadata
943951(` remaining ` , reset instant or retry delay when valid). The view explains the
944952unauthenticated public limit and offers a user-driven retry after the supplied
945- time. There is no automatic tight loop; transient retries, if later admitted,
946- must be separately bounded and cancellable. Ordinary GitHub failure does not
947- disable Files, Editor, Run, or any offline workflow (NFR-OFF-2).
953+ time. A positive supplied delay establishes one surface-wide not-before
954+ deadline independent of the currently rendered error object. Repository/ref
955+ edits, folder navigation, selection changes, review entry/cancellation, and
956+ other local state transitions cannot shorten or clear it; every action that can
957+ start a GitHub request is disabled and guarded until it expires. There is no
958+ automatic tight loop; transient retries, if later admitted, must be separately
959+ bounded and cancellable. Ordinary GitHub failure does not disable Files,
960+ Editor, Run, or any offline workflow (NFR-OFF-2).
948961
949962### 10.7 Explicit deferred full-A-33 design
950963
0 commit comments