Capstone dossier · what a name that promises nothing actually delivers: the receipts of the borrelplank program
Author
Dei M. Elurbe
Published
August 17, 2026
Dossier, not the essay. Backstage layer for technical readers; the capstone essay is the general-audience artifact. Corpus: Snapshot · June 2026, ~900 priced venues, roughly 4 in 10 of Amsterdam’s ~2,028 restaurants.
The verdict
The top of the borrelplank family in the atlas is abundance, not luxury. The row runs 9.80 to 49.40 around a typical of 18.50; its floor is supermarket-recognizable wherever the menu names components; its ceiling carries no luxury vocabulary (census-complete since the 2026-08-18 addendum below: 2 of all 118 items carry luxury vocabulary, both mid-band, none above the band; exactly one ibérico item in the whole row). What the top of the band buys is breadth: the priciest boards carry about one full component family more than the cheapest ones, drawn from the same repertoire of fried bites, cheese, sausage, bread and pickles. Bigger and posher boards do exist in this corpus, but they live in other rows of the atlas, under other names.
The program and its provenance
This page is the public methods layer for the borrelplank program: one atlas row measured wall to wall, the pillar behind the stream post that cites it. A borrelplank is the Dutch shared drinks board; a bittergarnituur is its fried-snack cousin; both live in one coordinate of the dish atlas of D1/D3 (snack · mixed · none · sharing, a confident cell), and that row is the subject everywhere below. The claims are about the borrelplank family in the atlas, never “borrelplanken in Amsterdam”: kitchens outside the ~900-venue snapshot, and boards filed in other rows, are outside every number here.
The row holds 119 listings at 89 venues (the atlas-canonical count). One listing is a duplicate, so the census below works on 118 deduplicated items, and every zone count in this page lives on the 118. Where a statistic says dedup, chain repeats and duplicate listings have been collapsed to one row.
The program ran under the same two-layer discipline as the protein program (D8): the measurement layer froze constructions in dated journal entries before running them; the copy layer then ruled, number by number, what may print where. Two items below are labeled post-hoc (one descriptive scan, one census extension) and print under recorded rulings with that origin stated. A scoped rider on organic labels ran alongside the program; it gates nothing and produces no claims on this page. Prices are in euros, per board as sold. No venue is named.
The census, three zones
The atlas gives the row a 90% range of 9.80 to 49.40 around the 18.50 typical (partially pooled, the construction of D3). The census reads all 118 items against that band: 3 sit below the band floor, 106 in the band interior, 9 above the band top. Observed prices run 6.00 to 80.00 with a median of 18.75.
Show the code
set.seed(9)cenp <- cen %>%mutate(outside = zone !="band interior")ggplot(cenp, aes(x = price_eur, y =0)) +geom_vline(xintercept =c(9.80, 49.40), linetype ="dashed", colour ="grey50") +geom_jitter(aes(shape = outside), height =0.32, width =0,size =2.1, colour = TERRA, fill ="white", alpha =0.85) +annotate("point", x =18.50, y =-0.48, shape =18, size =3.2, colour ="grey20") +scale_shape_manual(values =c(`FALSE`=16, `TRUE`=21), guide ="none") +scale_y_continuous(limits =c(-0.6, 0.6)) +labs(x ="price (euros, per board as sold)", y =NULL) +theme_minimal() +theme(axis.text.y =element_blank(), panel.grid.major.y =element_blank(),panel.grid.minor.y =element_blank())
Figure 1: The 118 deduplicated items of the borrelplank row on the price axis. Dashed lines mark the atlas band (9.80 to 49.40); the diamond marks the 18.50 typical; open dots are the 12 items outside the band.
The compositions behind those points, genericized (the named listing stays in the internal report: item strings identify venues): the interior is dominated by the Dutch repertoire (borrelplank, bittergarnituur, cheese-and-sausage combinations), with a steady minority of imported cousins at the same prices: Italian tagliere, Spanish boards of manchego, chorizo and jamón, nacho boards, street-food and snack mixes.
Not everything called a plank lives in this row. Name-matching plank and board items across the rest of the atlas finds 218 items at 130 venues in all tiers (173 at 116 venues in confident cells): cheese boards, charcuterie and meat sharing boards, fish sharing platters, vegetarian boards. Three of those rows run above this row’s band top:
Show the code
tbc <-rd(file.path(S1, "t8_tableB_by_cell.csv")) %>%filter(n_above_bp_top >0) %>%transmute(row =c("fish sharing platters", "meat sharing boards", "mixed cheese boards"),items = n, venues,`items above 49.40`= n_above_bp_top,`top price`=sprintf("%.2f", max_eur))kable(tbc, align ="lrrrr", caption ="Plank-named rows outside the borrelplank family with items above this row's band top.")
Table 1: Plank-named rows outside the borrelplank family with items above this row’s band top.
Plank-named rows outside the borrelplank family with items above this row’s band top.
row
items
venues
items above 49.40
top price
fish sharing platters
5
4
2
75.00
meat sharing boards
5
3
2
68.00
mixed cheese boards
2
1
2
58.50
The seafood tower at 75.00 and the cheese board at 58.50 are real, and they are filed under their own names. Inside the borrelplank row itself, the name buys the repertoire; the upgrade lives under a different label.
The floor
Three items sit below the band floor (6.00 / 6.50 / 7.70); widening the floor to everything under 12 gives 8 items at 7 venues. Where those floor menus name components, the components are supermarket-recognizable: 5 of the 8 pass the frozen supermarket-recognizability rubric (one of the five is a borderline call, packaged empanadas, counted recognizable), and the other 3 name no components at all (“a small arrangement”, “a board for two”). The floor qualifier travels with the claim: it holds where the menu names components, and 3 of the 8 floor menus are silent.
The ceiling
Nine items price above the band top, at 7 venues, and the count is the finding: 6 of the 9 are one six-outlet brand’s identical 55.00 plank (genericized: trappist cheese, dried sausage, cornichons, pickled onions, herb butter, bread, olives, nuts and a sixteen-piece round of fried bites). The other 3 are one venue’s afternoon teas at 60 / 70 / 80: their strings identify an event format, not a plank, so under the program’s symmetric scope rule they stay in the census and every statistic but never serve as composition examples. The 80.00 is a booking for an afternoon, not the price of a board.
The ceiling’s vocabulary is the point. The blind rubric tagged 0 of 37 sampled items as luxury, ceiling included; the 55.00 plank’s components are themselves supermarket-recognizable. Since 2026-08-18 that read is census-complete: the addendum below extends the rubric to all 118 items and confirms the whole above-band zone luxury-free, with the row’s only two luxury-vocabulary items (truffle croquettes at 19.00; the ibérico at 30.00) sitting mid-band. Exactly one item in the row carries an ibérico token (30.00, band interior), while the corpus’s 69 ibérico items live overwhelmingly in other rows (charcuterie and meat sharing cells, meat plates). What the top of this row sells is more of the same repertoire, not a swap into a posher one. That is why the program’s wording retreated from “the priciest planks” to “the top of the band”: the frozen abundance condition was met, but a zone that is one brand plus one venue’s teas licenses a single-example sentence, not a plural claim.
The middle, and how its examples were chosen
The 106 interior items are the anchor-dark middle: at nearly the same price the menu promises very different things, and nothing in the name says which. To show compositions without cherry-picking, the example set was selected by price rank before any composition was read: the three items nearest the census median (18.75) and the two nearest each quartile, with a deterministic tie-break, event formats excluded under the same scope rule as the ceiling. The frozen rule reproduces the original picks exactly; no discretion touched the set. The seven, genericized:
Show the code
f8 <-rd(file.path(S2, "sl07_f8_deterministic.csv")) %>%filter(set =="event-format excluded") %>%arrange(match(target, c("median", "q1", "q3")), dist, osm_id)stopifnot(identical(f8$price_eur, c(18.75, 18.75, 18.50, 15.50, 15.50, 25.00, 25.00)))para <-c("farmhouse cheese, nuts, ossenworst, ham, crisp cheese croquettes, tomato-mozzarella bitterballen, meatballs, pickles, bread","a warm-and-cold mixed bittergarnituur, vegetarian on request (no components named)","a cold board: ossenworst, liver sausage, fries with mayonnaise, chicken nuggets","ossenworst and aged cheese with pickles and mustard","cheese, smoked sausage and ossenworst with bread and butter","chicken wings, dried sausage, tomato salad, cocktail prawns, serrano ham, olives, aioli, coleslaw, bread","a medium snack platter (no components named)")tibble(pick =c("nearest the median", "", "", "nearest the lower quartile", "","nearest the upper quartile", ""),price =sprintf("%.2f", f8$price_eur),`composition, genericized`= para) %>%kable(align ="lrl")
Five of the seven name real components; two are silent, and the silence is itself part of the anatomy: composition here is read from menu text, and 93 of the 118 items name at least one recognizable component (the denominator behind every composition statement on this page; the other 25 sell a board without saying what is on it). At the lower quartile the boards are Amsterdam classics of cheese and ossenworst; at the median, warm fried bites join; at the upper quartile the boards widen toward charcuterie and seafood accents. That reading is example-tier; the measured version of it is the gradient below.
What the price buys: breadth
One descriptive scan of the census was run after the verdicts were ratified, on a pre-registered instrument (frozen component-family token lists over the 118 census strings). The statistic below, families per item by price band, is a post-hoc derivation from that scan (it was not in the declared output list) and prints here under a recorded ruling with that label attached.
Show the code
fpi <-rd(file.path(S2, "hm_families_per_item.csv"))tibble(`price band`=c("bottom quarter", "second quarter", "third quarter", "top quarter"),items = fpi$n,`component families per item`=sprintf("%.2f", fpi$mean_families_all)) %>%kable(align ="lrr", caption ="Mean number of component families named per item, by quarter of the row's price axis (all 118 items; post-hoc descriptive).")
Table 3: Mean number of component families named per item, by quarter of the row’s price axis (all 118 items; post-hoc descriptive).
Mean number of component families named per item, by quarter of the row’s price axis (all 118 items; post-hoc descriptive).
price band
items
component families per item
bottom quarter
30
1.80
second quarter
28
1.86
third quarter
30
2.27
top quarter
30
3.00
The top band’s boards name about one full component family more than the floor’s (1.80 to 3.00). Combined with the ceiling’s vocabulary count, this is the row’s price mechanism in one line: price buys breadth of the same repertoire, not luxury vocabulary.
The portion pairs
Seventeen of the 118 items carry a size token (klein/groot and kin). Same venue, same board, two sizes gives five pairs; the printed form is the range: the pairs we can see run from about 1,5 to 3,2 times the small price (1.50 / 1.53 / 1.94 / 2.00 / 3.17). Five pairs sits in the range-of-examples band of the program’s pre-registered printed-form map, so no single summary number is the beat’s headline.
Show the code
p2 <-rd(file.path(S1, "t9_pass2_pairs.csv"))p2 %>%arrange(ratio) %>%transmute(`klein to groot (euros)`=gsub(" -> ", " to ", prices),ratio =sprintf("%.2f", ratio)) %>%kable(align ="lr", caption ="The five klein/groot pairs under the frozen strict token rule (pass 2). Pass 1, the reconciliation rule, finds the same five pairs at the same prices.")
Table 4: The five klein/groot pairs under the frozen strict token rule (pass 2). Pass 1, the reconciliation rule, finds the same five pairs at the same prices.
The five klein/groot pairs under the frozen strict token rule (pass 2). Pass 1, the reconciliation rule, finds the same five pairs at the same prices.
klein to groot (euros)
ratio
9.95 to 14.95
1.50
6.5 to 9.95
1.53
16 to 31
1.94
11 to 22
2.00
15 to 47.5
3.17
The reproduction note. This beat has an earlier trail: a dated internal record of July 2026 derived 19 of 119 size-token items, the same five pairs, and a median of 1,9. On the current corpus all five recorded pairs reproduce at identical prices, and the recorded median re-derives as 1.94 under both the reconstructed rule and the frozen strict rule (that number prints here only as this reproduction statement, not as the beat’s headline). The item count lands at 17 of 118 because the verbatim July token list was not preserved: a different count under a reconstructed rule is a definition change, not an erratum, and the program’s erratum bar was therefore not triggered. Both facts are on the record in the internal report.
The blind second coder
The floor and ceiling claims rest on a rubric (supermarket-recognizable components; luxury vocabulary), so the rubric was stress-tested: all 8 floor items, all 9 ceiling items and 20 random mid-band items, shuffled and price-stripped, were coded independently by a second, fully blind coder seeing only the item text. Agreement: 37 of 37 on both rubrics, including 8 of 8 on the floor set and 9 of 9 on the ceiling set (the pre-set reference bar was 80%). One design fact is disclosed with it: coder 1 built the sample and was not price-blind by construction; the print gate rests on the blind coder’s independent reproduction, which is the gate the protocol froze. The 2026-08-18 extension re-ran the same blind protocol on the remaining 81 items of the census: agreement 81 of 81 (the addendum below).
The stress-test battery
The threat
The test
The verdict
One brand’s identical plank multiplies into a citywide ceiling
dedup census + brand count of the above-band zone
6 of the 9 above-top items are one six-outlet brand; the wording retreated to “the top of the band” and single-example form
Event formats masquerade as planks
symmetric scope rule: strings naming an event format stay in every statistic, never in composition examples
the three afternoon teas carry a membership note; the 80.00 never prints as a plank fact
0 of 37 items tagged; one ibérico in the row against 69 elsewhere in the corpus
Wrong floor/ceiling calls
blind second coder on shuffled, price-stripped items
37 of 37 agreement; floor 8 of 8, ceiling 9 of 9
Cherry-picked composition examples
selection by price rank frozen before any composition was read; deterministic tie-break re-run
the rule reproduces the original picks exactly
Recorded portion facts fail to reproduce
pass-1 reconciliation against the July 2026 internal record
all five pairs reproduce at identical prices; the median re-derives as 1.94; the item-count difference is a definition change, disclosed, no erratum
Silent menus read as evidence
naming denominator disclosed
93 of 118 items name a component; floor and composition claims carry the “where the menu names components” qualifier
A post-hoc statistic dressed as confirmatory
status labels per number, print rulings recorded
the families-per-item gradient is labeled post-hoc where it prints
The sample-scope objection (why code only 37?)
pre-registered extension (2026-08-18): the remaining 81 items coded under the same rubric and blind protocol
agreement 81 of 81; census-wide 2 of 118 items carry luxury vocabulary (19.00 and 30.00), both mid-band, none above the band
Addendum (2026-08-18): the census-complete luxury read
The luxury rubric originally ran on a 37-item sample. The obvious objection, why not all of them, was raised in-house and answered by measurement: a post-hoc extension, pre-registered as a dated journal addendum before any of the remaining item texts was read, coded the other 81 items of the census under the frozen rubric, with a fresh, fully blind second coder (shuffled order, anonymous ids, no prices, no zones). Post-hoc here means the extension was proposed after a token-level sweep of the census had been seen; the pre-registration disclosed that, pinned the rubric’s two judgment calls in advance (a protected-designation cheese counts only when the designation itself is printed; oyster mushrooms never count as oysters), and recorded the expected outcome so the run could not be quietly steered.
Agreement: 81 of 81. Combined with the original sample, the whole 118-item census is now double-coded, and the row’s complete luxury harvest is 2 items: one plank whose fried assortment includes truffle croquettes (19.00) and the one ibérico board (30.00). Both sit mid-band. Nothing above the band carries a single luxury word. One boundary case is worth the record: one board names Comté, a protected-designation cheese, without printing the designation; under the pinned reading that is named-origin vocabulary, not luxury vocabulary, the same tier as the row’s manchego and coppa. The verdict above already speaks in these census-complete terms; the sample-scoped 0-of-37 statements elsewhere on this page remain true as records of the original test.
What this is, and what it isn’t
A census of one atlas row, the borrelplank family inside the ~900-venue snapshot: not “borrelplanken in Amsterdam”, and not the other plank-named rows, which are shown here only as the destination of the bigger boards.
Menu text, not plates. Composition is read from what the menu writes down; 25 of the 118 items name nothing, and no photograph or visit corrects for that.
Prices per board as sold. Portions are unobserved except where the menu itself prices two sizes (the five pairs above).
Co-occurrence, not mechanism. Why the top of the row sells breadth rather than luxury is not identified by this design.
No venue is named, and the full named mid-band listing stays in the internal report; what prints here is genericized.
Lineage
Protocol + report:docs/stream_sposts_verification_protocol.md (the frozen Part-B battery: T8, T9, T10, T10b, T11), docs/stream_sposts_verification_report.md (Stage-1 measurements; Stage-2 adjudication, ratified 2026-08-07; the d9 licensing batch of 2026-08-17 this page prints under).
Code:R/53 (Stage-1 battery, the census, pairs and selection tables), R/57 (Stage-2 checks, the deterministic selection re-run), R/72 (the component-family scan), guard _number_guard_d9.R (every printed number asserts against the output files at render).
Data:output/sposts_stage1/ and output/sposts_stage2/ tables, atop data/processed/dish_atlas*.csv.
Journal trail:2026-07-30_001 (Stage 1), 2026-07-30_002/_003 (Stage 2), 2026-08-07_001 (Part-B close, ratification, the component scan), 2026-08-17 (this page), 2026-08-18_001 (the census-complete luxury read: pre-registration and result; record output/sposts_stage2/t10c_full_row_luxury.csv).
Sources: restaurant websites (menus), OpenStreetMap (venue universe). All open data. Snapshot · June 2026.