vector-mtrl 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. vector_mtrl-0.2.0/.gitignore +243 -0
  2. vector_mtrl-0.2.0/CHANGELOG.md +162 -0
  3. vector_mtrl-0.2.0/LICENSE +373 -0
  4. vector_mtrl-0.2.0/NOTICE +30 -0
  5. vector_mtrl-0.2.0/PKG-INFO +142 -0
  6. vector_mtrl-0.2.0/README.md +121 -0
  7. vector_mtrl-0.2.0/docs/user/getting-started.md +188 -0
  8. vector_mtrl-0.2.0/docs/user/reference.md +248 -0
  9. vector_mtrl-0.2.0/docs/user/workflows.md +576 -0
  10. vector_mtrl-0.2.0/mtrl/__init__.py +144 -0
  11. vector_mtrl-0.2.0/mtrl/_alignment_report.py +105 -0
  12. vector_mtrl-0.2.0/mtrl/_archive_documents.py +73 -0
  13. vector_mtrl-0.2.0/mtrl/_archive_integrity.py +539 -0
  14. vector_mtrl-0.2.0/mtrl/_archive_loading.py +1070 -0
  15. vector_mtrl-0.2.0/mtrl/_archive_serialise.py +696 -0
  16. vector_mtrl-0.2.0/mtrl/_candidate_matching.py +216 -0
  17. vector_mtrl-0.2.0/mtrl/_cli.py +28 -0
  18. vector_mtrl-0.2.0/mtrl/_disclosure.py +735 -0
  19. vector_mtrl-0.2.0/mtrl/_ingestion_shortcuts.py +99 -0
  20. vector_mtrl-0.2.0/mtrl/_install_targets.py +36 -0
  21. vector_mtrl-0.2.0/mtrl/_optional.py +38 -0
  22. vector_mtrl-0.2.0/mtrl/_provenance.py +32 -0
  23. vector_mtrl-0.2.0/mtrl/_receipts.py +211 -0
  24. vector_mtrl-0.2.0/mtrl/_record_resolution.py +60 -0
  25. vector_mtrl-0.2.0/mtrl/_replay_plan.py +557 -0
  26. vector_mtrl-0.2.0/mtrl/_replay_run.py +734 -0
  27. vector_mtrl-0.2.0/mtrl/_run_management.py +400 -0
  28. vector_mtrl-0.2.0/mtrl/_source_capture.py +507 -0
  29. vector_mtrl-0.2.0/mtrl/_table_plan.py +271 -0
  30. vector_mtrl-0.2.0/mtrl/_table_provenance.py +387 -0
  31. vector_mtrl-0.2.0/mtrl/_table_values.py +188 -0
  32. vector_mtrl-0.2.0/mtrl/_transform_apply.py +223 -0
  33. vector_mtrl-0.2.0/mtrl/_transform_validation.py +1367 -0
  34. vector_mtrl-0.2.0/mtrl/archive/__init__.py +54 -0
  35. vector_mtrl-0.2.0/mtrl/archive/canonical.py +45 -0
  36. vector_mtrl-0.2.0/mtrl/archive/codecs.py +88 -0
  37. vector_mtrl-0.2.0/mtrl/archive/dtypes.py +39 -0
  38. vector_mtrl-0.2.0/mtrl/archive/reader.py +945 -0
  39. vector_mtrl-0.2.0/mtrl/archive/validation.py +1872 -0
  40. vector_mtrl-0.2.0/mtrl/connectors/__init__.py +1 -0
  41. vector_mtrl-0.2.0/mtrl/connectors/protocols.py +84 -0
  42. vector_mtrl-0.2.0/mtrl/disclosure.py +273 -0
  43. vector_mtrl-0.2.0/mtrl/domain/__init__.py +129 -0
  44. vector_mtrl-0.2.0/mtrl/domain/archive_limits.py +46 -0
  45. vector_mtrl-0.2.0/mtrl/domain/committed_values.py +539 -0
  46. vector_mtrl-0.2.0/mtrl/domain/frozen_containers.py +168 -0
  47. vector_mtrl-0.2.0/mtrl/domain/identities.py +174 -0
  48. vector_mtrl-0.2.0/mtrl/domain/provenance.py +448 -0
  49. vector_mtrl-0.2.0/mtrl/domain/records.py +233 -0
  50. vector_mtrl-0.2.0/mtrl/domain/revisions.py +121 -0
  51. vector_mtrl-0.2.0/mtrl/domain/source.py +13 -0
  52. vector_mtrl-0.2.0/mtrl/domain/verification.py +302 -0
  53. vector_mtrl-0.2.0/mtrl/excel.py +139 -0
  54. vector_mtrl-0.2.0/mtrl/exceptions.py +215 -0
  55. vector_mtrl-0.2.0/mtrl/exports.py +326 -0
  56. vector_mtrl-0.2.0/mtrl/features.py +251 -0
  57. vector_mtrl-0.2.0/mtrl/frames.py +228 -0
  58. vector_mtrl-0.2.0/mtrl/grids.py +1172 -0
  59. vector_mtrl-0.2.0/mtrl/integrity/__init__.py +143 -0
  60. vector_mtrl-0.2.0/mtrl/integrity/canonical.py +511 -0
  61. vector_mtrl-0.2.0/mtrl/integrity/digests.py +363 -0
  62. vector_mtrl-0.2.0/mtrl/integrity/manifest.py +631 -0
  63. vector_mtrl-0.2.0/mtrl/integrity/receipts.py +771 -0
  64. vector_mtrl-0.2.0/mtrl/integrity/verification.py +1303 -0
  65. vector_mtrl-0.2.0/mtrl/models.py +952 -0
  66. vector_mtrl-0.2.0/mtrl/mtrl.py +1852 -0
  67. vector_mtrl-0.2.0/mtrl/operations/__init__.py +36 -0
  68. vector_mtrl-0.2.0/mtrl/operations/_identity.py +17 -0
  69. vector_mtrl-0.2.0/mtrl/operations/_validation.py +106 -0
  70. vector_mtrl-0.2.0/mtrl/operations/arithmetic.py +207 -0
  71. vector_mtrl-0.2.0/mtrl/operations/base.py +292 -0
  72. vector_mtrl-0.2.0/mtrl/operations/resampling.py +203 -0
  73. vector_mtrl-0.2.0/mtrl/operations/resampling_scipy.py +138 -0
  74. vector_mtrl-0.2.0/mtrl/operations/spectra.py +58 -0
  75. vector_mtrl-0.2.0/mtrl/processing/__init__.py +23 -0
  76. vector_mtrl-0.2.0/mtrl/processing/_table_capture.py +341 -0
  77. vector_mtrl-0.2.0/mtrl/processing/limits.py +9 -0
  78. vector_mtrl-0.2.0/mtrl/processing/registry.py +1533 -0
  79. vector_mtrl-0.2.0/mtrl/protocols.py +13 -0
  80. vector_mtrl-0.2.0/mtrl/py.typed +0 -0
  81. vector_mtrl-0.2.0/mtrl/replay.py +946 -0
  82. vector_mtrl-0.2.0/mtrl/tables.py +1365 -0
  83. vector_mtrl-0.2.0/mtrl/transformations/__init__.py +22 -0
  84. vector_mtrl-0.2.0/mtrl/transformations/base.py +17 -0
  85. vector_mtrl-0.2.0/mtrl/units.py +60 -0
  86. vector_mtrl-0.2.0/pyproject.toml +211 -0
