# Attribution allowlist — every rendered clause that credits an authority or
# asserts a rank, across the four disjoint scenarios in
# tests/test_invariant_output.py, in all four formats.
#
# Format:  KIND | citation | normalised clause (digits collapsed to N)
#
#   CITED    a document, and a year / round / section. The gate additionally
#            requires a digit in the citation, so "CDFI Fund guidance" alone
#            will not pass — a year, section or number must appear.
#   HOUSE    this tool's own judgement. The gate does NOT require a digit, but
#            the RENDERED text must say so on its face; an allowlist entry
#            claiming HOUSE while the document reads as a Fund figure is the
#            defect, not the fix.
#   PLACEHO  inside bracketed [CDE TO COMPLETE] / [NARRATIVE PLACEHOLDER]
#            guidance — marked on its face as instruction, not assertion
#   LABEL    a bare column or row label containing a trigger word
#
# NO ENTRY IS MARKED "PROVENANCE UNVERIFIED" ANY MORE, AND THAT IS THE POINT.
# Six were, in the first version of this file. A primary-source pass on those
# six established that the publication they cited — a "CDFI Fund NMTC Program
# Annual Report, FY2018-FY2023" — DOES NOT EXIST, that the Fund publishes no
# jobs-per-QEI figure in any denominator, and that no distribution exists to
# make 20.0 a "top quartile". The rendered text was relabelled as this tool's
# own screening bands, so those six clauses no longer render at all and their
# entries are gone. They were not re-cited and not downgraded to HOUSE — the
# claims were withdrawn. See nmtcapp/data/schema.py.
#
# NO ENTRY READS "DOCUMENT RETRIEVABLE, CONTENT NOT LOCATED" ANY MORE EITHER.
# Three did, all three for the distress-level definitions. That queue is now
# closed, and closing it found a defect worse than the missing citation.
#
# The rendered text read:
#
#     "Deep distress = poverty rate >30% or unemployment >1.5x national
#      average. Severe distress = LIC plus additional qualifying factors."
#
# Those thresholds are real. They are the CDFI Fund's definition of SEVERE
# distress, printed under the label DEEP. Verified by opening the Fund's own
# NMTC LIC Eligibility workbook — the .xlsb this package downloads and loads —
# and reading columns O and P verbatim:
#
#     Column O. Severe Distress
#         "Severe distress=LIC AND (Poverty>30%; MFI<=60%;Unemployment>=1.5)"
#     Column P. Deep Distress
#         "Deep distress=LIC AND (Poverty>40%; MFI<=40%;Unemployment>=2.5)"
#
# AMENDED IN 1.2.1. The first version of this note cited "columns 14 and 15".
# Those are the 0-BASED POSITIONAL INDICES of the two columns in the data
# sheet's header row. The Fund's own NOTES sheet labels them "Column O. Severe
# Distress" and "Column P. Deep Distress", and a reader who opened the workbook
# at columns 14 and 15 would land on N and O — the unemployment ratio and
# severe distress — and conclude the quotation was wrong. A citation-precision
# defect inside the text round nine added to fix a citation defect. The same
# 0-based citation was live on the published docs site at
# docs/reference/data-sources.md and is corrected there too; note that the docs
# fix does not reach gh-pages without a manual `mkdocs gh-deploy`.
#
# So the tool had the two tiers' thresholds swapped, dropped the median-family-
# income limb from both, dropped the "AND LIC" term from both, and attributed
# the result to "CDFI Fund NMTC Program guidance and the NMTC Allocation
# Application Review Process" — neither of which carries that wording. A CDE
# reading the old note was told a 32%-poverty tract is "deep distress"; the
# Fund's deep-distress bar is 40%.
#
# The classification DATA was never wrong — distress_level comes from these same
# workbook columns via nmtc-mapper. Only the printed definition was. That is its
# own lesson: correct data under an incorrect legend is still a wrong document.
#
# Cite the file you actually load. It is more retrievable than the prose
# document describing it, and it is the thing the numbers came from.

