PipeWhy Enron source contract E1 version1.0 | PW-14.01-.07 | Q1 v1.0 November2,2026 Accepted source and scope (D1, PW-14.01) The user selected https://huggingface.co/datasets/corbt/enron-emails. Initial scope is its complete default/train split:517401 records in three Parquet shards,493482449 compressed bytes. This is a public dataset connector, not an enterprise mail-server connector or permission to send email. First pinned revision: cfc06c758093d90993abce1a43668fb7357258a6. ENRON_SOURCE_MANIFEST.json records the actual repository/card/Parquet audit and published LFS SHA256 identities. Both Windows CPython3.14 and Linux source/distribution gates remain applicable; actual full-source qualification must be recorded separately from synthetic tests. Consistency and history (PW-14.02/.03, D5 implementation scope) Require an explicit full40-character Git revision; never resolve latest during a scan or silently substitute another version. Resolve metadata and shard URLs at that same revision. Verify all declared byte counts/SHA256 hashes before parsing. Use per-revision local cache directories, temporary files and atomic publication; an interrupted/mismatched download must not become a verified cached file. Compare existing pinned metadata rather than overwriting conflicting identities. A read uses verified file handles and checks file identity/content stability; a concurrent replacement/mutation must fail, not publish a complete comparable observation. Readiness is not source consistency. Captures retain the exact Git revision, schema/profile/context and successful/failed read counts. A bounded reader completes only after the declared record count is consumed successfully. Historical reads require either the same accessible upstream revision or its verified local cache. Offline reads never contact upstream or fall back to head. No guarantee is made that Hugging Face retains any revision forever. The connector does not evict caches automatically; explicit removal makes missing cached history unavailable. C5 snapshot history is independent: captured observations remain readable without network/Parquet libraries, and retained C2 values are opt-in. No enterprise retention/storage budget or D8/D9 deployment choice is inferred. Initial D5 implementation defaults: admit at most512 MiB of compressed source files per explicitly requested revision and4 MiB of metadata per response. The audited493482449-byte revision fits this cap. No background version prefetch or automatic eviction is performed. Multiple retained revisions require explicit caller requests and caller-managed disk retention. Dataset-level C5 fingerprints are the default; retaining email-value frames is an explicit option subject to existing snapshot limits. These are bounded local integration defaults, not an accepted enterprise SLA or a promise that source history remains available. Type and record mapping (PW-14.04) Source field order/IDs are fixed: 0 message_id: nullable string 1 subject: nullable string 2 from: nullable string 3 to: nullable ordered list of nullable strings 4 cc: nullable ordered list of nullable strings 5 bcc: nullable ordered list of nullable strings 6 date: nullable timestamp[us,tz=UTC] 7 body: nullable string 8 file_name: nullable string Validate the exact nine-column Arrow schema before reading. Strings remain exact Unicode text; nulls remain C2 nulls. Recipient lists map to versioned canonical JSON text (UTF8, ensure_ascii=False, compact separators), preserving ordering, duplicate entries, empty strings, null elements, empty lists and null whole fields distinctly. Do not join/filter/sort addresses. This is an explicit list representation in the source schema identity, not a new scalar type or a claim that text equals a list. The existing strict profile remains default; logical scalar normalization is opt-in. Convert UTC microseconds exactly to timezone-aware UTC datetime for existing C2 timestamp normalization; do not pass through floating-point seconds or reinterpret mail dates as observation/operation times. Preserve published typed data, not a claim of byte identity with the original CMU/raw-mail archive. Email bodies and headers are data; no instructions, links or apparent credentials are executed. Emit existing flat C2 RecordBatch buffers with all nine fields per record, preserving duplicate multiplicity. Bound both Arrow row batches and emitted C2 record/word pools; reject a single over-limit record explicitly rather than truncating it. Do not materialize the full corpus as Python dicts or install pandas/datasets just to read Parquet. PyArrow26.0.0 is the adopted optional enron reader; CPython3.14 Windows/Linux wheels were verified. ENRON_ACCEPTANCE.txt records production unit/type/coverage, dependency, package and full-source qualification evidence. Identity/discovery (PW-14.05/.06) Namespace identifies the selected repository/split, independent of download paths. Artifact0 is the repository container; artifact1 is the logical train dataset with parent0. Physical Parquet shard names/order are storage details, not artifact IDs. Display labels are separate from these fixed IDs. Initial discovery supports root0 and dataset1, with bounded C1 batches and explicit unknown-scope errors. No mailbox or individual-message artifact catalogue is claimed by this first scope. file_name is the published record key; message_id is content, not an assumed global deduplication key. Current full-source audit finds both unique, but duplicate content still counts. Row position is only the global ordered position. A record key rename is a content change; record-level rename tracking is not claimed. Lexicographic pinned shard paths and physical row order define ordered iteration; multiset fingerprints remain insensitive to partition/order. Scope selection never silently advertises a truncated prefix as the full train split. The selected repository is public/ungated. Configuration loading never connects; network preparation is an explicit operation. No token is required or read from ambient credentials. HTTP/permission/offline/missing/corrupt/type failures remain actionable and cannot yield an empty complete dataset. Metadata pagination or unrecognized layouts must be exhausted/validated or reported incomplete/unsupported, never silently omitted. Failed dataset reads preserve progress/reasons separately from successfully captured comparable rows; no successful partial aggregate. Lineage provenance (PW-14.07) This dataset supplies no verified data-pipeline lineage. Return UNKNOWN lineage coverage with an explicit UPSTREAM_LINEAGE_NOT_PROVIDED reason and no fabricated edges. Sender/recipient relationships, forwarded text, matching subjects, duplicate IDs and chronological proximity are not COPY/TRANSFORM or causation evidence. Containment of train under the repository is C1 structure, not data lineage. Existing diff/query/export must retain that uncertainty after offline reopening. Evidence and initial review All three actual downloads match their published SHA256/lengths. Parquet footers each report172467 rows/173 row groups, totaling517401. Full selected-column audit finds no duplicate file_name/message_id and no nulls in audited identity/date/list parent columns; schema nullability is still respected rather than generalized away. Recipient maxima include1029 to entries and457 cc/bcc entries. Exact dates/types are in the audit; no record text is stored in Git for this decision. Tests will use small synthetic Parquet fixtures with independent expected frames, controlled changes and permission/read/version faults. Real-corpus outputs/cache stay in ignored local artifacts; body text is not packaged as test data or printed as routine diagnostics. These planning/data-audit changes do not claim a fresh Python coverage pass. Q1 applies unchanged to every implementation subtask. Primary sources consulted November2: https://huggingface.co/datasets/corbt/enron-emails https://huggingface.co/api/datasets/corbt/enron-emails https://huggingface.co/api/datasets/corbt/enron-emails/tree/cfc06c758093d90993abce1a43668fb7357258a6/data?expand=true https://arrow.apache.org/docs/python/generated/pyarrow.parquet.ParquetFile.html