The companion primer reads a single filing six ways. This
is the other half: every signal laid out as a specimen — its
exact predicate, its anchor, its scope, the privacy gate that binds
it, and whether it fires today or waits on a helper. Each one is a
rule computed from a structured public field. Not a scrape. Not
an inference.
Source NYC DOB NOW filings (70 columns)Type ReferenceDrafted 10 June 2026Status Proposal — pending review
21
new signals proposed
16
fire deterministically today
5
pending a small SQL helper
26→47
catalog size, before & after
The 70-column dob_now_filings table exposes
structural transformation, workflow state, cost detail, expediter
identity, and spatial fields. None of these signals requires new
ingestion — every field already sits in the deployed table.
Sixteen of the twenty-one fire deterministically against existing
columns; the other five wait on a borough cost threshold or a
median-helper. Casting the existing and proposed
fields from text to integer is the only computation the structural
signals need.
The catalog organizes signals by what they are anchored to
— the property where the filing lands, the applicant or filing
representative who moves it, the spatial cluster it joins, or the
workflow clock it runs against. Each specimen below carries its
definition in plain language, its predicate in the engine’s own
terms, and a single representative reading. Every signal in the full
proposal carries Consumer/tenant, Homeowner/neighbor,
Investor/developer, Professional, Journalist/researcher, and
Civic/societal lenses; only the sharpest is reproduced here.
Live — fires today Pending — needs a helpercommercial commercial actors onlyuniversal no privacy gatelicensed licensed filing reps
Read this sheet plainly
A building permit is the moment a project becomes public —
before a sale comes through, before a wall comes down. NYC
publishes these filings daily, and almost nobody reads them. Each
filing carries dozens of structured fields. A signal is just
one rule run against one of those fields: when the rule is true, the
filing means something. This sheet is the full list of rules.
What is it
A named, repeatable test against the
dob_now_filings feed. Same field, same
logic, every property in NYC — not a scrape, not a guess.
Why it reads
The dot tells you if it fires
today (green) or waits on a small SQL helper (amber). The tags
tell you what it attaches to — a property, a filing rep,
a block — and who is allowed to see it.
How to use it
One signal is a fact. Two or three on the same property
are a thesis. The three combinations near the foot of the
sheet are where the edge lives.
Fig. iAnatomy of a filing · the fields a signal reads
One filing, the fields a signal reads from. The
deltas — existing against proposed units,
stories, height — are the sharpest fields in the dataset, and the
ones most platforms never touch. The four families below are organized
by which of these fields a signal is anchored to.
01
Property-anchored
Fires on the filing event itself · 13 signals
These fire on the permit itself — not
gated on a prior deed, the way the catalog’s older
permit_after_acquisition was. The moment intent, scale,
and timing become public, the signal evaluates.
Fig. iiReading what the building becomes · six transitions
Each transition is deterministic — it
reads the unit count, story count, height, or a yes/no flag, with no
cost-tier judgment required. The arrow is the delta between
existing and proposed. Green grows, oxblood
subtracts; unit_destruction is the sharpest displacement
warning in the public record.
Fig. iiiReading cost the right way · calibrated to the local median
The common mistake is a national dollar threshold:
a $75K alteration in Manhattan is noise; the same filing in the
Bronx is a substantial project. The ladder is set against the
trailing-12-month median for that borough and that
job type, so it moves with the market. The top two bands —
alteration_major and cost_outlier_high — are
the two signals on this sheet still waiting on the median helper.
new_building_filed
propertycommercial onlylive
A New Building job type — someone has decided this parcel is buildable now.
dob_now_filings.job_type = 'New Building'
Investor / developervisible competitive intelligence; read with recently acquired it reveals the acquisition thesis, with long held the moment a long-term holder decided to act.
demolition_filed
propertycommercial onlylive
A Demolition job type — the existing structure is worth less than the cleared lot.
dob_now_filings.job_type = 'Demolition'
Consumer / tenantif the demo is for your building and not a partial, the displacement timeline starts here — weeks or months before the work begins.
permanent_removal
propertycommercial onlylive
The work includes the permanent elimination of part of the building — units, structures, or systems.
Civic / societaloften the cheapest path to net new units in already-dense neighborhoods; aggregated, a counter to “we built nothing.”
unit_destruction
propertycommercial onlylive
Proposed dwelling units fall below existing — the sharpest tenant-protective signal in the catalog. The filing declares units being eliminated as part of the work.
Consumer / tenantdirect displacement risk for occupants of those units; lead time means weeks to months to engage counsel, organize, or plan instead of finding out at the door.
vertical_addition
propertycommercial onlylive
Proposed stories exceed existing — the building is growing taller, the parcel’s unused vertical capacity being used.
Homeowner / neighboradjacent buildings growing taller affects views, light, and shadow months before work is visible — the filing is the first moment to engage at community board.
legalization_request
propertycommercial onlylive
An owner surfacing previously unpermitted construction — illegal units, additions, or use changes — for legalization.
dob_now_filings.request_legalization = 'Yes'
Journalist / researchera spike in a neighborhood often correlates with enforcement pressure or impending rezoning.
assembly_use_filed
propertyuniversallive
A place-of-assembly use — bar, club, event space, place of worship, or large-gathering venue.
place_of_assembly = 'Yes' OR temporary_place_of_assembly = 'Yes'
Homeowner / neighborfoot traffic, noise, and late-night activity may follow; lead time for community-board engagement on liquor or special-use applications.
support_of_excavation_filed
propertycommercial onlylive
Major foundation work — significant structural or subterranean change, often the moment an expansion goes from concept to construction.
dob_now_filings.support_of_excavation = 'Yes'
Homeowner / neighborexcavation is the noisiest, longest, most disruptive phase — the lead-time signal months before the heavy equipment arrives.
multi_scope_filing
propertycommercial onlylive
Four or more of the work-type flag columns evaluate truthy on a single filing — a gut renovation, not a single-trade fix.
Investor / developercombined work types approximate the scope of investment more reliably than the owner-declared cost field, which is frequently understated.
little_e_filed
propertyuniversallive
An environmental restriction declared — site contamination, remediation context, or environmental-control commitments.
dob_now_filings.little_e = 'Yes'
Civic / societalthe aggregate map is the closest the city comes to publishing a real-time brownfield index.
progress_inspection_required
propertycommercial onlylive
DOB requires ongoing inspection — the work has an elevated risk profile.
Investor / developeruseful for evaluating construction risk on acquisitions during the work-in-progress phase.
alteration_major
propertycommercial onlypending
An Alteration whose cost clears a borough-calibrated threshold — a major project, not a minor fix.
job_type = 'Alteration'
AND initial_cost::numeric >= {borough_threshold}
Investor / developerweighted on the cost dimension; same audience map as multi_scope_filing.
Pending — borough thresholds need calibration. Sqitch change alteration-cost-thresholds (a borough × job_type → threshold lookup, refreshed quarterly). Est. half a day.
cost_outlier_high
propertycommercial onlypending
Declared cost at least five times the median for its borough and job type over the trailing twelve months — anomalous capital concentration.
initial_cost::numeric
>= 5 × median(initial_cost) FOR (borough, job_type)
over trailing 12 months
Journalist / researcheroutlier filings are story candidates, particularly when the owner entity is in the news or on a watch list.
Pending — median-helper not built. Sqitch change permit-median-helpers, function permit_cost_median(borough, job_type, window_days). Est. one day.
02
Applicant · Filing-rep-anchored
A dimension parallel to the existing applicant signals · 3 signals
The filing rep is its own intelligence layer.
Reps carry a DOB Registration Number, so the licensed gate
applies — and the rep is often more identifiable than the
owner behind an opaque LLC.
expediter_concentrated
filing-replicensed onlylive
The same filing rep appears on thirty or more filings in the trailing twelve months — who is moving work through DOB quickly.
count(filing_rep_business_name) >= 30
over trailing 12 months
Investor / professionaluseful for hiring decisions and as competitive intelligence — whose filings are stacking up reveals where capital is being deployed.
expediter_specialty_dominant
filing-replicensed onlylive
Seventy percent or more of a rep’s trailing-12-month filings are a single job type — a specialist.
max(share by job_type) >= 0.70
over a rep's trailing-12-month filings
Investor / professionalthe same reading as specialty_dominant for applicants — concentration signals deep expertise in one work class.
filing_rep_owner_paired
filing-rep × ownercommercial onlylive
The same rep-and-owner pair appears on five or more filings in the trailing twenty-four months — a repeated business relationship.
count(filing_rep_business_name, owner_business_name) >= 5
over trailing 24 months
Journalist / researcheroften the thread that leads behind an opaque LLC owner — the filing rep is frequently the more identifiable party.
Where the unit of analysis is not a single
parcel but a cluster — the block, the NTA, the
community district. Two of the four wait on the same median-helper
as the cost outliers.
permit_velocity_high
blockcommercial onlypending
Filings on a block in the trailing ninety days run at four times the borough median — capital concentrating onto one block.
count(filings on (borough, block)) over 90d
>= 4 × borough_median
Investor / developerconfirmation if you’re already invested; a contrarian flag if you’re considering entry late.
Pending — median-helper not built. Sqitch change permit-median-helpers, function permit_count_per_block_median(borough, window_days).
permit_velocity_zero
neighborhooduniversallive
No filings at all in a neighborhood over the trailing twelve months — a disinvestment indicator.
count(filings in neighborhood) over 12m = 0
Civic / societalmay warrant intervention — targeted infrastructure investment, or community-land-trust acquisition while prices are low.
nta_construction_pulse
neighborhood (NTA)universallive
Filings within an NTA over the trailing ninety days, surfaced as an ordinal rank — the busiest and quietest neighborhoods.
rank NTAs by count(filings) over trailing 90 days
Investor / developera mid-resolution market-activity index — coarser than block-level, finer than borough-level.
cd_inspection_concentration
community districtuniversallive
Ten or more progress-inspection-required filings in a single community district over ninety days — where DOB is paying close attention.
count(progress_inspection_requirement = 'Yes'
per community_board) over 90d >= 10
Civic / societaluseful for evaluating whether elevated inspection correlates with elevated violation rates or just elevated project complexity.
04
Temporal · Workflow
Property-anchored, read against the workflow clock · 3 signals
A filing carries a chain of dates —
filed, approved, first permit, signoff, current status. The deltas
between them are signals of their own: freshness at one
end, distress at the other.
filing_to_permit_lag_long
propertycommercial onlylive
More than 180 days between filing and first permit — complex work, or bureaucratic friction.
Civic / societalaggregated, a measure of permitting bottleneck — DOB throughput by job type, neighborhood, or filing characteristic.
recent_signoff
propertycommercial onlylive
Work signed off within the last ninety days — the building is newly stabilized and ready for re-marketing.
signoff_date >= now() - interval '90 days'
Consumer / tenantin a residential context, recent signoff often precedes re-marketing at higher rents — a lead-time signal for lease-renewal posture.
pending_signoff_stalled
propertycommercial onlylive
Approved but not signed off, with no status change in over a year — the closest workflow-distress signal in the permit system.
approved_date IS NOT NULL
AND signoff_date IS NULL
AND current_status_date < now() - interval '365 days'
Investor / developercombined with open_violations or tax_lien, often signals owner financial difficulty mid-project.
05
Combination
Multi-source · a self-join across the feed · 1 signal
The single highest-value combination signal.
It formalizes a pattern operators look for informally — a
demolition with no follow-through — as a deterministic
predicate no public platform surfaces.
cleared_lot_stalled
propertycommercial onlylive
A demolition filed more than 180 days ago on a BBL, with no New Building filing on the same BBL since — a stuck project.
demolition_filed on BBL >= 180 days ago
AND NOT EXISTS (new_building_filed
on same BBL since the demolition)
Read three waysopportunistic acquisition target to the developer; vacant-lot eyesore and possible upzoning catalyst to the civic reader; a property-value and public-safety concern to the neighbor next door.
On sourcing. Every signal here is computed from a field that
already sits in the deployed dob_now_filings
table — verified against the schema, not guessed. No new
ingestion. The single highest-value signal is
unit_destruction: the sharpest
tenant-protective permit signal available, sourced from a field that
no other publicly known NYC real-estate platform surfaces. The
catalog’s “same records, used differently” framework
only delivers on the protective side when signals like that one ship.
This page describes a proposal pending review — the
sixteen live signals can ship as catalog rows with no data-layer
engineering; the five pending wait on the two small SQL helpers named
above.