matelab-python-sdk 0.1.0a6__tar.gz → 0.1.0a7__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 (62) hide show
  1. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/AGENTS.md +2 -2
  2. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/CHANGELOG.md +9 -0
  3. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/PKG-INFO +24 -26
  4. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/README.md +22 -25
  5. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/docs/operation-coverage.yaml +0 -71
  6. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/pyproject.toml +6 -3
  7. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/scripts/check_release.py +1 -1
  8. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/scripts/generate_models.py +84 -1
  9. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/__init__.py +2 -0
  10. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/_generated/models.py +751 -111
  11. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/_transport.py +41 -32
  12. matelab_python_sdk-0.1.0a7/src/matelab/_wire_validation.py +89 -0
  13. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/client.py +13 -5
  14. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/cloud_drive.py +64 -49
  15. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/literature.py +121 -103
  16. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/notebooks.py +59 -47
  17. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/records.py +380 -325
  18. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/templates.py +91 -58
  19. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/uploads.py +18 -16
  20. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/users.py +6 -5
  21. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/errors.py +16 -4
  22. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/streaming.py +4 -4
  23. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_client.py +38 -8
  24. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_cloud_drive.py +4 -1
  25. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_generation.py +44 -1
  26. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_notebook_lifecycle.py +7 -2
  27. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_operation_coverage.py +6 -51
  28. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_record_mutations.py +2 -1
  29. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_records.py +2 -1
  30. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_release.py +6 -2
  31. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_streaming.py +27 -0
  32. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_transport.py +52 -5
  33. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_users.py +3 -2
  34. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/uv.lock +176 -1
  35. matelab_python_sdk-0.1.0a6/docs/roadmap.md +0 -934
  36. matelab_python_sdk-0.1.0a6/src/matelab/_wire_validation.py +0 -217
  37. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/.env.example +0 -0
  38. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/.github/workflows/release.yml +0 -0
  39. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/.gitignore +0 -0
  40. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/LICENSE +0 -0
  41. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/NOTICE +0 -0
  42. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/contracts/matelab-integration-v1.lock.json +0 -0
  43. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/contracts/matelab-integration-v1.openapi.yaml +0 -0
  44. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/scripts/check_installed_package.py +0 -0
  45. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/_generated/__init__.py +0 -0
  46. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/__init__.py +0 -0
  47. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/domains/groups.py +0 -0
  48. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/py.typed +0 -0
  49. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/src/matelab/session.py +0 -0
  50. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/conftest.py +0 -0
  51. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/provider/test_provider_smoke.py +0 -0
  52. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_comments_and_downloads.py +0 -0
  53. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_consumer_smoke.py +0 -0
  54. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_extended_records.py +0 -0
  55. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_groups.py +0 -0
  56. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_notebooks.py +0 -0
  57. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_record_lifecycle.py +0 -0
  58. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_template_lifecycle.py +0 -0
  59. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_templates.py +0 -0
  60. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/test_uploads_and_literature.py +0 -0
  61. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/typing/consumer.py +0 -0
  62. {matelab_python_sdk-0.1.0a6 → matelab_python_sdk-0.1.0a7}/tests/typing/pyproject.toml +0 -0
@@ -1,8 +1,8 @@
1
1
  # AGENTS.md
2
2
 
3
3
  本文档只保留维护 `matelab-python-sdk` 必须长期遵守的项目约束。当前能力和使用方式见
4
- `README.md`,实现路线与进度见 `docs/roadmap.md`,operation 状态以
5
- `docs/operation-coverage.yaml` 为机器权威。不要在本文记录阶段性完成状态、一次性验收数字或迁移历史。
4
+ `README.md`,版本历史见 `CHANGELOG.md`,operation 状态以 `docs/operation-coverage.yaml` 为机器权威。
5
+ 不要在本文记录阶段性完成状态、一次性验收数字或迁移历史。
6
6
 
7
7
  ## 权威与范围
8
8
 
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0a7 - 2026-08-04
4
+
5
+ - Replaces the hand-maintained wire-validation rule tables with deterministic generated JSON Schema 2020-12 rules.
6
+ - Simplifies transport, streaming, error mapping, and domain adapters while retaining the pinned `matelab-spec v0.3.0`
7
+ behavior and automatic Session refresh guarantees.
8
+ - Breaking: tightens several public domain inputs and results, and exposes stable `MatelabProviderErrorKind` values
9
+ instead of raw Provider error codes.
10
+ - Removes completed roadmap and work-package bookkeeping; refreshes release checks, documentation, and tests.
11
+
3
12
  ## 0.1.0a6 - 2026-08-01
