matelab-python-sdk 0.1.0a17__tar.gz → 0.1.0a18__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 (65) hide show
  1. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/CHANGELOG.md +11 -0
  2. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/PKG-INFO +31 -17
  3. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/README.md +30 -16
  4. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/contracts/matelab-integration-v1.lock.json +3 -3
  5. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/contracts/matelab-integration-v1.openapi.yaml +26 -5
  6. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/docs/operation-coverage.yaml +24 -24
  7. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/pyproject.toml +1 -1
  8. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/_generated/models.py +1 -1
  9. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_generation.py +3 -3
  10. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/uv.lock +1 -1
  11. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/.env.example +0 -0
  12. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/.github/workflows/release.yml +0 -0
  13. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/.gitignore +0 -0
  14. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/AGENTS.md +0 -0
  15. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/CONTEXT.md +0 -0
  16. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/LICENSE +0 -0
  17. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/NOTICE +0 -0
  18. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/scripts/check_installed_package.py +0 -0
  19. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/scripts/check_release.py +0 -0
  20. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/scripts/generate_models.py +0 -0
  21. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/__init__.py +0 -0
  22. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/_generated/__init__.py +0 -0
  23. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/_hashes.py +0 -0
  24. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/_transport.py +0 -0
  25. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/_wire_validation.py +0 -0
  26. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/client.py +0 -0
  27. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/__init__.py +0 -0
  28. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/_attachment_content.py +0 -0
  29. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/cloud_drive.py +0 -0
  30. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/groups.py +0 -0
  31. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/literature.py +0 -0
  32. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/notebooks.py +0 -0
  33. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/records.py +0 -0
  34. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/templates.py +0 -0
  35. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/uploads.py +0 -0
  36. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/domains/users.py +0 -0
  37. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/errors.py +0 -0
  38. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/py.typed +0 -0
  39. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/session.py +0 -0
  40. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/src/matelab/streaming.py +0 -0
  41. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/conftest.py +0 -0
  42. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/provider/test_provider_smoke.py +0 -0
  43. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_async_attachment_upload.py +0 -0
  44. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_client.py +0 -0
  45. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_cloud_drive.py +0 -0
  46. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_comments_and_downloads.py +0 -0
  47. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_consumer_smoke.py +0 -0
  48. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_errors.py +0 -0
  49. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_extended_records.py +0 -0
  50. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_groups.py +0 -0
  51. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_notebook_lifecycle.py +0 -0
  52. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_notebooks.py +0 -0
  53. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_operation_coverage.py +0 -0
  54. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_record_lifecycle.py +0 -0
  55. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_record_mutations.py +0 -0
  56. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_records.py +0 -0
  57. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_release.py +0 -0
  58. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_streaming.py +0 -0
  59. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_template_lifecycle.py +0 -0
  60. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_templates.py +0 -0
  61. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_transport.py +0 -0
  62. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_uploads_and_literature.py +0 -0
  63. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/test_users.py +0 -0
  64. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/typing/consumer.py +0 -0
  65. {matelab_python_sdk-0.1.0a17 → matelab_python_sdk-0.1.0a18}/tests/typing/pyproject.toml +0 -0
@@ -3,6 +3,17 @@
3
3
  This file records release-to-release changes and migration impact. It is not the authority for the current interface;
4
4
  see [README.md](README.md) for current behavior and [AGENTS.md](AGENTS.md) for maintenance policy.
5
5
 
6
+ ## 0.1.0a18 - 2026-08-23
7
+
8
+ - Adopts immutable `matelab-spec v0.4.2` at commit `a51483f910440fbbbc3693cc32566482064bb3ab` and OpenAPI
9
+ SHA-256 `4c92b96ba3dfe7122b30b4db2e2c8054c06018291c8c52c15482112b51a32920`. The wire schema, methods,
10
+ paths, encodings, operation count, and public interface are unchanged.
11
+ - Records that compatibility evidence remains the stable Provider revision
12
+ `59101f006e9fd6d6ce0b951dfd34695a7949b54f`; the latest reviewed revision
13
+ `a3e6b961800f6b1ab666f0d3f6cd4c64c2a3ce27` is incompatible. The SDK retains the stable multipart comment-upload
14
+ field, while integrations must account for that Provider's DOI rejection, encrypted-search omission, valid
15
+ files-folder-path rejection, and explicit-null table-file-import failure.
16
+
6
17
  ## 0.1.0a17 - 2026-08-20
7
18
 
8
19
  - Adopts immutable `matelab-spec v0.4.1` at commit `6f8ab3d14797385d0075d0aba38bf3bf529e674d` and OpenAPI
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matelab-python-sdk
3
- Version: 0.1.0a17
3
+ Version: 0.1.0a18
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
@@ -35,10 +35,10 @@ This README describes the current SDK interface, integration semantics, examples
35
35
  [AGENTS.md](AGENTS.md) for durable maintenance rules, and `docs/operation-coverage.yaml` for the machine-readable
36
36
  operation inventory.
37
37
 
38
- The current alpha is `0.1.0a17`. `[project].version` in `pyproject.toml` is the sole SDK version source;
38
+ The current alpha is `0.1.0a18`. `[project].version` in `pyproject.toml` is the sole SDK version source;
39
39
  `uv.lock` only mirrors that source.
40
40
 
41
- The SDK is pinned to the immutable `matelab-spec v0.4.1` Contract Release. The sole release pin is
41
+ The SDK is pinned to the immutable `matelab-spec v0.4.2` Contract Release. The sole release pin is
42
42
  `contracts/matelab-integration-v1.lock.json`, which records
43
43
  the source tag, commit, OpenAPI path, local snapshot path, and SHA-256.
44
44
 
@@ -64,12 +64,18 @@ To test the same artifact a downstream Consumer will install, build and install
64
64
 