PLACEHO | Wrapped continuation of the [NARRATIVE PLACEHOLDER] block. Reclassified from CITED in 1.2.0: it is guidance addressed to the CDE about what to write, not a figure, and the claim about reviewer emphasis was never located in a Fund document. N2 misses it only because the PDF extractor wraps the line away from its opening bracket. | cdfi fund reviewers score on specificity, evidence, and alignment with
PLACEHO | Wrapped tail of INVESTOR_TABLE_NOTE, a [CDE TO COMPLETE] block. Names the Fund as the audience a CDE must defend a row to. | cdfi fund, and delete any row you cannot.] (see attachment: investor commitments table)
PLACEHO | Inside the has_prior_reporting_issues [CDE TO COMPLETE] block. A statement about the Fund's own recordkeeping, in guidance addressed to the CDE, not a figure in the CDE's voice. | do not omit this — the cdfi fund holds prior
LABEL | Column header in the Section B distress-documentation table. Names an ACS field; the value beneath it renders 'See ACS'. Claims nothing. | median family income
LABEL | 'tiers' here names the two levels the Fund's own workbook defines; the clause states a structural fact about both definitions (each requires LIC) and claims no rank. | both tiers additionally require the tract to be a low-income community.
HOUSE | The clause NAMES the CDFI Fund only to disclaim it: the credit price and the CDE fee rate are this model's market assumptions and the sentence says so in the same breath. The statutory figure in the same note — the 39% credit rate over 7 years — is cited to IRC §45D(a)(2) inline. Added 1.2.1 when the methodology appendix moved to renderers/_methodology and gained the credit rate, which through 1.2.0 was the one deal-economics figure with no attribution anywhere in the document. | assumed credit price $N/credit and cde fee N% of qei are market assumptions of this model, not cdfi fund parameters.
HOUSE | Wrapped continuation of the same disclaimer. | assumptions of this model, not cdfi fund parameters.
PLACEHO | Inside the Section E [CDE TO COMPLETE] block added in 1.2.1 L-5. The sentence above it used to promise "details on each prior award, including states served, sectors financed, and outcomes achieved" and print it over rows reading "States: N/A. Sectors: N/A." — neither field is collected by this tool's CDE profile scaffold. This clause names the Fund as the party that asks for the two fields, in guidance addressed to the CDE about what to add, not as a figure in the CDE's voice. | the cdfi fund's section e asks for both and this tool does