4
13
 
5
14
  - Adopts the immutable `matelab-spec v0.3.0` Contract release and its form-encoding updates.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matelab-python-sdk
3
- Version: 0.1.0a6
3
+ Version: 0.1.0a7
4
4
  Summary: Reusable async Python client for the Matelab Integration Contract
5
5
  Author-email: 朱天念 <zhutiannian@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -21,6 +21,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
21
  Classifier: Typing :: Typed
22
22
  Requires-Python: >=3.11
23
23
  Requires-Dist: httpx2<3,>=2.9.1
24
+ Requires-Dist: jsonschema<5,>=4.26
24
25
  Requires-Dist: pydantic<3,>=2.13.4
25
26
  Description-Content-Type: text/markdown
26
27
 
@@ -28,7 +29,7 @@ Description-Content-Type: text/markdown
28
29
 
29
30
  Reusable async Python client for the Matelab Integration Contract.
30
31
 
31
- The current alpha is `0.1.0a6`. `[project].version` in `pyproject.toml` is the sole SDK version source;
32
+ The current alpha is `0.1.0a7`. `[project].version` in `pyproject.toml` is the sole SDK version source;
32
33
  `uv.lock` only mirrors that source.
33
34
 
34
35
  The SDK is pinned to the immutable `matelab-spec v0.3.0` Contract Release. The sole release pin is
@@ -57,7 +58,7 @@ To test the same artifact a downstream Consumer will install, build and install
57
58
 
58
59
  ```bash
59
60
  uv build --no-build-isolation --out-dir dist/release
60
- python -m pip install dist/release/matelab_python_sdk-0.1.0a6-py3-none-any.whl
61
+ python -m pip install dist/release/matelab_python_sdk-0.1.0a7-py3-none-any.whl
61
62
  ```
62
63
 
63
64
  Do not infer Provider compatibility from the SDK version alone. A release is also bound to the Contract
@@ -90,12 +91,19 @@ Catch `MatelabError` for one application-level fallback, or a specific subclass
90
91
  |---|---|
91
92
  | `MatelabUsageError` | The call cannot be represented safely; correct its arguments. |
92
93
  | `MatelabAuthenticationError` | The Session is missing, expired, invalid, or rejected; refresh or authenticate again as appropriate. |
93
- | `MatelabProviderError` | The Provider rejected a valid request with a business error; inspect `code` and do not assume a mutation was applied. |
94
+ | `MatelabProviderError` | The Provider returned a non-authentication error; inspect its stable `kind` and do not assume a mutation was applied. |
94
95
  | `MatelabTransportError` | The HTTP exchange failed; `status_code` is present for HTTP failures, and a mutation outcome may be unknown. |
95
96
  | `MatelabProtocolError` | The Provider response does not match the pinned Contract; treat it as Provider drift or an SDK defect. A mutation may already have been applied. |
96
97
 
97
- `code` and `status_code` are the stable scalar diagnostics. Provider response bodies and caller inputs are never
98
- attached to exceptions. Never automatically retry a mutation solely because it raised a transport or protocol error.
98
+ `MatelabProviderError.kind` is a `MatelabProviderErrorKind`: `REJECTED` covers input, permission, and business
99
+ rejections; `SERVER` identifies Provider server failures; `VALIDATION` identifies multi-error validation failures; and
100
+ `UNKNOWN` safely represents all other non-success, non-authentication Provider codes. Authentication codes are hidden
101
+ behind `MatelabAuthenticationError`; raw Provider codes are not part of the public error interface.
102
+ Codes `0` and `10` remain operation-specific successes selected by the pinned Contract; an operation that receives a
103
+ success code it does not allow raises `MatelabProtocolError` rather than assigning an error kind.
104
+ `MatelabTransportError.status_code` remains available for HTTP failures. Provider response bodies and caller inputs are
105
+ never attached to exceptions. Never automatically retry a mutation solely because it raised a transport or protocol
106
+ error.
99
107
 
100
108
  ### Session ownership
101
109
 
