ADR-004: Legally-Scoped Data Tenancy

On this page

Status

Accepted

NOTE
Amended by ADR-014 (FTI audit hash-chain integrity).
NOTE
Amended by Amendment 1 (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.
NOTE
Amended by Amendment 2 (the audit tamper-evidence mechanism moves from the ADR-014 hash chain to the ADR-041 logging + redaction facility; the FTI retention floor is corrected to 7 years, Pub 1075 AU-11; Amendment 1’s A6 is preserved, its A7 chain-v2 attachment is withdrawn, epic &74, #1299). The §Decision isolation mandates are re-affirmed byte-unchanged; see Amendment 2.
NOTE
Amended by Amendment 3 (the A8a storage classification rule for the sealed reporting stores: engine-evaluated keys stay plaintext with a justifying query, all other restricted content seals under a per-generation ADR-036 envelope; corrects the "CMS-416 as held is aggregate-only" premise for the shared run-universe working state, #1256). See Amendment 3.
NOTE
Amended by Amendment 4 (the two pending classifications resolved: A3 relaxes to HIPAA PHI-only — 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

canopy-tanf

FTI (IRC §6103(l)(7)), SSA SOLQ/BINDEX (TANF CMA)

canopy-medicaid

FTI (IRC §6103(l)(12)), FDSH hub data, HIPAA-scoped clinical data

canopy-snap

IEVS data (state wage, UI, SSA income via IEVS), SSA SOLQ/BINDEX (SNAP CMA)

canopy-verification

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-security audit 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

  1. 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_extracts table is a PHI holding; the CMS-416 extract, by contrast, persists only de-identified aggregate age-band counts (no person_id, no income — 45 CFR 164.514), reading person-level DOB only transiently at extract time. canopy-reporting is 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 §B7 report_runs model is inherently snapshot-based.

  2. 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.)

  3. 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).

  4. 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_universe IEVS-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

canopy-reporting

HIPAA PHI — person-level Medicaid eligibility/enrollment extract for the T-MSIS federal universe (medicaid_tmsis_eligibility_extracts), minimum-necessary fields only (no SSN, no raw FTI income — income is held only as income_as_pct_fpl); CMS-416 held only as de-identified aggregate age-band counts (no person_id, no income persisted). Governed as HIPAA PHI (PHI-only) per Amendment 4 — the #1257 provenance determination confirmed no exported field is FTI-derived as-built, conditional on the IEVS estate staying IRS-free and on #785/#810 not writing FTI back into the persons fact corpus. Held as a persisted federal-extract snapshot for reproducibility, not transiently.

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-reporting is now a mapped authorized restricted-data consumer; the ADR-001 A1 §B8 PHI-tenancy gap is closed at the tenancy layer, and the shipped medicaid_tmsis_eligibility_extracts table 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_fpl FTI-provenance determination is filed as a separate issue (#1257 — it may relax A3 to PHI-only); the snap_qc_universe IEVS-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 universe DISTINCT/keyset/COUNT + the person index), enrollment_id (the generation-month-enrollment unique index + the export keyset), report_month (window predicates), generation_id, chip_indicator (universe WHERE), coverage_group (CMS-64 GROUP BY), and the timestamps.

  • Sealed (one restricted_payload envelope per row): eligibility status
    start/end dates, income_as_pct_fpl, citizenship status, the disability/dual/managed-care fields, and restricted_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):

  1. canopy-reporting computes income_as_pct_fpl locally — the T-MSIS drain captures no income (TmsisDetAux), and a separate persons-service batch leg (tmsis_enrichpersons:batchGet [Income]) feeds sum_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.

  2. 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 reads fti_tax_data on a production path.

  3. 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.

  4. 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_fpl through 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 in src/worker/snap.rs fetch 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, and ievs_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_completed is 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.

Edit this page · default