equiframe 0.12.4__py3-none-any.whl
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.
- equiframe/__init__.py +832 -0
- equiframe/__main__.py +3 -0
- equiframe/_base.py +84 -0
- equiframe/_cli_support.py +125 -0
- equiframe/_comparison_io.py +161 -0
- equiframe/_dataset_provenance.py +146 -0
- equiframe/_decimal.py +22 -0
- equiframe/_diff_capture.py +433 -0
- equiframe/_doctor.py +123 -0
- equiframe/_document_io.py +61 -0
- equiframe/_documents.py +79 -0
- equiframe/_duckdb_transport.py +149 -0
- equiframe/_error_reporting.py +52 -0
- equiframe/_first_use.py +102 -0
- equiframe/_path_compat.py +26 -0
- equiframe/_physical.py +133 -0
- equiframe/_r_review.R +308 -0
- equiframe/_regular_io.py +167 -0
- equiframe/_report_format_v1.py +298 -0
- equiframe/_report_io.py +591 -0
- equiframe/_stability_inventory.py +1421 -0
- equiframe/_timezones.py +257 -0
- equiframe/_vendor/cyclonedx/LICENSE +201 -0
- equiframe/_vendor/cyclonedx/PROVENANCE.md +18 -0
- equiframe/_vendor/cyclonedx/bom-1.6.schema.json +5673 -0
- equiframe/_vendor/cyclonedx/jsf-0.82.schema.json +240 -0
- equiframe/_vendor/cyclonedx/spdx.schema.json +712 -0
- equiframe/adapters.py +454 -0
- equiframe/assertion_types.py +122 -0
- equiframe/assertions.py +271 -0
- equiframe/benchmark.py +101 -0
- equiframe/bundle.py +240 -0
- equiframe/cli.py +693 -0
- equiframe/comparison.py +937 -0
- equiframe/comparison_report.py +660 -0
- equiframe/comparison_types.py +257 -0
- equiframe/compatibility.py +546 -0
- equiframe/contracts.py +879 -0
- equiframe/datasets.py +1301 -0
- equiframe/decision.py +34 -0
- equiframe/destinations.py +295 -0
- equiframe/detector_types.py +431 -0
- equiframe/detectors.py +389 -0
- equiframe/diff.py +192 -0
- equiframe/diff_contracts.py +523 -0
- equiframe/docs/adoption.md +329 -0
- equiframe/docs/api.md +534 -0
- equiframe/docs/arquitecto.md +143 -0
- equiframe/docs/choosing-api.md +84 -0
- equiframe/docs/cientifico.md +180 -0
- equiframe/docs/compatibility.md +254 -0
- equiframe/docs/contributing.md +171 -0
- equiframe/docs/dependencies.md +237 -0
- equiframe/docs/eda.md +166 -0
- equiframe/docs/extending.md +158 -0
- equiframe/docs/fast-ci.md +52 -0
- equiframe/docs/first-use.md +78 -0
- equiframe/docs/index.md +142 -0
- equiframe/docs/ingestion.md +145 -0
- equiframe/docs/inicio.md +129 -0
- equiframe/docs/installed-private.md +97 -0
- equiframe/docs/journeys.md +362 -0
- equiframe/docs/lectura-conversion.md +211 -0
- equiframe/docs/licensing.md +17 -0
- equiframe/docs/maintenance.md +233 -0
- equiframe/docs/migration-ir.md +333 -0
- equiframe/docs/option-audit.md +45 -0
- equiframe/docs/outcome-gates.md +134 -0
- equiframe/docs/performance.md +263 -0
- equiframe/docs/piloto-simulado.md +56 -0
- equiframe/docs/quickstart.md +156 -0
- equiframe/docs/r_review.md +212 -0
- equiframe/docs/recipes.md +248 -0
- equiframe/docs/releasing.md +183 -0
- equiframe/docs/security.md +218 -0
- equiframe/docs/semantics.md +274 -0
- equiframe/docs/sqlite-snapshots.md +262 -0
- equiframe/docs/universal-sources.md +49 -0
- equiframe/docs/universalidad-cinco-pasos.md +107 -0
- equiframe/docs/upgrading.md +538 -0
- equiframe/duckdb_capture.py +410 -0
- equiframe/eda/__init__.py +36 -0
- equiframe/eda/__main__.py +3 -0
- equiframe/eda/_backend.py +612 -0
- equiframe/eda/_inventory.py +49 -0
- equiframe/eda/_paths.py +49 -0
- equiframe/eda/_report.py +291 -0
- equiframe/eda/api.py +535 -0
- equiframe/eda/cli.py +102 -0
- equiframe/eda/models.py +239 -0
- equiframe/errors.py +83 -0
- equiframe/evidence.py +375 -0
- equiframe/examples/integrations/eda_generic.py +60 -0
- equiframe/examples/integrations/outcome_gates.py +94 -0
- equiframe/examples/integrations/sqlite_snapshot.py +246 -0
- equiframe/examples/integrations/sqlite_snapshot_demo.py +226 -0
- equiframe/examples/integrations/universal_first_use.py +296 -0
- equiframe/examples/journeys/README.md +31 -0
- equiframe/examples/journeys/__init__.py +1 -0
- equiframe/examples/journeys/a_pandas_refactor.py +88 -0
- equiframe/examples/journeys/b_native_migration.py +181 -0
- equiframe/examples/journeys/c_retail_etl.py +460 -0
- equiframe/examples/journeys/common.py +136 -0
- equiframe/examples/journeys/d_financial_reconciliation.py +96 -0
- equiframe/examples/journeys/e_telemetry.py +135 -0
- equiframe/examples/journeys/f_data_science_preparation.py +84 -0
- equiframe/examples/journeys/g_external_snapshots.py +197 -0
- equiframe/examples/journeys/h_portable_ci.py +129 -0
- equiframe/examples/journeys/requirements.lock +249 -0
- equiframe/examples/journeys/verify_journeys.py +117 -0
- equiframe/examples/load_convert_compare.py +85 -0
- equiframe/execution.py +355 -0
- equiframe/execution_types.py +177 -0
- equiframe/ingestion.py +744 -0
- equiframe/local.py +126 -0
- equiframe/migration/__init__.py +94 -0
- equiframe/migration/_physical.py +8 -0
- equiframe/migration/backends/_timestamp_transport.py +109 -0
- equiframe/migration/backends/duckdb.py +651 -0
- equiframe/migration/backends/duckdb_decimal.py +125 -0
- equiframe/migration/backends/duckdb_time.py +87 -0
- equiframe/migration/backends/pandas.py +544 -0
- equiframe/migration/backends/polars.py +915 -0
- equiframe/migration/backends/polars_decimal.py +231 -0
- equiframe/migration/io.py +198 -0
- equiframe/migration/ports.py +96 -0
- equiframe/migration/runner.py +545 -0
- equiframe/migration/runner_types.py +405 -0
- equiframe/migration/types.py +354 -0
- equiframe/migration/validation.py +619 -0
- equiframe/normalization.py +358 -0
- equiframe/pipeline.py +274 -0
- equiframe/pipeline_types.py +247 -0
- equiframe/ports.py +39 -0
- equiframe/preprocessing.py +110 -0
- equiframe/profile_types.py +343 -0
- equiframe/profiles.py +447 -0
- equiframe/py.typed +0 -0
- equiframe/r_review.py +706 -0
- equiframe/reduction.py +518 -0
- equiframe/registry.py +121 -0
- equiframe/report_rendering.py +366 -0
- equiframe/report_types.py +294 -0
- equiframe/reporting.py +26 -0
- equiframe/rule_types.py +178 -0
- equiframe/rules.py +819 -0
- equiframe/schemas/r-execution-binding-1.0.schema.json +46 -0
- equiframe/schemas/r-review-binding-1.0.schema.json +28 -0
- equiframe/schemas/r-review-options-1.0.schema.json +38 -0
- equiframe/schemas/r-review-result-1.0.schema.json +207 -0
- equiframe/schemas/reviewed-decision-1.0.schema.json +3394 -0
- equiframe/serialization.py +152 -0
- equiframe/snapshot.py +296 -0
- equiframe/sources.py +283 -0
- equiframe/tables.py +459 -0
- equiframe/types.py +71 -0
- equiframe/values.py +252 -0
- equiframe/verification_request.py +35 -0
- equiframe/verify.py +799 -0
- equiframe/verify_types.py +255 -0
- equiframe/workflow.py +510 -0
- equiframe/workflow_request.py +38 -0
- equiframe-0.12.4.dist-info/METADATA +268 -0
- equiframe-0.12.4.dist-info/RECORD +170 -0
- equiframe-0.12.4.dist-info/WHEEL +4 -0
- equiframe-0.12.4.dist-info/entry_points.txt +3 -0
- equiframe-0.12.4.dist-info/licenses/LICENSE +21 -0
- equiframe-0.12.4.dist-info/licenses/THIRD_PARTY_NOTICES.md +42 -0
- equiframe-0.12.4.dist-info/licenses/tools/cyclonedx/LICENSE +201 -0
- equiframe-0.12.4.dist-info/licenses/tools/cyclonedx/PROVENANCE.md +18 -0
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
# Upgrading, recovery and support
|
|
2
|
+
|
|
3
|
+
[Handbook](index.md) · [Compatibility](compatibility.md) · [Security](security.md) ·
|
|
4
|
+
[Release/rollback](releasing.md)
|
|
5
|
+
|
|
6
|
+
## 0.12.4 candidate: raw metadata and producer identity
|
|
7
|
+
|
|
8
|
+
This source revision prepares the exactly paired 0.12.4 core and benchmark.
|
|
9
|
+
Its release checks require artifact-bound receipts, and index availability must
|
|
10
|
+
be observed directly. The 0.12.2 tag, artifacts and successful, failed or
|
|
11
|
+
incomplete checks retain their original identities. The local 0.12.3 candidate
|
|
12
|
+
was not uploaded. Its publication-gate negative test accidentally selected the
|
|
13
|
+
current candidate version; the new fixture requires an explicitly different
|
|
14
|
+
version. This corrects the test expectation, not the verifier's version binding.
|
|
15
|
+
|
|
16
|
+
The benchmark's passive-metadata regression now constructs explicit LF and CRLF
|
|
17
|
+
bytes and checks each raw SHA-256. The inventory still hashes the file as read;
|
|
18
|
+
it does not normalize line endings to accept different bytes. This corrects a
|
|
19
|
+
Windows test-fixture expectation rather than changing metadata-reader behavior.
|
|
20
|
+
|
|
21
|
+
New detector fits identify producer 0.12.4. The new reader continues to admit
|
|
22
|
+
supported older producers, including 0.12.2, without rewriting their evidence.
|
|
23
|
+
A 0.12.2 reader does not automatically admit a 0.12.4 producer. Keep the matching
|
|
24
|
+
reader and artifact hashes; never replace the recorded producer to force an
|
|
25
|
+
older reader to accept a bundle. The IF/MAD algorithms and public format markers
|
|
26
|
+
remain unchanged. Active schemas and their reviewed inventories follow the
|
|
27
|
+
explicit producer admission.
|
|
28
|
+
|
|
29
|
+
The source-only consumer application 0.1.19 requires core 0.12.4. Earlier
|
|
30
|
+
0.1.18/core 0.12.2 runs remain evidence of that pairing, not executions of the new
|
|
31
|
+
application or release. Its frozen corpus is unchanged.
|
|
32
|
+
|
|
33
|
+
## 0.12.2 compatible patch
|
|
34
|
+
|
|
35
|
+
This patch retains the reviewed 0.12.0 public API and file-format contracts. Its
|
|
36
|
+
package description is in English; repository READMEs present English before
|
|
37
|
+
Spanish. A runnable file/conversion/comparison example is included with both
|
|
38
|
+
source and wheel distributions.
|
|
39
|
+
|
|
40
|
+
Release versions now come from the reviewed Git tag through Hatch. Installed
|
|
41
|
+
`__version__` values read distribution metadata. Build from an identified source
|
|
42
|
+
archive or a correctly tagged Git checkout; do not inject an SCM override to
|
|
43
|
+
manufacture a release version. The exact paired benchmark remains Beta.
|
|
44
|
+
|
|
45
|
+
Existing evidence keeps its original producer. The new producer is admitted
|
|
46
|
+
explicitly without relabeling previous detector fits or historical fixtures.
|
|
47
|
+
Source changes and rebuilt distributions need their own final checks and hashes.
|
|
48
|
+
|
|
49
|
+
## 0.12.0 public contract
|
|
50
|
+
|
|
51
|
+
The 0.12.0 stabilization protects the explicitly reviewed file-reading/conversion,
|
|
52
|
+
DuckDB capture, closed IR/native migration, profile/IF/MAD/H and language-R
|
|
53
|
+
interfaces. See the per-name `get_stability_register()` and
|
|
54
|
+
[compatibility boundaries](compatibility.md). This is not a blanket promotion of
|
|
55
|
+
every export: EDA, reduction, providers, ingestion/workflows and standalone
|
|
56
|
+
pipeline orchestration remain experimental. Shared pipeline models embedded in
|
|
57
|
+
stable migration evidence retain their format and reader commitments.
|
|
58
|
+
|
|
59
|
+
Existing valid calls, typed outcomes, exact values, historical format semantics
|
|
60
|
+
and fail-closed rejections remain the contract. No caller needs to replace `1.0`
|
|
61
|
+
format markers with the package version. Do not relabel old compiler identities,
|
|
62
|
+
producer versions, detector evidence or successful/failed historical runs as
|
|
63
|
+
0.12.0. A new package identity requires its own final artifact checks; the A14
|
|
64
|
+
implementation matrix is separately identified in compatibility documentation.
|
|
65
|
+
|
|
66
|
+
Stability does not promise that a trained forest survives arbitrary changes to
|
|
67
|
+
scikit-learn, NumPy, preprocessing features or training/calibration selection.
|
|
68
|
+
Keep the original environment and bundle for retained inference; after a
|
|
69
|
+
dependency change, check version admission, reproduce representative scores and
|
|
70
|
+
retrain/recalibrate deliberately where required. No inference path may refit a
|
|
71
|
+
model or turn unavailable support into `no_alert`.
|
|
72
|
+
|
|
73
|
+
## Before changing a dependency or candidate
|
|
74
|
+
|
|
75
|
+
The 26 October 2026 source development introduced
|
|
76
|
+
[file loading/conversion](lectura-conversion.md) and [language-R review](r_review.md)
|
|
77
|
+
APIs, now included in the reviewed 0.12.0 public contract. Existing contract,
|
|
78
|
+
comparison, migration and detector semantics remain separate. Initial file
|
|
79
|
+
loading constructs Pandas before its selected native target; later conversion
|
|
80
|
+
consumes the currently selected Pandas, Polars or DuckDB frame, verifies its
|
|
81
|
+
captured identity and records the new provenance. Conversion is not a replacement
|
|
82
|
+
for executing independent transformations. R review
|
|
83
|
+
requires an explicit contract and preserves existing alerts/unavailable states.
|
|
84
|
+
Select the `files` extra for Excel/XML readers and the corresponding engine extra
|
|
85
|
+
for conversion; install Rscript separately only when using the optional R API.
|
|
86
|
+
Validation results for these source additions are reported separately and do not
|
|
87
|
+
inherit results from older candidate artifacts.
|
|
88
|
+
|
|
89
|
+
A14 introduced construction-time rejection of invalid built-in transformation
|
|
90
|
+
metadata; 0.12.0 retains it. `PandasTransformation` and `PolarsTransformation` require an
|
|
91
|
+
explicit callable; `DuckDBTransformation` requires nonempty trusted Unicode SQL
|
|
92
|
+
without NUL. No constructor runs that code or imports a native engine. Valid SQL
|
|
93
|
+
is preserved verbatim, including surrounding whitespace. Revision/identity/version
|
|
94
|
+
errors retain `ValidationError`; engine/callback/SQL admission errors use
|
|
95
|
+
`InvalidExecutionInput`. Custom registered implementations remain explicit.
|
|
96
|
+
|
|
97
|
+
`RunContext.check_table` requires actual boolean `output` and `enforce_rows`
|
|
98
|
+
values. Pass `False` deliberately to skip its row checkpoint; this does not
|
|
99
|
+
disable its Arrow buffer budget. `measure` rejects invalid stage text before
|
|
100
|
+
entering the operation. Constructor validation and budget guards do not sandbox
|
|
101
|
+
trusted callbacks or provide hard process-memory/preemption guarantees.
|
|
102
|
+
|
|
103
|
+
Historical A11 added source inputs and deterministic windows; see the
|
|
104
|
+
[five-step guide](universalidad-cinco-pasos.md). Existing plans keep their node
|
|
105
|
+
defaults. That candidate's consumers needed its regenerated IR/migration/workflow
|
|
106
|
+
schemas and a fresh compilation/validation; older
|
|
107
|
+
readers do not understand a new `window` kind. A11 introduced its detector
|
|
108
|
+
producer identity; historical producer records remain readable. No historical expected
|
|
109
|
+
output or receipt is rewritten. Core/benchmark versions are paired exactly.
|
|
110
|
+
|
|
111
|
+
1. Keep the current wheel/sdist, trusted receipt, dependency pins/hashes and
|
|
112
|
+
environment details. `0.11.1` alone cannot identify private candidate bytes
|
|
113
|
+
2. Preserve contracts, their revisions, reviewed expected outputs and finalized
|
|
114
|
+
evidence. Do not overwrite old runs or automatically approve new baselines
|
|
115
|
+
3. Read the artifact's changelog, per-name stability register, compatibility
|
|
116
|
+
policy, dependency inventory and affected security/release notes
|
|
117
|
+
4. Create a new isolated environment. Install the new identified artifact and
|
|
118
|
+
reviewed dependencies outside the checkout; check imports and `pip check`
|
|
119
|
+
5. Run your representative positive, different, invalid-expected, incomplete and
|
|
120
|
+
resource-limit cases, plus the appropriate installed recipe and regression suite
|
|
121
|
+
6. Compare semantics, diagnostics, artifact readability and performance budgets.
|
|
122
|
+
A successful import is not enough; historical artifact readers must still
|
|
123
|
+
satisfy their integrity and supported-format checks
|
|
124
|
+
7. Move the application only after those checks pass. Retain the previous safe
|
|
125
|
+
environment and evidence for rollback, without reinstating a known unsafe version
|
|
126
|
+
|
|
127
|
+
Dependency upgrades can change native transport, timezones and fitted ML
|
|
128
|
+
behavior. Use the same exact identified wheel for every claimed matrix cell.
|
|
129
|
+
Do not edit lock hashes, reference outputs or capability fingerprints to silence
|
|
130
|
+
a failure. Escalate the smallest reproducible semantic difference instead.
|
|
131
|
+
|
|
132
|
+
## Retained behavior and historical candidate corrections
|
|
133
|
+
|
|
134
|
+
### Historical A13/A14 producer identities
|
|
135
|
+
|
|
136
|
+
A12 incorrectly inherited the A11 default when fitting a new detector. The
|
|
137
|
+
historical A13 correction addressed that default for its own candidate. The
|
|
138
|
+
then-current A14 candidate recorded `0.12.0a14` for newly fitted detector evidence;
|
|
139
|
+
supported older records retain their recorded producer. This concerns provenance
|
|
140
|
+
metadata, not fitting,
|
|
141
|
+
thresholds, labels or the `equiframe-if-mad-1.0` algorithm identity. Existing
|
|
142
|
+
bundles retain their recorded producer; readers never relabel old evidence.
|
|
143
|
+
Recreate affected A12 fits when accurate producer provenance is required.
|
|
144
|
+
The frozen A12 option catalog remains bound to its original artifact and does
|
|
145
|
+
not establish a current release's coverage percentage. New 0.12.0 producers
|
|
146
|
+
record their own package identity; supported historical records keep theirs.
|
|
147
|
+
|
|
148
|
+
### Truth testing is intentionally rejected
|
|
149
|
+
|
|
150
|
+
Replace:
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
# Unsafe historical pattern; now raises TypeError
|
|
154
|
+
assert result
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
With:
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
ef.assert_equivalent(result)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
For absence checks use `result is not None`, and for a decision use
|
|
164
|
+
`decision.accepted`. Do not use `result or fallback`, `any([result])`, or
|
|
165
|
+
`if decision`. All three comparison states reject truth testing.
|
|
166
|
+
|
|
167
|
+
### Operational outcomes also reject truth testing
|
|
168
|
+
|
|
169
|
+
The [explicit outcome inventory](outcome-gates.md) extends this rule to operational
|
|
170
|
+
results, checks, decisions and comparison reports. Replace optional-presence
|
|
171
|
+
checks with `value is not None`; replace acceptance checks with the documented
|
|
172
|
+
state/completeness/decision gate. Do not mechanically replace `if result` with
|
|
173
|
+
`if result is not None` when the original intent was approval. Configuration,
|
|
174
|
+
input data and bundle containers are not globally converted to boolean guards.
|
|
175
|
+
Persisted fields, formats, readers and fingerprints remain unchanged.
|
|
176
|
+
|
|
177
|
+
### Complete does not mean accepted
|
|
178
|
+
|
|
179
|
+
An invalid right-hand expected result may be `not_evaluable` with `complete=True`.
|
|
180
|
+
Use the explicit assertion and do not replace it with a check of only
|
|
181
|
+
`result.complete` or an empty example list. `equiframe compare` uses 0 only for
|
|
182
|
+
accepted complete equivalence; 1 is a complete difference; 3 is unavailable
|
|
183
|
+
judgment/failure; invalid input/configuration may use 2.
|
|
184
|
+
|
|
185
|
+
### Existing evidence keeps its meaning
|
|
186
|
+
|
|
187
|
+
Readers reject unknown versions, inconsistent counts, corrupted inventory and
|
|
188
|
+
unsafe references even if an earlier candidate accepted them or hashes were
|
|
189
|
+
recomputed. That is a fail-closed correctness restriction, not permission to
|
|
190
|
+
reinterpret an old schema. Core format `1.0`, contract revision and package
|
|
191
|
+
version are independent. Save a new artifact when an explicit supported
|
|
192
|
+
migration exists; no universal automatic converter is promised.
|
|
193
|
+
|
|
194
|
+
### Native capture can reject previously lossy cases
|
|
195
|
+
|
|
196
|
+
Unsupported metadata, Decimal/time representations, DuckDB HUGEINT/UHUGEINT and
|
|
197
|
+
other unfaithful native transports are rejected instead of coerced. Do not
|
|
198
|
+
work around a rejection by turning precise numbers into floats or discarding
|
|
199
|
+
metadata. A deliberate consumer-side conversion needs its own reviewed domain
|
|
200
|
+
and range proof. Preserve the original data and conversion provenance.
|
|
201
|
+
|
|
202
|
+
### Migration arithmetic rejects concealed intermediate overflow
|
|
203
|
+
|
|
204
|
+
Each arithmetic expression's declared range is enforced before its value is
|
|
205
|
+
consumed. DuckDB compiler v8 replaces its earlier placement rejections with
|
|
206
|
+
native eager checkpoints, allowing nested arithmetic, arithmetic predicates
|
|
207
|
+
and later relational operations without concealing errors. Compiled IR programs
|
|
208
|
+
require the native checkpoint-aware adapter; executing their `.sql` alone fails
|
|
209
|
+
explicitly. Ordinary registered trusted DuckDB SQL keeps its interface.
|
|
210
|
+
|
|
211
|
+
Pandas v4 and Polars v11 retain their own native paths. DuckDB's new version is
|
|
212
|
+
`product-semantics-v8`; old identities and historical formats remain unchanged.
|
|
213
|
+
Read the [checkpoint and budget contract](migration-ir.md#eager-failures-and-historical-evidence)
|
|
214
|
+
and rerun affected plans against the identified artifact. Source-only tests and
|
|
215
|
+
earlier artifacts do not establish validation of a new installed wheel.
|
|
216
|
+
|
|
217
|
+
## Optional configuration and pinned snapshots
|
|
218
|
+
|
|
219
|
+
Optional `options`/`policy` arguments now use defaults only for `None`. Invalid
|
|
220
|
+
falsey values such as `False`, `0` or `[]` raise validation errors before work
|
|
221
|
+
begins. Existing option models and valid strict mappings, including an empty
|
|
222
|
+
all-default mapping, retain their behavior. Use an explicit empty mapping only
|
|
223
|
+
where a mapping is the documented input, not as a substitute for another type.
|
|
224
|
+
|
|
225
|
+
The generic snapshot API is now available from `equiframe` and
|
|
226
|
+
`equiframe.snapshot`. Existing `equiframe_benchmark` imports are supported aliases,
|
|
227
|
+
so there is no forced import migration or manifest rewrite. New integrations can
|
|
228
|
+
avoid installing the benchmark; see [extension ports](extending.md).
|
|
229
|
+
|
|
230
|
+
## Failure diagnosis
|
|
231
|
+
|
|
232
|
+
| Symptom | Safe next step |
|
|
233
|
+
|---|---|
|
|
234
|
+
| `missing_optional_dependency` | Install the required extra from reviewed artifacts; retain its pinned dependency identity |
|
|
235
|
+
| Import resolves inside checkout | Recreate a clean environment outside the source tree; remove editable/PYTHONPATH influence |
|
|
236
|
+
| Missing compatible dependency wheel | Record Python/OS/architecture and exact pins; request a reviewed supported set instead of dropping hashes |
|
|
237
|
+
| `CapabilityError` / unsupported representation | Inspect adapter stage/type policy; do not silently cast, deduplicate or drop metadata |
|
|
238
|
+
| `different` | Inspect key/position, both values/types, policy and actual contract violation; fix the candidate or review a genuine requirement change |
|
|
239
|
+
| `not_evaluable` | Inspect diagnostics and completeness; repair invalid reference/input or deliberately revise sufficient resource budgets |
|
|
240
|
+
| Evidence missing/corrupt/outside root | Preserve the failed directory; verify source/receipt and configured authorized root; do not rehash corruption into validity |
|
|
241
|
+
| Destination already exists | Use a new output directory rather than overwriting earlier evidence |
|
|
242
|
+
| Timeout, cancellation or process kill | Retain partial evidence and nonzero status; require valid finalization on a new run |
|
|
243
|
+
| HTML looks valid but integrity check fails | Treat publication as failed; a rendered view is not verified acceptance |
|
|
244
|
+
| ML bundle incompatible/not estimable | Preserve the reason; validate features, versions and disjoint normal training/calibration support; do not convert to `no_alert` |
|
|
245
|
+
|
|
246
|
+
Exception messages are concise but arbitrary caller/dependency tracebacks,
|
|
247
|
+
Pydantic `.errors()`, pytest `--showlocals`, plugins and environment dumps can
|
|
248
|
+
still reveal data. Share a minimized synthetic reproduction, not raw private
|
|
249
|
+
captures or credentials.
|
|
250
|
+
|
|
251
|
+
## Reporting a problem
|
|
252
|
+
|
|
253
|
+
Use the repository issue channel linked in the README for nonsensitive bugs and
|
|
254
|
+
minimal synthetic reproductions. Follow [security](security.md) for sensitive
|
|
255
|
+
reports. This handbook does not establish a guaranteed response time, staffed
|
|
256
|
+
security duty roster or SLA. Package stability protects the published technical
|
|
257
|
+
contract; it is not a support-service promise.
|
|
258
|
+
|
|
259
|
+
Include only what is needed:
|
|
260
|
+
|
|
261
|
+
- Exact wheel/sdist hashes, package and dependency versions, Python/OS/architecture
|
|
262
|
+
- Minimal synthetic inputs, reviewed contract/policy and expected versus observed
|
|
263
|
+
state/completeness/exit code
|
|
264
|
+
- Reproduction command, budget settings and whether failure is repeatable
|
|
265
|
+
- Redacted validated report where sufficient; record missing evidence honestly
|
|
266
|
+
- Whether a prior **identified artifact** behaved differently
|
|
267
|
+
|
|
268
|
+
A possible false `equivalent` deserves urgent owner review because it can
|
|
269
|
+
undermine downstream trust. Stop using that result for acceptance, preserve
|
|
270
|
+
private evidence, bound affected versions/data and avoid publishing sensitive
|
|
271
|
+
examples while the issue is assessed. This is an incident-handling expectation,
|
|
272
|
+
not a claim that a staffed response service already exists.
|
|
273
|
+
|
|
274
|
+
## Rollback and withdrawal
|
|
275
|
+
|
|
276
|
+
Rollback means selecting an earlier **known-safe identified artifact and matching
|
|
277
|
+
dependency environment**, then revalidating your representative workload. Do not
|
|
278
|
+
alter historical reports or downgrade format markers to make them readable.
|
|
279
|
+
An old version known to admit false equivalence is not a safe fallback. If no
|
|
280
|
+
safe reader/environment is available, retain the evidence and suspend acceptance.
|
|
281
|
+
Only the owner can authorize public release/withdrawal decisions; see
|
|
282
|
+
[release procedure](releasing.md). Authorization to prepare a stable release is
|
|
283
|
+
not evidence that registry publication, clean installation or the other release
|
|
284
|
+
gates have finished; use the status of the identified final artifact.
|
|
285
|
+
|
|
286
|
+
## Retained use and incident follow-through
|
|
287
|
+
|
|
288
|
+
Use the [adoption protocol](adoption.md) to record whether an integration survives
|
|
289
|
+
a later real change, including failures and assistance. Technical replays are
|
|
290
|
+
not human acceptance. [Maintenance](maintenance.md) documents proposed priorities,
|
|
291
|
+
minimal permitted reproductions, pending owners and critical false-equivalence
|
|
292
|
+
containment, correction, safe recovery and consumer reconfirmation.
|
|
293
|
+
|
|
294
|
+
## Shared primitives and installed learning routes
|
|
295
|
+
|
|
296
|
+
The consolidation retains all current public names and their imports. Generic
|
|
297
|
+
byte publication no longer depends on profile computation; physical captured-table
|
|
298
|
+
validation no longer belongs to migration. Old private aliases remain identical.
|
|
299
|
+
No serializer, schema version, newline or fingerprint was unified by this move.
|
|
300
|
+
Existing historical fixtures remain immutable regression inputs.
|
|
301
|
+
|
|
302
|
+
Start from [the Spanish introduction](inicio.md) or [API choice](choosing-api.md).
|
|
303
|
+
The wheel now carries [A–H runnable journeys](journeys.md) and the complete
|
|
304
|
+
[SQLite snapshot integration](sqlite-snapshots.md) as package resources, so their
|
|
305
|
+
use need not depend on a checkout. These are synthetic engineering examples;
|
|
306
|
+
they do not establish independent human adoption, domain/DW acceptance or a
|
|
307
|
+
completed security assessment.
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
## 0.12.0a1 native relational additions
|
|
311
|
+
|
|
312
|
+
The [IR extension reference](migration-ir.md) specifies the new outer joins,
|
|
313
|
+
cardinality, deterministic deduplication, Decimal operations and timestamp/DST
|
|
314
|
+
contracts. Existing `EquiJoin` defaults remain many-to-many; existing identical
|
|
315
|
+
dedup and arithmetic behavior remain unchanged. New default fields are omitted
|
|
316
|
+
from old-shaped serialization to preserve historical IR/spec fingerprints.
|
|
317
|
+
Historical evidence is read without rewriting bytes, schemas or old compiler
|
|
318
|
+
identities. New compilers carry `product-semantics-v2` identities. Previously
|
|
319
|
+
blanket-rejected operations now have explicit per-engine admitted subsets.
|
|
320
|
+
|
|
321
|
+
Decimal division now has independent exact native routes in all three engines;
|
|
322
|
+
Polars/DuckDB use bounded integer quotient/remainder steps through precision 38.
|
|
323
|
+
DuckDB also supports explicit half-even DecimalRound through the exact integer
|
|
324
|
+
coefficient path; its compiler identity advances to product-semantics-v5.
|
|
325
|
+
Rerun affected rounding plans with the new wheel and independent expected values;
|
|
326
|
+
older rejected half-even plans do not become historical successful executions.
|
|
327
|
+
|
|
328
|
+
The subsequent IR timestamp implementation uses Polars product-semantics-v9 and
|
|
329
|
+
DuckDB product-semantics-v6. Exact int64 tick codecs preserve all four units and
|
|
330
|
+
declared zones. DuckDB localization now enforces explicit fold/gap policies in
|
|
331
|
+
native ICU SQL; Polars seconds localization uses a checked native millisecond
|
|
332
|
+
view. General transformations keep their original native transport restrictions.
|
|
333
|
+
Rerun affected time plans against the new wheel and literal expected instants;
|
|
334
|
+
the source-only foundation checks and previous artifacts retain their identities.
|
|
335
|
+
The earlier foundation used Polars v6 and DuckDB v4. Those compiler identities
|
|
336
|
+
and their evidence remain unchanged: that revision rejected DuckDB explicit DST
|
|
337
|
+
localization and Polars timestamp seconds, and restricted DuckDB arithmetic
|
|
338
|
+
placement. Current transport, localization and checkpoint behavior is specified
|
|
339
|
+
in [the IR manual](migration-ir.md); capture support alone never establishes
|
|
340
|
+
localization support.
|
|
341
|
+
Check both compilers before migrating; a source test is not installed-wheel
|
|
342
|
+
validation. These additions do not alter thesis families, partitions or R/M/B/H/O.
|
|
343
|
+
|
|
344
|
+
Polars `product-semantics-v13` subsequently replaces bundled-provider IR
|
|
345
|
+
localization with native transition lookup and POSIX-rule evaluation from the
|
|
346
|
+
installed `tzdata` resources. This addresses timezone history revisions such as
|
|
347
|
+
the Colombian May 1992 transition without changing input ticks or expected
|
|
348
|
+
instants. Compilation identities include resource hashes; changing a resource
|
|
349
|
+
before execution rejects the run. Rerun affected plans against the identified
|
|
350
|
+
wheel. Earlier Factory, numeric and timezone receipts retain their original
|
|
351
|
+
artifact identities and do not establish acceptance of the new implementation.
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
## 0.12.0a2 strict numeric and boolean metadata literals
|
|
355
|
+
|
|
356
|
+
Numeric/boolean `Literal` fields now require the exact declared Python value type.
|
|
357
|
+
For example, `64.0` is rejected for an integer bit-width literal and `1` is rejected
|
|
358
|
+
for a `Literal[True]` confirmation. This closes a reproduced coercion in both core
|
|
359
|
+
and benchmark metadata, rather than changing valid value encodings or the
|
|
360
|
+
scientific method. String-only literals retain their existing behavior.
|
|
361
|
+
|
|
362
|
+
Candidate 0.12.0a2 introduced these guards. Its producer register retained
|
|
363
|
+
0.12.0a1 and older admitted identities for valid historical evidence; retaining
|
|
364
|
+
an identity does not certify the correctness of every earlier input. Preserve
|
|
365
|
+
a1 receipts separately and rerun affected cases against the new wheel. Its matching
|
|
366
|
+
benchmark required exactly `equiframe[arrow]==0.12.0a2`.
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
## 0.12.0a3 verification reader consistency
|
|
370
|
+
|
|
371
|
+
Use 0.12.0a3 for new validation, with the benchmark pinned to the same core
|
|
372
|
+
candidate. A verification must request at least one output. A failed capture
|
|
373
|
+
may still have one requested output and zero inspected outputs; that remains
|
|
374
|
+
non-publishable and incomplete rather than becoming a publishable empty result.
|
|
375
|
+
|
|
376
|
+
Retained execution/snapshot mismatches must remain failed and incomplete. Readers
|
|
377
|
+
reject expected pass/fail claims without a bound comparison and invalid integrity
|
|
378
|
+
states.
|
|
379
|
+
Complete verification requires passed integrity; requested comparison counts and
|
|
380
|
+
coverage completeness must agree with the retained dimensions. These checks strengthen
|
|
381
|
+
the existing acceptance boundary without changing scientific protocols or admitting
|
|
382
|
+
partial, missing or contradictory evidence as success. They check consistency,
|
|
383
|
+
not producer authentication.
|
|
384
|
+
|
|
385
|
+
Valid historical producer identities, including 0.12.0a1 and 0.12.0a2, remain
|
|
386
|
+
admitted. Admission is not a certification of malformed earlier documents.
|
|
387
|
+
Preserve the original evidence and failed probes; do not rewrite old results or
|
|
388
|
+
infer acceptance from old passing totals. Revalidate affected cases against the
|
|
389
|
+
identified 0.12.0a3 wheel and preserve the new artifact-specific receipts.
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
## 0.12.0a4 explicit integrity-reader controls
|
|
393
|
+
|
|
394
|
+
`read_pipeline`, `read_migration`, `read_workflow`, and the benchmark's
|
|
395
|
+
`read_integration` require an actual Python `bool` for `verify`. The default and
|
|
396
|
+
explicit `True` verify retained evidence. Explicit `False` is a deliberate
|
|
397
|
+
metadata-only read: returned producer decisions such as `complete` or `exit_code`
|
|
398
|
+
are not proof that retained bytes are intact.
|
|
399
|
+
|
|
400
|
+
Other values, including `0`, `1`, `None`, strings and empty collections, raise
|
|
401
|
+
`TypeError` before evidence I/O. Convert external configuration to a validated
|
|
402
|
+
boolean explicitly; do not use truthiness to interpret text such as `"false"`.
|
|
403
|
+
This closes reproduced cases where invalid falsey values silently skipped
|
|
404
|
+
corrupted-evidence checks. Valid boolean behavior and evidence formats are
|
|
405
|
+
unchanged. Preserve earlier artifacts and failed probes, and rerun acceptance
|
|
406
|
+
against the identified 0.12.0a4 package pair.
|
|
407
|
+
|
|
408
|
+
For portable bundles, only `expected_sha256=None` omits the optional trusted
|
|
409
|
+
manifest pin. Empty strings or other falsey supplied values no longer disable
|
|
410
|
+
pin checking; they fail the exact SHA-256 comparison. This also applies to
|
|
411
|
+
`inspect_bundle` and `import_bundle`; a rejected import does not create its
|
|
412
|
+
destination. Bundle member checks remain mandatory even when the pin is omitted.
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
## 0.12.0a5 literal native column names
|
|
416
|
+
|
|
417
|
+
IR column strings denote exact names, including `*`, regex-shaped names and
|
|
418
|
+
projected aliases. Earlier Polars compilers could expand such names, fail
|
|
419
|
+
planning or return unintended extra columns. The comparison/expected gates
|
|
420
|
+
remain necessary; successful native execution alone never proves correctness.
|
|
421
|
+
|
|
422
|
+
The corrected Polars compiler uses literal selectors and temporary native-local
|
|
423
|
+
join identifiers, restoring exact public names and order. It carries
|
|
424
|
+
`product-semantics-v3`; Pandas/DuckDB compiler identities are unchanged. No IR
|
|
425
|
+
format, comparison policy or scientific method changes. Existing name validation
|
|
426
|
+
and engine-specific identifier limitations remain in force. See
|
|
427
|
+
[migration contracts](migration-ir.md#literal-column-names).
|
|
428
|
+
|
|
429
|
+
Preserve old artifacts and receipts. Recompile/rerun affected plans with the
|
|
430
|
+
identified A5 wheel and retain new evidence; do not reinterpret A4 results as A5.
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
## 0.12.0a6 optimization-independent input rejection
|
|
434
|
+
|
|
435
|
+
The shared snapshot boundary now rejects unsupported input objects with an
|
|
436
|
+
explicit `TypeError` rather than a Python assertion. This avoids diagnostic
|
|
437
|
+
behavior changing when assertions are disabled with `python -O`. In `verify`,
|
|
438
|
+
an unsupported expected object follows the existing failed-capture path and
|
|
439
|
+
cannot make a result publishable. It does not become a supported expected type;
|
|
440
|
+
use the documented `ArtifactRef`, `ExecutionResult`, or `None` inputs.
|
|
441
|
+
|
|
442
|
+
Supported snapshot inputs and recorded valid evidence are unchanged. Preserve
|
|
443
|
+
A5 artifacts and receipts, and use the exact A6 package hashes for new validation.
|
|
444
|
+
No output-model contract or scientific methodology changed.
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
## 0.12.0a14 first use and environment diagnosis
|
|
448
|
+
|
|
449
|
+
Two new experimental commands use existing public comparison/report APIs:
|
|
450
|
+
`python -I -m equiframe doctor --extra arrow` checks local metadata;
|
|
451
|
+
`python -I -m equiframe demo --role scientist --output NEW_DIRECTORY` runs a
|
|
452
|
+
small synthetic preparation and saves reports before the gate. See
|
|
453
|
+
[first use](first-use.md) for both roles and all three states. Dependency ranges,
|
|
454
|
+
existing API signatures and persisted format versions are unchanged.
|
|
455
|
+
|
|
456
|
+
Core and benchmark must both be A14. External consumers with an exact older
|
|
457
|
+
core pin continue to require their identified older artifact; do not bypass
|
|
458
|
+
dependency checks to force an upgrade. Reinstall the correct artifact in the
|
|
459
|
+
selected interpreter if doctor reports code/metadata identity disagreement.
|
|
460
|
+
|
|
461
|
+
## 0.12.0a7 minimum-Polars expression composition
|
|
462
|
+
|
|
463
|
+
The A5/A6 literal-name selector compiles to escaped regex expressions on admitted
|
|
464
|
+
Polars 1.30. Combining different columns can fail with `ComputeError: an expression
|
|
465
|
+
is not allowed to have different regexes`, including ordinary two-column Boolean
|
|
466
|
+
filters. Affected migrations remain incomplete/non-evaluable; that is a defect for
|
|
467
|
+
valid admitted plans, not acceptance of their data. Historical A5/A6 passes on a
|
|
468
|
+
newer Polars do not establish minimum-version support for those combinations.
|
|
469
|
+
|
|
470
|
+
The Polars compiler now evaluates expressions in a collision-free native-local
|
|
471
|
+
column namespace, mapped from the actual input frame's literal names and order.
|
|
472
|
+
Even `nth(index)` can expand its resolved name in Polars 1.30, so positional
|
|
473
|
+
selection alone is insufficient. Logical names are restored after evaluation;
|
|
474
|
+
every stored node is normalized to validated schema order. Projections compute
|
|
475
|
+
all expressions from one renamed source using distinct temporary output aliases.
|
|
476
|
+
New aliases, replacements and literal `*`/regex-shaped names stay literal.
|
|
477
|
+
Aggregation, deduplication, sorting and join-key checks use the same safe naming
|
|
478
|
+
boundary; existing collision-free join renaming is retained. There is no fallback
|
|
479
|
+
to another engine and no raised Polars minimum.
|
|
480
|
+
|
|
481
|
+
Reinstall the exact A7 wheel and rerun affected Polars plans against their
|
|
482
|
+
independent expected output at both dependency endpoints. The compiler identity
|
|
483
|
+
is `migration-native-ir1.0/polars/product-semantics-v4`; Pandas and DuckDB retain
|
|
484
|
+
v2. The public IR, contract and evidence formats remain 1.0. Preserve old artifacts
|
|
485
|
+
and receipts; do not relabel previous failures or passes as results for A7.
|
|
486
|
+
|
|
487
|
+
## Private a8 compatibility candidate
|
|
488
|
+
|
|
489
|
+
Install a8 into a new environment; its runtime bytes and package identity differ
|
|
490
|
+
from a7. The benchmark requires exactly a8 and the independent consumer is
|
|
491
|
+
0.1.10. Named aliases retain their names and underlying alternatives; no public
|
|
492
|
+
signature, default, acceptance state or format is intentionally withdrawn.
|
|
493
|
+
The detector producer version admits a8 and retains every previously accepted
|
|
494
|
+
producer version. Its new default identifies a8; prior saved artifacts are not
|
|
495
|
+
rewritten. Two producer-version schemas consequently extend their known-version
|
|
496
|
+
enumeration; this does not change the detector algorithm or scientific protocol.
|
|
497
|
+
|
|
498
|
+
Use the chosen interpreter explicitly. Never force requires-python, ignore
|
|
499
|
+
dependencies or reuse a 3.12 binary wheelhouse on ARM64/3.10. Restore the retained
|
|
500
|
+
a7 environment only on its supported Python (3.12/3.13), using original hashes;
|
|
501
|
+
an attempted a7 rollback on 3.10/3.11 must fail normal metadata admission.
|
|
502
|
+
|
|
503
|
+
The Windows offline lifecycle check uses the reviewed executable A7 core wheel
|
|
504
|
+
`5d435e75a79754ab45c8a27f7d30ff513c006034bdddbff170ec9506816b9ff0`.
|
|
505
|
+
The distinct A7 documentary-delivery wheel
|
|
506
|
+
`abab950c4bdbaf38056f493ca4efc97148b0d85d8d34322d2725437c9f2b42c9`
|
|
507
|
+
is retained as document history, not substituted as the runtime baseline. The
|
|
508
|
+
upgrade receipt records both identities and rejects any baseline whose outer
|
|
509
|
+
wheel hash differs from the reviewed executable artifact.
|
|
510
|
+
|
|
511
|
+
## Private SDK11 checked Polars DecimalRound candidate
|
|
512
|
+
|
|
513
|
+
The SDK10 diagnostic matrix observed four Polars native panics for the frozen
|
|
514
|
+
DecimalRound case `G06.value.guard.620d9009465585d69de18975`, across ARM310/312
|
|
515
|
+
and normal/optimized modes. Those observations remain failures of SDK10. A panic
|
|
516
|
+
wrapped as NativeEngineError is not an accepted semantic range rejection.
|
|
517
|
+
|
|
518
|
+
The corrected candidate prepares DecimalRound through exact native coefficient
|
|
519
|
+
arithmetic before the final Decimal cast. It retains the declared half_even and
|
|
520
|
+
half_away_from_zero policies, signed values, NULLs, duplicates and physical scale.
|
|
521
|
+
A valid carry from Decimal(38,18) to Decimal(38,1) is preserved; an incompatible
|
|
522
|
+
Decimal(1,1) destination produces an explicit range rejection. Arithmetic division
|
|
523
|
+
keeps its separate exact mode. No DecimalRound exact mode or implicit float path
|
|
524
|
+
is added, and Pandas/DuckDB continue executing their own native implementations.
|
|
525
|
+
|
|
526
|
+
Polars compiler identities advance from product-semantics-v13 to v14, including
|
|
527
|
+
plans without DecimalRound. Recompile plans with the selected candidate and
|
|
528
|
+
register their actual new transformation IDs. Preserve saved compiled identities,
|
|
529
|
+
runtime source maps and historical receipts; never rewrite them to v14 or relabel
|
|
530
|
+
an SDK10 observation as a new candidate execution. Public IR/contract/evidence
|
|
531
|
+
formats remain unchanged. Verify and the separation of rules, profiles and
|
|
532
|
+
Isolation Forest remain unchanged; legacy R denotes rules, not language R.
|
|
533
|
+
|
|
534
|
+
Use the actual reviewed wheel/sdist and fresh source/bytecode/compiler maps for
|
|
535
|
+
the selected environment. Validation must cover normal and optimized modes,
|
|
536
|
+
direct filter predicates, nested projections, overflow, the valid wider neighbor,
|
|
537
|
+
temporary-style logical names, empty inputs and all-NULL inputs. Candidate source
|
|
538
|
+
or proposed tests alone do not establish a completed regression or publication.
|