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.
Files changed (170) hide show
  1. equiframe/__init__.py +832 -0
  2. equiframe/__main__.py +3 -0
  3. equiframe/_base.py +84 -0
  4. equiframe/_cli_support.py +125 -0
  5. equiframe/_comparison_io.py +161 -0
  6. equiframe/_dataset_provenance.py +146 -0
  7. equiframe/_decimal.py +22 -0
  8. equiframe/_diff_capture.py +433 -0
  9. equiframe/_doctor.py +123 -0
  10. equiframe/_document_io.py +61 -0
  11. equiframe/_documents.py +79 -0
  12. equiframe/_duckdb_transport.py +149 -0
  13. equiframe/_error_reporting.py +52 -0
  14. equiframe/_first_use.py +102 -0
  15. equiframe/_path_compat.py +26 -0
  16. equiframe/_physical.py +133 -0
  17. equiframe/_r_review.R +308 -0
  18. equiframe/_regular_io.py +167 -0
  19. equiframe/_report_format_v1.py +298 -0
  20. equiframe/_report_io.py +591 -0
  21. equiframe/_stability_inventory.py +1421 -0
  22. equiframe/_timezones.py +257 -0
  23. equiframe/_vendor/cyclonedx/LICENSE +201 -0
  24. equiframe/_vendor/cyclonedx/PROVENANCE.md +18 -0
  25. equiframe/_vendor/cyclonedx/bom-1.6.schema.json +5673 -0
  26. equiframe/_vendor/cyclonedx/jsf-0.82.schema.json +240 -0
  27. equiframe/_vendor/cyclonedx/spdx.schema.json +712 -0
  28. equiframe/adapters.py +454 -0
  29. equiframe/assertion_types.py +122 -0
  30. equiframe/assertions.py +271 -0
  31. equiframe/benchmark.py +101 -0
  32. equiframe/bundle.py +240 -0
  33. equiframe/cli.py +693 -0
  34. equiframe/comparison.py +937 -0
  35. equiframe/comparison_report.py +660 -0
  36. equiframe/comparison_types.py +257 -0
  37. equiframe/compatibility.py +546 -0
  38. equiframe/contracts.py +879 -0
  39. equiframe/datasets.py +1301 -0
  40. equiframe/decision.py +34 -0
  41. equiframe/destinations.py +295 -0
  42. equiframe/detector_types.py +431 -0
  43. equiframe/detectors.py +389 -0
  44. equiframe/diff.py +192 -0
  45. equiframe/diff_contracts.py +523 -0
  46. equiframe/docs/adoption.md +329 -0
  47. equiframe/docs/api.md +534 -0
  48. equiframe/docs/arquitecto.md +143 -0
  49. equiframe/docs/choosing-api.md +84 -0
  50. equiframe/docs/cientifico.md +180 -0
  51. equiframe/docs/compatibility.md +254 -0
  52. equiframe/docs/contributing.md +171 -0
  53. equiframe/docs/dependencies.md +237 -0
  54. equiframe/docs/eda.md +166 -0
  55. equiframe/docs/extending.md +158 -0
  56. equiframe/docs/fast-ci.md +52 -0
  57. equiframe/docs/first-use.md +78 -0
  58. equiframe/docs/index.md +142 -0
  59. equiframe/docs/ingestion.md +145 -0
  60. equiframe/docs/inicio.md +129 -0
  61. equiframe/docs/installed-private.md +97 -0
  62. equiframe/docs/journeys.md +362 -0
  63. equiframe/docs/lectura-conversion.md +211 -0
  64. equiframe/docs/licensing.md +17 -0
  65. equiframe/docs/maintenance.md +233 -0
  66. equiframe/docs/migration-ir.md +333 -0
  67. equiframe/docs/option-audit.md +45 -0
  68. equiframe/docs/outcome-gates.md +134 -0
  69. equiframe/docs/performance.md +263 -0
  70. equiframe/docs/piloto-simulado.md +56 -0
  71. equiframe/docs/quickstart.md +156 -0
  72. equiframe/docs/r_review.md +212 -0
  73. equiframe/docs/recipes.md +248 -0
  74. equiframe/docs/releasing.md +183 -0
  75. equiframe/docs/security.md +218 -0
  76. equiframe/docs/semantics.md +274 -0
  77. equiframe/docs/sqlite-snapshots.md +262 -0
  78. equiframe/docs/universal-sources.md +49 -0
  79. equiframe/docs/universalidad-cinco-pasos.md +107 -0
  80. equiframe/docs/upgrading.md +538 -0
  81. equiframe/duckdb_capture.py +410 -0
  82. equiframe/eda/__init__.py +36 -0
  83. equiframe/eda/__main__.py +3 -0
  84. equiframe/eda/_backend.py +612 -0
  85. equiframe/eda/_inventory.py +49 -0
  86. equiframe/eda/_paths.py +49 -0
  87. equiframe/eda/_report.py +291 -0
  88. equiframe/eda/api.py +535 -0
  89. equiframe/eda/cli.py +102 -0
  90. equiframe/eda/models.py +239 -0
  91. equiframe/errors.py +83 -0
  92. equiframe/evidence.py +375 -0
  93. equiframe/examples/integrations/eda_generic.py +60 -0
  94. equiframe/examples/integrations/outcome_gates.py +94 -0
  95. equiframe/examples/integrations/sqlite_snapshot.py +246 -0
  96. equiframe/examples/integrations/sqlite_snapshot_demo.py +226 -0
  97. equiframe/examples/integrations/universal_first_use.py +296 -0
  98. equiframe/examples/journeys/README.md +31 -0
  99. equiframe/examples/journeys/__init__.py +1 -0
  100. equiframe/examples/journeys/a_pandas_refactor.py +88 -0
  101. equiframe/examples/journeys/b_native_migration.py +181 -0
  102. equiframe/examples/journeys/c_retail_etl.py +460 -0
  103. equiframe/examples/journeys/common.py +136 -0
  104. equiframe/examples/journeys/d_financial_reconciliation.py +96 -0
  105. equiframe/examples/journeys/e_telemetry.py +135 -0
  106. equiframe/examples/journeys/f_data_science_preparation.py +84 -0
  107. equiframe/examples/journeys/g_external_snapshots.py +197 -0
  108. equiframe/examples/journeys/h_portable_ci.py +129 -0
  109. equiframe/examples/journeys/requirements.lock +249 -0
  110. equiframe/examples/journeys/verify_journeys.py +117 -0
  111. equiframe/examples/load_convert_compare.py +85 -0
  112. equiframe/execution.py +355 -0
  113. equiframe/execution_types.py +177 -0
  114. equiframe/ingestion.py +744 -0
  115. equiframe/local.py +126 -0
  116. equiframe/migration/__init__.py +94 -0
  117. equiframe/migration/_physical.py +8 -0
  118. equiframe/migration/backends/_timestamp_transport.py +109 -0
  119. equiframe/migration/backends/duckdb.py +651 -0
  120. equiframe/migration/backends/duckdb_decimal.py +125 -0
  121. equiframe/migration/backends/duckdb_time.py +87 -0
  122. equiframe/migration/backends/pandas.py +544 -0
  123. equiframe/migration/backends/polars.py +915 -0
  124. equiframe/migration/backends/polars_decimal.py +231 -0
  125. equiframe/migration/io.py +198 -0
  126. equiframe/migration/ports.py +96 -0
  127. equiframe/migration/runner.py +545 -0
  128. equiframe/migration/runner_types.py +405 -0
  129. equiframe/migration/types.py +354 -0
  130. equiframe/migration/validation.py +619 -0
  131. equiframe/normalization.py +358 -0
  132. equiframe/pipeline.py +274 -0
  133. equiframe/pipeline_types.py +247 -0
  134. equiframe/ports.py +39 -0
  135. equiframe/preprocessing.py +110 -0
  136. equiframe/profile_types.py +343 -0
  137. equiframe/profiles.py +447 -0
  138. equiframe/py.typed +0 -0
  139. equiframe/r_review.py +706 -0
  140. equiframe/reduction.py +518 -0
  141. equiframe/registry.py +121 -0
  142. equiframe/report_rendering.py +366 -0
  143. equiframe/report_types.py +294 -0
  144. equiframe/reporting.py +26 -0
  145. equiframe/rule_types.py +178 -0
  146. equiframe/rules.py +819 -0
  147. equiframe/schemas/r-execution-binding-1.0.schema.json +46 -0
  148. equiframe/schemas/r-review-binding-1.0.schema.json +28 -0
  149. equiframe/schemas/r-review-options-1.0.schema.json +38 -0
  150. equiframe/schemas/r-review-result-1.0.schema.json +207 -0
  151. equiframe/schemas/reviewed-decision-1.0.schema.json +3394 -0
  152. equiframe/serialization.py +152 -0
  153. equiframe/snapshot.py +296 -0
  154. equiframe/sources.py +283 -0
  155. equiframe/tables.py +459 -0
  156. equiframe/types.py +71 -0
  157. equiframe/values.py +252 -0
  158. equiframe/verification_request.py +35 -0
  159. equiframe/verify.py +799 -0
  160. equiframe/verify_types.py +255 -0
  161. equiframe/workflow.py +510 -0
  162. equiframe/workflow_request.py +38 -0
  163. equiframe-0.12.4.dist-info/METADATA +268 -0
  164. equiframe-0.12.4.dist-info/RECORD +170 -0
  165. equiframe-0.12.4.dist-info/WHEEL +4 -0
  166. equiframe-0.12.4.dist-info/entry_points.txt +3 -0
  167. equiframe-0.12.4.dist-info/licenses/LICENSE +21 -0
  168. equiframe-0.12.4.dist-info/licenses/THIRD_PARTY_NOTICES.md +42 -0
  169. equiframe-0.12.4.dist-info/licenses/tools/cyclonedx/LICENSE +201 -0
  170. 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.