@@ -340,11 +348,7 @@ plain text and that a hash-based URI can fall back to an existing quote, so neit
340
348
  Existing `RecordRichTextUpdate` remains legal only with record-scoped `StagedRecordAttachment`. Attachment-bearing
341
349
  multi-record import is also forbidden; callers must split it into single-record finalizers.
342
350
 
343
- ## Implementation roadmap
344
-
345
- `docs/roadmap.md` is the complete SDK-only execution plan. It assigns all 71
346
- `matelab-spec v0.3.0` operations to ordered work packages, defines the machine-readable coverage that
347
- must be added, records Provider-risk gates, and specifies the final completion checks.
351
+ ## Operation coverage
348
352
 
349
353
  The SDK tracks all 71 Contract operations and exposes 70 through public domain interfaces; one identity-bootstrap
350
354
  operation is intentionally unexposed. It deliberately excludes MCP migration, adjacent-repository changes, external
@@ -352,7 +356,7 @@ publishing, and automatic mutation against a real Provider.
352
356
 
353
357
  Machine-readable status lives in
354
358
  `docs/operation-coverage.yaml`. An exact-coverage test keeps its 71
355
- operation IDs, methods, paths, work packages, and Provider issue references aligned with the pinned
359
+ operation IDs, methods, paths, states, public interfaces, and Provider issue references aligned with the pinned
356
360
  OpenAPI snapshot.
357
361
 
358
362
  | Domain | Implemented | Planned | Current public surface |
@@ -590,19 +594,11 @@ deletion is named `permanently_delete_files` and is non-recoverable. Cloud downl
590
594
  resolve bytes from the final file identity and reuse `DownloadStream`, thumbnail/preview choices and the PVD-002-safe
591
595
  range subset. Cloud mutations are not automatically retried.
592
596
 
593
- To run the implementation as a persistent Codex goal, start a task in this repository and use:
594
-
595
- > 完整阅读并严格遵循 `AGENTS.md`、`README.md` 和 `docs/roadmap.md`。创建并持续执行一个 goal:
596
- > 只修改当前仓库,按照 roadmap 从第一个未完成 work package 开始,完成 71-operation 精确覆盖和全部
597
- > SDK 领域 interface;每个 package 通过局部验证后自动继续,最终让 generation `--check`、Ruff、
598
- > Ruff format、Basedpyright、Pytest 和 package build 全部通过。不要修改相邻仓库,不执行生产 Provider
599
- > mutation,不 commit、push、tag 或发布。
600
-
601
597
  Owned/shared `NotebookRef`, public `PublicNotebookRef`, `RecordRef`, and `RecordVersionRef` keep
602
598
  Provider identifiers distinct. Historical reads first re-read the authorized current record and confirm
603
599
  that the requested version is still present in its `modify_log`; both reads write Provider audit entries.
604
600
 
605
- Errors are separated into Provider business errors, authentication errors, HTTP/transport errors,
601
+ Errors are separated into semantic Provider errors, authentication errors, HTTP/transport errors,
606
602
  Integration Contract response errors, and client-side usage errors. Provider response bodies and caller inputs do not
607
603
  enter exceptions.
608
604
 
@@ -621,11 +617,13 @@ uv build
621
617
 
622
618
  The generator first verifies the contract lock, OpenAPI release metadata, and snapshot digest. It then
623
619
  creates a temporary OpenAPI 3.1 generation projection, resolves references without network access, and
624
- generates private component, operation-response, and parameter models. The projection only flattens pure
625
- object inheritance that the generator cannot otherwise preserve correctly; the checked-in release
626
- snapshot remains unchanged. `--check` performs the same validation and deterministic generation without
627
- writing the checked-in models. The current lock resolves `datamodel-code-generator 0.71.0` and
628
- `hatchling 1.31.0`. Published metadata requires `httpx2>=2.9.1,<3` and
620
+ generates private component, operation-response, and parameter models. The projection flattens pure
621
+ object inheritance and preserves constraints the model generator cannot express as self-contained JSON Schema
622
+ 2020-12 metadata; the checked-in release snapshot remains unchanged. `--check` performs the same validation and deterministic generation without
623
+ writing the checked-in models. `WireModel` applies that metadata with the standard
624
+ `jsonschema` Draft 2020-12 validator; the SDK does not maintain a second hand-written schema interpreter. The current lock resolves
625
+ `datamodel-code-generator 0.71.0` and
626
+ `hatchling 1.31.0`. Published metadata requires `httpx2>=2.9.1,<3`, `jsonschema>=4.26,<5`, and
629
627
  `pydantic>=2.13.4,<3`; the build backend requires `hatchling>=1.27,<2`. These lower bounds are verified
