diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 57de0c1f..2f0a069b 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -428,7 +428,8 @@ Source (stdin bytes or child process stdout)
└── parallel_bufread() (all inputs)
├─ Thread 1: I/O reader — reads 256 KB chunks, splits at line boundaries,
│ assigns monotonic sequence numbers, sends to MPMC channel
- ├─ Thread N: workers — receive chunks, validate UTF-8,
+ ├─ Thread 1: bounded dispatcher — uses in-flight tokens to limit queued/running jobs
+ ├─ Pool workers: receive chunk jobs, validate UTF-8,
│ create DefaultSkimItem::new(line, ansi, trans_fields, matching_fields, delimiter)
│ .hidden_fields(hidden_fields, delimiter)
│ (handles ANSI stripping, --nth / --with-nth / --hide-nth inline),
@@ -491,7 +492,7 @@ Engines are composable through the factory pattern. Starting from `Matcher::crea
options
│
├── if regex mode:
- │ RegexEngineFactory
+ │ RegexEngineFactory (configured with the same RankBuilder / --tiebreak criteria)
│ └─ if normalize: NormalizedEngineFactory(RegexEngineFactory)
│
└── else (fuzzy/exact mode):
@@ -581,12 +582,12 @@ Matcher::run(query, item_pool, thread_pool, …)
│ └─ merge_worker_results(worker_results, no_sort, …)
│ ├─ concatenate k sorted runs
│ ├─ sort() (stable; driftsort detects k runs → O(n log k))
- │ └─ write into SpinLock