Changelog¶
Changelog¶
All notable changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.1.0a1 - unreleased¶
First internally coherent alpha. Not published: no PyPI release, no GitHub release, no tag.
Added¶
- Phase 0 — project foundation: development log
0001and Architecture Decision Records ADR-0001 through ADR-0004. - Phase 1 — packaging and tooling scaffold:
pyproject.toml(hatchling build backend, uv-managed, src layout), package skeleton (openaucwith typed marker, exception hierarchy, public API facade and CLI stub), test scaffold, ruff / mypy / pytest / pre-commit configuration, GitHub issue and PR templates, Dependabot, and a CI workflow across Python 3.11–3.13. - Community-health files:
README,CONTRIBUTING,CODE_OF_CONDUCT,SECURITY,CITATION.cff,NOTICE, and a filled Apache-2.0LICENSE. -
Phase 2 — canonical in-memory data model (
openauc.models): pydantic v2 metadata (ExperimentMetadata,InstrumentMetadata,SampleMetadata,ScanMetadata), theQuantityvalue type with explicit present/missing/unknown/not-applicable status and per-value provenance, an xarray-backedObservationsstore supporting shared and per-scan radius axes (per-scan uses padded 2-D arrays with an authoritative validity mask; no silent interpolation), theAUCExperimentcontainer withsummary()and structuralvalidate_structure(), an in-memoryImportProvenancerecord, and metadata/experiment serialisation viato_dict()/from_dict(). AddsObservationErrorandStructuralValidationError. Concept docs underdocs/concepts/and an API reference atdocs/api.md. -
Phase 3 — generic delimited (CSV/TSV) ingestion (
openauc.formats): theopenauc.load(path, *, format=None, manifest=None)entry point andopenauc.available_formats(); a parser plugin registry with confidence-based detection (ADR-0004); a typed, versioned experiment manifest (JSON canonical, YAML for authoring) with safe relative-path validation;generic-longandgeneric-wideparsers that preserve raw values and order, build shared- or per-scan-axis observations without interpolation, retain declared units, and populateImportProvenance. AddsUnsupportedFormatError,AmbiguousFormatError,ManifestError,ParseErrorandDataConflictError; a machine-readable schema atschemas/generic-manifest-v1.schema.json; and docs underdocs/formats/. -
Phase 4 — tiered validation, analysis readiness and structured summaries: a four-tier validation model (
ARCHIVAL,STRUCTURAL,SV_READINESS,SE_READINESS) with 26 deterministic checks carrying stable codes, severity, tiers, blocked tiers, observed/expected values and suggested remediation;experiment.validate()for the full report andexperiment.assess_readiness()for per-workflow metadata-presence reporting; a frozenExperimentSummary(withValueRange,MetadataPresenceandValidationCounts) exposed asexperiment.summary_data(), of whichsummary()is now the text rendering. AddsValidationTier,ReadinessStatusandAnalysisKind, and extendsValidationIssue/ValidationReportwith tier-aware fields and filters. This phase resolves open question Q3 (see the ADR-0002 Phase 4 amendment) and marks ADR-0001 Accepted alongside an as-built amendment. -
Phase 5 — basic scan plotting (
openauc.plotting):plot_scansandplot_scandraw radial scans from the canonical model onto amatplotlib.axes.Axes. Each scan is rendered from its own stored(radius, signal)vectors in stored order — nothing is interpolated, resampled, sorted or smoothed, and per-scan radius axes are never placed on a common grid (ADR-0002). Figures are built withoutpyplot, so plotting works headless and leaks no global figures; matplotlib is imported on the first draw soimport openaucstays light, andopenauc.api.plot_scansresolves lazily. AddsObservations.scan_vectors()/iter_scan_vectors()for masked per-scan access, and thePlottingErrorexception. -
Phase 6 — the AUCX archival container (
openauc.formats.aucx): a ZIP of JSON metadata and NumPy.npyarrays at format version1.0.openauc.export_aucx/experiment.export()write it;openauc.load()reads it via suffix orformat="aucx";openauc.inspect_aucxandopenauc.validate_aucxreport on it. Both radius modes, masks, dtypes, shapes, units and all four value statuses round-trip exactly. Every checksum is verified before a model is constructed. Exports are deterministic (fixed member order, ZIP timestamps, permissions and compression; JSON with sorted keys) and atomic (written to a sibling temporary file, verified, then moved). AddsArchiveIntegrityError,ArchiveVersionError,AUCXInfo,AUCXExportandArchiveValidationReport. - Phase 6 — source checksums at import, resolving the Phase 3 deferral.
ImportProvenancegainssource_checksums: tuple[SourceChecksum, ...], one typed entry per source file with its role (manifest,data_file), digest and byte size.sha256is retained and mirrors thedata_fileentry. - Phase 7 — a practical CLI:
openauc version | formats | inspect | validate | convert, each with--jsonwhere useful,--readinessonvalidate,--overwriteonconvert, and documented exit codes (0 success, 1 structural failure, 2 input error, 3 output exists). Domain errors print one clear line, never a traceback. -
Phase 8 — six runnable
examples/over new synthetic demo data,docs/cli.md, and release-readiness tests covering the public surface, examples, packaging metadata and repository hygiene. -
Synthetic data generator (
openauc.synthetic):generate_experimentbuilds reproducible, repository-safe AUC-like datasets from a frozenSyntheticExperimentConfig, in eight scenarios (moving-boundary,equilibrium-profile,static-profile,per-scan-radius,sparse-metadata,mixed-optics,empty-scans,invalid-structure). Writerswrite_generic_long,write_generic_wideandwrite_aucxreuse the existing manifest and AUCX infrastructure; anopenauc generateCLI command wraps them. Randomness comes from a localnumpy.random.Generator, so NumPy's global state is never touched. AddsSyntheticWriteError.
Generated curves are illustrative closed-form shapes, not Lamm-equation solutions, not simulations of sedimentation, and carry no physical parameters; every generated experiment says so in its metadata and provenance.
- Documentation site (MkDocs Material) with a detailed user manual: getting
started, eight tutorials, eleven how-to guides including troubleshooting and
twelve recipes, ten concept pages (adding provenance/checksums and scientific
boundaries), four format specifications, a per-command CLI reference with
documented exit codes, and a curated mkdocstrings API reference. Adds a
docsdependency group,mkdocs.yml, a strict-build CI job and a GitHub Pages deployment workflow. Resolves open question Q6 (documentation tooling).
Changed¶
- README slimmed to a concise overview; long-form explanation now lives in the
documentation site.
docs/api.mdanddocs/cli.mdare superseded by thedocs/api/anddocs/cli/sections. - Version is now
0.1.0a1(was0.1.0.dev0), in the package andCITATION.cff. - Imported experiments now record source checksums, so
source_checksum_absentno longer fires for them andExperimentSummary.checksum_availableis true. This is the intended resolution of the Phase 3 deferral. available_formats()now also lists archive formats, soaucxappears alongside the delimited parsers.- ADR-0003 amended and accepted, recording the implemented archive structure and resolving Q1 (in-archive encoding) and Q5 (provenance schema, SHA-256).
AUCExperiment.summary()now renders the structured summary and appends nine further lines (points per scan, total observations, wavelengths, cells, channels, rotor speed, temperature, source checksum, validation counts). Every previously emitted line is preserved verbatim.validate_structure()is now defined as the archival and structural findings ofERRORorWARNINGseverity; informational and readiness findings are reported byvalidate(). Existing codes, severities and the meaning ofValidationReport.is_validare unchanged.
Generic delimited ingestion reads CSV/TSV only. Vendor and instrument formats, automatic unit conversion, and scientific quality control are not implemented, and no claim of scientific validity is made anywhere.
Phase 4 validates and summarises structure and metadata presence only. It never
judges scientific validity, data quality or suitability for analysis: absent
metadata is reported, never required, and scientific suitability is permanently
reported as NOT_ASSESSED. Sample-to-scan linkage and heterogeneous per-scan
signal units remain deferred.
AUCX checksums establish integrity, not authenticity: a verified archive is one whose bytes are unchanged since it was written, not one whose origin is proven. AUCX carries no signature. Vendor and instrument formats remain unsupported, and no scientific analysis, quality control or unit conversion is implemented.
Phase 5 plots only what is stored. No fitting, smoothing, baseline correction, derivative or derived overlay is drawn, and no regridding API is offered: placing per-scan data on a common grid remains an explicit, opt-in, recorded transformation that does not yet exist.