Silencing the Span

Agentic population model

Every noise figure in this repository is attached to a place. Every population figure is attached to a polygon. Those two cannot honestly be multiplied together, because exposure is neither — it is what accumulates along a path: dose = ∫ noise(position(t)) dt. The cohort model supplies dt and has no position(t) at all. This model is an attempt at the missing term.

It is a demonstration of mechanism, not a measurement of DUMBO. Nothing here is evidence about how loud anywhere is. Read the two red panels before quoting any number off this page.

The finding this model was built to show

Two people can follow the same itinerary, leave ninety seconds apart, and receive materially different noise doses — because whether you are on the waterfront path at the moment a train crosses is a matter of timing, not of geography.

That is a race condition in the precise sense: the outcome depends on the interleaving of two independent schedules, one of which (the trains) is published to the second and the other of which (a person's walk) is not. A cohort model cannot represent it, because a cohort has a duration but no clock position. Averaged over a long enough exposure the effect washes out. Over a single visit — which is what a tourist has, and what the Louisville survey says lasts about two hours — it does not.

Same plan, staggered starts

Dose spread across start offsets

Run the model

Run state
Commons observer

A standing agent with no vote. It reports externality on populations the simulation does not contain, which is the only reason a model like this is worth building rather than merely watching.

Event log — the run is reconstructable from this alone

Results of the last run

Dose distribution across groups

Each group's accumulated A-weighted sound exposure over its whole visit, converted to an equivalent continuous level. The spread inside a single persona is the race condition; the offset between personas is the itinerary.

By persona
By place — where the person-seconds actually accumulate

Who is standing in it

Every number above is a level or a duration. Neither says anything about whose ear it arrived at. A person with hyperacusis, an eighty-year-old with recruitment, a baby in a pram and a dog on a lead are all, to the model so far, one unit of exposure each.

The dose is not weighted, and it never will be on this page. The obvious move is a per-class penalty in decibels — add a few dB for a sensitive listener and report the result as their exposure. That would be a fabricated dose–response wearing the costume of a measurement, and it would be the more dangerous for looking like arithmetic. Sound pressure is a property of the air. It does not change because of who is standing in it.

That is enforced rather than promised. Class membership is drawn from its own random stream, so switching this layer on leaves the dose of every group whose itinerary it did not change bit for bit identical — checked group by group, not in aggregate. The groups whose dose does move are the ones now walking a dog, and they move because they genuinely go somewhere else, which is a change of itinerary and not a change of physics. The check is visual-review/verify_agent_model.js, and it has already caught three real defects in this page.

One sentence above was too strong, and the check that enforces it found out.
“The groups whose dose does move are exactly the ones now walking a dog”
That is withdrawn. At a population of 400 the harness found a group with an identical persona, an identical itinerary and an identical arrival time whose dose moved by 0.97 dB when this layer was switched on. It had not changed. Someone else had. Nineteen groups were rerouted to the dog run, one of them out of a place that was at capacity, and the group that had been turned away from that place was no longer turned away — so it stayed 1,100 s longer, somewhere quieter, and its dose fell.

That is the race condition this model was built to demonstrate, arriving unannounced in its own verification output. The rule still holds in the form that matters — no decibel anywhere is multiplied by anything about a person — but the weaker claim that the layer is separable from the dose is false once capacity is modelled. Occupancy is a shared resource, and a shared resource couples strangers to each other. The test now distinguishes the two: a dose may move only if the group's re-plan count moved with it, and a dose that moves with the same plan, the same arrival time and the same re-plan count is a desynchronised random stream and fails the build.

Exposure by class, this run

Classes overlap on purpose: membership is drawn per person, so one person can appear in two rows. Summing this column double-counts. The “any class” row is the only correct total, and it is produced by the draw rather than by addition.

Who chose to be there

The one question an agent model can answer that a cohort model cannot. A cohort has an exposure; it does not have an itinerary, and so it cannot be asked who picked the route.

Where the classes accumulate

The number that would answer this, and why it cannot be computed

The natural way to say what this noise does to a sound-sensitive person is a threshold. Audiology has one: the loudness discomfort level, the point at which a sound is reported as uncomfortably loud. For normal-hearing listeners without a tolerance problem it averages around 100 dB HL across the audiometric frequencies, and hyperacusis is commonly marked at 90 dB HL or below. The MTA measured 98.90 dB(A) peaks at the dog run. Those two numbers are begging to be compared.

They are not in the same units, and the conversion needs a measurement nobody has taken. Hearing level is referenced to audiometric zero at each frequency, measured with pure tones under headphones. A-weighted sound pressure is broadband, free-field, and weighted by a single fixed curve. Going from one to the other requires the reference threshold at each frequency and the spectrum of the actual sound. This repository has no third-octave spectrum for this source — its own field protocol calls the assumed spectrum the largest fabrication in the corpus. So the comparison is refused here rather than performed badly.

That refusal is the most useful thing on this page, because it converts a vague call for “more data” into one specific missing measurement. A third-octave spectrum of a pass-by is the thing standing between this model and a defensible statement about a sound-sensitive listener — and it is a capture that has already been specified, costed and left undone. It is capture C1 in this programme's field protocol, and the desk work that would follow it is Method 43.

It will not give a clean verdict even then. A headphone threshold and a free-field broadband exposure are different measurements, so the defensible output is a bracket with its assumptions named — and a bracket that straddles the measured peak would be as informative as either clean result.

How people arrive, and whether it matters

Everyone in this model walks in through one of four gateways — the York Street F platform, the High Street A/C platform, the Brooklyn Bridge walkway, or Fulton Ferry Landing — drawn per persona, with the exit sampled independently. So arrivals were never all from one place. They were, however, at a perfectly constant rate, and that is a description of nothing that has ever happened at a subway station.

A false comment, quoted and withdrawn.
“Arrival is a Poisson-ish trickle spread over the first three quarters of the window”
The line underneath it contained no random draw of any kind. It admitted floor(pop × t / window) groups — a deterministic ramp, which is not Poisson-ish but perfectly regular, the one thing arrivals never are. That is withdrawn. The arrival process is now explicit and selectable, and the default has moved from the ramp to Poisson.

A subway door is a starting gun. Nobody trickles out of a train: the doors open and a slug of people climbs the stairs together, walks the same way at the same time, and wants the same bench. So a third process models arrivals at the two gateways that have a door, in slugs on the feeder line's headway, while people who walked over the bridge or stepped off the ferry keep the Poisson process — because there is no gun for them.

The three processes, run against the same seed

Group i is the same group under all three: same persona, same party size, same itinerary, same susceptibilities. Only the moment it walks in changes, because the schedule is built from its own random stream. The diff is therefore a diff of timing and of nothing else.

Takes a few seconds, and resets the view afterwards.
The answer, over twelve seeds, paired run against run. Bursts do what they should: peak arrivals per minute go from 14.0 under the ramp to 31.5 under Poisson to 40.0 under train doors — a 2.9× increase in bunching. And the dose does not move. The paired burst-minus-Poisson difference in mean dose is +0.006 dB (sd 0.025), with a largest single-seed difference of 0.047 dB.
Those were not the first numbers published here, and the first ones were misleading.
“peak arrivals per minute go from 14.0 … to 58.9 under train doors — a 4.2× increase in bunching … the paired difference in mean dose is +0.001 dB
Every one of those figures was measured correctly, and not at this page's settings: the twelve-seed run behind them was executed with the stair-climb spread tightened to 0–10 s, which is the adversarial end of the sensitivity sweep and not the default of 25–150 s. Presenting them without saying so invited a reader to check the figures against the button above and find different ones. That is withdrawn and replaced by the default-configuration run in the block above. The tightened run is kept, as what it always was:

An adversarial check, not the headline. Re-running the same twelve seeds with the stair spread tightened to 0–10 s — a whole train reaching the street almost at once, which is physically impossible — pushes bunching to 58.9 per minute, 4.2× the ramp, and the paired dose difference falls to +0.001 dB with a worst seed of 0.037 dB. Making the burst as sharp as it can possibly be does not make it matter. That is a stronger result than the default run, which is why the two are reported separately rather than averaged.

That null has a mechanism, which is why it is reportable rather than merely observed. Arrival time sets a group's phase against the train cycle, and phase can only matter if the visit is comparable to the headway. It is not. Weekday daytime headway on the bridge is 58 s, and even the shortest-dwell tenth of the population is in the corridor for a median of about 430 s — roughly seven crossings. Shifting phase moves that by at most one crossing in seven, and across a population it cancels.

Crowding is the exception, and it is a real one. Contention events rise from a base of about 58 per run to 68 under train doors — a paired difference of +10.3 (sd 6.5), positive in eleven of twelve seeds. People who arrive together compete for the same bench at the same moment, which is exactly what a burst should do. So the arrival process is irrelevant to the quantity this page exists to compute, and relevant to the one it computes as a side effect.

This bounds a worry that has been near the top of the weaknesses list since the model was built. “The arrivals are invented” was true and is still true — but for the dose it is now invented within 0.05 dB, which is far below every other uncertainty on this page. It would stop being true for anyone whose time in the corridor approached the headway, and nothing in DUMBO produces that: the corridor takes minutes to cross at any pace.

The noise field, and the propagation model that was rejected

The obvious way to give every point on the map a sound level is a propagation model: take the track as a line source, attenuate with distance, done. That was tried first. It was rejected, and the reason is worth more than the model would have been.

What the MTA actually measured
Distance does not order these measurements. The DUMBO Archway sits directly underneath the structure. Brooklyn Bridge Park's Main Street section is a few hundred metres away. The park is 7.1 dB louder on peak level. A line-source model fitted to the near sites and extended to the park under-predicts the measured level by roughly 17 dB. For the park reading to be consistent with simple distance decay, it would have to be about seven metres from the track centreline, which is not a position that exists.
And the fit that looked good was an artefact. The three near-bridge sites do lie within 0.15 dB of ideal line-source spreading, which is a seductive result. It is not a result. Their positions were digitised by eye from street addresses, and a sensitivity test says that with only ±10 m of position error the fitted decay exponent ranges from about 0.7 to 22.3 — that is, from “no decay at all” to “steeper than a point source”. The data cannot constrain a propagation model. The apparent agreement is coincidence, and reporting it as a finding would have been exactly the failure this programme has already committed five times.

So the field below carries no physics. It is inverse-distance interpolation between the measured anchors, computed in the energy domain because energy is what adds, with the train contribution switched by the published headway. It is a way of moving a plausible number around a map so that timing and route can be studied. It is not a noise map of DUMBO and must never be reproduced as one.

One design consequence survives all of this. Whatever the mechanism, the quietest measured public space is the one directly under the deck and the loudest is the open park with a clear line of sight to the structure across water. Under-deck treatment — the intervention most often proposed, including in the 2025 residents' petition — would therefore be applied where the measured problem is smallest. That is a testable and consequential claim, and it is cheap to settle: one afternoon with a meter and a tape measure.

Schemas

Four object types. They are printed here in full because the schema is the argument: it fixes what the model can represent and, more importantly, what it cannot.

Place

      
Persona

    
Scenario — an itinerary archetype

      
Group — the unit that actually moves

      
Sensitivity — who is standing in the dose

    
The group, not the person, is the agent. A family of four walks as one object: it chooses once, dwells once, and is exposed once. This is why the model reports groups spawned and people represented as two different numbers, and it is the single most consequential simplification on this page. It is defensible for exposure — four people standing together receive the same level — and indefensible for anything involving individual choice, which is why no such thing is modelled.
The personas
The susceptibility classes, and what each rate is actually a rate of

Two ratings, because two things are being claimed. Prevalence is how well established the share is in the population it was measured in. Applies here is whether the same share walks through DUMBO, and it is 1/5 for every row without exception, because nobody has ever counted who is in this corridor by any attribute at all. A flat national rate is knowably wrong in places whose whole purpose selects for a class — a dog run, a playground, the residential blocks at Farragut Houses — and it is wrong in a different direction at each of them.

The itinerary archetypes
The places

How the engine works, and why it is built that way

The tick has four phases

1. OPEN      the clock advances; arrivals spawn
2. PERCEIVE  groups read visible state; no writes
3. ACT       groups emit intents; buffered, not applied
4. RESOLVE   engine applies intents in a fixed
             order and writes the event log

A group may not observe another group's action from the same tick. Actions taken in tick n become visible in tick n+1. This removes order-dependence between agents, which is the precondition for the run being reproducible at all.

Contention is resolved deterministically

Places have capacity. When more groups want a bench, a cafe table or a viewpoint than it holds, the engine resolves intents in ascending group_id — never arrival order, never insertion order, never the order the array happens to be in. A group that loses is re-routed to another place of the same kind that still has room, and emits place.contended. If nothing of that kind has room it abandons the slot and moves on.

This is the literal race condition, and it is deliberately made boring: a real one would be a bug. The interesting race is the one against the train timetable, which no amount of careful scheduling removes.

Every reasoning agent has a deterministic twin

Everything on this page is the twin. It makes the same shape of decisions as a language-model agent would — pick a scenario, pick places matching it, re-plan when blocked — with zero model calls, so the whole run is a pure function of the seed. A model-backed variant is specified in the repository and is deliberately not shipped here: an artifact that produces different answers on every load cannot be checked by a reader, and this programme's entire method is that a reader can check it.

Capability is a ladder, not a flag

Five separate policies rather than five options on one policy, so that what each layer adds can be read off by running them against the same seed and diffing the result. Switching rung re-runs from the same seed for exactly that reason.

A correction to that claim, which was false until this version.
“what each layer adds can be read off by diffing runs at the same seed”
The group sub-seed included the rung. Diffing two rungs at one seed therefore compared two different random samples rather than the same people under a richer policy, so the diff measured resampling as much as it measured the policy. The rung has been removed from the sub-seed and the ladder is now genuinely paired. This changes the numbers every rung reports. No claim elsewhere in this repository rests on them — the figures on this page are computed in the reader's own browser and are never quoted as findings — but the change is stated rather than absorbed.

Seeded and idempotent

The same seed, day type, hour, population and rung produce a byte-identical event log. Sub-seeds are derived per group, so changing the population size does not reshuffle the groups that were already there.

Where this model is likely to be wrong

  1. The noise field is interpolation, not propagation. Four measured points, no physics between them, no buildings, no shielding, no reflection, no ground effect. A propagation model was attempted and rejected as unconstrainable; interpolation is not an improvement on it, it is an admission.
  2. The map is schematic. Positions were digitised by eye from addresses and public maps. No survey, no GIS layer, no measured geometry. The sensitivity test in the noise section applies to every distance on this page, not only to the anchors.
  3. Itinerary archetypes are invented. “Quick photo stop”, “full tour”, “tour and a meal” and the rest are plausible and unmeasured. No origin-destination survey of DUMBO pedestrians exists in this repository or, as far as the community evidence audit could establish, anywhere public.
  4. Dwell distributions are transferred. The visitor figures come from a park in Louisville, Kentucky. They are real, published and stratified by residency — and they are about a different park in a different city on a different river.
  5. Group size is a distribution, not an observation. Nobody has counted party sizes in DUMBO.
  6. Walking speed is uniform within a persona and does not slow in crowds, at kerbs, at the Archway, or on the stairs from the Brooklyn Bridge walkway — all of which are real and all of which would lengthen exposure.
  7. Indoor attenuation is a flat offset. Real facades vary by tens of decibels, and the one indoor measurement in the record is from a building whose occupants had already paid privately to isolate it.
  8. Nobody reacts to the noise. Groups do not leave early, cross the street, cut a visit short or decline to come back. If the noise changes behaviour — and the resident testimony in the community evidence audit says it does — then this model understates the harm by construction, because avoidance is a cost that never appears as exposure.
  9. The population totals are inherited from the cohort model, and that model cannot identify its own cohort labels. Errors there propagate here unchanged.
  10. Arrivals are Poisson, not the measured curve. The turnstile and origin-destination work in this repository produced an hourly arrival profile for York St and High St. This model does not use it: the arrival rate is set so that every visit finishes inside the run, and only the arrival structure is modelled. What that costs is now bounded rather than guessed — across twelve paired seeds, moving from the flattest possible arrivals to the burstiest moves the mean dose by 0.006 dB and never by more than 0.047 dB. So the rate matters for the mix of personas present at a given hour, and the structure does not matter for the dose at all.
  11. The feeder headways are invented, and the stair-climb spread is invented. Both are rated 1/5. The feeder headways are one constant away from being measured — bridge_schedule.py already computes exactly this and has only ever been pointed at the four bridge routes. The stair spread has no route to measurement short of standing at a fare gate with a stopwatch. Neither is load-bearing for the dose, because the sensitivity sweep tightened the spread to two seconds and the answer did not move; both are load-bearing for the crowding result, which is the one quantity that does respond to bursts.
  12. An hour is not a day. The run models a single hour at a single headway. Nothing here spreads a population across a day, so the model cannot say anything about how exposure accumulates for someone who is in the corridor at several different times — which is every resident.
  13. It has not been validated against anything. There is no observation of DUMBO pedestrian movement to validate it against. Until there is, agreement between this model and any other quantity in the repository is agreement between two assumptions.
  14. Every susceptibility share is a national rate applied flat to a corridor. The prevalences are real and most are well established in the populations they were measured in. Nothing establishes that the same shares walk through DUMBO, and the places most worth asking about are precisely the ones that select for a class: a dog run selects for dogs, a carousel and a lawn select for prams, and the residential blocks at Farragut Houses have an age structure nobody here has looked up. The flat rate is therefore wrong at every one of those places and wrong in a different direction at each.
  15. The dog rate is the weakest input on the page, and its documentation contradicts its own constants. The schema below records “near zero for anyone arriving by subway”, on the sound reasoning that the MTA requires a dog to travel in a container, so dogs in the corridor are overwhelmingly walked from home rather than carried off a train. The constants attached to the three subway-ingress personas are 0.02, 0.04 and 0.01 — between one group in a hundred and one in twenty-five. That is not near zero. If the true rate is nearer 0.2%, as a resident's recollection of a year of daily riding suggests, the comment and the constants disagree by up to a factor of twenty. The number is not being changed here, because there is nothing to change it to. Replacing one unmeasured constant with another unmeasured constant chosen to match the prose would make the page self-consistent and no more true, and it would destroy the visible disagreement that is currently the most useful thing about this input. It is registered as Method 45, which costs nothing and rides along with a commute somebody is already taking. It drives every dog-hour reported on this page.
  16. There is no exposure–response function anywhere in this layer, and its absence is the finding rather than a gap to be filled later. The model can say who was standing there and for how long. It cannot say what that did to them, because the unit conversion required is blocked on a third-octave spectrum this programme has never measured.
  17. Class membership is drawn independently per person, so the model treats being over 65 and living with a history of cancer as unrelated events. They are not: the classes correlate strongly with each other and with age in the real population. The any-class total is therefore biased, and the sign is knowable — independent draws spread membership across more distinct people than reality does, so the any-class figure is an over-estimate and the double-membership figure an under-estimate.
  18. Nobody in this model is prevented from coming at all. If the noise is why a parent does not take the pram under the bridge, or why a handler drives to a quieter run, then the classes most sensitive to it are the ones most likely to be missing from the corridor entirely — and this page would report that as low exposure rather than as exclusion. That is the same avoidance blind spot listed above, and it bites hardest exactly here.

Ratings. Measured sound levels 5/5 — MTA's own instrumented sessions. Train headway 5/5 — MTA GTFS. Anchor positions 2/5 — digitised by eye. Noise field between anchors 1/5 — interpolation with no physics. Itineraries, group sizes, walking speeds 1/5 — invented. Visitor dwell 4/5 for Louisville, 2/5 as a transfer to Brooklyn. Susceptibility prevalences 4/5 in the populations they were measured in, 1/5 as a statement about who is in this corridor. The share of groups that bring a dog 1/5 — reasoned from a transit rule, not counted. Feeder-line headways at York St and High St 1/5 — plausible timetable intervals, one constant away from being computed from the GTFS tooling already here. Stair-climb dispersal 1/5 — invented, and swept rather than asserted.

Part of the DUMBO rail-noise research programme. Frequency dashboard · 3D model · Acoustic demo · Overview