Skip to main content

HPD Lead-Paint Resolution RULEBOOK — every violation × every option

What this is. The single authoritative operational chart: every HPD lead order, every way it can be resolved (contest / cure / dismiss / postpone × overdue / not-overdue), the documents required, the professionals, the firm + deployment that produces each, the workflow phase it lives in, and the combination scenarios grouped by initial service request.

The code twin. This doc is the human-readable mirror of domain/src/programs/nyc-lead-paint/orderRegistry.ts (ported from the pre-rebuild app under archive/src/lib/hpd/orderRegistry.ts). When they disagree, the verbatim HPD forms win and BOTH get corrected. Do not add a third rulebook. The broader domain spec is docs/HPD_SYSTEM_MODEL.md. For how projects move through the rebuilt app (Decide / Work / File / Money, who does what), see docs/PROJECT_LIFECYCLE_GUIDE.md and docs/domain/OVERVIEW.md. Phase is a label, not a gate (docs/domain/GATING.md). Honest walk-through status: docs/LIFECYCLE_ASSESSMENT.md.

Provenance (verbatim). Grounded in the HPD NOV CERT LEAD (621/622/623/625) + NOV/NOF CERT LEAD (616/617/624) cert+instructions and all six L-06 contestation forms — all read verbatim via pdftotext from …/HPD LEAD BASED PAINT Documentation/ — plus orderRegistry.ts. Last full verification pass: 2026-06-26 (every option/ground confirmed against the forms). Only Afffidavits/DOH DWS AFFIDAVIT.pdf remains unreadable (scanned — owner to re-upload/OCR).

Consolidated 2026-06-29 from HPD-MASTER-RESOLUTION-CHART.md + HPD-RESOLUTION-OPTION-MATRIX.md (those files lived under .planning/archive/, which is gone from this repo; this RULEBOOK is the surviving copy).


0. Structural model — firms, deployments, professionals, documents

App mapping (not a literal schema). "Firm" and "deployment" below are this rulebook's legal/workflow vocabulary, verified against the HPD forms — they are not literal app tables. In the rebuilt app: a firm (SEC/ABA/IND) is a tenants row (tenant_id, no firms table); a deployment (D-INSP/D-ABAT/D-DWS) is an inspections row distinguished by service_type (xrf/paint_chip/dust_wipe/abatement), carrying tenant_id directly — there is no separate deployments table. See docs/PROJECT_LIFECYCLE_GUIDE.md and §7 item 2 below.

One project → many deployments → firm per deployment

One PROJECT per unit-job → multiple DEPLOYMENTS (field work-orders) → firm + EPA license attach to the DEPLOYMENT; each generated document inherits its deployment's firm. (NOT parent+linked projects, NOT a single requires_abatement flag.) One abatement supervisor affidavit lists multiple Violation Number(s) (616s + 617s + 624s cured by one abatement) and prints the abatement firm's EPA #.

Firms (one owner, two LLCs + a selectable third party)

CodeFirmRoleEPA license
SECSecure (inspections)XRF / paint-chip / dust-wipe testinginspection EPA LBP-F251759-2 (renewed; iss 2026-05-21, exp 2029-07-25 — entered into ykeo 2026-06-29)
ABAAbated NYCabatement workabatement EPA (LBP-F269301-1)
INDIndependent third partyclearance dust-wipe (optional, COI)their own EPA

Deployments (firm + EPA attach here)