65
65
  ```bash
66
66
  uv build --no-build-isolation --out-dir dist/release
67
- python -m pip install dist/release/matelab_python_sdk-0.1.0a17-py3-none-any.whl
67
+ python -m pip install dist/release/matelab_python_sdk-0.1.0a18-py3-none-any.whl
68
68
  ```
69
69
 
70
70
  Do not infer Provider compatibility from the SDK version alone. A release is also bound to the Contract
71
71
  tag, commit, and checksum recorded below.
72
72
 
73
+ The Contract and public SDK interface remain compatible with the stable Provider evidence at
74
+ `59101f006e9fd6d6ce0b951dfd34695a7949b54f`. The latest reviewed Provider,
75
+ `a3e6b961800f6b1ab666f0d3f6cd4c64c2a3ce27`, is incompatible with that evidence. Its operation-specific
76
+ differences are documented alongside the affected interfaces below; do not treat a successful Contract adoption as
77
+ proof that this newer Provider revision is interchangeable.
78
+
73
79
  ## Design
74
80
 
75
81
  The public module is intentionally small:
@@ -117,7 +123,7 @@ success code it does not allow raises `MatelabProtocolError` rather than assigni
117
123
  `MatelabTransportError.status_code` remains available for HTTP failures. Provider response bodies, top-level `msg`,
118
124
  legacy `errmsg`, opaque `errs`, uncontracted debug fields, and request payloads are not attached to exceptions because
119
125
  Provider-authored diagnostics may contain stack traces, credentials, or submitted values.
120
- The pinned v0.4.1 Contract also declares optional code-4 `errs`, but PVD-041 and PCG-015 record incompatible observed
126
+ The pinned v0.4.2 Contract also declares optional code-4 `errs`, but PVD-041 and PCG-015 record incompatible observed
121
127
  item/container shapes and insufficient evidence for requiredness, cardinality, or exclusion from other codes. The SDK
122
128
  therefore keeps those diagnostics wire-only and does not expose `errs` as stable public metadata. A typed detail
123
129
  interface remains blocked until a future Contract release can define one from stronger Provider evidence. `retryable`
@@ -446,7 +452,7 @@ targets = await client.users.search("Example Researcher", global_scope=False)
446
452
  `groups.list()` returns the `GroupSummary` tuple directly. Ordering remains Provider-unspecified and is documented
447
453
  rather than repeated as a constant result field. The Provider's members for an unstable first group remain wire-only;
448
454
  `users.search()` is the public recipient-discovery interface. These two discovery interfaces are experimental because
449
- group order is unstable and user search is unpaged, unordered and not field-minimized (PVD-006, PVD-029, PCG-011).
455
+ group order is unstable and user search is unpaged, unordered and not field-minimized (PVD-006, PVD-029).
450
456
  `GroupSummary.notebook_creation_available` expresses whether the group can currently host notebook creation without
451
457
  exposing the Provider's data-server routing value.
452
458
 
@@ -538,6 +544,8 @@ relations = await client.records.relations(source)
538
544
  as `modules`; it is not the template-shaped `RecordImportItem.data` accepted by record import.
539
545
  `records.search()` maps each requested field name to a stored record path. A match exposes only Provider-returned
540
546
  entries in `values`, so key membership distinguishes an absent result from an explicit JSON `null`.
547
+ The latest reviewed Provider excludes encrypted records from search (PVD-043); an empty search result therefore does
548
+ not prove that no matching encrypted record exists.
541
549
 
542
550
  The Provider calls its notebook directory tree `subtype`; that name remains wire-only. The SDK exposes
543
551
  `RecordFolder`, `RecordSummary.folder_id`, and the `folders` returned with record listings. A top-level folder has
@@ -587,8 +595,9 @@ UID. Import validates the complete batch with generated wire models but cannot m
587
595
  individual inputs or promise atomicity (PCG-008); it therefore returns only the tuple of database IDs actually
588
596
  reported by the Provider. `RecordImportItem.keywords` is a tuple; the adapter owns the Provider's
589
597
  legacy semicolon encoding. Folder paths are ordered existing folder titles from the notebook root; they do not create
590
- missing folders. Delete means moving records into the recycle bin, not permanent
591
- deletion. Delete and restore return `None`; record mutations are not automatically retried.
598
+ missing folders. The latest reviewed Provider rejects explicit-null table-file imports (PVD-045), so integrations
599
+ targeting it must not interpret that rejection as an invalid SDK input. Delete means moving records into the recycle bin,
600
+ not permanent deletion. Delete and restore return `None`; record mutations are not automatically retried.
592
601
 
593
602
  `records.copy()` accepts an optional `new_record_uid`; when omitted, the SDK generates one locally. The Provider
594
603
  returns only the copied row's database ID, so retaining that UID lets the SDK return a complete `RecordLocator`
@@ -605,7 +614,9 @@ returns the acknowledgement classification
605
614
  issue a post-write read. Database, active-browser, and unclassified acknowledgements remain distinct, and mutation
606
615
  retries stay disabled. Encrypted record content is outside the SDK's public read/update interface: the list-level
607
616
  `RecordSummary.encrypted` flag lets callers identify and skip it, while the Provider password field and frontend-only
608
- password lifecycle remain unexposed.
617
+ password lifecycle remain unexposed. The latest reviewed Provider rejects a valid files-folder append path
618
+ (PVD-044); integrations targeting it must not reinterpret that rejection as invalid SDK input, and should treat a
619
+ staged attachment as indeterminate once the write has started.
609
620
 
610
621
  Relation addition reads both endpoints and checks their resolved data server before writing; this reduces PVD-019
611
622
  risk but is not an atomic Provider authorization guarantee. It does not list relations merely to inspect the
