CSV sources
===========

CSV capture is available in the development source. The published
``0.1.0.dev0`` package predates this functionality.

Configure an explicit local CSV source, a schema and resource limits as shown in
:doc:`../development/format-sources`. The source ID identifies the same logical
dataset across captures. Choose it deliberately: changing a path does not change
that identity, and using the same ID for unrelated datasets can make them appear
comparable.

Provide the lowercase SHA-256 of the file's exact bytes as ``--source-version``
to ``pipewhy scan``. The file must still match that digest during the entire
read. Once a scan completes, its snapshot can be reopened, compared and exported
without the original file. An unavailable, malformed, changed or oversized file
produces an unavailable capture with a reason; partial records are discarded.

The header must exactly match the configured field names and order. The supported
scalar types are text, boolean, signed and unsigned 8-, 16-, 32- and 64-bit
integers, finite decimal, finite binary64 and supported ISO timestamps. Each field
has an explicit stable ID and null-marker policy. A null marker applies after CSV
decoding whether the source field was quoted or unquoted. Nested values and
unlisted types are unsupported. Strict normalization is the default; select
``--profile logical-v1`` to opt in to logical equivalence.

Limit source, record and field bytes, field count, batch records, batch words and
total records in the configuration. The reader also respects the interpreter's
existing CSV field-character limit. Complete capture counts are the rows observed
after verification, not an independently supplied upstream count. Source lineage
is unknown unless supported by evidence; no upstream lineage is inferred from
the file. Remote object storage is not part of this local CSV reader.
