From ebf2fa859527e4d4697a34ab0d5bcda7213bc245 Mon Sep 17 00:00:00 2001 From: gandarfh Date: Sat, 13 Jun 2026 09:56:26 -0300 Subject: [PATCH] chore(bench): perf fixtures, analysis/transport benchmarks, baseline --- .github/workflows/ci.yml | 11 + Makefile | 4 +- bench/BASELINE.md | 76 + bench/README.md | 41 +- bench/bench_analysis.ml | 95 + bench/dune | 3 + bench/fixtures/large.md | 5226 ++++++++++++++++++++++++++++++++++++++ bench/fixtures/medium.md | 466 ++++ bench/gen_fixtures.py | 134 + bench/lsp_roundtrip.py | 111 +- 10 files changed, 6128 insertions(+), 39 deletions(-) create mode 100644 bench/BASELINE.md create mode 100644 bench/bench_analysis.ml create mode 100644 bench/dune create mode 100644 bench/fixtures/large.md create mode 100644 bench/fixtures/medium.md create mode 100644 bench/gen_fixtures.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e98327b..5664f81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,6 +49,17 @@ jobs: run: opam exec -- dune build - name: Test run: opam exec -- dune runtest + # Perf gate: regenerate fixtures and assert the LSP E2E path stays + # within the ADR-010 hard-fail budgets. Linux only — shared runners + # are too noisy for the tight p95 targets, but a hard-fail breach is + # a real regression. See bench/BASELINE.md. + - name: Benchmark budget gate + if: runner.os == 'Linux' + run: | + python3 bench/gen_fixtures.py + opam exec -- dune build bench/bench_analysis.exe + python3 bench/lsp_roundtrip.py \ + _build/default/bin/httui-lsp/httui_lsp.exe --check - name: Format check if: runner.os == 'Linux' run: | diff --git a/Makefile b/Makefile index 94162b4..f232dbc 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,9 @@ test-grammars: ## Run grammar corpus tests cd $(TS_REFS_DIR) && npx tree-sitter test cd $(TS_HTTP_DIR) && npx tree-sitter test -bench: build-ocaml ## Run the LSP transport benchmark +bench: build-ocaml ## Run perf benchmarks (analysis in-process + LSP transport) + python3 bench/gen_fixtures.py + dune exec bench/bench_analysis.exe -- bench/fixtures python3 bench/lsp_roundtrip.py lint: lint-ocaml lint-js ## Run all linters diff --git a/bench/BASELINE.md b/bench/BASELINE.md new file mode 100644 index 0000000..87ccf6b --- /dev/null +++ b/bench/BASELINE.md @@ -0,0 +1,76 @@ +# Performance baseline — Slice 2.5 + +Measured on the canonical ADR-010 fixtures (`bench/fixtures/`, generated +by `gen_fixtures.py`): **medium** (466 lines, 10 blocks, ~30 refs) and +**large** (5226 lines, 50 blocks, ~190 refs). Reproduce with `make bench`. + +Machine: darwin/arm64 (dev). Numbers are indicative, not absolute — the +gates that matter are the ADR-010 budgets and regression between runs. + +## Analysis path — in-process (`bench_analysis.ml`) + +Pure OCaml, no transport. p95 on the **large** fixture: + +| Operation | p50 | p95 | +|---|---|---| +| `Fence_scanner.scan` | 0.21ms | 0.23ms | +| `Analyze.diagnostics` | 0.62ms | 0.70ms | +| `Semantic_tokens.of_blocks` | 0.79ms | 0.83ms | +| `Analyze.completion_at` | ~0ms | ~0ms | +| `Analyze.hover_at` | ~0ms | ~0ms | +| didChange (scan + diagnostics) | 0.89ms | 0.92ms | + +The whole analysis is **sub-millisecond on 50 blocks** — two orders of +magnitude under the ADR-010 diagnostics budget (<100ms p95). The +suspected hot spots (the O(n²) `aliases_above`, re-parsing every block's +tree-sitter tree per edit) cost <1ms combined. **The analysis is not a +bottleneck.** + +## Transport path — E2E over stdio (`lsp_roundtrip.py`) + +| Operation | p50 | p95 | ADR-010 p95 budget | +|---|---|---|---| +| request round-trip floor | 0.011ms | 0.015ms | — | +| didChange→diagnostics [medium 12KB] | 0.21ms | 0.35ms | <100ms | +| didChange→diagnostics [large 147KB] | 1.83ms | 1.89ms | <100ms | +| semanticTokens/full [medium] | 1.27ms | 1.34ms | <80ms | +| **semanticTokens/full [large]** | **67.8ms** | **69.7ms** | **<80ms** | + +`didChange→diagnostics` on the large doc is **1.9ms** end to end — +excellent. The one number near a budget is **`semanticTokens/full` on +the large doc: ~70ms p95**. Note `Semantic_tokens.of_blocks` itself is +0.83ms — so the other ~67ms is **LSP delta-position encoding + JSON +serialization of the large token array, plus stdio transfer**, not the +token computation. This is exactly what `semanticTokens/full/delta` +targets (send the diff, not the whole array). + +## Frontend path — per-keystroke (`httui-desktop`, vitest bench, jsdom) + +One keystroke = insert + delete (two `view.dispatch` calls): + +| Fixture | mean | p99 | +|---|---|---| +| medium (10 blocks) | 0.59ms | 1.04ms | +| large (50 blocks) | 6.18ms | 6.89ms | + +**10.5x medium→large.** That linear-with-doc-size scaling is the +signature of the full-document scanners (`createFencedBlockExtension` +`findBlocks`, `cm-tables`, `cm-merge-conflict`) that re-walk every line +on every `docChanged`. The viewport-scoped `referenceHighlight` would be +roughly constant. jsdom caveat: `visibleRanges` covers the whole doc, so +this is a worst-case upper bound for the viewport plugins and excludes +browser layout/paint. + +## Conclusions (what the data says to optimize) + +1. **LSP analysis (planned Fase 2: memo + subtree cache) — not justified + by the bench.** Everything is sub-ms; optimizing it would tune work + already 100x under budget (the ADR-010 anti-pattern: don't optimize + what the bench doesn't flag). +2. **Semantic tokens encoding (Fase 3 delta) — justified**, but as the + one transport hot spot (~70ms on large) and a future token-consuming + client concern. The desktop does not consume server semantic tokens + today (Lezer first-paint), so it pays 0ms of this now. +3. **Frontend full-doc scanners (Fase 4) — the real desktop win.** They + scale linearly with doc size and dominate the keystroke cost. Early-out + by sentinel + incrementalizing the fence scanner cut this directly. diff --git a/bench/README.md b/bench/README.md index 94ef5a6..96b7cf8 100644 --- a/bench/README.md +++ b/bench/README.md @@ -1,30 +1,33 @@ # Benchmark fixtures and harness -Synthetic vault fixtures used to validate performance budgets: +Synthetic vault fixtures used to validate the ADR-010 performance +budgets, generated deterministically by `gen_fixtures.py`: -- **Medium**: ~500 lines of markdown, 10 executable blocks (5 HTTP + 5 SQL), - ~20 references. -- **Large**: ~5000 lines, 50 blocks, ~200 references. +- **medium.md**: ~500 lines, 10 executable blocks (5 HTTP + 5 SQL), ~30 refs. +- **large.md**: ~5000 lines, 50 blocks (mixed), ~190 refs. -Operations measured per fixture include incremental retokenize, semantic -tokens delta, completion popup latency, hover latency, diagnostic publish, -rename, find-all-references, format on save, and cancellation latency. - -Cold-start metrics tracked separately: LSP spawn-to-ready, time-to-first- -completion after `didOpen`, first parse + semantic tokens, and schema cache -lookup. Memory budget (RSS) tracked on both medium and large fixtures. +Refs only point at blocks declared above (DAG by construction), so they +exercise real scope resolution. Regenerate with `python3 bench/gen_fixtures.py`. ## Harness -- `lsp_roundtrip.py` — transport baseline against the built `httui-lsp` - binary: spawn-to-initialize, request round-trip (framing + JSON + - dispatch), and didChange ingestion. No external dependencies. +Two complementary benchmarks, both run by `make bench`: + +- `bench_analysis.ml` — **in-process** analysis cost (no transport): scan, + diagnostics, semantic tokens, completion, hover over each fixture. This + isolates the pure-OCaml algorithm cost. +- `lsp_roundtrip.py` — **E2E over stdio**: spawn-to-initialize, request + round-trip floor, and per-fixture `didChange→diagnostics` + + `semanticTokens/full`. The gap between this and the in-process numbers + is the LSP encoding + transport cost. No external dependencies. ```bash -dune build -make bench # or: python3 bench/lsp_roundtrip.py +make bench +# or individually: +python3 bench/gen_fixtures.py +dune exec bench/bench_analysis.exe -- bench/fixtures +python3 bench/lsp_roundtrip.py ``` -Feature-level operations (hover, completion, semantic tokens, -diagnostics) gain sections here as the server implements them; the -fixtures above become their inputs. +Current numbers and the optimization conclusions they drive live in +[`BASELINE.md`](BASELINE.md). diff --git a/bench/bench_analysis.ml b/bench/bench_analysis.ml new file mode 100644 index 0000000..afe98db --- /dev/null +++ b/bench/bench_analysis.ml @@ -0,0 +1,95 @@ +(* In-process analysis benchmark: measures the pure-OCaml analysis path + (no stdio, no JSON) over the canonical fixtures, so the numbers are + the algorithm cost alone — the transport floor lives in + lsp_roundtrip.py. + + Run via [make bench] or: + dune exec bench/bench_analysis.exe -- [fixtures-dir] + (default fixtures-dir: bench/fixtures) + + Reports p50/p95/p99 per operation per fixture. ADR-010 budgets: + retoken viewport <16ms p95, diagnostics publish <100ms p95. *) + +let read_file path = + let ic = open_in_bin path in + let n = in_channel_length ic in + let s = really_input_string ic n in + close_in ic; + s + +let now () = Unix.gettimeofday () + +let percentile sorted p = + let n = Array.length sorted in + sorted.(int_of_float (Float.round (float_of_int (n - 1) *. p))) + +let report name samples = + Array.sort compare samples; + let ms x = x *. 1e3 in + Printf.printf "%-40s n=%5d p50=%.4fms p95=%.4fms p99=%.4fms max=%.4fms\n" + name (Array.length samples) + (ms (percentile samples 0.50)) + (ms (percentile samples 0.95)) + (ms (percentile samples 0.99)) + (ms samples.(Array.length samples - 1)) + +(* Time [f ()] [iters] times after [warmup] discarded runs. [f] returns a + value we keep via [Sys.opaque_identity] so the optimizer cannot hoist + the work out of the loop. *) +let bench ?(warmup = 50) ?(iters = 1000) f = + for _ = 1 to warmup do + ignore (Sys.opaque_identity (f ())) + done; + let samples = Array.make iters 0.0 in + for i = 0 to iters - 1 do + let t = now () in + ignore (Sys.opaque_identity (f ())); + samples.(i) <- now () -. t + done; + samples + +(* Offset just past the first [{{] in the doc — a realistic completion + trigger point. Falls back to 0 if the doc has no refs. *) +let first_ref_open doc = + match Str.search_forward (Str.regexp_string "{{") doc 0 with + | i -> i + 2 + | exception Not_found -> 0 + +(* Offset inside the first ref name — a realistic hover point. *) +let first_ref_name doc = first_ref_open doc + +let run_fixture path = + let doc = read_file path in + Printf.printf "\n# %s (%d bytes, %d lines)\n" (Filename.basename path) + (String.length doc) + (String.fold_left (fun n c -> if c = '\n' then n + 1 else n) 0 doc); + let blocks = Httui_lang.Fence_scanner.scan doc in + let comp_off = first_ref_open doc in + let hover_off = first_ref_name doc in + report "Fence_scanner.scan" + (bench (fun () -> Httui_lang.Fence_scanner.scan doc)); + report "Analyze.diagnostics" + (bench (fun () -> Httui_lang.Analyze.diagnostics blocks)); + report "Semantic_tokens.of_blocks" + (bench (fun () -> Httui_lang.Semantic_tokens.of_blocks blocks)); + report "Analyze.completion_at" + (bench (fun () -> + Httui_lang.Analyze.completion_at doc blocks ~offset:comp_off)); + report "Analyze.hover_at" + (bench (fun () -> Httui_lang.Analyze.hover_at blocks ~offset:hover_off)); + (* didChange cost = scan + diagnostics (what publish_diagnostics does). *) + report "didChange (scan + diagnostics)" + (bench (fun () -> + let b = Httui_lang.Fence_scanner.scan doc in + Httui_lang.Analyze.diagnostics b)) + +let () = + let dir = + if Array.length Sys.argv > 1 then Sys.argv.(1) else "bench/fixtures" + in + List.iter + (fun f -> + let path = Filename.concat dir f in + if Sys.file_exists path then run_fixture path + else Printf.eprintf "missing fixture: %s\n" path) + [ "medium.md"; "large.md" ] diff --git a/bench/dune b/bench/dune new file mode 100644 index 0000000..04c0a14 --- /dev/null +++ b/bench/dune @@ -0,0 +1,3 @@ +(executable + (name bench_analysis) + (libraries httui_lang unix str)) diff --git a/bench/fixtures/large.md b/bench/fixtures/large.md new file mode 100644 index 0000000..f0a99a8 --- /dev/null +++ b/bench/fixtures/large.md @@ -0,0 +1,5226 @@ +# Benchmark fixture + +### Block 1 + +```http alias=req1 timeout=30000 +GET https://api.example.com/items?page=1 +Authorization: Bearer {{TOKEN}} +Content-Type: application/json + +{"page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 2 + +```db-postgres alias=q2 +SELECT id, name, created_at FROM items WHERE name = {{req1.response.body.name}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 3 + +```http alias=req3 timeout=30000 +GET https://api.example.com/items?parent={{q2.response.body.parent_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req1.response.body.parent_id}} +Content-Type: application/json + +{"page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 4 + +```db-postgres alias=q4 +SELECT id, name, created_at FROM items WHERE owner_id = {{req3.response.body.owner_id}} AND owner_id = {{q2.response.body.owner_id}} AND owner_id = {{req1.response.body.owner_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 5 + +```http alias=req5 timeout=30000 +GET https://api.example.com/items?parent={{q4.response.body.status}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req3.response.body.status}} +Content-Type: application/json + +{"ref": "{{q2.response.body.status}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 6 + +```db-postgres alias=q6 +SELECT id, name, created_at FROM items WHERE id = {{req5.response.body.id}} AND id = {{q4.response.body.id}} AND id = {{req3.response.body.id}} AND id = {{q2.response.body.id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 7 + +```http alias=req7 timeout=30000 +GET https://api.example.com/items?parent={{q6.response.body.name}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req5.response.body.name}} +Content-Type: application/json + +{"ref": "{{q4.response.body.name}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 8 + +```db-postgres alias=q8 +SELECT id, name, created_at FROM items WHERE parent_id = {{req7.response.body.parent_id}} AND parent_id = {{q6.response.body.parent_id}} AND parent_id = {{req5.response.body.parent_id}} AND parent_id = {{q4.response.body.parent_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 9 + +```http alias=req9 timeout=30000 +GET https://api.example.com/items?parent={{q8.response.body.owner_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req7.response.body.owner_id}} +Content-Type: application/json + +{"ref": "{{q6.response.body.owner_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 10 + +```db-postgres alias=q10 +SELECT id, name, created_at FROM items WHERE status = {{req9.response.body.status}} AND status = {{q8.response.body.status}} AND status = {{req7.response.body.status}} AND status = {{q6.response.body.status}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 11 + +```http alias=req11 timeout=30000 +GET https://api.example.com/items?parent={{q10.response.body.id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req9.response.body.id}} +Content-Type: application/json + +{"ref": "{{q8.response.body.id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 12 + +```db-postgres alias=q12 +SELECT id, name, created_at FROM items WHERE name = {{req11.response.body.name}} AND name = {{q10.response.body.name}} AND name = {{req9.response.body.name}} AND name = {{q8.response.body.name}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 13 + +```http alias=req13 timeout=30000 +GET https://api.example.com/items?parent={{q12.response.body.parent_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req11.response.body.parent_id}} +Content-Type: application/json + +{"ref": "{{q10.response.body.parent_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 14 + +```db-postgres alias=q14 +SELECT id, name, created_at FROM items WHERE owner_id = {{req13.response.body.owner_id}} AND owner_id = {{q12.response.body.owner_id}} AND owner_id = {{req11.response.body.owner_id}} AND owner_id = {{q10.response.body.owner_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 15 + +```http alias=req15 timeout=30000 +GET https://api.example.com/items?parent={{q14.response.body.status}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req13.response.body.status}} +Content-Type: application/json + +{"ref": "{{q12.response.body.status}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 16 + +```db-postgres alias=q16 +SELECT id, name, created_at FROM items WHERE id = {{req15.response.body.id}} AND id = {{q14.response.body.id}} AND id = {{req13.response.body.id}} AND id = {{q12.response.body.id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 17 + +```http alias=req17 timeout=30000 +GET https://api.example.com/items?parent={{q16.response.body.name}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req15.response.body.name}} +Content-Type: application/json + +{"ref": "{{q14.response.body.name}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 18 + +```db-postgres alias=q18 +SELECT id, name, created_at FROM items WHERE parent_id = {{req17.response.body.parent_id}} AND parent_id = {{q16.response.body.parent_id}} AND parent_id = {{req15.response.body.parent_id}} AND parent_id = {{q14.response.body.parent_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 19 + +```http alias=req19 timeout=30000 +GET https://api.example.com/items?parent={{q18.response.body.owner_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req17.response.body.owner_id}} +Content-Type: application/json + +{"ref": "{{q16.response.body.owner_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 20 + +```db-postgres alias=q20 +SELECT id, name, created_at FROM items WHERE status = {{req19.response.body.status}} AND status = {{q18.response.body.status}} AND status = {{req17.response.body.status}} AND status = {{q16.response.body.status}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 21 + +```http alias=req21 timeout=30000 +GET https://api.example.com/items?parent={{q20.response.body.id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req19.response.body.id}} +Content-Type: application/json + +{"ref": "{{q18.response.body.id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 22 + +```db-postgres alias=q22 +SELECT id, name, created_at FROM items WHERE name = {{req21.response.body.name}} AND name = {{q20.response.body.name}} AND name = {{req19.response.body.name}} AND name = {{q18.response.body.name}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 23 + +```http alias=req23 timeout=30000 +GET https://api.example.com/items?parent={{q22.response.body.parent_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req21.response.body.parent_id}} +Content-Type: application/json + +{"ref": "{{q20.response.body.parent_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 24 + +```db-postgres alias=q24 +SELECT id, name, created_at FROM items WHERE owner_id = {{req23.response.body.owner_id}} AND owner_id = {{q22.response.body.owner_id}} AND owner_id = {{req21.response.body.owner_id}} AND owner_id = {{q20.response.body.owner_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 25 + +```http alias=req25 timeout=30000 +GET https://api.example.com/items?parent={{q24.response.body.status}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req23.response.body.status}} +Content-Type: application/json + +{"ref": "{{q22.response.body.status}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 26 + +```db-postgres alias=q26 +SELECT id, name, created_at FROM items WHERE id = {{req25.response.body.id}} AND id = {{q24.response.body.id}} AND id = {{req23.response.body.id}} AND id = {{q22.response.body.id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 27 + +```http alias=req27 timeout=30000 +GET https://api.example.com/items?parent={{q26.response.body.name}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req25.response.body.name}} +Content-Type: application/json + +{"ref": "{{q24.response.body.name}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 28 + +```db-postgres alias=q28 +SELECT id, name, created_at FROM items WHERE parent_id = {{req27.response.body.parent_id}} AND parent_id = {{q26.response.body.parent_id}} AND parent_id = {{req25.response.body.parent_id}} AND parent_id = {{q24.response.body.parent_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 29 + +```http alias=req29 timeout=30000 +GET https://api.example.com/items?parent={{q28.response.body.owner_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req27.response.body.owner_id}} +Content-Type: application/json + +{"ref": "{{q26.response.body.owner_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 30 + +```db-postgres alias=q30 +SELECT id, name, created_at FROM items WHERE status = {{req29.response.body.status}} AND status = {{q28.response.body.status}} AND status = {{req27.response.body.status}} AND status = {{q26.response.body.status}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 31 + +```http alias=req31 timeout=30000 +GET https://api.example.com/items?parent={{q30.response.body.id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req29.response.body.id}} +Content-Type: application/json + +{"ref": "{{q28.response.body.id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 32 + +```db-postgres alias=q32 +SELECT id, name, created_at FROM items WHERE name = {{req31.response.body.name}} AND name = {{q30.response.body.name}} AND name = {{req29.response.body.name}} AND name = {{q28.response.body.name}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 33 + +```http alias=req33 timeout=30000 +GET https://api.example.com/items?parent={{q32.response.body.parent_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req31.response.body.parent_id}} +Content-Type: application/json + +{"ref": "{{q30.response.body.parent_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 34 + +```db-postgres alias=q34 +SELECT id, name, created_at FROM items WHERE owner_id = {{req33.response.body.owner_id}} AND owner_id = {{q32.response.body.owner_id}} AND owner_id = {{req31.response.body.owner_id}} AND owner_id = {{q30.response.body.owner_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 35 + +```http alias=req35 timeout=30000 +GET https://api.example.com/items?parent={{q34.response.body.status}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req33.response.body.status}} +Content-Type: application/json + +{"ref": "{{q32.response.body.status}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 36 + +```db-postgres alias=q36 +SELECT id, name, created_at FROM items WHERE id = {{req35.response.body.id}} AND id = {{q34.response.body.id}} AND id = {{req33.response.body.id}} AND id = {{q32.response.body.id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 37 + +```http alias=req37 timeout=30000 +GET https://api.example.com/items?parent={{q36.response.body.name}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req35.response.body.name}} +Content-Type: application/json + +{"ref": "{{q34.response.body.name}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 38 + +```db-postgres alias=q38 +SELECT id, name, created_at FROM items WHERE parent_id = {{req37.response.body.parent_id}} AND parent_id = {{q36.response.body.parent_id}} AND parent_id = {{req35.response.body.parent_id}} AND parent_id = {{q34.response.body.parent_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 39 + +```http alias=req39 timeout=30000 +GET https://api.example.com/items?parent={{q38.response.body.owner_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req37.response.body.owner_id}} +Content-Type: application/json + +{"ref": "{{q36.response.body.owner_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 40 + +```db-postgres alias=q40 +SELECT id, name, created_at FROM items WHERE status = {{req39.response.body.status}} AND status = {{q38.response.body.status}} AND status = {{req37.response.body.status}} AND status = {{q36.response.body.status}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 41 + +```http alias=req41 timeout=30000 +GET https://api.example.com/items?parent={{q40.response.body.id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req39.response.body.id}} +Content-Type: application/json + +{"ref": "{{q38.response.body.id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 42 + +```db-postgres alias=q42 +SELECT id, name, created_at FROM items WHERE name = {{req41.response.body.name}} AND name = {{q40.response.body.name}} AND name = {{req39.response.body.name}} AND name = {{q38.response.body.name}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 43 + +```http alias=req43 timeout=30000 +GET https://api.example.com/items?parent={{q42.response.body.parent_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req41.response.body.parent_id}} +Content-Type: application/json + +{"ref": "{{q40.response.body.parent_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 44 + +```db-postgres alias=q44 +SELECT id, name, created_at FROM items WHERE owner_id = {{req43.response.body.owner_id}} AND owner_id = {{q42.response.body.owner_id}} AND owner_id = {{req41.response.body.owner_id}} AND owner_id = {{q40.response.body.owner_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 45 + +```http alias=req45 timeout=30000 +GET https://api.example.com/items?parent={{q44.response.body.status}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req43.response.body.status}} +Content-Type: application/json + +{"ref": "{{q42.response.body.status}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 46 + +```db-postgres alias=q46 +SELECT id, name, created_at FROM items WHERE id = {{req45.response.body.id}} AND id = {{q44.response.body.id}} AND id = {{req43.response.body.id}} AND id = {{q42.response.body.id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 47 + +```http alias=req47 timeout=30000 +GET https://api.example.com/items?parent={{q46.response.body.name}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req45.response.body.name}} +Content-Type: application/json + +{"ref": "{{q44.response.body.name}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 48 + +```db-postgres alias=q48 +SELECT id, name, created_at FROM items WHERE parent_id = {{req47.response.body.parent_id}} AND parent_id = {{q46.response.body.parent_id}} AND parent_id = {{req45.response.body.parent_id}} AND parent_id = {{q44.response.body.parent_id}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 49 + +```http alias=req49 timeout=30000 +GET https://api.example.com/items?parent={{q48.response.body.owner_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req47.response.body.owner_id}} +Content-Type: application/json + +{"ref": "{{q46.response.body.owner_id}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 50 + +```db-postgres alias=q50 +SELECT id, name, created_at FROM items WHERE status = {{req49.response.body.status}} AND status = {{q48.response.body.status}} AND status = {{req47.response.body.status}} AND status = {{q46.response.body.status}} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + diff --git a/bench/fixtures/medium.md b/bench/fixtures/medium.md new file mode 100644 index 0000000..0166c31 --- /dev/null +++ b/bench/fixtures/medium.md @@ -0,0 +1,466 @@ +# Benchmark fixture + +### Block 1 + +```http alias=req1 timeout=30000 +GET https://api.example.com/items?page=1 +Authorization: Bearer {{TOKEN}} +Content-Type: application/json + +{"page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. +### Block 2 + +```db-postgres alias=q2 +SELECT id, name, created_at FROM items WHERE name = {{req1.response.body.name}} +``` + + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +### Block 3 + +```http alias=req3 timeout=30000 +GET https://api.example.com/items?parent={{q2.response.body.parent_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req1.response.body.parent_id}} +Content-Type: application/json + +{"page": 1} +``` + +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +### Block 4 + +```db-postgres alias=q4 +SELECT id, name, created_at FROM items WHERE owner_id = {{req3.response.body.owner_id}} AND owner_id = {{q2.response.body.owner_id}} AND owner_id = {{req1.response.body.owner_id}} +``` + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +### Block 5 + +```http alias=req5 timeout=30000 +GET https://api.example.com/items?parent={{q4.response.body.status}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req3.response.body.status}} +Content-Type: application/json + +{"ref": "{{q2.response.body.status}}", "page": 1} +``` + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +### Block 6 + +```db-postgres alias=q6 +SELECT id, name, created_at FROM items WHERE id = {{req5.response.body.id}} AND id = {{q4.response.body.id}} AND id = {{req3.response.body.id}} AND id = {{q2.response.body.id}} +``` + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + +### Block 7 + +```http alias=req7 timeout=30000 +GET https://api.example.com/items?parent={{q6.response.body.name}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req5.response.body.name}} +Content-Type: application/json + +{"ref": "{{q4.response.body.name}}", "page": 1} +``` + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. +### Block 8 + +```db-postgres alias=q8 +SELECT id, name, created_at FROM items WHERE parent_id = {{req7.response.body.parent_id}} AND parent_id = {{q6.response.body.parent_id}} AND parent_id = {{req5.response.body.parent_id}} AND parent_id = {{q4.response.body.parent_id}} +``` + + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +### Block 9 + +```http alias=req9 timeout=30000 +GET https://api.example.com/items?parent={{q8.response.body.owner_id}} +Authorization: Bearer {{TOKEN}} +X-Parent-Id: {{req7.response.body.owner_id}} +Content-Type: application/json + +{"ref": "{{q6.response.body.owner_id}}", "page": 1} +``` + +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +### Block 10 + +```db-postgres alias=q10 +SELECT id, name, created_at FROM items WHERE status = {{req9.response.body.status}} AND status = {{q8.response.body.status}} AND status = {{req7.response.body.status}} AND status = {{q6.response.body.status}} +``` + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + +A longer paragraph that talks through the data flow between blocks and why the reference chain matters for the downstream query. + +> A blockquote with a caveat about pagination. + + +Some explanatory prose about the request below and what it returns. + +- a bullet point describing a field +- another bullet describing an edge case + +## Section heading + diff --git a/bench/gen_fixtures.py b/bench/gen_fixtures.py new file mode 100644 index 0000000..660957b --- /dev/null +++ b/bench/gen_fixtures.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +"""Generate the canonical benchmark fixtures (ADR-010). + +Deterministic — no randomness with a free seed, no timestamps — so the +output is reproducible and diffable. Re-run to regenerate: + + python3 bench/gen_fixtures.py + +Produces: + bench/fixtures/medium.md — ~500 lines, 10 blocks (5 HTTP + 5 SQL), ~20 refs + bench/fixtures/large.md — ~5000 lines, 50 blocks (mixed), ~200 refs + +Refs only point at blocks declared above (DAG by construction), so they +exercise real scope resolution rather than dangling lookups. +""" + +from pathlib import Path + +FIXTURES = Path(__file__).parent / "fixtures" + +# A short rota of prose lines, cycled deterministically to pad the doc to +# the target length between blocks. Realistic markdown: headings, lists, +# paragraphs. +PROSE = [ + "", + "Some explanatory prose about the request below and what it returns.", + "", + "- a bullet point describing a field", + "- another bullet describing an edge case", + "", + "## Section heading", + "", + "A longer paragraph that talks through the data flow between blocks " + "and why the reference chain matters for the downstream query.", + "", + "> A blockquote with a caveat about pagination.", + "", +] + + +def http_block(n, refs): + """An HTTP block aliased req{n}. `refs` are (alias, field) pairs to + earlier blocks, woven into header values and the query.""" + lines = [f"```http alias=req{n} timeout=30000"] + if refs: + a, f = refs[0] + lines.append(f"GET https://api.example.com/items?parent={{{{{a}.response.body.{f}}}}}") + else: + lines.append("GET https://api.example.com/items?page=1") + lines.append("Authorization: Bearer {{TOKEN}}") + if len(refs) > 1: + a, f = refs[1] + lines.append(f"X-Parent-Id: {{{{{a}.response.body.{f}}}}}") + lines.append("Content-Type: application/json") + lines.append("") + if len(refs) > 2: + a, f = refs[2] + lines.append('{"ref": "{{%s.response.body.%s}}", "page": 1}' % (a, f)) + else: + lines.append('{"page": 1}') + lines.append("```") + return lines + + +def db_block(n, refs): + """A db-postgres block aliased q{n}, referencing earlier blocks in the + WHERE clause (converted to bind params by the runtime, but the refs + still parse + resolve here).""" + lines = [f"```db-postgres alias=q{n}"] + if refs: + conds = " AND ".join( + f"{f} = {{{{{a}.response.body.{f}}}}}" for a, f in refs + ) + lines.append(f"SELECT id, name, created_at FROM items WHERE {conds}") + else: + lines.append("SELECT id, name, created_at FROM items LIMIT 100") + lines.append("```") + return lines + + +FIELDS = ["id", "name", "parent_id", "owner_id", "status"] + + +def gen(n_blocks, target_lines): + """Build a doc with n_blocks executable blocks (alternating HTTP/SQL), + each referencing up to 3 earlier blocks, padded with prose to roughly + target_lines.""" + out = ["# Benchmark fixture", ""] + aliases = [] # (kind, n) declared so far, for upward refs + prose_i = 0 + for b in range(n_blocks): + is_http = b % 2 == 0 + n = b + 1 + # Pick up to 3 earlier aliases (closest-first) to reference. + refs = [] + for prev_kind, prev_n in reversed(aliases): + alias = f"req{prev_n}" if prev_kind == "http" else f"q{prev_n}" + field = FIELDS[(prev_n + len(refs)) % len(FIELDS)] + refs.append((alias, field)) + if len(refs) == 4: + break + out.append(f"### Block {n}") + out.append("") + if is_http: + out += http_block(n, refs) + aliases.append(("http", n)) + else: + out += db_block(n, refs) + aliases.append(("db", n)) + out.append("") + # Pad with prose until we have spent our per-block line budget. + per_block = target_lines // n_blocks + pad = max(0, per_block - 12) + for _ in range(pad): + out.append(PROSE[prose_i % len(PROSE)]) + prose_i += 1 + return "\n".join(out) + "\n" + + +def main(): + FIXTURES.mkdir(parents=True, exist_ok=True) + medium = gen(n_blocks=10, target_lines=500) + large = gen(n_blocks=50, target_lines=5400) + (FIXTURES / "medium.md").write_text(medium) + (FIXTURES / "large.md").write_text(large) + for name, text in (("medium", medium), ("large", large)): + n_lines = text.count("\n") + n_blocks = text.count("```http") + text.count("```db-") + n_refs = text.count("{{") - text.count("{{TOKEN}}") + print(f"{name}.md: {n_lines} lines, {n_blocks} blocks, ~{n_refs} refs") + + +if __name__ == "__main__": + main() diff --git a/bench/lsp_roundtrip.py b/bench/lsp_roundtrip.py index 0c9bb13..77bd940 100644 --- a/bench/lsp_roundtrip.py +++ b/bench/lsp_roundtrip.py @@ -56,7 +56,12 @@ def request(self, method, params=None): if params is not None: payload["params"] = params self.send(payload) - return self.recv() + # Skip any server-initiated notifications (e.g. publishDiagnostics + # emitted after a didOpen/didChange) queued ahead of our response. + while True: + msg = self.recv() + if msg.get("id") == rid: + return msg def notify(self, method, params=None): payload = {"jsonrpc": "2.0", "method": method} @@ -64,6 +69,26 @@ def notify(self, method, params=None): payload["params"] = params self.send(payload) + def recv_until_method(self, method): + """Drain messages until a notification with `method` arrives, + returning it. Used to time edit -> server notification cycles.""" + while True: + msg = self.recv() + if msg.get("method") == method: + return msg + + +# p95 by operation name, filled by report(); used by the CI budget gate. +RESULTS = {} + +# ADR-010 "Hard fail" thresholds (the generous column, not the tight p95 +# targets) — shared CI runners are too noisy to gate on the p95 budgets, +# but a hard-fail breach is a real regression on any machine. +HARD_FAIL_MS = { + "didChange->diagnostics": 300.0, + "semanticTokens/full": 200.0, +} + def percentile(sorted_values, p): return sorted_values[round((len(sorted_values) - 1) * p)] @@ -71,8 +96,9 @@ def percentile(sorted_values, p): def report(name, samples_ms): samples_ms.sort() + RESULTS[name] = percentile(samples_ms, 0.95) print( - f"{name:32s} n={len(samples_ms):>5} " + f"{name:40s} n={len(samples_ms):>5} " f"p50={percentile(samples_ms, 0.50):.4f}ms " f"p95={percentile(samples_ms, 0.95):.4f}ms " f"p99={percentile(samples_ms, 0.99):.4f}ms " @@ -80,8 +106,25 @@ def report(name, samples_ms): ) +def check_budgets(): + """Exit non-zero if any operation breached its ADR-010 hard-fail + budget. Matches by name prefix so fixture suffixes are ignored.""" + breaches = [] + for name, p95 in RESULTS.items(): + for prefix, limit in HARD_FAIL_MS.items(): + if name.startswith(prefix) and p95 > limit: + breaches.append(f" {name}: p95 {p95:.1f}ms > hard-fail {limit:.0f}ms") + if breaches: + print("\nBUDGET BREACH (ADR-010 hard-fail):") + print("\n".join(breaches)) + sys.exit(1) + print("\nbudgets OK (within ADR-010 hard-fail thresholds)") + + def main(): - server = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_SERVER + args = [a for a in sys.argv[1:] if a != "--check"] + check = "--check" in sys.argv + server = args[0] if args else DEFAULT_SERVER if not Path(server).exists(): sys.exit(f"server binary not found: {server} (run `dune build` first)") @@ -123,29 +166,59 @@ def probe(): samples.append((time.perf_counter() - t) * 1e3) report("request round-trip (dispatch)", samples) - # didChange ingestion: full-sync document replace per notification, - # measured via a probe request behind each batch (notifications have - # no response of their own). - version = 2 - samples = [] - for _ in range(1000): - t = time.perf_counter() + # Fixture-based E2E: the canonical ADR-010 fixtures over the real + # transport. This captures what the in-process bench (bench_analysis.ml) + # cannot: stdio framing + JSON encode/decode of a large payload on top + # of the server's analysis. The gap between the two benches IS the + # transport cost. + fixtures = Path(__file__).parent / "fixtures" + for fixture in ("medium.md", "large.md"): + path = fixtures / fixture + if not path.exists(): + print(f" (skip {fixture}: run bench/gen_fixtures.py first)") + continue + text = path.read_text() + uri = f"file:///tmp/{fixture}" client.notify( - "textDocument/didChange", - { - "textDocument": {"uri": "file:///tmp/bench.md", "version": version}, - "contentChanges": [{"text": doc}], - }, + "textDocument/didOpen", + {"textDocument": {"uri": uri, "languageId": "markdown", + "version": 1, "text": text}}, ) - probe() - samples.append((time.perf_counter() - t) * 1e3) - version += 1 - report("didChange(2KB doc) + probe", samples) + client.recv_until_method("textDocument/publishDiagnostics") + + # Edit-to-diagnostics: full-sync re-send, then read until the + # server republishes diagnostics — exactly ADR-010's "diagnostic + # publish after edit" budget (<100ms p95). + version = 2 + samples = [] + for _ in range(300): + t = time.perf_counter() + client.notify( + "textDocument/didChange", + {"textDocument": {"uri": uri, "version": version}, + "contentChanges": [{"text": text}]}, + ) + client.recv_until_method("textDocument/publishDiagnostics") + samples.append((time.perf_counter() - t) * 1e3) + version += 1 + report(f"didChange->diagnostics [{fixture} {len(text)//1024}KB]", samples) + + # semanticTokens/full request latency on the fixture. + samples = [] + for _ in range(300): + t = time.perf_counter() + client.request("textDocument/semanticTokens/full", + {"textDocument": {"uri": uri}}) + samples.append((time.perf_counter() - t) * 1e3) + report(f"semanticTokens/full [{fixture}]", samples) client.request("shutdown") client.notify("exit") client.proc.wait(timeout=5) + if check: + check_budgets() + if __name__ == "__main__": main()