CodeDeploymentFirmWhat it doesProduces
D-INSPInspectionSECone pro/visit: XRF + paint-chip + dust-wipe testinginspection report, XRF/paint-chip affidavits, contestation testing docs
D-ABATAbatementABAthe abatement workabatement supervisor affidavit (unions all cured violation #s)
D-DWSClearance dust-wipeSEC or IND (selectable)post-abatement clearance wipes — must be independent of the abater (COI)clearance CoC + sampler affidavit + lab

Professionals

CodeProfessionalCertSigns
INSPEPA-certified Inspector / Risk AssessorEPA L/Q (40 CFR 745)inspection report, XRF affidavit, paint-chip affidavit
ABSUPLead Abatement Supervisor / Project Designer (+ workers)EPA abatementabatement supervisor affidavit
SAMPDust-wipe samplerEPA clearancesampler affidavit (date + dwelling)
LABNYS ELAP-certified laboratoryELAPdust + paint-chip lab analyses
NOTNotarynotarizes affidavits / cert / contestation
OWNOwner / managing agent / officeron HPD Property Registrationthe cert / contestation (the filer)

Document catalog (codes used below)

CodeDocumentByFirm
CERT-HCert of Correction — hazard (616-617-624 cert)OWN + NOTfiler
CERT-TCert of Correction — turnover (621-622-623-625 cert)OWN + NOTfiler
CONTESTContestation form (per-order L-06)OWN + NOTfiler
AF5Affidavit of Compliance AF-5 (overdue hazard)OWN + NOTfiler
DRDismissal Request inspection + fee (overdue hazard)OWNfiler
DISM-TDismissal request to Audit Unit (overdue turnover, no fee)OWNfiler
POST1/POST21st / 2nd postponement requestOWNfiler
INSP-RPTInspection report (EPA Inspector/RA)INSPSEC
XRF-AFFNotarized XRF affidavitINSP + NOTSEC
PC-RPTPaint-chip sampling reportINSPSEC
PC-AFFNotarized XRF + paint-chip affidavitINSP + NOTSEC
PC-LABState-lab analysis of paint-chip sampleLAB(vendor)
ABAT-AFFAbatement supervisor affidavit (§27-2056.11; start/end dates; firm contact; lists all cured violation #s)ABSUP + NOTABA
ABAT-EPAEPA cert of abatement firm + workers + supervisorsABAABA
WORK-DESCPer-room work location/description OR invoicesABAABA
DUST-LABState-lab analysis of all clearance dust samplesLAB(vendor)
SAMP-AFFDust-wipe sampler affidavit (date + dwelling)SAMP + NOTSEC/IND
SAMP-EPAEPA cert of the dust-wipe sampler (valid for sample date)SAMPSEC/IND
INSP-EPAEPA cert of the Inspector/RA (valid for inspection date)INSPSEC
COFOCertificate of Occupancy (building age ≥1960)(owner records)
LEASELease/tenancy documentation (initial lease date)(owner records)
NOVCopy of the Notice of Violation(owner records)

The abatement proof-set = ABAT-AFF + ABAT-EPA + WORK-DESC + DUST-LAB + SAMP-AFF + SAMP-EPA. It is identical whether filed as CERT (on time) or AF-5/DISM (overdue) — only the cover form changes.


1. Per-order resolution chart

"≥Nd" = must be filed N days before correct-by (registry contestLeadDays). Penalties from the forms.

HAZARD family (occupied unit) — overdue route = AF-5 + Dismissal Request + fee

KEY ASYMMETRY (verbatim). The hazard Certification of Correction has ONLY the abatement / "work completed" section — there is no Option-4 XRF-dismissal or Option-5 paint-chip section on the hazard cert. So a hazard's no-work, prove-no-LBP route runs through the CONTESTATION form (≥6d before correct-by), never the cert. The hazard cert also embeds the abatement supervisor affidavit with a "Violation Number(s) ___" union field.

616 — Presumed lead-based paint hazard

StatePathDocumentsPros / firmDeployments
not overdueContest (≥6d) — building age / exemption / 3a XRF-no-LBP / 3b XRF-inconc+paint-chipCONTEST + NOV + (COFO | nothing-for-exemption | INSP-RPT+INSP-EPA+XRF-AFF | +PC-RPT+PC-AFF+PC-LAB)OWN, NOT, (INSP for content)D-INSP (only if content ground)
not overdueCure = abate → CERT-HCERT-H + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS
not overduePostpone (≥6d)POST1 / POST2OWN
overdueAF-5 (abate, then file)AF5 + DR(+fee) + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS

XRF-negative resolves a 616 only via the CONTEST channel, never the cert.

617 — HPD-confirmed positive hazard (no content dismissal — must abate)

StatePathDocumentsPros / firmDeployments
not overdueContest (≥6d) — issuance grounds only: building age / exemptionCONTEST + NOV + (COFO)OWN, NOT
not overdueCure = abate → CERT-HCERT-H + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS
not overduePostponePOST1 / POST2OWN
overdueAF-5AF5 + DR(+fee) + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS

Same work overdue-or-not; only the cover doc changes (Cert ↔ AF-5).

624 — Inconclusive (XRF) / positive-on-ceramic-metal substrate (XRF cannot resolve — paint-chip or abate)

StatePathDocumentsPros / firmDeployments
not overdueContest (≥6d) — paint-chip-no-LBP only (L-06 624 rev 11/2025 also covers positive-on-ceramic/metal)CONTEST + NOV + PC-RPT + INSP-EPA + PC-AFF + PC-LABOWN, NOT, INSP, LABD-INSP
not overdueCure = abate → CERT-HCERT-H + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS
not overduePostponePOST1 / POST2OWN
overdueAF-5AF5 + DR(+fee) + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS

616/624 four-state shape (owner): (a) not-overdue contestable → contest; (b) not-overdue but known positive (prior standard test) → skip contest, abate → Cert; (c) contested → came back positive → abate → Cert; (d) overdue → abate → AF-5. States (b)/(c) are INSTANCE facts (prior-test result, contest outcome) with no backing data field yet — deferred to the per-option walkthrough (see §9).

TURNOVER family (vacant-unit turnover) — overdue route = Audit Unit dismissal, no fee

The turnover cert (621/622/623/625) bakes the dismissal options INTO the certification: Opt 3 = abate · Opt 4 = XRF-dismissal · Opt 5 = paint-chip-dismissal. 🔒 HARD RULE (on the form): Options #4 and #5 CANNOT be submitted for a friction surface tested positive by HPD for which an Order #617 was issued.

621 — Turnover, presumed

StatePathDocumentsPros / firmDeployments
not overdueContest (≥5d) — tenancy / building age / exemption / 4a-4b XRF / 4c paint-chipCONTEST + NOV + (LEASE | COFO | — | INSP-RPT+INSP-EPA+XRF-AFF | +PC-RPT+PC-AFF+PC-LAB)OWN, NOT, (INSP for content)D-INSP (if content)
not overdueCure → CERT-T Opt 4 (XRF-no-LBP, no work)CERT-T + INSP-RPT + INSP-EPA + XRF-AFFOWN, NOT, INSPD-INSP
not overdueCure → CERT-T Opt 5 (paint-chip)CERT-T + INSP-RPT + PC-RPT + INSP-EPA + PC-AFF + PC-LABOWN, NOT, INSP, LABD-INSP
not overdueCure → CERT-T Opt 3 (abate)CERT-T + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS
not overduePostponePOST1 / POST2OWN
overdueDismissal (same Opt 3/4/5 docs to Audit Unit)DISM-T + chosen-option doc setper optionper option

622 — Turnover, "positive" but XRF-dismissable (cert Option 4) unless an Order 617 is open

StatePathDocumentsPros / firmDeployments
not overdue, no open 617Cure → CERT-T Opt 4 (XRF-no-LBP)CERT-T + INSP-RPT + INSP-EPA + XRF-AFFOWN, NOT, INSPD-INSP
not overdue, no open 617Cure → CERT-T Opt 3 (abate)CERT-T + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS
not overdueContest (≥5d) — tenancy / building age / exemption (no content ground)CONTEST + NOV + (LEASE | COFO | —)OWN, NOT
open 617 presentOpt 4/5 BARRED → must abate → CERT-T Opt 3CERT-T + abatement proof-setOWN, NOT, ABSUP, SAMP, LABD-ABAT → D-DWS
not overduePostponePOST1 / POST2OWN
overdueDismissal (Opt 3 or 4 docs to Audit Unit)DISM-T + chosen-option doc setper optionper option

623 — Turnover, general / audit-tied (extra ground: surface condition)

Owner ruling 2026-07-13 (after the HPD-website audit): the 623 is BOTH. 621/622/625 police turnover compliance with the hazards; the 623 polices turnover compliance with the audit — HPD issues it when the occupant moved in within 10 years and the owner failed to produce turnover documents under a Record Production Order. It resolves either way: produce the 10-year turnover records, or cure it like any turnover (cert Options 3/4/5 / contest grounds below). No model change. | State | Path | Documents | Pros / firm | Deployments | |---|---|---|---|---| | not overdue | Contest (≥5d) — tenancy(<10yr of RPO) / building age / exemption / XRF / paint-chip / surface condition | CONTEST + NOV + ground docs (surface-condition = attestation; HPD may inspect) | OWN, NOT, (INSP for content) | D-INSP (if content) | | not overdue | Cure → CERT-T Opt 3/4/5 | as 621 | per option | per option | | not overdue | Postpone | POST1 / POST2 | OWN | — | | overdue | Dismissal | DISM-T + chosen-option doc set | per option | per option |

625 — Turnover, inconclusive (CONTEST route: violation surface = paint-chip ONLY. CERT route: Opt 4 negative friction XRF OK when no open 624/617 — owner ruling 2026-07-13. Cannot dismiss while paired 624 open)

StatePathDocumentsPros / firmDeployments
not overdue, no open 624Contest (≥5d) — content = (a) paint-chip on violation surface AND (b) XRF or XRF+paint-chip on all OTHER friction surfacesCONTEST + NOV + PC-RPT + PC-LAB + INSP-RPT + INSP-EPA + PC-AFF/XRF-AFFOWN, NOT, INSP, LABD-INSP
not overdue, no open 624/617Cure → CERT-T Opt 4 (negative friction XRF, no work — owner ruling 2026-07-13; the X-550 reads a definitive negative where HPD's Pb200i was inconclusive)CERT-T + INSP-RPT + INSP-EPA + XRF-AFFOWN, NOT, INSPD-INSP
not overdueCure → CERT-T Opt 5 (paint-chip) or Opt 3 (abate)CERT-T + (PC set | abatement proof-set)per optionD-INSP or D-ABAT→D-DWS
open 624 presentdismissal BLOCKED → resolve 624 first
not overduePostponePOST1 / POST2OWN
overdueDismissalDISM-T + chosen-option doc setper optionper option

Penalties (per the forms): 621 $250/day≤$10k · 622 $250/day≤$10k · 623 $1500/violation · 625 $250/day≤$10k.

RECORDS / LL31 / LEGACY — no field testing/abatement (records or owner-side)

618 / 619 / 620 — RPO records audit (overdue → Audit Unit, no fee)

StatePathDocumentsPros / firmDeployments
anyRecords production → cert (618-619-620 cert)RPO record set: turnover-vacancy + annual-notice + visual-investigation + safe-work-practices sample formsOWN (records)none (no field firm)

626 — Local Law 31 (5-yr XRF testing violation)

StatePathDocumentsPros / firmDeployments
anySubmit 5-yr XRF inspection report to Audit Unit (626 cert)INSP-RPT (positive + negative surfaces) + INSP-EPA + (XRF-AFF if tested after Aug 9 2020)OWN, INSPD-INSP

555 (AF-3) / 614 — legacy

StatePathDocumentsPros / firmDeployments
555AF-3 (work before Aug 1 2004)AF-3 affidavit + dust-wipeOWN, SAMP, LABD-DWS
614Abateabatement proof-setOWN, ABSUP, SAMP, LABD-ABAT → D-DWS

2. The five resolution "shapes" (what drives deployments/workflow)

Every path collapses into one of five shapes — this is what the per-option walkthrough builds:

ShapeDeploymentsField prosDoc engine outputWorkflow phases
S1 — Contest (non-content) building age / exemption / tenancy / surface-conditionnonenone (owner records)CONTEST + NOV + COFO/LEASEintake → docs_qa → billing
S2 — Contest/Dismiss by XRF (presumed surfaces; turnover Opt 4)D-INSPINSPCONTEST or CERT-T + INSP-RPT + INSP-EPA + XRF-AFFintake → scheduling → field → docs_qa → billing
S3 — Contest/Dismiss by paint-chip (inconclusive; Opt 5)D-INSPINSP, LAB+ PC-RPT + PC-AFF + PC-LABintake → scheduling → field → docs_qa → billing
S4 — Abate (positive / overdue hazard / blocked turnover)D-ABAT → D-DWSABSUP, SAMP, LABCERT/AF-5/DISM + abatement proof-setfull pipeline
S5 — Records only (RPO / LL31)none (or D-INSP for 626)(INSP for 626)record set / XRF reportintake → docs_qa → billing

Overdue shifts the shape: an overdue hazard (616/617/624) can no longer contest → forced to S4 (abate) + AF-5 + fee. An overdue turnover keeps its cheapest shape (S2/S3/S4) but files a dismissal to the Audit Unit (no fee) instead of a cert.


3. Reusing existing XRF data — the big efficiency (owner, 2026-06-26)

When Secure already ran a full XRF inspection (LL31, prior turnover, initial inspection), the component-level readings persist. A later violation on specific components does NOT require a new field visit — we regenerate a violation-scoped subset of the stored XRF report = a "limited contest XRF report", covering STRICTLY the HPD-cited components. So XRF (S2) can resolve to ZERO deployments when prior data covers the cited components. Paint-chip (S3) is NEVER reused — lab data is immutable (chain of custody), so paint-chips are always FRESH with violation-specific room + component descriptions.

Action-level check for UPLOADED third-party reports (owner ruling 2026-07-13): all of OUR reports were taken at the 0.5 standard (the firm began testing after LL66 took effect), so no check is needed on our own data. But when a client uploads an XRF report from ANOTHER company, validate the report's action level at upload: a pre-Dec-2021 report tested at 1.0 cannot support an exemption (retest at 0.5 required), and its "negatives" between 0.5–0.9 are positives today. Old 1.0-level reports DO still satisfy the LL31 testing requirement itself.

Per-reading routing:

  • negative (reusable) → regenerate limited XRF report, no visit.
  • inconclusivefresh paint-chip (S3) — XRF can't resolve.
  • positive on a metal / ceramic substratefresh paint-chip (S3) — XRF can be a false positive on metal/ceramic (what the 624 form rev 11/2025 now explicitly covers).
  • positive on any other substrate (wood/plaster/etc.) → genuine positive → abate (S4).
  • partially covered (cited component never XRF-tested) → go back (supplemental D-INSP) with a manual override to add the reading into the CSV; merge into the one limited report.

Dates + signatures (HARD — HPD needs wet-signed originals):

  • the limited contest report carries the ORIGINAL inspection date (when readings were taken);
  • the XRF affidavit gets the CURRENT date + a fresh WET signature every filing — never reprinted;
  • the Inspector EPA cert must have been valid on the original test date.

HPD location grammar → derived violation fields + human reconciliation

HPD hazard descriptions are a nested positional address, parseable into structured fields:

"1st WINDOW FRAME FROM WEST AT NORTH WALL IN THE 2nd BATHROOM FROM EAST LOCATED AT APT 6C, 6th STORY, 1st APARTMENT FROM NORTH AT EAST"

FieldValue
component_typeWINDOW FRAMEfeeds friction-surface classification
component_ordinal / from_dir1st / WEST
wallNORTH
room_type / room_ordinal / from_dirBATHROOM / 2nd / EAST
apartment / story6C / 6
apartment_ordinal / from_dir / at_dir1st / NORTH / EAST

Grammar: building → apartment-position (ordinal-from-dir + at-side) → story → room (ordinal-from-dir) → wall → component (ordinal-from-dir) + a compass orientation to render.

Reconciliation is a HUMAN step, structure-assisted. Secure's report uses colloquial labels ("living room – door to switch"); HPD uses the positional address. The app supplies the derived fields

  • compass so the match is fast, then re-labels the reused reading to the violation's description in the limited contest report. The orig↔vio reading match stays human-in-the-loop.

4. Contest grounds — verbatim-confirmed vs orderRegistry.contestGrounds

Every L-06 contestation form read 2026-06-26. The numbered grounds on each form (owner-facing walkthrough checklists) and the registry mapping — all six already match the live forms:

OrderForm (rev)Numbered grounds on the formRegistry contestGrounds
616L-06 (616) 7/20211 building age (≥1960 +CofO) · 2 HPD exemption · 3a XRF-no-LBP · 3b XRF-inconclusive+paint-chipbuilding_age, exemption, content_xrf, content_paintchip ✅
621L-06 (621) 6/20241 tenancy (moved in <8/2/2004) · 2 building age · 3 exemption · 4a XRF unit · 4b XRF-friction-neg + others-no-peeling/smooth · 4c XRF-inconclusive+paint-chiptenancy, building_age, exemption, content_xrf, content_paintchip ✅
622L-06 (622) 6/20241 tenancy · 2 building age · 3 exemption — NO content groundtenancy, building_age, exemption ✅ (622 XRF route is cert Opt#4, not contest)
623L-06 (623)1 tenancy (<10 yrs of RPO date) · 2 building age · 3 exemption · 4a/4b XRF · 4c paint-chip · 5 surface conditiontenancy, building_age, exemption, content_xrf, content_paintchip, surface_condition ✅
624L-06 (624) 11/2025paint-chip-no-LBP only (also covers positive-on-ceramic/metal substrates)content_paintchip ✅
625L-06 (625) 6/20241 tenancy · 2 building age · 3 exemption · 4 content = (a) paint-chip on violation surface (XRF NOT acceptable there) AND (b) XRF/XRF+paint-chip on all OTHER friction surfacescontent_paintchip ✅ (xrfClearable:false correct)

617: issuance-grounds-only contest (building_age, exemption — no content); registry matches.


5. Combination scenarios (grouped by initial service request)

One PROJECT per unit-job; multiple orders cited together split into bundles by their cheapest cure (owner rule: contest/test before abate — abatement is the expensive last resort). Blocker rules re-route the cheap path to abatement when a paired positive/inconclusive hazard is open.

#Cited orders (same unit)Bundles → shapeDeploymentsNotes
C1616 aloneS2 (XRF) or S1 (age/exemption) or S4 (abate)D-INSP, or D-ABAT→D-DWSowner picks cheapest viable
C2617 aloneS4D-ABAT → D-DWSno dismissal possible
C3624 aloneS3 (paint-chip) or S4D-INSP, or D-ABAT→D-DWSXRF can't resolve
C4621 aloneS2/S3/S4per optionturnover, no fee if overdue
C5622 alone (no 617)S2 (XRF Opt 4) or S4D-INSPthe corrected case — XRF-dismissable
C6622 + 617622→S4 (blocked), 617→S4D-ABAT → D-DWSone ABAT-AFF unions both #s
C7616 + 617 (classic co-issue)616→S2 (XRF), 617→S4D-INSP and D-ABAT→D-DWSsplit: contest/XRF the 616, abate the 617
C8625 + 624625 dismissal blocked, 624→S3/S4D-INSP or D-ABAT→D-DWSresolve 624 first
C9616 + 621 (hazard+turnover presumed)both S2D-INSP (one visit)one inspection clears both
C10multi-unit / multi-order abatementall S4 → one D-ABATD-ABAT → D-DWSone ABAT-AFF lists every cured violation # (the union)
C11RPO (618-620) + a hazardS5 + (S2/S4)none + per optionrecords bundle independent
C12all overdue hazardsall S4 + AF-5 + feeD-ABAT → D-DWSdismissal-request inspection

Clearance-firm selection (D-DWS): whenever a project has a D-ABAT it needs a D-DWS, and the D-DWS firm is selectable (SEC or IND) — it must be independent of whichever firm performed the abatement for the clearance to be valid (28 RCNY: "third-party, independent of the owner and any individual or firm that performs the work"). Default = SEC unless the owner picks IND — but since SEC also holds abatement capability (owner 2026-07-13), if SEC performed the abatement, SEC cannot wipe that job: use IND. LL31-test practice rule (owner 2026-07-13): contract the LL31 XRF test as a STANDALONE engagement; contract any abatement separately, only after results exist — the §27-2056.4(a-1)/28 RCNY §11-04(b) tester bar is "not the owner/agent/any contractor hired to perform remediation," judged at test time, so a bundled test+fix engagement is the one edge to avoid.


6. HPD Open Data field contract (everything keys on this)

Source = HPD Violations wvxf-dwi5 (filter bin, daily) via sync-hpd-violationspublic_events.

HPD fieldpublic_events columnLogic use
ordernumberorder_numberthe rulebook (616–626) → shape/firm/docs
originalcorrectbydate / newcorrectbydateoriginal_correct_by_date / new_correct_by_date; correct_by_date = new ‖ originaldeadline engine reads the EFFECTIVE date
originalcertifybydate / newcertifybydate / certifieddate*_certify_by_date / certified_datecert vs AF-5 timing
currentstatusid (+ status/date)current_status_id, status_norm, status_detailopen/closed/dismissed; postponement = status id 6 granted / 7 denied OR new≠original
novdescriptiondescription (+ raw)parsed → location/component fields (§3 grammar)
apartment / story / classapartment / story / class_codeunit linkage, severity

Not an HPD field: substrate (ours, from the XRF CSV) and the parsed location fields (derived).


7. What's encoded vs pending (build status)

  1. orderRegistry corrections — ✅ APPLIED: 622 → surfaceStatus:'presumed', xrfClearable:true, cureMethods:['xrf_negative','abatement_dustwipe'], contentContestable:false, keep blockedByOpen:['617']; 625 blockedByOpen:['624']. deriveServiceKey honors blockedByOpen (622+open-617, or 625+open-624 → forced abatement bundle). 18/18 logic assertions green. 1b. orderRegistry 625 correction — ⚠ PENDING (owner ruling 2026-07-13, NOT yet in code): mirror the 622 fix one family down: 625 → xrfClearable:true, add 'xrf_negative' to cureMethods, keep blockedByOpen:['624'] (contest grounds stay paint-chip-only per the L-06 625 form — the XRF route is the CERT Opt #4, not a contest ground, exactly like 622). Until applied, the app under-offers the 625 XRF-clear path. hpdAdapter / documentValidationRules re-derive once the registry changes.
  2. deployments entity — ✅ RESOLVED, not pending. Owner decision "Contradiction 13" (supabase/migrations/20260821080900_inspections.sql, 2026-08-21) rejected a standalone deployments/firm_id join in favor of folding it into inspections: project_id, service_type (xrf | paint_chip | dust_wipe | abatement) is the deployment type, tenant_id (→ SEC/ABA/IND's tenant row) is the firm attach point. No firms table exists in this rebuild. Auto-splitting one inspection per tenant/service and unioning ABAT-AFF violation numbers across collaborating tenants are still manual (see docs/PROJECT_LIFECYCLE_GUIDE.md §7, §11).
  3. Per-option document bundle = pick the shape (S1–S5) per violation × chosen path → emit the exact doc codes from §1. The multi-violation union (Phase 14.7) already unions doc types; this adds the per-shape content + the union ABAT-AFF.
  4. Instance states still needed for 616/624 four-state (known-positive / contested-positive): a violation-instance field (prior standard-test result + contest outcome) — to add when the walkthrough is built.

Open owner inputs that touch this rulebook

  • Renewed SEG inspection EPA number (replaces LBP-F251759-1) → §0 firm table + plan 16-05.
  • Re-upload DOH DWS AFFIDAVIT.pdf (only unreadable source form).
  • DOH NOV / COTA abatement in scope? (a whole intake class not yet modeled here.)