@@ -617,8 +628,9 @@ ignores target notebook identity (PVD-020); its mutation likewise performs autho
617
628
  `records.comments()`. Each returned `RecordRelationRef` carries only the relation row and declared target IDs.
618
629
  Deletion accepts the source `RecordLocator` and one of those observed refs.
619
630
 
620
- Comment upload follows the Provider's literal one-request `upload` field, not the incompatible Front fragment
621
- protocol (PVD-037). Comment mutations return `None` after acknowledgement. Edit first verifies that the selected
631
+ Comment upload follows the stable Provider's literal one-request `upload` field. The latest reviewed Provider renames
632
+ that field (PVD-037), but the SDK retains the Contract-compatible `upload` encoding. Comment mutations return `None`
633
+ after acknowledgement. Edit first verifies that the selected
622
634
  comment is currently observed and caller-owned because the Provider otherwise reports a false success for a missing or
623
635
  other-user ID (PVD-004). Delete sends the typed ref directly because the Provider mutation itself enforces record and
624
636
  caller ownership. Neither operation performs a post-write read. Staged comment attachments have no Contract abort
@@ -697,7 +709,9 @@ The Provider's static literature form definition and extraction deployment flag
697
709
  `extract_metadata()` directly and handle an unavailable or failing optional backend as a Provider error. Extraction
698
710
  returns a `PublicationMetadataCandidate`: unstored, rich publication evidence rather than metadata already attached to
699
711
  a literature item. Its structured authors are `PublicationAuthorCandidate` values. Extraction accepts a DOI, a
700
- completed staged PDF, or both; a supplied DOI takes precedence over the staged PDF. Literature list
712
+ completed staged PDF, or both; a supplied DOI takes precedence over the staged PDF. The latest reviewed Provider
713
+ rejects DOI formats accepted by the stable evidence (PVD-042), so a rejection from that revision does not by itself
714
+ make a DOI invalid for this SDK interface. Literature list
701
715
  results likewise exclude Provider-generated citation HTML and author-highlight fragments; Consumers receive the
702
716
  underlying citation fields instead of presentation markup. `LiteratureDetail.metadata` is `None` when invalid legacy
703
717
  JSON produces the Provider's empty-array fallback; otherwise it contains decoded stored metadata without arbitrary
@@ -722,7 +736,7 @@ canonical update preflights the raw item response and refuses to drop top-level
722
736
  `allow_source_metadata_loss=True` explicitly skips that preflight and sends the canonical replacement directly. The
723
737
  default read/check/write protection is best effort rather than atomic because the Provider offers no revision or
724
738
  compare-and-swap condition; this Provider-specific behavior remains internal to the update operation (PVD-027).
725
- PDF replace/delete are separate acknowledged mutations and are not presented as atomic with metadata (PCG-010).
739
+ PDF replace/delete are separate acknowledged mutations and are not presented as atomic with metadata.
726
740
  Permanent personal deletion is named `permanently_delete`, returns `None`, and is non-recoverable. Sharing requires
727
741
  list-observed item summaries, user-search summaries and a
728
742
  valid caller identity, then returns `None` because the Provider supplies no per-recipient IDs (PVD-012, PVD-036).
@@ -759,7 +773,7 @@ time strings.
759
773
  Folder create returns a `CloudFolderRef` built from the Provider ID. Other folder and file mutations return `None`
760
774
  after acknowledgement and do not automatically list the drive. Staged finalize accepts a completed `StagedFile`;
761
775
  the Provider binds by temporary row ID without checking its owner (PVD-031), and finalize atomicity/idempotency remain
762
- absent (PCG-012). Batch move and permanent delete do not claim Provider per-item results or atomicity. Permanent
776
+ absent. Batch move and permanent delete do not claim Provider per-item results or atomicity. Permanent
763
777
  deletion is named `permanently_delete_files` and is non-recoverable. Cloud downloads
764
778
  resolve bytes from the final file identity and reuse `DownloadStream`, thumbnail/preview choices and the PVD-002-safe
765
779
  range subset. Cloud mutations are not automatically retried.