630
628
  against the complete test suite on the supported Python boundary versions rather than inferred from
631
629
  `uv.lock`. The exact toolchain remains locked for development and release builds. Basedpyright and its
@@ -2,7 +2,7 @@
2
2
 
3
3
  Reusable async Python client for the Matelab Integration Contract.
4
4
 
5
- The current alpha is `0.1.0a6`. `[project].version` in `pyproject.toml` is the sole SDK version source;
5
+ The current alpha is `0.1.0a7`. `[project].version` in `pyproject.toml` is the sole SDK version source;
6
6
  `uv.lock` only mirrors that source.
7
7
 
8
8
  The SDK is pinned to the immutable `matelab-spec v0.3.0` Contract Release. The sole release pin is
@@ -31,7 +31,7 @@ To test the same artifact a downstream Consumer will install, build and install
31
31
 
32
32
  ```bash
33
33
  uv build --no-build-isolation --out-dir dist/release
34
- python -m pip install dist/release/matelab_python_sdk-0.1.0a6-py3-none-any.whl
34
+ python -m pip install dist/release/matelab_python_sdk-0.1.0a7-py3-none-any.whl
35
35
  ```
36
36
 
37
37
  Do not infer Provider compatibility from the SDK version alone. A release is also bound to the Contract
@@ -64,12 +64,19 @@ Catch `MatelabError` for one application-level fallback, or a specific subclass
64
64
  |---|---|
65
65
  | `MatelabUsageError` | The call cannot be represented safely; correct its arguments. |
66
66
  | `MatelabAuthenticationError` | The Session is missing, expired, invalid, or rejected; refresh or authenticate again as appropriate. |
67
- | `MatelabProviderError` | The Provider rejected a valid request with a business error; inspect `code` and do not assume a mutation was applied. |
67
+ | `MatelabProviderError` | The Provider returned a non-authentication error; inspect its stable `kind` and do not assume a mutation was applied. |
68
68
  | `MatelabTransportError` | The HTTP exchange failed; `status_code` is present for HTTP failures, and a mutation outcome may be unknown. |
69
69
  | `MatelabProtocolError` | The Provider response does not match the pinned Contract; treat it as Provider drift or an SDK defect. A mutation may already have been applied. |
70
70
 
71
- `code` and `status_code` are the stable scalar diagnostics. Provider response bodies and caller inputs are never
72
- attached to exceptions. Never automatically retry a mutation solely because it raised a transport or protocol error.
71
+ `MatelabProviderError.kind` is a `MatelabProviderErrorKind`: `REJECTED` covers input, permission, and business
72
+ rejections; `SERVER` identifies Provider server failures; `VALIDATION` identifies multi-error validation failures; and
73
+ `UNKNOWN` safely represents all other non-success, non-authentication Provider codes. Authentication codes are hidden
74
+ behind `MatelabAuthenticationError`; raw Provider codes are not part of the public error interface.
75
+ Codes `0` and `10` remain operation-specific successes selected by the pinned Contract; an operation that receives a
76
+ success code it does not allow raises `MatelabProtocolError` rather than assigning an error kind.
77
+ `MatelabTransportError.status_code` remains available for HTTP failures. Provider response bodies and caller inputs are
78
+ never attached to exceptions. Never automatically retry a mutation solely because it raised a transport or protocol
79
+ error.
73
80
 
74
81
  ### Session ownership
75
82
 
@@ -314,11 +321,7 @@ plain text and that a hash-based URI can fall back to an existing quote, so neit
314
321
  Existing `RecordRichTextUpdate` remains legal only with record-scoped `StagedRecordAttachment`. Attachment-bearing
315
322
  multi-record import is also forbidden; callers must split it into single-record finalizers.
316
323
 
317
- ## Implementation roadmap
318
-
319
- `docs/roadmap.md` is the complete SDK-only execution plan. It assigns all 71
320
- `matelab-spec v0.3.0` operations to ordered work packages, defines the machine-readable coverage that
321
- must be added, records Provider-risk gates, and specifies the final completion checks.
324
+ ## Operation coverage
322
325
 