# --- FIX-3: the Section B BASIS NOTE, which names the Fund in order to state
#     that no share this package renders answers its commitments -----------
CITED | CY 2024-2025 NMTC Program Review Process, 'Targeting Areas of Higher Distress (Question 25)': 'at least 85% of its QLICIs in specified areas of severe distress and/or areas characterized by multiple indicia of distress ... at least 20% of its QLICIs to "Deep Distress" areas'. Downloaded and text-extracted; the document contains no 'FAQ #79', which is what the two entries this replaced in 1.2.1 used to cite. FIX-3 restored the Fund's own words, INCLUDING 'of its QLICIs', because the rendered line's subject is that the commitment's denominator is not the one this package computes. | basis note — the cdfi fund's two distress commitments are measured on qlicis, not on qei
CITED | CY 2024-2025 NMTC Program Allocation Application, Question 25, printed pp. 38-41 (PDF 65-68), retrieved 2026-08-17 (1,525,626 bytes, 142 pp.) and text-extracted locally with pypdf. Q25(a) verbatim: 'Will the Applicant commit to providing at least 85% of its QLICIs (in terms of aggregate dollar amounts) in areas that are either: (1) characterized by at least one of items 1-5 on the list for each QLICI; or (2) characterized by at least two of items 6-12 on the list for each QLICI?'. Items 6-12 are read off printed pp. 39-40 (PDF 66-67). 1.3.0 S1 REPLACES the FIX-3 entry, which quoted the seven-page Review Process correctly and inherited both of its omissions: that the 20% is the top rung of a 0/5/10/15/20 ladder rather than a bar, and that Question 25(b) covers four area types. Both omissions instructed a CDE to UNDERSTATE its own qualifying share to a federal agency - the first false negative in this package | basis note — the cdfi fund's two distress commitments are measured on qlicis, not on qei:** question N of the cy N-N nmtc allocation application (printed pp.
HOUSE | This package's own behaviour, checkable in its source: intelligence/distress_analysis.analyze_distress_concentration divides qei_request and never reads qlici_amount, and qlici_amount reaches only tables/pipeline_table.py (the 'Total QLICI ($)' column of Appendix A) and validation/consistency_check.py (the QLICI <= QEI rule). The clause names the Fund only to say what this tool does NOT compute for it, which is a statement about this package, not a figure credited to the Fund. 1.3.0 S1: 'no figure above' became 'no figure in this document' when the note moved out of Section B's table and onto the Excel Summary Dashboard as well | nmtc-application-builder computes neither qlici-denominated figure — it reads this pipeline's qlici amounts only to print them in appendix a and to check that each is no larger than its qei — so no figure in this document answers either commitment, and none may be presented to the cdfi fund as doing so.
CITED | CY 2024-2025 NMTC Program Allocation Application, Question 25, printed pp. 38-41 (PDF 65-68), retrieved 2026-08-17 (1,525,626 bytes, 142 pp.) and text-extracted locally with pypdf. Q25(a) verbatim: 'Will the Applicant commit to providing at least 85% of its QLICIs (in terms of aggregate dollar amounts) in areas that are either: (1) characterized by at least one of items 1-5 on the list for each QLICI; or (2) characterized by at least two of items 6-12 on the list for each QLICI?'. Items 6-12 are read off printed pp. 39-40 (PDF 66-67). 1.3.0 S1 REPLACES the FIX-3 entry, which quoted the seven-page Review Process correctly and inherited both of its omissions: that the 20% is the top rung of a 0/5/10/15/20 ladder rather than a bar, and that Question 25(b) covers four area types. Both omissions instructed a CDE to UNDERSTATE its own qualifying share to a federal agency - the first false negative in this package | targeted populations) or by at least two of items N-N (N% poverty / N% median family income / Nx unemployment;

# --- FIX-4: the same two clauses, after 'verbatim' became 'quoted ... with
#     spacing normalised for legibility' ------------------------------
CITED | CDFI Fund NMTC LIC Eligibility workbook (NMTC_LIC_Eligibility_2016_2020.xlsb), sheet '2016-2020', columns O and P (NOTES sheet: 'Column O. Severe Distress', 'Column P. Deep Distress'), quoted verbatim: 'Severe distress=LIC AND (Poverty>30%; MFI<=60%;Unemployment>=1.5)' and 'Deep distress=LIC AND (Poverty>40%; MFI<=40%;Unemployment>=2.5)'. Read directly off the .xlsb this tool downloads and loads, not off a secondary description. Replaces the three CONTENT NOT LOCATED entries this file used to carry. FIX-4: the rendered sentence introduced these with the word 'verbatim' and no longer does. The workbook holds 'Severe distress=LIC AND (Poverty>30%; MFI<=60%;Unemployment>=1.5)'; the document renders a space either side of the '=' and after the second ';' — three insertions per line, six across both. Every threshold, operator and separator is the workbook's, and the quotations themselves are byte-unchanged by that fix; only the claim made about them changed, to 'quoted ... with spacing normalised for legibility'. | distress levels (quoted from the cdfi fund nmtc lic eligibility workbook,
CITED | CDFI Fund NMTC LIC Eligibility workbook (NMTC_LIC_Eligibility_2016_2020.xlsb), sheet '2016-2020', columns O and P (NOTES sheet: 'Column O. Severe Distress', 'Column P. Deep Distress'), quoted verbatim: 'Severe distress=LIC AND (Poverty>30%; MFI<=60%;Unemployment>=1.5)' and 'Deep distress=LIC AND (Poverty>40%; MFI<=40%;Unemployment>=2.5)'. Read directly off the .xlsb this tool downloads and loads, not off a secondary description. Replaces the three CONTENT NOT LOCATED entries this file used to carry. FIX-4: the rendered sentence introduced these with the word 'verbatim' and no longer does. The workbook holds 'Severe distress=LIC AND (Poverty>30%; MFI<=60%;Unemployment>=1.5)'; the document renders a space either side of the '=' and after the second ';' — three insertions per line, six across both. Every threshold, operator and separator is the workbook's, and the quotations themselves are byte-unchanged by that fix; only the claim made about them changed, to 'quoted ... with spacing normalised for legibility'. | distress levels (quoted from the cdfi fund nmtc lic eligibility workbook, N–N acs, columns o and p — the file this tool loads to classify every tract;
HOUSE | This package's own behaviour, checkable in its source, and it names the CDFI Fund only to say which of ITS OWN fields the Fund's table populated. integrations/nmtc_mapper_adapter.enrich_pipeline_eligibility assigns project.distress_level from the mapper result (guarded by _determinate_distress) and assigns project.is_high_migration_rural through _prefer_determinate, whose mapper value WINS over the CDE's declaration; it never assigns is_native_area or is_us_territory, and the comment block above that call says so. A CDE's own distress column is read into the separate field declared_distress_level and rendered as '(CDE-declared, not verified)' by PipelineProject.distress_display. 1.3.0 B2: this clause replaced a blanket 'three CDE-declared and tool-unverified flags for NMTC Native Areas, High Migration Rural Counties and U.S. territory', which understated the tool inside the sentence written to end understatement - the audit executed it and found native rendered as unknown while HMR rendered from the mapper. Stated per field now, and deliberately NOT in the other direction: claiming verification this package does not perform would be the worse defect. | severe distress and deep distress: tool-verified — the distress level is read from the cdfi fund eligibility table for the tract this package geocoded, and a cde's own distress column is kept separately and labelled cde-declared wherever it is shown.