@@ -0,0 +1,243 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/#use-with-ide
110
+ .pdm.toml
111
+
112
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113
+ __pypackages__/
114
+
115
+ # Celery stuff
116
+ celerybeat-schedule
117
+ celerybeat.pid
118
+
119
+ # SageMath parsed files
120
+ *.sage.py
121
+
122
+ # Environments
123
+ .env
124
+ .venv
125
+ env/
126
+ venv/
127
+ ENV/
128
+ env.bak/
129
+ venv.bak/
130
+
131
+ # Spyder project settings
132
+ .spyderproject
133
+ .spyproject
134
+
135
+ # Rope project settings
136
+ .ropeproject
137
+
138
+ # mkdocs documentation
139
+ /site
140
+
141
+ # mypy
142
+ .mypy_cache/
143
+ .dmypy.json
144
+ dmypy.json
145
+
146
+ # Pyre type checker
147
+ .pyre/
148
+
149
+ # pytype static type analyzer
150
+ .pytype/
151
+
152
+ # Cython debug symbols
153
+ cython_debug/
154
+
155
+ # PyCharm
156
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
159
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
+ .idea/
161
+
162
+ ### macOS ###
163
+ # General
164
+ .DS_Store
165
+ .AppleDouble
166
+ .LSOverride
167
+
168
+ # Icon must end with two \r
169
+ Icon
170
+
171
+
172
+ # Thumbnails
173
+ ._*
174
+
175
+ # Files that might appear in the root of a volume
176
+ .DocumentRevisions-V100
177
+ .fseventsd
178
+ .Spotlight-V100
179
+ .TemporaryItems
180
+ .Trashes
181
+ .VolumeIcon.icns
182
+ .com.apple.timemachine.donotpresent
183
+
184
+ # Directories potentially created on remote AFP share
185
+ .AppleDB
186
+ .AppleDesktop
187
+ Network Trash Folder
188
+ Temporary Items
189
+ .apdisk
190
+
191
+ ### macOS Patch ###
192
+ # iCloud generated files
193
+ *.icloud
194
+
195
+ ### Linux ###
196
+ *~
197
+
198
+ # temporary files which can be created if a process still has a handle open of a deleted file
199
+ .fuse_hidden*
200
+
201
+ # KDE directory preferences
202
+ .directory
203
+
204
+ # Linux trash folder which might appear on any partition or disk
205
+ .Trash-*
206
+
207
+ # .nfs files are created when an open file is removed but is still being accessed
208
+ .nfs*
209
+
210
+ ### Windows ###
211
+ # Windows thumbnail cache files
212
+ Thumbs.db
213
+ Thumbs.db:encryptable
214
+ ehthumbs.db
215
+ ehthumbs_vista.db
216
+
217
+ # Dump file
218
+ *.stackdump
219
+
220
+ # Folder config file
221
+ [Dd]esktop.ini
222
+
223
+ # Recycle Bin used on file shares
224
+ $RECYCLE.BIN/
225
+
226
+ # Windows Installer files
227
+ *.cab
228
+ *.msi
229
+ *.msix
230
+ *.msm
231
+ *.msp
232
+
233
+ # Windows shortcuts
234
+ *.lnk
235
+ .pi
236
+
237
+ # Private local TRIOS corpus, native files, exports, and reports.
238
+ /data/tri-corpus/
239
+
240
+ # Generated project overview and local test corpora.
241
+ /PROJECT_DIRECTORY_OVERVIEW.md
242
+ /tests/data/mtrl/
243
+ /node_modules/
@@ -0,0 +1,162 @@
1
+ # Changelog
2
+
3
+ All notable changes to the core distribution are documented in this file. Each private suite
4
+ distribution keeps its own changelog in its own repository. Maintainers keep the versioning, tag and publishing
5
+ contract in the repository file `RELEASE.md`.
6
+
7
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and each
8
+ distribution uses pre-1.0 Semantic Versioning: while a distribution is `0.x`, a minor bump may
9
+ break, and every breaking change is named in the release entry.
10
+
11
+ ## [Unreleased]
12
+
13
+ ### Changed
14
+
15
+ - Prepare `0.2.0` as the first public-core release candidate with the interp and tabular
16
+ capabilities folded into the core as public extras (`interp`, `tabular`, `excel`), per the
17
+ 2026-10-22 owner decision. The two former suite distributions cease: `vector-mtrl-interp`
18
+ and `vector-mtrl-tabular` no longer exist, and the repository is a single uv project.
19
+ Breaking changes: the `mtrl.resample.pchip` and `mtrl.resample.cubic` operations restore
20
+ as core built-ins, so archives recorded under the suite identifiers
21
+ `vector-mtrl-interp.resample.pchip` and `vector-mtrl-interp.resample.cubic` cannot resolve
22
+ or rerun on this version; the suite `register(registry)` seam is gone; the `.xlsx` writer
23
+ registers at import, so a base install without the `excel` extra raises
24
+ `MissingOptionalDependencyError` naming `vector-mtrl[excel]` instead of
25
+ `UnsupportedExportFormatError`, and the `.xlsx` suffix is no longer free for a custom
26
+ writer; the `vector-mtrl-interp.suite/1` capability string is no longer recorded. The
27
+ base install stays NumPy, Pydantic, and RFC 8785 canonical JSON only. The source-tree
28
+ version fallback also names `0.2.0` when installed distribution metadata is absent.
29
+ Uploads still need separate owner approval, and the public enable switch stays off.
30
+
31
+ - Cut `0.1.4` as the public-core build-only candidate: remove the README section that named
32
+ the private suite distributions and the authorised-customer boundary, so the package long
33
+ description carries no private-suite delivery detail. The source-tree version fallback
34
+ also names `0.1.4` when installed distribution metadata is absent. Uploads still need
35
+ separate owner approval, and the public enable switch stays off.
36
+
37
+ - Cut `0.1.3` as the public-core build-only candidate after the `vector-mtrl-v0.1.2` tag
38
+ was stranded: the tag was pushed before its preparation commits reached `main`, the
39
+ pull-request merge then rewrote the commit identities, and the immutable tag protection
40
+ keeps the tag on the off-main commit. The stranded tag's build-only run stayed
41
+ upload-disabled and its archives were never reviewed for upload. This entry re-cuts the
42
+ same hardened content as `0.1.3` from the merged `main` commit, with the source-tree
43
+ version fallback also naming `0.1.3` when installed distribution metadata is absent.
44
+ Uploads still need separate owner approval, and the public enable switch stays off.
45
+
46
+ - Prepare `0.1.2` as the public-core candidate cut from the hardened toolchain. The 2026-10-20
47
+ eMudhra intermediate-certificate compromise left the previous pins (Node.js `22.15.0`,
48
+ `uv` `0.12.1`) on vulnerable bundled trust stores, so the repository and workflow pins move
49
+ to Node.js `22.23.4` and `uv` `0.13.4`, and the release build runs with the patched
50
+ certificate bundles. Keep the earlier unpublished `0.1.0` and `0.1.1` tags and their
51
+ reviewed files unchanged. Uploads still need separate owner approval, and the public enable
52
+ switch stays off. The source-tree version fallback also names `0.1.2` when installed
53
+ distribution metadata is absent.
54
+
55
+ - Prepare `0.1.1` as a new candidate for the first public-core release, with cleaned documentation.
56
+ Keep the earlier unpublished `0.1.0` tag and reviewed files unchanged. Uploads still need
57
+ separate owner approval, and the public enable switch stays off. The source-tree version
58
+ fallback also names `0.1.1` when installed distribution metadata is absent.
59
+
60
+ - Separate the concise public README and three shipped user guides from private suite guidance,
61
+ maintainer runbooks and dated preparation records. Keep executable documentation coverage and
62
+ the strict public archive boundary. Existing reviewed release files and tags stay unchanged.
63
+
64
+ - Earlier preparation moved the core version from `0.0.1` to the unpublished `0.1.0`
65
+ candidate. The two local suite members update their declared core requirement to
66
+ `vector-mtrl>=0.1.0,<0.2` under the 0.x minor core range rule; their own versions stay at
67
+ `0.0.1` until their first own release entries. No date is filed and no upload is claimed:
68
+ the first upload still needs explicit owner approval, and the public enable switch stays
69
+ off.
70
+ - Public release preparation now permits only core tags. Uploads require an explicit enable
71
+ switch. An offline gate rejects legacy licence metadata, private suite dependencies, and
72
+ non-core archive content. The old six-public-package train workflow is disabled.
73
+ - The core distribution is renamed from `mtrl` to `vector-mtrl` in one change: the root
74
+ project name, the member dependency strings, the wheel manifest key, the README install
75
+ commands, and the diagnostic install guidance all name `vector-mtrl`. The import package
76
+ stays `mtrl`, and the stored identity values keep their spelling: the operation
77
+ identifiers, the capability strings, the format feature names, and the recorded
78
+ `implementation_package` values, including the core value `mtrl`.
79
+
80
+ ### Added
81
+
82
+ - Author disclosure: `Mtrl.attach_environment_record` attaches one passive environment record,
83
+ `Mtrl.attach_source_bundle` binds one passive source bundle to the exact custom output record,
84
+ `Mtrl.environment_record` and `Mtrl.source_bundles` inspect the attached values, and
85
+ `Mtrl.export_source_bundle` writes one committed bundle as three fixed files. Attached material
86
+ is inert: MTRL records the author's claim and never imports, compiles, or executes it. The
87
+ value types live in `mtrl.disclosure`, and `EnvironmentRecordError` and `SourceBundleError`
88
+ join the package-root exports.
89
+ - Two core format features, `mtrl.environment-records/1` and `mtrl.source-bundles/1`, gate
90
+ archives that carry attachment content.
91
+ - `Mtrl.export_execution_plan`: the replay plan of one committed target as a
92
+ standalone `mtrl-execution-plan/1` document. The document is code-free, holds
93
+ recorded facts only, and carries no local registration fact, so it never
94
+ grants execution approval. The loader bounds bytes and depth and rejects every
95
+ closed-schema violation.
96
+ - `Mtrl.replay_plan`, `Mtrl.capability_view`, and `Mtrl.rerun`: explicit replay of a committed
97
+ operation chain. The plan and the capability view are read-only and execute nothing; the rerun
98
+ resolves each step only through the local registry, commits fresh identities in one revision,
99
+ and reports the recorded versus fresh canonical digests per step. `ReplayPlanError` and
100
+ `ReplayIneligibleError` join the package-root exports, and the replay types live under
101
+ `mtrl.replay`.
102
+ - Release safety before the first train: the core sdist carries a deliberate allowlist (`mtrl/`
103
+ with its `py.typed` marker, `LICENSE`, `NOTICE`, `README.md`, `CHANGELOG.md`, and the three
104
+ public guides under `docs/user/`) and no tests, because the
105
+ root test tree is workspace-coupled; `tests/test_packaging_inventory.py` pins the exact
106
+ top-level inventory of every workspace sdist; CI rebuilds the core wheel from its extracted
107
+ sdist in an isolated environment and imports `mtrl` from the installed wheel; and
108
+ `scripts/release_core_range_gate.py` fails closed before any upload when a suite tag's
109
+ declared core range does not resolve from PyPI.
110
+
111
+ ### Removed
112
+
113
+ - The `vector-mtrl-spa` and `vector-mtrl-trios` suites leave this workspace. They now live in
114
+ the private `vectorlabsonline/vector-mtrl-connectors` repository. The development group, the
115
+ workspace sources, the lockfile, and the CI member steps and wheel rows no longer select them.
116
+ The core `Mtrl.load_spa` and `Mtrl.load_tri` facades stay and fail closed without the suite.
117
+ - The `vector-mtrl-viz` suite leaves this workspace. It now lives in the private
118
+ `vectorlabsonline/vector-mtrl-viz` repository. The development group, the workspace
119
+ sources, and the lockfile no longer select it.
120
+ - The `spa`, `interp`, `tabular`, and `excel` core extras are removed. Development requirements
121
+ select the private suite members of this workspace; users install authorised suite wheels
122
+ from the member repositories. Superseded on 2026-10-22: the fold restores the `interp`,
123
+ `tabular`, and `excel` core extras, and the development group selects them.
124
+ - Legacy archive format support, including the `upgrade_legacy` path and the legacy alias map.
125
+ The single archive format is current-format-only, and an unknown format fails closed.
126
+ - The `mtrl.ftir.excise-co2-window` and `mtrl.ftir.baseline-airpls` operations and the `ftir`
127
+ extra.
128
+ - The `mtrl.resample.pchip` and `mtrl.resample.cubic` identifiers. The operations move to the
129
+ `vector-mtrl-interp` suite under new `vector-mtrl-interp.resample.*` identifiers.
130
+ Superseded on 2026-10-22: the fold returns both operations to the core as built-ins under
131
+ their historical identifiers.
132
+
133
+ ### Changed
134
+
135
+ - `MaterialData` accepts `units=None` as an explicit no-unit declaration: the values carry no unit
136
+ contract, construction stores an empty units mapping, and no operation invents a unit for
137
+ undeclared values. Passing `None` raised a pydantic validation error before.
138
+ - The `ReplayPlanError` message for a rerun step with no local implementation now states the
139
+ registry step as well: the registry in use must have registered the operations of the named
140
+ package, and installing the package alone registers nothing.
141
+ - Docstrings: `Mtrl.aggregate` reaches the house standard with Args, Returns, and Raises;
142
+ `Mtrl.save` documents the forced `.mtrl` suffix; and `Mtrl.load` states that the default registry
143
+ is a fresh built-in registry that holds no suite operations.
144
+ - The core distribution registers `mtrl.environment-records/1` and `mtrl.source-bundles/1` at
145
+ import, so the supported feature set is no longer empty by default.
146
+ `clear_supported_features()` still removes every feature; restore the core pair with
147
+ `register_supported_features(CORE_FORMAT_FEATURES)`.
148
+ - The operations layout is unified under `mtrl/operations/`.
149
+ - Instrument ingestion moves to the suites: the SPA connector to `vector-mtrl-spa` and the native
150
+ TRIOS connector to `vector-mtrl-trios`.
151
+ - The pandas frame builders, the Excel writer, and the internal table evaluation move to the
152
+ `vector-mtrl-tabular` suite. Superseded on 2026-10-22: the fold returns them to the core
153
+ through its public `tabular` and `excel` extras.
154
+ - The demo moves to the `vector-mtrl-viz` suite as its first consumer.
155
+
156
+ ## [0.0.1] - 2026-10-10
157
+
158
+ Baseline record of the core distribution. The code at this version is the Stage 0-1 modular rework
159
+ branch, `feature/modular-stage0`. It records the approved modular direction and delivers the
160
+ format-feature gate, the frozen manifest, namespace reservation at registration, derived capability
161
+ strings, descriptor-driven validation, and the stdlib CSV writer. This version was not published;
162
+ wheels are CI artefacts only. History before this baseline is not backfilled.