@@ -901,6 +915,6 @@ uv run python scripts/check_release.py dist/release/*.whl dist/release/*.tar.gz
901
915
  ```
902
916
 
903
917
  Rebuilding the same commit with the same locked environment and `SOURCE_DATE_EPOCH` must produce
904
- byte-identical wheel and source distribution hashes. The release is bound to `matelab-spec v0.4.1`,
905
- commit `6f8ab3d14797385d0075d0aba38bf3bf529e674d`, and OpenAPI SHA-256
906
- `73d899c9e60b59f9521062ffcfaaae5f073eea36f24f3e535fcb53f12242581c`.
918
+ byte-identical wheel and source distribution hashes. The release is bound to `matelab-spec v0.4.2`,
919
+ commit `a51483f910440fbbbc3693cc32566482064bb3ab`, and OpenAPI SHA-256
920
+ `4c92b96ba3dfe7122b30b4db2e2c8054c06018291c8c52c15482112b51a32920`.
@@ -7,10 +7,10 @@ This README describes the current SDK interface, integration semantics, examples
7
7
  [AGENTS.md](AGENTS.md) for durable maintenance rules, and `docs/operation-coverage.yaml` for the machine-readable
8
8
  operation inventory.
9
9
 
10
- The current alpha is `0.1.0a17`. `[project].version` in `pyproject.toml` is the sole SDK version source;
10
+ The current alpha is `0.1.0a18`. `[project].version` in `pyproject.toml` is the sole SDK version source;
11
11
  `uv.lock` only mirrors that source.
12
12
 
13
- The SDK is pinned to the immutable `matelab-spec v0.4.1` Contract Release. The sole release pin is
13
+ The SDK is pinned to the immutable `matelab-spec v0.4.2` Contract Release. The sole release pin is
14
14
  `contracts/matelab-integration-v1.lock.json`, which records
15
15
  the source tag, commit, OpenAPI path, local snapshot path, and SHA-256.
16
16
 
@@ -36,12 +36,18 @@ To test the same artifact a downstream Consumer will install, build and install
36
36
 
37
37
  ```bash
38
38
  uv build --no-build-isolation --out-dir dist/release
39
- python -m pip install dist/release/matelab_python_sdk-0.1.0a17-py3-none-any.whl
39
+ python -m pip install dist/release/matelab_python_sdk-0.1.0a18-py3-none-any.whl
40
40
  ```
41
41
 
42
42
  Do not infer Provider compatibility from the SDK version alone. A release is also bound to the Contract
43
43
  tag, commit, and checksum recorded below.
44
44
 
45
+ The Contract and public SDK interface remain compatible with the stable Provider evidence at
46
+ `59101f006e9fd6d6ce0b951dfd34695a7949b54f`. The latest reviewed Provider,
47
+ `a3e6b961800f6b1ab666f0d3f6cd4c64c2a3ce27`, is incompatible with that evidence. Its operation-specific
48
+ differences are documented alongside the affected interfaces below; do not treat a successful Contract adoption as
49
+ proof that this newer Provider revision is interchangeable.
50
+
45
51
  ## Design
46
52
 
47
53
  The public module is intentionally small:
@@ -89,7 +95,7 @@ success code it does not allow raises `MatelabProtocolError` rather than assigni
89
95
  `MatelabTransportError.status_code` remains available for HTTP failures. Provider response bodies, top-level `msg`,
90
96
  legacy `errmsg`, opaque `errs`, uncontracted debug fields, and request payloads are not attached to exceptions because
91
97
  Provider-authored diagnostics may contain stack traces, credentials, or submitted values.
92
- The pinned v0.4.1 Contract also declares optional code-4 `errs`, but PVD-041 and PCG-015 record incompatible observed
98
+ The pinned v0.4.2 Contract also declares optional code-4 `errs`, but PVD-041 and PCG-015 record incompatible observed
93
99
  item/container shapes and insufficient evidence for requiredness, cardinality, or exclusion from other codes. The SDK
94
100
  therefore keeps those diagnostics wire-only and does not expose `errs` as stable public metadata. A typed detail
95
101
  interface remains blocked until a future Contract release can define one from stronger Provider evidence. `retryable`
@@ -418,7 +424,7 @@ targets = await client.users.search("Example Researcher", global_scope=False)
418
424
  `groups.list()` returns the `GroupSummary` tuple directly. Ordering remains Provider-unspecified and is documented
419
425
  rather than repeated as a constant result field. The Provider's members for an unstable first group remain wire-only;
420
426
  `users.search()` is the public recipient-discovery interface. These two discovery interfaces are experimental because
421
- group order is unstable and user search is unpaged, unordered and not field-minimized (PVD-006, PVD-029, PCG-011).
427
+ group order is unstable and user search is unpaged, unordered and not field-minimized (PVD-006, PVD-029).
422
428
  `GroupSummary.notebook_creation_available` expresses whether the group can currently host notebook creation without
423
429
  exposing the Provider's data-server routing value.
424
430
 
@@ -510,6 +516,8 @@ relations = await client.records.relations(source)
510
516
  as `modules`; it is not the template-shaped `RecordImportItem.data` accepted by record import.
511
517
  `records.search()` maps each requested field name to a stored record path. A match exposes only Provider-returned
512
518
  entries in `values`, so key membership distinguishes an absent result from an explicit JSON `null`.
519
+ The latest reviewed Provider excludes encrypted records from search (PVD-043); an empty search result therefore does
520
+ not prove that no matching encrypted record exists.
513
521
 
514
522
  The Provider calls its notebook directory tree `subtype`; that name remains wire-only. The SDK exposes
515
523
  `RecordFolder`, `RecordSummary.folder_id`, and the `folders` returned with record listings. A top-level folder has
@@ -559,8 +567,9 @@ UID. Import validates the complete batch with generated wire models but cannot m
559
567
  individual inputs or promise atomicity (PCG-008); it therefore returns only the tuple of database IDs actually
560
568
  reported by the Provider. `RecordImportItem.keywords` is a tuple; the adapter owns the Provider's
561
569
  legacy semicolon encoding. Folder paths are ordered existing folder titles from the notebook root; they do not create
562
- missing folders. Delete means moving records into the recycle bin, not permanent
563
- deletion. Delete and restore return `None`; record mutations are not automatically retried.
570
+ missing folders. The latest reviewed Provider rejects explicit-null table-file imports (PVD-045), so integrations
571
+ targeting it must not interpret that rejection as an invalid SDK input. Delete means moving records into the recycle bin,
572
+ not permanent deletion. Delete and restore return `None`; record mutations are not automatically retried.
564
573
 
565
574
  `records.copy()` accepts an optional `new_record_uid`; when omitted, the SDK generates one locally. The Provider
566
575
  returns only the copied row's database ID, so retaining that UID lets the SDK return a complete `RecordLocator`
@@ -577,7 +586,9 @@ returns the acknowledgement classification
577
586
  issue a post-write read. Database, active-browser, and unclassified acknowledgements remain distinct, and mutation
578
587
  retries stay disabled. Encrypted record content is outside the SDK's public read/update interface: the list-level
579
588
  `RecordSummary.encrypted` flag lets callers identify and skip it, while the Provider password field and frontend-only
580
- password lifecycle remain unexposed.
589
+ password lifecycle remain unexposed. The latest reviewed Provider rejects a valid files-folder append path
590
+ (PVD-044); integrations targeting it must not reinterpret that rejection as invalid SDK input, and should treat a
591
+ staged attachment as indeterminate once the write has started.
581
592
 
582
593
  Relation addition reads both endpoints and checks their resolved data server before writing; this reduces PVD-019
583
594
  risk but is not an atomic Provider authorization guarantee. It does not list relations merely to inspect the
@@ -589,8 +600,9 @@ ignores target notebook identity (PVD-020); its mutation likewise performs autho
589
600
  `records.comments()`. Each returned `RecordRelationRef` carries only the relation row and declared target IDs.
590
601
  Deletion accepts the source `RecordLocator` and one of those observed refs.
591
602
 
592
- Comment upload follows the Provider's literal one-request `upload` field, not the incompatible Front fragment
593
- protocol (PVD-037). Comment mutations return `None` after acknowledgement. Edit first verifies that the selected
603
+ Comment upload follows the stable Provider's literal one-request `upload` field. The latest reviewed Provider renames
604
+ that field (PVD-037), but the SDK retains the Contract-compatible `upload` encoding. Comment mutations return `None`
605
+ after acknowledgement. Edit first verifies that the selected
594
606
  comment is currently observed and caller-owned because the Provider otherwise reports a false success for a missing or
595
607
  other-user ID (PVD-004). Delete sends the typed ref directly because the Provider mutation itself enforces record and
596
608
  caller ownership. Neither operation performs a post-write read. Staged comment attachments have no Contract abort
@@ -669,7 +681,9 @@ The Provider's static literature form definition and extraction deployment flag
669
681
  `extract_metadata()` directly and handle an unavailable or failing optional backend as a Provider error. Extraction
670
682
  returns a `PublicationMetadataCandidate`: unstored, rich publication evidence rather than metadata already attached to
671
683
  a literature item. Its structured authors are `PublicationAuthorCandidate` values. Extraction accepts a DOI, a
672
- completed staged PDF, or both; a supplied DOI takes precedence over the staged PDF. Literature list
684
+ completed staged PDF, or both; a supplied DOI takes precedence over the staged PDF. The latest reviewed Provider
685
+ rejects DOI formats accepted by the stable evidence (PVD-042), so a rejection from that revision does not by itself
686
+ make a DOI invalid for this SDK interface. Literature list
673
687
  results likewise exclude Provider-generated citation HTML and author-highlight fragments; Consumers receive the
674
688
  underlying citation fields instead of presentation markup. `LiteratureDetail.metadata` is `None` when invalid legacy
675
689
  JSON produces the Provider's empty-array fallback; otherwise it contains decoded stored metadata without arbitrary
@@ -694,7 +708,7 @@ canonical update preflights the raw item response and refuses to drop top-level
694
708
  `allow_source_metadata_loss=True` explicitly skips that preflight and sends the canonical replacement directly. The
695
709
  default read/check/write protection is best effort rather than atomic because the Provider offers no revision or
696
710
  compare-and-swap condition; this Provider-specific behavior remains internal to the update operation (PVD-027).
697
- PDF replace/delete are separate acknowledged mutations and are not presented as atomic with metadata (PCG-010).
711
+ PDF replace/delete are separate acknowledged mutations and are not presented as atomic with metadata.
698
712
  Permanent personal deletion is named `permanently_delete`, returns `None`, and is non-recoverable. Sharing requires
699
713
  list-observed item summaries, user-search summaries and a
700
714
  valid caller identity, then returns `None` because the Provider supplies no per-recipient IDs (PVD-012, PVD-036).
@@ -731,7 +745,7 @@ time strings.
731
745
  Folder create returns a `CloudFolderRef` built from the Provider ID. Other folder and file mutations return `None`
732
746
  after acknowledgement and do not automatically list the drive. Staged finalize accepts a completed `StagedFile`;
733
747
  the Provider binds by temporary row ID without checking its owner (PVD-031), and finalize atomicity/idempotency remain
734
- absent (PCG-012). Batch move and permanent delete do not claim Provider per-item results or atomicity. Permanent
748
+ absent. Batch move and permanent delete do not claim Provider per-item results or atomicity. Permanent
735
749
  deletion is named `permanently_delete_files` and is non-recoverable. Cloud downloads
736
750
  resolve bytes from the final file identity and reuse `DownloadStream`, thumbnail/preview choices and the PVD-002-safe
737
751
  range subset. Cloud mutations are not automatically retried.
@@ -873,6 +887,6 @@ uv run python scripts/check_release.py dist/release/*.whl dist/release/*.tar.gz
873
887
  ```
874
888
 
875
889
  Rebuilding the same commit with the same locked environment and `SOURCE_DATE_EPOCH` must produce
876
- byte-identical wheel and source distribution hashes. The release is bound to `matelab-spec v0.4.1`,
877
- commit `6f8ab3d14797385d0075d0aba38bf3bf529e674d`, and OpenAPI SHA-256
878
- `73d899c9e60b59f9521062ffcfaaae5f073eea36f24f3e535fcb53f12242581c`.
890
+ byte-identical wheel and source distribution hashes. The release is bound to `matelab-spec v0.4.2`,
891
+ commit `a51483f910440fbbbc3693cc32566482064bb3ab`, and OpenAPI SHA-256
892
+ `4c92b96ba3dfe7122b30b4db2e2c8054c06018291c8c52c15482112b51a32920`.
@@ -2,12 +2,12 @@
2
2
  "schema_version": 1,
3
3
  "contract_line": "integration-v1",
4
4
  "release": {
5
- "tag": "v0.4.1",
6
- "commit": "6f8ab3d14797385d0075d0aba38bf3bf529e674d"
5
+ "tag": "v0.4.2",
6
+ "commit": "a51483f910440fbbbc3693cc32566482064bb3ab"
7
7
  },
8
8
  "openapi": {
9
9
  "source_path": "openapi/matelab-integration-v1.openapi.yaml",
10
10
  "snapshot": "matelab-integration-v1.openapi.yaml",
11
- "sha256": "73d899c9e60b59f9521062ffcfaaae5f073eea36f24f3e535fcb53f12242581c"
11
+ "sha256": "4c92b96ba3dfe7122b30b4db2e2c8054c06018291c8c52c15482112b51a32920"
12
12
  }
13
13
  }
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: Matelab Integration Contract
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  description: |
6
6
  Stable PHP wire contract for the `integration-v1` contract line.
7
7
  Business failures are returned as JSON envelopes over HTTP 200.
@@ -37,6 +37,16 @@ info:
37
37
  - sql/eln.sql
38
38
  - sql/matelab.sql
39
39
  - sql/recommend.sql
40
+ x-provider-audit:
41
+ latestReviewedCommit: a3e6b961800f6b1ab666f0d3f6cd4c64c2a3ce27
42
+ stableEvidenceCommit: 59101f006e9fd6d6ce0b951dfd34695a7949b54f
43
+ compatibility: incompatible
44
+ regressions:
45
+ - {issue: PVD-037, operationId: uploadRecordCommentAttachment}
46
+ - {issue: PVD-042, operationId: extractLiteratureMetadata}
47
+ - {issue: PVD-043, operationId: searchRecordData}
48
+ - {issue: PVD-044, operationId: updateRecordData}
49
+ - {issue: PVD-045, operationId: importRecordDataset}
40
50
  x-consumer-evidence:
41
51
  - repository: /home/tnzhu/projects/matelab-mcp
42
52
  commit: 94a129b2df0ef0fbcf179c10550fb7c9a5dd2e6f
@@ -963,7 +973,7 @@ paths:
963
973
  product capability and the notebook/template share routes do not require
964
974
  common group membership. The contract still narrows the keyword to a
965
975
  bounded, non-blank 2–100-character string and records the unpaged global
966
- directory as PVD-029/PCG-011.
976
+ directory as PVD-029.
967
977
  x-consumer-use-case: Resolve same-institute or global target user ids before notebook, template, or literature sharing.
968
978
  x-known-provider-issues: [PVD-013, PVD-029]
969
979
  security: [{bearerAuth: []}]
@@ -1507,7 +1517,7 @@ paths:
1507
1517
  Consumers must split attachment-bearing imports into single-record
1508
1518
  requests with a distinct staged name for each request, and must not
1509
1519
  retry a failed finalize with the same name.
1510
- x-known-provider-issues: [PVD-023, PVD-024, PVD-040, PVD-041]
1520
+ x-known-provider-issues: [PVD-023, PVD-024, PVD-040, PVD-041, PVD-045]
1511
1521
  security: [{bearerAuth: []}]
1512
1522
  requestBody:
1513
1523
  required: true
@@ -1597,6 +1607,12 @@ paths:
1597
1607
  operationId: searchRecordData
1598
1608
  tags: [Records]
1599
1609
  summary: Search notebooks and extract requested dynamic fields
1610
+ description: |
1611
+ The released contract is backed by Provider commit `59101f0`. The latest
1612
+ reviewed Provider commit excludes encrypted records before applying the
1613
+ requested filters, which is a response-subtractive behavior change still
1614
+ awaiting policy confirmation and Provider Verification under PVD-043.
1615
+ x-known-provider-issues: [PVD-043]
1600
1616
  security: [{bearerAuth: []}]
1601
1617
  requestBody:
1602
1618
  required: true
@@ -1650,7 +1666,11 @@ paths:
1650
1666
  This operation does not modify record title or other record metadata.
1651
1667
  `UpdateRecordRequest` rejects a top-level `title`; the Front uses the
1652
1668
  separate, currently unsupported `/eln_items/edit` route for that use
1653
- case. A stable Integration metadata update remains PCG-016.
1669
+ case. That candidate route remains outside Supported Routes and has not
1670
+ completed the request-boundary, permission, side-effect, response, and
1671
+ Provider Verification audit required for Integration use. MCP therefore
1672
+ deliberately omits title from `update_record`; the shared capability gap
1673
+ remains tracked as PCG-016.
1654
1674
 
1655
1675
  Verified staged-name update shapes are enumerated by
1656
1676
  `info.x-record-attachment-staging.safeFinalizerShapes.update` and their
@@ -1674,7 +1694,7 @@ paths:
1674
1694
  consumption are not atomic. Once a finalizer begins, any write error,
1675
1695
  collaboration-pending response, response loss or failed readback leaves
1676
1696
  staging indeterminate and must not be retried.
1677
- x-known-provider-issues: [PVD-014, PVD-015, PVD-016, PVD-017, PVD-040, PVD-041]
1697
+ x-known-provider-issues: [PVD-014, PVD-015, PVD-016, PVD-017, PVD-040, PVD-041, PVD-044]
1678
1698
  security: [{bearerAuth: []}]
1679
1699
  requestBody:
1680
1700
  required: true
@@ -3398,6 +3418,7 @@ paths:
3398
3418
  external to the PHP Provider and can omit fields or return additional
3399
3419
  fields, so only the documented candidate fields are promised.
3400
3420
  x-consumer-use-case: Prefill canonical literature metadata before import from a DOI or staged PDF.
3421
+ x-known-provider-issues: [PVD-042]
3401
3422
  security: [{bearerAuth: []}]
3402
3423
  requestBody:
3403
3424
  required: true
@@ -3,7 +3,7 @@
3
3
  schema_version: 1
4
4
  contract:
5
5
  line: integration-v1
6
- release: v0.4.1
6
+ release: v0.4.2
7
7
  operation_count: 71
8
8
 
9
9
  operations:
@@ -169,7 +169,7 @@ operations:
169
169
  state: implemented
170
170
  stability: experimental
171
171
  public_interface: AsyncMatelab.groups.list
172
- known_issues: [PCG-003, PCG-011, PVD-006, PVD-013]
172
+ known_issues: [PCG-003, PVD-006, PVD-013]
173
173
 
174
174
  - operation_id: searchUsers
175
175
  method: GET
@@ -178,7 +178,7 @@ operations:
178
178
  state: implemented
179
179
  stability: experimental
180
180
  public_interface: AsyncMatelab.users.search
181
- known_issues: [PCG-003, PCG-011, PVD-013, PVD-029]
181
+ known_issues: [PCG-003, PVD-013, PVD-029]
182
182
 
183
183
  - operation_id: saveNotebookMetadata
184
184
  method: POST
@@ -259,7 +259,7 @@ operations:
259
259
  state: implemented
260
260
  stability: experimental
261
261
  public_interface: AsyncMatelab.records.import_dataset
262
- known_issues: [PCG-008, PCG-014, PVD-023, PVD-024, PVD-040, PVD-041]
262
+ known_issues: [PCG-008, PCG-014, PVD-023, PVD-024, PVD-040, PVD-041, PVD-045]
263
263
 
264
264
  - operation_id: exportRecords
265
265
  method: POST
@@ -277,7 +277,7 @@ operations:
277
277
  state: implemented
278
278
  stability: experimental
279
279
  public_interface: AsyncMatelab.records.search
280
- known_issues: [PCG-003, PVD-013]
280
+ known_issues: [PCG-003, PVD-013, PVD-043]
281
281
 
282
282
  - operation_id: updateRecordData
283
283
  method: POST
@@ -286,7 +286,7 @@ operations:
286
286
  state: implemented
287
287
  stability: experimental
288
288
  public_interface: AsyncMatelab.records.update
289
- known_issues: [PCG-001, PCG-002, PCG-014, PVD-014, PVD-015, PVD-016, PVD-017, PVD-040, PVD-041]
289
+ known_issues: [PCG-001, PCG-002, PCG-014, PVD-014, PVD-015, PVD-016, PVD-017, PVD-040, PVD-041, PVD-044]
290
290
 
291
291
  - operation_id: deleteRecordsByUid
292
292
  method: POST
@@ -385,7 +385,7 @@ operations:
385
385
  state: implemented
386
386
  stability: experimental
387
387
  public_interface: AsyncMatelab.records.comments
388
- known_issues: [PCG-013, PVD-013]
388
+ known_issues: [PVD-013]
389
389
 
390
390
  - operation_id: saveRecordComment
391
391
  method: POST
@@ -394,7 +394,7 @@ operations:
394
394
  state: implemented
395
395
  stability: experimental
396
396
  public_interface: AsyncMatelab.records.create_comment / AsyncMatelab.records.update_comment
397
- known_issues: [PCG-013, PVD-004, PVD-026]
397
+ known_issues: [PVD-004, PVD-026]
398
398
 
399
399
  - operation_id: uploadRecordCommentAttachment
400
400
  method: POST
@@ -403,7 +403,7 @@ operations:
403
403
  state: implemented
404
404
  stability: experimental
405
405
  public_interface: AsyncMatelab.records.upload_comment_attachment
406
- known_issues: [PCG-013, PVD-037]
406
+ known_issues: [PVD-037]
407
407
 
408
408
  - operation_id: deleteRecordComment
409
409
  method: POST
@@ -412,7 +412,7 @@ operations:
412
412
  state: implemented
413
413
  stability: experimental
414
414
  public_interface: AsyncMatelab.records.delete_comment
415
- known_issues: [PCG-013]
415
+ known_issues: []
416
416
 
417
417
  - operation_id: downloadRecordCommentAttachment
418
418
  method: GET
@@ -421,7 +421,7 @@ operations:
421
421
  state: implemented
422
422
  stability: experimental
423
423
  public_interface: AsyncMatelab.records.download_comment_attachment
424
- known_issues: [PCG-013, PVD-002, PVD-038]
424
+ known_issues: [PVD-002, PVD-038]
425
425
 
426
426
  - operation_id: readRecord
427
427
  method: GET
@@ -531,7 +531,7 @@ operations:
531
531
  state: implemented
532
532
  stability: experimental
533
533
  public_interface: AsyncMatelab.literature.extract_metadata
534
- known_issues: [PCG-010]
534
+ known_issues: [PVD-042]
535
535
 
536
536
  - operation_id: saveLiteratureItem
537
537
  method: POST
@@ -540,7 +540,7 @@ operations:
540
540
  state: implemented
541
541
  stability: experimental
542
542
  public_interface: AsyncMatelab.literature.create / AsyncMatelab.literature.update
543
- known_issues: [PCG-010, PVD-011, PVD-026, PVD-027, PVD-041]
543
+ known_issues: [PVD-011, PVD-026, PVD-027, PVD-041]
544
544
 
545
545
  - operation_id: replaceLiteraturePdf
546
546
  method: POST
@@ -549,7 +549,7 @@ operations:
549
549
  state: implemented
550
550
  stability: experimental
551
551
  public_interface: AsyncMatelab.literature.replace_pdf
552
- known_issues: [PCG-010, PVD-011, PVD-026]
552
+ known_issues: [PVD-011, PVD-026]
553
553
 
554
554
  - operation_id: deleteLiteraturePdf
555
555
  method: POST
@@ -558,7 +558,7 @@ operations:
558
558
  state: implemented
559
559
  stability: experimental
560
560
  public_interface: AsyncMatelab.literature.delete_pdf
561
- known_issues: [PCG-010, PVD-011]
561
+ known_issues: [PVD-011]
562
562
 
563
563
  - operation_id: downloadLiteraturePdf
564
564
  method: GET
@@ -576,7 +576,7 @@ operations:
576
576
  state: implemented
577
577
  stability: experimental
578
578
  public_interface: AsyncMatelab.cloud_drive.list
579
- known_issues: [PCG-003, PCG-012, PVD-013]
579
+ known_issues: [PCG-003, PVD-013]
580
580
 
581
581
  - operation_id: saveCloudDriveFolder
582
582
  method: POST
@@ -585,7 +585,7 @@ operations:
585
585
  state: implemented
586
586
  stability: experimental
587
587
  public_interface: AsyncMatelab.cloud_drive.create_folder / AsyncMatelab.cloud_drive.update_folder
588
- known_issues: [PCG-012]
588
+ known_issues: []
589
589
 
590
590
  - operation_id: deleteEmptyCloudDriveFolder
591
591
  method: POST
@@ -594,7 +594,7 @@ operations:
594
594
  state: implemented
595
595
  stability: experimental
596
596
  public_interface: AsyncMatelab.cloud_drive.delete_folder
597
- known_issues: [PCG-012]
597
+ known_issues: []
598
598
 
599
599
  - operation_id: moveCloudDriveFolder
600
600
  method: POST
@@ -603,7 +603,7 @@ operations:
603
603
  state: implemented
604
604
  stability: experimental
605
605
  public_interface: AsyncMatelab.cloud_drive.move_folder
606
- known_issues: [PCG-012]
606
+ known_issues: []
607
607
 
608
608
  - operation_id: bindStagedCloudDriveFile
609
609
  method: POST
@@ -612,7 +612,7 @@ operations:
612
612
  state: implemented
613
613
  stability: experimental
614
614
  public_interface: AsyncMatelab.cloud_drive.bind_staged_file
615
- known_issues: [PCG-012, PVD-031]
615
+ known_issues: [PVD-031]
616
616
 
617
617
  - operation_id: editCloudDriveFile
618
618
  method: POST
@@ -621,7 +621,7 @@ operations:
621
621
  state: implemented
622
622
  stability: experimental
623
623
  public_interface: AsyncMatelab.cloud_drive.update_file
624
- known_issues: [PCG-012]
624
+ known_issues: []
625
625
 
626
626
  - operation_id: deleteCloudDriveFiles
627
627
  method: POST
@@ -630,7 +630,7 @@ operations:
630
630
  state: implemented
631
631
  stability: experimental
632
632
  public_interface: AsyncMatelab.cloud_drive.permanently_delete_files
633
- known_issues: [PCG-012]
633
+ known_issues: []
634
634
 
635
635
  - operation_id: moveCloudDriveFiles
636
636
  method: POST
@@ -639,7 +639,7 @@ operations:
639
639
  state: implemented
640
640
  stability: experimental
641
641
  public_interface: AsyncMatelab.cloud_drive.move_files
642
- known_issues: [PCG-012]
642
+ known_issues: []
643
643
 
644
644
  - operation_id: downloadCloudDriveFile
645
645
  method: GET
@@ -648,4 +648,4 @@ operations:
648
648
  state: implemented
649
649
  stability: experimental
650
650
  public_interface: AsyncMatelab.cloud_drive.download
651
- known_issues: [PCG-012, PVD-002]
651
+ known_issues: [PVD-002]
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "matelab-python-sdk"
7
- version = "0.1.0a17"
7
+ version = "0.1.0a18"
8
8
  description = "Reusable async Python client for the Matelab Integration Contract"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -11,7 +11,7 @@ from pydantic import ConfigDict, Field, RootModel, SecretStr, StrictBool, Strict
11
11
 
12
12
  from matelab._wire_validation import WireModel
13
13
 
14
- OPENAPI_INFO_VERSION = "0.4.1"
14
+ OPENAPI_INFO_VERSION = "0.4.2"
15
15
 
16
16
 
17
17
  class ResponseEnvelope(WireModel):
@@ -333,7 +333,7 @@ def test_generated_models_cover_every_component_schema_and_non_streaming_operati
333
333
  }
334
334
  assert expected_response_models <= class_names
335
335
  assert len(operation_ids) == 71
336
- assert wire_models.OPENAPI_INFO_VERSION == "0.4.1"
336
+ assert wire_models.OPENAPI_INFO_VERSION == "0.4.2"
337
337
 
338
338
 
339
339
  def test_generation_is_deterministic(tmp_path: Path) -> None:
@@ -445,8 +445,8 @@ def test_contract_lock_is_the_single_release_pin() -> None:
445
445
  openapi = cast(dict[str, Any], lock["openapi"])
446
446
  assert set(release) == {"tag", "commit"}
447
447
  assert set(openapi) == {"source_path", "snapshot", "sha256"}
448
- assert release == {"tag": "v0.4.1", "commit": "6f8ab3d14797385d0075d0aba38bf3bf529e674d"}
449
- assert openapi["sha256"] == "73d899c9e60b59f9521062ffcfaaae5f073eea36f24f3e535fcb53f12242581c"
448
+ assert release == {"tag": "v0.4.2", "commit": "a51483f910440fbbbc3693cc32566482064bb3ab"}
449
+ assert openapi["sha256"] == "4c92b96ba3dfe7122b30b4db2e2c8054c06018291c8c52c15482112b51a32920"
450
450
  assert re.fullmatch(r"[0-9a-f]{40}", cast(str, release["commit"]))
451
451
  assert re.fullmatch(r"[0-9a-f]{64}", cast(str, openapi["sha256"]))
452
452
  assert not (ROOT / "contracts" / "matelab-integration-v1.sha256").exists()
@@ -352,7 +352,7 @@ wheels = [
352
352
 
353
353
  [[package]]
354
354
  name = "matelab-python-sdk"
355
- version = "0.1.0a17"
355
+ version = "0.1.0a18"
356
356
  source = { editable = "." }
357
357
  dependencies = [
358
358
  { name = "httpx2" },