323
326
  The SDK tracks all 71 Contract operations and exposes 70 through public domain interfaces; one identity-bootstrap
324
327
  operation is intentionally unexposed. It deliberately excludes MCP migration, adjacent-repository changes, external
@@ -326,7 +329,7 @@ publishing, and automatic mutation against a real Provider.
326
329
 
327
330
  Machine-readable status lives in
328
331
  `docs/operation-coverage.yaml`. An exact-coverage test keeps its 71
329
- operation IDs, methods, paths, work packages, and Provider issue references aligned with the pinned
332
+ operation IDs, methods, paths, states, public interfaces, and Provider issue references aligned with the pinned
330
333
  OpenAPI snapshot.
331
334
 
332
335
  | Domain | Implemented | Planned | Current public surface |
@@ -564,19 +567,11 @@ deletion is named `permanently_delete_files` and is non-recoverable. Cloud downl
564
567
  resolve bytes from the final file identity and reuse `DownloadStream`, thumbnail/preview choices and the PVD-002-safe
565
568
  range subset. Cloud mutations are not automatically retried.
566
569
 
567
- To run the implementation as a persistent Codex goal, start a task in this repository and use:
568
-
569
- > 完整阅读并严格遵循 `AGENTS.md`、`README.md` 和 `docs/roadmap.md`。创建并持续执行一个 goal:
570
- > 只修改当前仓库,按照 roadmap 从第一个未完成 work package 开始,完成 71-operation 精确覆盖和全部
571
- > SDK 领域 interface;每个 package 通过局部验证后自动继续,最终让 generation `--check`、Ruff、
572
- > Ruff format、Basedpyright、Pytest 和 package build 全部通过。不要修改相邻仓库,不执行生产 Provider
573
- > mutation,不 commit、push、tag 或发布。
574
-
575
570
  Owned/shared `NotebookRef`, public `PublicNotebookRef`, `RecordRef`, and `RecordVersionRef` keep
576
571
  Provider identifiers distinct. Historical reads first re-read the authorized current record and confirm
577
572
  that the requested version is still present in its `modify_log`; both reads write Provider audit entries.
578
573
 
579
- Errors are separated into Provider business errors, authentication errors, HTTP/transport errors,
574
+ Errors are separated into semantic Provider errors, authentication errors, HTTP/transport errors,
580
575
  Integration Contract response errors, and client-side usage errors. Provider response bodies and caller inputs do not
581
576
  enter exceptions.
582
577
 
@@ -595,11 +590,13 @@ uv build
595
590
 
596
591
  The generator first verifies the contract lock, OpenAPI release metadata, and snapshot digest. It then
597
592
  creates a temporary OpenAPI 3.1 generation projection, resolves references without network access, and
598
- generates private component, operation-response, and parameter models. The projection only flattens pure
599
- object inheritance that the generator cannot otherwise preserve correctly; the checked-in release
600
- snapshot remains unchanged. `--check` performs the same validation and deterministic generation without
601
- writing the checked-in models. The current lock resolves `datamodel-code-generator 0.71.0` and
602
- `hatchling 1.31.0`. Published metadata requires `httpx2>=2.9.1,<3` and
593
+ generates private component, operation-response, and parameter models. The projection flattens pure
594
+ object inheritance and preserves constraints the model generator cannot express as self-contained JSON Schema
595
+ 2020-12 metadata; the checked-in release snapshot remains unchanged. `--check` performs the same validation and deterministic generation without
596
+ writing the checked-in models. `WireModel` applies that metadata with the standard
597
+ `jsonschema` Draft 2020-12 validator; the SDK does not maintain a second hand-written schema interpreter. The current lock resolves
598
+ `datamodel-code-generator 0.71.0` and
599
+ `hatchling 1.31.0`. Published metadata requires `httpx2>=2.9.1,<3`, `jsonschema>=4.26,<5`, and
603
600
  `pydantic>=2.13.4,<3`; the build backend requires `hatchling>=1.27,<2`. These lower bounds are verified
604
601
  against the complete test suite on the supported Python boundary versions rather than inferred from
605
602
  `uv.lock`. The exact toolchain remains locked for development and release builds. Basedpyright and its