ADR-004: Legally-Scoped Data Tenancy
On this page
Status
Accepted
canopy-reporting authorized as a restricted-data consumer for the T-MSIS / CMS-416 federal extracts, scale audit epic &73, #1250) — which adds canopy-reporting to the isolation map (person-level T-MSIS HIPAA PHI, minimum-necessary; CMS-416 held de-identified) with its own IRS Pub 1075 §4 / HIPAA access-audit log + ADR-014 chain-v2 retention. The Decision text and isolation map are byte-unchanged; see Amendment 1.
income_as_pct_fpl is not FTI-derived as-built, conditional on the IEVS estate staying IRS-free and no #785/#810 FTI write-back (#1257); snap_qc_universe confirmed non-restricted as held, with the sourcing boundary for any future population made normative (#1258)). See Amendment 4.
Context
Eligibility systems depend on automated data matches from federal sources to verify applicant-reported information. These data sources are not interchangeable: each is authorized by a specific statute for specific programs and purposes, and each carries enforcement mechanisms — including criminal penalties — for unauthorized use.
The relevant sources for Canopy are:
| Source | Authorizing Statute | Authorized Programs | Governing Compliance Framework |
|---|---|---|---|
IRS Federal Tax Information (FTI) |
IRC §6103(l) |
TANF (§6103(l)(7)), Medicaid (§6103(l)(12)), CHIP (§6103(l)(12)) |
IRS Publication 1075; on-site IRS audit |
SSA SOLQ/BINDEX |
Social Security Act §1137 |
SNAP, TANF, Medicaid, CHIP |
Computer Matching Agreement (CMA); CMPPA oversight |
USDA IEVS (state wage, UI, SSA income) |
Food and Nutrition Act §11(e)(8) |
SNAP |
FNS audit; 7 USC §2020(e)(8) |
DHS SAVE (immigration status) |
PRWORA §121 |
All programs (immigration screening) |
DHS data use agreement |
SSA Death Master File |
Social Security Act §205(r) |
All programs |
SSA data use agreement |
FDSH (Federal Data Services Hub) |
ACA §1413 |
Medicaid, CHIP, Marketplace |
CMS data use agreement |
The question is how to structure data storage and access controls to satisfy all of these frameworks simultaneously within a single system.
Decision
Each federal data source is isolated to the program service(s) statutorily authorized to use it. No data from a restricted source is replicated to, queried by, or visible to any service that is not an authorized consumer.
The isolation map:
| Service | Restricted sources held |
|---|---|
|
FTI (IRC §6103(l)(7)), SSA SOLQ/BINDEX (TANF CMA) |
|
FTI (IRC §6103(l)(12)), FDSH hub data, HIPAA-scoped clinical data |
|
IEVS data (state wage, UI, SSA income via IEVS), SSA SOLQ/BINDEX (SNAP CMA) |
|
SAVE (shared, all programs), SSA Death Master File (shared, all programs); raw match responses held transiently, not persisted beyond the verification request lifecycle |
Each program service with FTI exposure implements independent FTI audit logging that satisfies IRS Publication 1075 §4 requirements:
-
Every FTI access is logged with: user ID, timestamp, purpose code, data elements accessed, originating system
-
FTI audit logs are stored in a separate schema within the program service database, not in the shared
canopy-securityaudit log -
FTI audit logs are retained for the period specified in the applicable SORN and Pub 1075 (minimum 5 years; corrected to 7 years, Pub 1075 AU-11 — see the ADR-041-era retention amendment; #1363)
-
FTI audit log access is restricted to authorized personnel and IRS auditors
-
canopy-security’s wildcard event subscriber does NOT receive events containing FTI fields; program services scrub FTI from event payloads before publishing to `canopy.events
Rationale
IRS Publication 1075 is non-negotiable
IRS Pub 1075 requires that FTI be:
-
Stored in systems with documented access controls
-
Accessed only for authorized purposes
-
Logged at the individual access level
-
Protected by physical or logical isolation from non-authorized systems
-
Subject to IRS on-site inspection
A shared database or shared audit log containing FTI alongside non-FTI data is not prohibited per se, but it requires the entire shared system to be subject to Pub 1075 controls — including IRS audit authority over the entire system.
By isolating FTI to canopy-tanf and canopy-medicaid, Canopy limits IRS audit scope to those two services.
The SNAP service, the worker portal, and the applicant portal are outside Pub 1075 scope by design.
Computer Matching Agreements require demonstrable isolation
CMAs under the CMPPA require that matched data be used only for the authorized purpose stated in the agreement. SSA audits CMA compliance. If SNAP-authorized SSA data and TANF-authorized SSA data share a database, demonstrating compliance with both CMAs simultaneously becomes complex. Per-program isolation makes each CMA independently auditable.
IEVS data cannot commingle with non-SNAP uses
7 USC §2025(e) prohibits use of IEVS data for purposes other than SNAP administration. If IEVS data resides in a shared database accessible to Medicaid or TANF program logic, even incidentally, this creates a compliance exposure. `canopy-snap’s isolated database ensures IEVS data is physically unavailable to non-SNAP services.
Event bus scrubbing
The canopy.events RabbitMQ exchange is subscribed to by canopy-security via wildcard.
This means every event published to the exchange is captured for audit purposes.
Program services must therefore ensure that events published to canopy.events contain no restricted data fields — only IDs, status codes, timestamps, and non-restricted metadata.
The determination object (per ADR-002) satisfies this requirement: it contains the outcome of restricted data processing, not the restricted data itself.
Alternatives considered
Alternative 1: Unified compliance database with column-level encryption All program data in one database; FTI columns encrypted with program-specific keys. Rejected because column-level encryption does not satisfy Pub 1075’s access logging requirement at the granularity IRS expects, and a DBA with key access defeats the isolation.
Alternative 2: Shared compliance database with separate FTI schema One PostgreSQL instance, FTI in a separate schema with separate roles. Rejected because a single PostgreSQL instance means a single superuser can access all schemas. IRS auditors are not satisfied by role-based controls at the schema level when the underlying server is shared.
Alternative 3: Hardware Security Module (HSM) for FTI encryption
HSM-encrypted FTI in a shared database.
Not rejected outright — this approach can satisfy Pub 1075 but at significant infrastructure cost and complexity.
Per-service isolation achieves equivalent compliance posture with lower operational overhead.
HSM integration may be revisited for canopy-tanf if required by a future Pub 1075 audit finding.
Consequences
-
Each program service with FTI exposure maintains a second audit log table alongside the main application tables. This table is populated directly by the service, not via the event bus.
-
`canopy-security’s wildcard subscriber remains the system of record for non-restricted audit events. FTI audit logs are separate and reported separately to IRS.
-
Event payloads must be reviewed before publication to ensure no restricted fields leak to the event bus. This is a documented coding convention enforced in code review.
-
Federal audits (IRS, FNS, SSA, CMS) are conducted per-service. Canopy’s architecture enables this; coordinating simultaneous multi-agency audits is an operational concern, not an architectural one.
-
New federal data sources added to Canopy must be accompanied by an assessment of authorized use and assigned to the correct service before implementation begins.
Amendment 1 — canopy-reporting authorized as a restricted-data consumer (T-MSIS / CMS-416) (scale audit epic &73, #1250, 2026-07-27)
Status unchanged (still Accepted; amendments extend, they do not supersede). The 2026-07-25 scale-readiness
audit (epic &73) and ADR-001 Amendment 1 §B8
surfaced a shipped compliance gap: canopy-reporting already persists person-level T-MSIS PHI at rest
(services/canopy-reporting/migrations/20260409000000_tanf_medicaid_reporting_tables.sql,
medicaid_tmsis_eligibility_extracts.person_id) yet is entirely absent from this ADR’s isolation map (§Decision),
which forbids restricted data being "replicated to, queried by, or visible to any service that is not an authorized
consumer" (§Decision). ADR-001 Amendment 1 §B8 named this amendment the hard prerequisite (blocker) for the
T-MSIS + CMS-416 PHI-extract children (#1250). This amendment closes the gap by authorizing canopy-reporting as a
mapped restricted-data consumer, scoped to those two federal extracts and minimum-necessary, with its own Pub 1075
§4 / HIPAA audit log, chain-v2 retention, encryption at rest, and a least-privilege role.
This amendment governs data tenancy only. The Decision section (the isolation-map table and the FTI-audit-logging
bullets, §Decision) and the Context source table (§Context) remain byte-immutable — the amendment extends the map,
it does not edit it; the canopy-reporting entry below is a mirror row. Every control clause is normative
(MUST/SHALL), not as-built: canopy-reporting today has no access-audit log (only API-layer JWT RBAC), no
encryption at rest, and a broad shared DB role. The implementation (the audit-log schema + chain-v2 family
attachment, the restricted role, encryption at rest, the audited export path) is a filed implementation child, not
this doc.
Settled decisions
-
The person-level T-MSIS extract is HIPAA PHI; CMS-416 as held is de-identified aggregate (not PHI). All Medicaid program data is HIPAA PHI (ADR-001 A1 §B8), so the person-level
medicaid_tmsis_eligibility_extractstable is a PHI holding; the CMS-416 extract, by contrast, persists only de-identified aggregate age-band counts (noperson_id, no income — 45 CFR 164.514), reading person-level DOB only transiently at extract time.canopy-reportingis authorized to hold the persisted T-MSIS extract snapshot (not merely transient reads) because a federal submission is a point-in-time record that must stay reproducible and auditable, and the ADR-001 A1 §B7report_runsmodel is inherently snapshot-based. -
Governed under the stronger IRS Pub 1075 §4 control set (FTI-derived-or-PHI). Medicaid is a §6103(l)(12) FTI consumer and the persisted row carries
income_as_pct_fpl(a MAGI-methodology figure that is potentially FTI-derived — MAGI can draw on IRS income; Pub 1075 treats FTI-derived data as FTI), so — fail-safe pending the #1257 provenance determination — reporting’s holdings are governed under Pub 1075 §4, which subsumes HIPAA minimum-necessary + audit. Classification relaxes to PHI-only only if #1257 confirms no exported T-MSIS field is FTI-derived; the mandated controls are identical either way. (Resolved 2026-08-25: #1257 confirmed no exported field is FTI-derived as-built — relaxed to PHI-only, conditionally; see Amendment 4.) -
The controls are normative, not as-built — the byte-level (audit-log schema, chain-v2 family, restricted role, encryption, export audit) is a filed implementation child cross-linking the ADR-014 chain-v2 substrate (#1246).
-
Scoped strictly to T-MSIS / CMS-416 (the #1250 fix direction). The ADR-001 A1 §B8 non-PHI extracts (FNS-388 / ACF-199 / FNS-7176-QC, over non-restricted derived data) are unchanged; the
snap_qc_universeIEVS-touchpoint classification is tracked as a separate issue, not folded in here. (Resolved 2026-08-25: #1258 confirmed non-restricted as held — Amendment 4.)
The reporting restricted-data tenancy contract (children own the byte-level)
The isolation-map entry this amendment adds (a mirror of the §Decision table structure; that table itself is unchanged):
| Service | Restricted sources held |
|---|---|
|
HIPAA PHI — person-level Medicaid eligibility/enrollment extract for the T-MSIS federal universe
( |
A1 — Isolation-map entry (the authorization). canopy-reporting is an authorized restricted-data consumer for
the T-MSIS and CMS-416 federal extracts, per the mirror row above. This closes the ADR-001 A1 §B8 gap (a shipped
person-level PHI table held by an unmapped service).
A2 — HIPAA PHI is an explicit restricted class. The person-level T-MSIS extract is HIPAA PHI (all Medicaid program data is HIPAA PHI, ADR-001 A1 §B8); this makes explicit what §Decision holds only implicitly via `canopy-medicaid’s "HIPAA-scoped clinical data". CMS-416 as held is de-identified aggregate (45 CFR 164.514), named for extract-scope completeness, not as a PHI holding. The §Context source table is not edited — HIPAA is a compliance framework, not a new data source.
A3 — Governing framework: Pub 1075 §4 (FTI-derived-or-PHI). Because Medicaid is a §6103(l)(12) FTI consumer and
income_as_pct_fpl is MAGI-methodology-based and potentially FTI-derived (provenance pending #1257), reporting’s
holdings are — fail-safe — governed under the Pub 1075 §4 control set (the superset of HIPAA’s
minimum-necessary + audit obligations), authorizing reporting as a downstream holder of FTI-derived Medicaid data.
#1257’s provenance determination MAY relax the classification to PHI-only; the mandated controls (A6–A8) do not
change. (Resolved 2026-08-25: relaxed to PHI-only per Amendment 4, conditional on the IEVS
estate staying IRS-free and on #785/#810 not writing FTI back into the persons fact corpus.)
A4 — Minimum-necessary scope. The authorization covers EXACTLY the fields the T-MSIS / CMS-416 federal layouts
require — the enumerated medicaid_tmsis_eligibility_extracts columns (identifiers, eligibility/coverage status
dates, income_as_pct_fpl, the citizenship / disability / dual-eligible / managed-care / CHIP / restricted-benefit
indicators). NO SSN and NO raw FTI are authorized or held. CMS-416 is authorized only as aggregate counts.
Enforcement is projection (ADR-001 A1 §B4): unprojected restricted fields are never fetched, decrypted, or audited.
A5 — Sanctioned access path. canopy-reporting MUST acquire restricted data ONLY over internal HTTP (never
cross-program DB — this half is the shipped reality) and MUST use the ADR-001 A1 §B7 async report_runs job model
(itself not yet built), the §B1/§B2/§B3 keyset + total_in_scope completeness contract, and §B4 first-class
projection (minimum-necessary). report_runs and its cursors live only in the reporting database (isolation
preserved).
A6 — Independent Pub 1075 §4 / HIPAA access-audit log (MUST; not as-built). canopy-reporting MUST implement its
own independent access-audit log satisfying IRS Pub 1075 §4, mirroring §Decision’s FTI-audit-logging requirements:
every restricted-data persist (extract) AND every read/export is logged with user/service id, timestamp, purpose
code, data elements accessed, and originating system; the log is stored in reporting’s own database, NOT the shared
canopy-security audit log; and restricted fields are scrubbed from canopy.events payloads before publication.
None of this exists today — this clause is normative.
A7 — Chain-v2 retention attachment (MUST; not as-built). Reporting’s restricted-holdings audit log is a NEW
ADR-014 chain-v2 chain family (a new family under the C1
chain identity model), minted with a non-reusable chain_instance_id and attached via the #1246 substrate under
the full C1–C8 apparatus. Retention is the per-jurisdiction ruleset value (ADR-014 A5 §C7), legal-hold aware,
bounded below by the maximum of the applicable federal floors — the Pub 1075 §4 five-year floor (corrected to 7 years, Pub 1075 AU-11 — see the ADR-041-era retention amendment below; #1363) and the HIPAA
45 CFR 164.316(b)(2) six-year documentation-retention floor for the audit log.
A8 — Storage controls (MUST; not as-built). Reporting’s restricted holdings MUST be (a) encrypted at rest (an
ADR-036 crypto-shred envelope or equivalent — not a reporting
dependency today); (b) owned by a least-privilege restricted DB role, not the shared broad canopy role; and
(c) exported only through an audited path (the current T-MSIS CSV export emits full person-level PHI rows unlogged;
the QC / FNS-7176 export’s restricted classification is pending #1258 and is not authorized here — resolved
2026-08-25: non-restricted as held, Amendment 4).
A9 — Scope boundary. This amendment governs data tenancy only. The implementation (A6–A8 code + the chain-v2 family attachment) is a filed child, cross-linking the ADR-014 #1246 substrate. It does NOT re-classify the non-PHI extracts (FNS-388 / ACF-199 / FNS-7176-QC — ADR-001 A1 §B8) and does NOT touch bulk determinations (ADR-002 / #1237). Landing this amendment UNBLOCKS the T-MSIS + CMS-416 PHI-extract children (#1250).
Consequences
-
canopy-reportingis now a mapped authorized restricted-data consumer; the ADR-001 A1 §B8 PHI-tenancy gap is closed at the tenancy layer, and the shippedmedicaid_tmsis_eligibility_extractstable is brought into policy. -
The T-MSIS + CMS-416 PHI-extract children (#1250) are unblocked; the non-PHI extracts already proceeded per ADR-001 A1 §B8 and are untouched.
-
A reporting storage-controls / audit-log implementation child is filed (#1256: encryption at rest, restricted DB role, the Pub 1075 §4 / HIPAA audit-log table + append-guard, and an audited export path), cross-linking the ADR-014 chain-v2 substrate (#1246) for the new family.
-
The
income_as_pct_fplFTI-provenance determination is filed as a separate issue (#1257 — it may relax A3 to PHI-only); thesnap_qc_universeIEVS-touchpoint classification question is filed separately (#1258, per the "bug found mid-implementation → separate issue" rule) — this amendment does not silently expand to cover it. (Both resolved 2026-08-25 — Amendment 4.)
Amendment 2 — audit tamper-evidence + retention re-homed to ADR-041; retention corrected to 7 years (epic &74, #1299, 2026-08-03)
ADR-041 supersedes ADR-014's hash-chain approach. This amendment carries the consequences for ADR-004; the §Decision isolation mandates themselves are re-affirmed byte-unchanged.
What changes
-
Tamper-evidence mechanism. The FTI audit log’s tamper-evidence no longer comes from an in-app SHA-256 hash chain. canopy emits a complete, integrity-checkable audit record (a complete-row digest + policy version) via the ADR-041 unfilterable audit-export channel; external tamper-evidence + retention of the exported copy are the deployment logging facility’s responsibility. Where the §Status NOTE and Amendment 1 reference "ADR-014 chain-v2 retention," read "the ADR-041 facility
the general audit-retention lifecycle (#1303)." -
Retention floor. §Decision states FTI audit logs are retained "minimum 5 years." That figure is corrected to 7 years (IRS Pub 1075 AU-11). The 45 CFR 164.316(b)(2) six-year HIPAA documentation floor for the reporting audit log (Amendment 1 A6) is unchanged; the effective floor is the greater of the applicable requirements.
-
Amendment 1 dispositions. A6 (reporting-owned Pub 1075 §4 / HIPAA audit rows in reporting’s own DB) is preserved — reporting keeps its rows as system-of-record and additionally exports via the ADR-041 facility. A7 (chain-v2 retention attachment) is withdrawn (no hash chain). A8 (encryption-at-rest, restricted role, audited export) is unchanged and remains tracked by #1256.
What is re-affirmed (byte-unchanged)
The §Decision isolation mandates stand exactly as written: FTI audit logs live in
a separate schema within the program-service DB (not the shared canopy-security
log); every FTI access is logged with user/timestamp/purpose/elements/system;
access is restricted to authorized personnel + IRS auditors; and the wildcard
subscriber does NOT receive FTI — program services scrub FTI from event payloads
before publishing (the scrub_fti_fields bus control + the publisher fail-closed
guard remain distinct from the ADR-041 log-redaction facility and are unaffected).
Amendment 3 — storage classification rule for the sealed reporting stores (A8a, #1256, 2026-08-11)
Amendment 1’s A8(a) requires `canopy-reporting’s restricted holdings encrypted at rest. This amendment records the classification rule the #1256 implementation applies, and corrects one factual premise Amendment 1 stated about what reporting holds. The §Decision isolation mandates are unchanged.
The rule
Plaintext is permitted only for values the database engine itself must evaluate (filter / join / order / unique / group keys); every such column is enumerated with its justifying query. All other restricted-table content is sealed — an ADR-036 context-bound envelope (AAD = table tag + generation + row id, so a relocated ciphertext fails the tag), under a per-report-generation DEK.
Applied to the one restricted-as-held table,
medicaid_tmsis_eligibility_extracts:
-
Plaintext (engine-evaluated):
person_id(the CMS-416 universeDISTINCT/keyset/COUNT+ the person index),enrollment_id(the generation-month-enrollment unique index + the export keyset),report_month(window predicates),generation_id,chip_indicator(universeWHERE),coverage_group(CMS-64GROUP BY), and the timestamps. -
Sealed (one
restricted_payloadenvelope per row): eligibility status
start/end dates,income_as_pct_fpl, citizenship status, the disability/dual/managed-care fields, andrestricted_benefits_indicator.
Threat model for the plaintext person/enrollment UUIDs: bare UUIDs are
pseudonymous references — the linkage data (name/SSN/DOB) lives sealed in the
other legally-scoped service databases. ADR-004 tenancy isolation is the linkage
control; envelope encryption is the content control. The same pseudonymous UUIDs
are therefore not sealed where they recur as engine keys — including in the
shared report_run_universe / report_runs.progress run substrate.
Accepted residual — report_run_universe.aux. The scope of #1256 is the
extract OUTPUT table only; the shared run substrate is left plaintext. Its
per-row aux for the tmsis drain (TmsisDetAux) holds the covered
person_id/household_id (pseudonymous keys), the assigned_coa
assigned_coa_track (identical to the coverage_group/chip_indicator this
table already keeps plaintext as engine keys), AND the raw determination
status (approved / filtered) — the one field of the same class as the sealed
eligibility_status that is NOT sealed at rest. This is an accepted residual,
not "no attribute content": the universe is transient, generation-scoped drain
scratch (janitor-reaped with its generation), and sealing it would reintroduce
per-kind branching across the SNAP/TANF/QC-shared substrate — the cost #1256
deliberately avoided. Tracked as follow-up #1459; a
threat review decides whether the determination-status residual warrants sealing
the aux or narrowing what the drain persists.
Redaction unit
Reporting’s restricted rows are derived federal extracts. Person-level redaction happens at the source of record, after which the affected report regenerates — so the per-generation DEK is the correct granularity, not a compromise. When the generation janitor deletes a superseded generation’s ciphertext rows, its DEK becomes an orphaned live key; that lifecycle is owned by the general audit/retention work (#1303), not #1256.
Premise correction
Amendment 1 A2 states "CMS-416 as held is de-identified aggregate." That holds for
the medicaid_cms416_reports OUTPUT table (age-band counts, no person id). It does
not describe the shared report_run_universe working state, which durably holds
person ids AND (for the tmsis drain) determination status + class-of-assistance
in its aux (see the accepted-residual note above). Those stay plaintext in
#1256 as janitor-bounded transient drain scratch, not a published holding; the
determination-status residual is tracked as a follow-up.
Amendment 4 — provenance + classification determinations (#1257 / #1258, 2026-08-25)
Amendment 1 left two classifications pending evidence: A3’s governing
framework (fail-safe Pub 1075, pending the #1257 provenance trace) and the
snap_qc_universe classification (pending #1258). This amendment records
both determinations. The mandated controls (A6–A8) change in neither case.
A3 resolved: income_as_pct_fpl is not FTI-derived as-built — PHI-only (#1257)
Determination. No exported T-MSIS field is FTI-derived in the shipped codebase. A3’s governing framework relaxes from the Pub 1075 §4 fail-safe to HIPAA PHI (PHI-only). The provenance chain (all four hops verified 2026-08-25):
-
canopy-reporting computes
income_as_pct_fpllocally — the T-MSIS drain captures no income (TmsisDetAux), and a separate persons-service batch leg (tmsis_enrich→persons:batchGet [Income]) feedssum_monthly_income/income_pct_of_fpl(services/canopy-reporting/src/worker/medicaid.rs,src/reporting/medicaid.rs). The medicaid MAGI result is never an input. -
canopy-medicaid’s MAGI reads the same canopy-persons fact corpus. The dedicated FTI-for-MAGI readers are
dead_code-gated pending #785 (services/canopy-medicaid/src/store/fti.rs; TANF likewise, #810) — nothing populates or readsfti_tax_dataon a production path. -
Persons income facts originate from applicant attestation and worker authorship. The IEVS discrepancy accept flow authors a worker-verified fact whose amount defaults to the IEVS figure (ADR-027 §2 human-transformation;
services/canopy-web/src/api/ievs.rs) — so the FTI question reduces to the IEVS source list. -
The IEVS estate has no IRS component: the adapter set is exactly
georgia_dol_swr/georgia_dol_ui/ssa_sdx/ssa_bendex(services/canopy-verification/src/api/ievs.rs), and only wage + UI hits can even become acceptable discrepancies (services/canopy-snap/src/verification.rs). No IRS / BEER / 1099 record type exists in any wire contract or adapter — BEER appears only as a catalogued legacy-gateway interface and a reserved ADR-045 evidence source (documentation, not code; that is precisely the tripwire below).
Effect. Reporting’s T-MSIS holdings are governed as HIPAA PHI. Audit-log
labelling is PHI; the retention floor is unchanged in practice (A7 already
takes the maximum of the applicable floors, and ADR-041 governs retention since
Amendment 2). canopy-reporting remains ABSENT from class.fti in
compliance/data-tenancy-authorisation.toml — correctly, as it holds no FTI.
The condition (tripwire — this relaxation is not unconditional). PHI-only holds only while BOTH stay true:
-
No IEVS/exchange source is IRS-derived. The glossary defines FTI as IRS data including data received through IEVS matching; IRS BEER exists as a catalogued legacy-gateway interface and a reserved ADR-045 evidence source. The MR that enables any IRS-derived source MUST reopen A3 to the Pub 1075 §4 fail-safe in the same change — the accept flow’s authored facts are not source-segregated on read (the persons read filter is claim-status-only), so an IRS-sourced IEVS value would reach
income_as_pct_fplthrough the exact chain above. -
#785/#810 FTI verification wiring does not write back into the persons fact corpus. If FTI income verification ever authors or amends persons facts, the same reopening applies.
The isolation between IEVS values and non-SNAP uses rests on the ADR-027 human-transformation doctrine, not on data-flow segregation — Amendment 4 records that explicitly so a future source addition cannot assume a structural barrier that does not exist.
QC universe resolved: snap_qc_universe is non-restricted as held (#1258)
Determination. snap_qc_universe holds no IEVS-derived or otherwise
restricted data. The ADR-001 A1 §B8 "non-restricted derived data" framing for
the FNS-7176-QC extract is CONFIRMED, and A8(c)'s pending question resolves the
same way: the QC export is non-restricted as held. Evidence (verified
2026-08-25):
-
The populated columns are exactly §B8’s enumerated non-restricted classes: certification window/type (renewals cert roll), household member count (persons memberships), issued benefit total (enrollment issuances server-side sum), and one ABAWD boolean whose batch contract is bool-only by construction (
crates/canopy-contracts-snap/src/batch.rs). The run-pipeline INSERT binds nothing else (services/canopy-reporting/src/store.rs,insert_qc_rows_in; the enrichment legs insrc/worker/snap.rsfetch no application, determination, or verification data). -
Every contested column is NULL in every row ever written — the full income/deduction stack,
net_income,head_of_household_age,categorical_eligibility,expedited_service,work_registration_exempt_count, andievs_match_completed. The current pipeline omits them; the deleted stub assembler never sourced them; the #1155 and #1202-D8 migrations NULLed the stub-era constant values. -
ievs_match_completedis a process flag, never match content — a boolean "was the match run", with an existing scanner-allowlist row citing 7 CFR 275.12 (compliance/data-tenancy-authorisation.toml); its only designed upstream is a status indicator from canopy-snap’s API, which returns no IEVS data.
The boundary (normative, so a future populater cannot drift). If the
income/deduction stack is ever populated, its values MUST source from the
canopy-persons fact corpus (attestation and ADR-027 worker-verified facts —
the same non-restricted derivation the determination pipeline consumes).
Values MUST NOT source from canopy-snap’s sealed IEVS stores
(ievs_discrepancies, the sealed IevsReconstruction) — no code path exists
today, and none may be added absent the Amendment-1-shaped authorization
landing FIRST: an isolation-map row, a
compliance/data-tenancy-authorisation.toml grant, and the sealing /
least-privilege / audited-export controls the T-MSIS store carries. Absent
that, canopy-reporting remains correctly absent from class.ievs.