| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Add bounded jittered backoff at explicit read boundaries, avoid caching failed GitLab project lookups, and reuse known titles while treating optional history enrichment as best effort. Drain child process output concurrently to prevent stderr pipe deadlocks. Cover retries, cancellation, mutation safety, enrichment boundaries, and real pipe backpressure.
| Back | FazBrowse Home | New Git URL |
Why
A single code-host read timeout currently aborts a stack operation, even when another attempt could succeed. GitLab also rereads already-known titles and retains failed source-project lookups in its cache, so optional work can fail a repair and later reads can repeat an old failure without contacting the host.
Investigation also reproduced a subprocess deadlock: a child filling stderr before closing stdout hangs while stack drains the pipes sequentially.
What Changes
Retry Boundaries
Retries wrap only explicit read call sites: lists, details, merge-state polling, and GitLab source-project lookup. Decoding remains outside the retry boundary. A retry stays inside its existing concurrency slot, and interruption cancels the delay rather than launching another request.
Scope
Related to #43, taking an automatic-recovery-first approach. This does not add stack.codeHostConcurrency, change the default of four jobs, or claim to reproduce the reporter's particular environment. Keep #43 open pending their timeout details and verification; persistent overload may still need a separate concurrency-policy decision.
Verification
GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null bun run test bun run typecheck bun run format:check bun run lint bun run package:smoke bun run changeset:status --since origin/main bun src/cli.ts --help bun src/cli.ts sync --help git diff --check200 tests pass. New provider tests use injected CLI failures and TestClock to cover recovery, bounded attempts, cancellation, mutation exclusion, cache behavior, and concurrency. Stack regressions reproduce duplicate metadata reads and failed optional enrichment, while protecting mandatory-read and interruption boundaries. Latch-backed pipe tests and a real child writing 2 MiB to stderr reproduce the deadlock before the fix and pass afterward. No live-provider load tests were run.