mintmark 0.3.0__tar.gz → 0.3.2__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 (145) hide show
  1. {mintmark-0.3.0 → mintmark-0.3.2}/CHANGELOG.md +26 -0
  2. {mintmark-0.3.0 → mintmark-0.3.2}/PKG-INFO +3 -3
  3. {mintmark-0.3.0 → mintmark-0.3.2}/README.md +2 -2
  4. {mintmark-0.3.0 → mintmark-0.3.2}/pyproject.toml +1 -1
  5. {mintmark-0.3.0 → mintmark-0.3.2}/schemas/manifest.schema.json +2 -2
  6. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/version.py +1 -1
  7. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/test_numeric_resource_limits.py +22 -0
  8. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_workflows.py +11 -1
  9. {mintmark-0.3.0 → mintmark-0.3.2}/.gitignore +0 -0
  10. {mintmark-0.3.0 → mintmark-0.3.2}/LICENSE +0 -0
  11. {mintmark-0.3.0 → mintmark-0.3.2}/NOTICE +0 -0
  12. {mintmark-0.3.0 → mintmark-0.3.2}/assets/brand/mintmark-logo.png +0 -0
  13. {mintmark-0.3.0 → mintmark-0.3.2}/assets/brand/mintmark-logo.svg +0 -0
  14. {mintmark-0.3.0 → mintmark-0.3.2}/assets/denylist/institutions-tr.txt +0 -0
  15. {mintmark-0.3.0 → mintmark-0.3.2}/assets/readme/family-topology.png +0 -0
  16. {mintmark-0.3.0 → mintmark-0.3.2}/assets/readme/family-topology.svg +0 -0
  17. {mintmark-0.3.0 → mintmark-0.3.2}/assets/readme/mint-pipeline.png +0 -0
  18. {mintmark-0.3.0 → mintmark-0.3.2}/assets/readme/mint-pipeline.svg +0 -0
  19. {mintmark-0.3.0 → mintmark-0.3.2}/assets/tables/CHECKSUMS +0 -0
  20. {mintmark-0.3.0 → mintmark-0.3.2}/assets/tables/balances.json +0 -0
  21. {mintmark-0.3.0 → mintmark-0.3.2}/assets/tables/txn_amounts.json +0 -0
  22. {mintmark-0.3.0 → mintmark-0.3.2}/packs/example/README.md +0 -0
  23. {mintmark-0.3.0 → mintmark-0.3.2}/packs/example/fields/customer.yaml +0 -0
  24. {mintmark-0.3.0 → mintmark-0.3.2}/packs/example/fields/transaction.yaml +0 -0
  25. {mintmark-0.3.0 → mintmark-0.3.2}/packs/example/pack.yaml +0 -0
  26. {mintmark-0.3.0 → mintmark-0.3.2}/packs/example/recipes/demo.yaml +0 -0
  27. {mintmark-0.3.0 → mintmark-0.3.2}/packs/example/templates/txn_descriptions/set.yaml +0 -0
  28. {mintmark-0.3.0 → mintmark-0.3.2}/schemas/pack.schema.json +0 -0
  29. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/__init__.py +0 -0
  30. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/annotate/__init__.py +0 -0
  31. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/annotate/render.py +0 -0
  32. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/annotate/sidecar.py +0 -0
  33. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/annotate/spans.py +0 -0
  34. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/annotate/taxonomy.py +0 -0
  35. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/api.py +0 -0
  36. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/cli.py +0 -0
  37. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/emit/__init__.py +0 -0
  38. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/emit/canonical.py +0 -0
  39. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/emit/csv_writer.py +0 -0
  40. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/emit/writer.py +0 -0
  41. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/__init__.py +0 -0
  42. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/draws.py +0 -0
  43. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/fold.py +0 -0
  44. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/prng.py +0 -0
  45. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/records.py +0 -0
  46. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/streams.py +0 -0
  47. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/tables.py +0 -0
  48. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/engine/templates.py +0 -0
  49. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/__init__.py +0 -0
  50. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/email.py +0 -0
  51. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/iban.py +0 -0
  52. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/pan.py +0 -0
  53. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/phone.py +0 -0
  54. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/policy.py +0 -0
  55. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/tckn.py +0 -0
  56. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/identifiers/vkn.py +0 -0
  57. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/__init__.py +0 -0
  58. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/data/given_names_tr.yaml +0 -0
  59. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/data/occupations_tr.yaml +0 -0
  60. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/data/provinces_tr.yaml +0 -0
  61. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/data/special_descriptors.yaml +0 -0
  62. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/data/street_parts_tr.yaml +0 -0
  63. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/data/surnames_tr.yaml +0 -0
  64. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/lexicons/denylist.py +0 -0
  65. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/manifest/__init__.py +0 -0
  66. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/manifest/document.py +0 -0
  67. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/manifest/io.py +0 -0
  68. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/manifest/safety.py +0 -0
  69. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/manifest/sums.py +0 -0
  70. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/manifest/verify.py +0 -0
  71. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/mint.py +0 -0
  72. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/packs/__init__.py +0 -0
  73. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/packs/digest.py +0 -0
  74. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/packs/loader.py +0 -0
  75. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/packs/model.py +0 -0
  76. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/packs/semver.py +0 -0
  77. {mintmark-0.3.0 → mintmark-0.3.2}/src/mintmark/py.typed +0 -0
  78. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/alias/pack.yaml +0 -0
  79. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/anchor/pack.yaml +0 -0
  80. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/bad-name-pattern/pack.yaml +0 -0
  81. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/duplicate-key/pack.yaml +0 -0
  82. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/empty-file/pack.yaml +0 -0
  83. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/float-weight/pack.yaml +0 -0
  84. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/merge-key/pack.yaml +0 -0
  85. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/missing-schema-version/pack.yaml +0 -0
  86. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/multiple-documents/pack.yaml +0 -0
  87. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/non-mapping-root/pack.yaml +0 -0
  88. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/open-ended-requires-core/pack.yaml +0 -0
  89. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/tab-indentation/pack.yaml +0 -0
  90. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/unknown-field/pack.yaml +0 -0
  91. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/valid/pack.yaml +0 -0
  92. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/packs/wrong-locale/pack.yaml +0 -0
  93. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/test_pack_rejection.py +0 -0
  94. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/test_tamper_detection.py +0 -0
  95. {mintmark-0.3.0 → mintmark-0.3.2}/tests/adversarial/test_template_grammar.py +0 -0
  96. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/fields/account.yaml +0 -0
  97. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/fields/card.yaml +0 -0
  98. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/fields/complaint_ticket.yaml +0 -0
  99. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/fields/customer.yaml +0 -0
  100. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/fields/kyc_note.yaml +0 -0
  101. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/fields/support_transcript.yaml +0 -0
  102. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/fields/transaction.yaml +0 -0
  103. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/lexicons/ratings.yaml +0 -0
  104. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/pack.yaml +0 -0
  105. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/recipes/full.yaml +0 -0
  106. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/templates/complaints/set.yaml +0 -0
  107. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/templates/kyc_notes/set.yaml +0 -0
  108. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/pack/templates/transcripts/set.yaml +0 -0
  109. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conformance/test_contract_coverage.py +0 -0
  110. {mintmark-0.3.0 → mintmark-0.3.2}/tests/conftest.py +0 -0
  111. {mintmark-0.3.0 → mintmark-0.3.2}/tests/golden/demo-run/DIGESTS.json +0 -0
  112. {mintmark-0.3.0 → mintmark-0.3.2}/tests/golden/demo-run/customer.jsonl +0 -0
  113. {mintmark-0.3.0 → mintmark-0.3.2}/tests/golden/demo-run/transaction.jsonl +0 -0
  114. {mintmark-0.3.0 → mintmark-0.3.2}/tests/golden/demo-run/transaction.labels.jsonl +0 -0
  115. {mintmark-0.3.0 → mintmark-0.3.2}/tests/golden/prng_vectors.json +0 -0
  116. {mintmark-0.3.0 → mintmark-0.3.2}/tests/golden/test_golden_bytes.py +0 -0
  117. {mintmark-0.3.0 → mintmark-0.3.2}/tests/property/test_draws.py +0 -0
  118. {mintmark-0.3.0 → mintmark-0.3.2}/tests/property/test_fold_and_email.py +0 -0
  119. {mintmark-0.3.0 → mintmark-0.3.2}/tests/property/test_records.py +0 -0
  120. {mintmark-0.3.0 → mintmark-0.3.2}/tests/property/test_render.py +0 -0
  121. {mintmark-0.3.0 → mintmark-0.3.2}/tests/property/test_safe_mode_purity.py +0 -0
  122. {mintmark-0.3.0 → mintmark-0.3.2}/tests/property/test_span_alignment.py +0 -0
  123. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_canary.py +0 -0
  124. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_cli.py +0 -0
  125. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_community_mirrors.py +0 -0
  126. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_declared_controls.py +0 -0
  127. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_denylist.py +0 -0
  128. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_emit.py +0 -0
  129. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_mint_invariants.py +0 -0
  130. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_module_boundaries.py +0 -0
  131. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_no_libm.py +0 -0
  132. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_pack_digest.py +0 -0
  133. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_packaging.py +0 -0
  134. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_prng.py +0 -0
  135. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_prose_lint.py +0 -0
  136. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_readme_mirror.py +0 -0
  137. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_repository_inventory.py +0 -0
  138. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_special_descriptors.py +0 -0
  139. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_streams.py +0 -0
  140. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_tables.py +0 -0
  141. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_taxonomy.py +0 -0
  142. {mintmark-0.3.0 → mintmark-0.3.2}/tests/unit/test_toolchain.py +0 -0
  143. {mintmark-0.3.0 → mintmark-0.3.2}/tools/canary.py +0 -0
  144. {mintmark-0.3.0 → mintmark-0.3.2}/tools/gen_tables.py +0 -0
  145. {mintmark-0.3.0 → mintmark-0.3.2}/tools/mdlint.py +0 -0
@@ -11,6 +11,32 @@ output for a fixed set of inputs. A change that alters emitted bytes for a fixed
11
11
  seed is a major version event even when no signature changed, because it breaks
12
12
  the reproducibility of every published manifest.
13
13
 
14
+ ## 0.3.2 - 2026-08-23
15
+
16
+ ### Security
17
+
18
+ - Release checksums and GitHub build-provenance attestations now cover the
19
+ CycloneDX SBOM alongside the wheel and source distribution.
20
+ - Artifact upload and download steps use immutable, Node 24-compatible action
21
+ revisions.
22
+
23
+ Generated record and label files do not change for the same inputs. Manifests
24
+ record the patch engine version.
25
+
26
+ ## 0.3.1 - 2026-08-23
27
+
28
+ ### Fixed
29
+
30
+ - The manifest schema now uses the same 1,000,000-record per-type budget as pack
31
+ loading, minting, and streaming verification. The stale 50,000-record schema
32
+ ceiling made the published HR and banking reference shapes producible but
33
+ unverifiable.
34
+ - A regression test exercises the legitimate upper boundary and confirms that
35
+ 1,000,001 records remain rejected.
36
+
37
+ Generated record and label files do not change for the same inputs. Manifests
38
+ record the patch engine version.
39
+
14
40
  ## 0.3.0 - 2026-08-23
15
41
 
16
42
  ### Security
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mintmark
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Deterministic, fully synthetic, Turkish-first labeled datasets with a provenance manifest.
5
5
  Author: Mintmark contributors
6
6
  License-Expression: Apache-2.0
@@ -33,9 +33,9 @@ Description-Content-Type: text/markdown
33
33
 
34
34
  <p align="center">
35
35
  <a href="https://github.com/lokomotifai/mintmark/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/lokomotifai/mintmark/ci.yml?branch=main&amp;style=flat-square&amp;label=CI"></a>
36
- <img alt="925 tests" src="https://img.shields.io/badge/tests-925-3C873A?style=flat-square">
36
+ <img alt="926 tests" src="https://img.shields.io/badge/tests-926-3C873A?style=flat-square">
37
37
  <img alt="18 invariants, each with a named test" src="https://img.shields.io/badge/invariants-18%20tested-3C873A?style=flat-square">
38
- <a href="https://github.com/lokomotifai/mintmark/releases/tag/v0.3.0"><img alt="Release v0.3.0" src="https://img.shields.io/badge/release-v0.3.0-3C873A?style=flat-square"></a>
38
+ <a href="https://github.com/lokomotifai/mintmark/releases/tag/v0.3.2"><img alt="Release v0.3.2" src="https://img.shields.io/badge/release-v0.3.2-3C873A?style=flat-square"></a>
39
39
  <a href="https://pypi.org/project/mintmark/"><img alt="On PyPI" src="https://img.shields.io/pypi/v/mintmark?style=flat-square&amp;label=PyPI&amp;color=3C873A"></a>
40
40
  <a href="LICENSE"><img alt="Apache-2.0 license" src="https://img.shields.io/badge/license-Apache--2.0-3B3F46?style=flat-square"></a>
41
41
  </p>
@@ -13,9 +13,9 @@
13
13
 
14
14
  <p align="center">
15
15
  <a href="https://github.com/lokomotifai/mintmark/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/lokomotifai/mintmark/ci.yml?branch=main&amp;style=flat-square&amp;label=CI"></a>
16
- <img alt="925 tests" src="https://img.shields.io/badge/tests-925-3C873A?style=flat-square">
16
+ <img alt="926 tests" src="https://img.shields.io/badge/tests-926-3C873A?style=flat-square">
17
17
  <img alt="18 invariants, each with a named test" src="https://img.shields.io/badge/invariants-18%20tested-3C873A?style=flat-square">
18
- <a href="https://github.com/lokomotifai/mintmark/releases/tag/v0.3.0"><img alt="Release v0.3.0" src="https://img.shields.io/badge/release-v0.3.0-3C873A?style=flat-square"></a>
18
+ <a href="https://github.com/lokomotifai/mintmark/releases/tag/v0.3.2"><img alt="Release v0.3.2" src="https://img.shields.io/badge/release-v0.3.2-3C873A?style=flat-square"></a>
19
19
  <a href="https://pypi.org/project/mintmark/"><img alt="On PyPI" src="https://img.shields.io/pypi/v/mintmark?style=flat-square&amp;label=PyPI&amp;color=3C873A"></a>
20
20
  <a href="LICENSE"><img alt="Apache-2.0 license" src="https://img.shields.io/badge/license-Apache--2.0-3B3F46?style=flat-square"></a>
21
21
  </p>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mintmark"
7
- version = "0.3.0"
7
+ version = "0.3.2"
8
8
  description = "Deterministic, fully synthetic, Turkish-first labeled datasets with a provenance manifest."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12,<3.13"
@@ -86,7 +86,7 @@
86
86
  "additionalProperties": {
87
87
  "type": "integer",
88
88
  "minimum": 0,
89
- "maximum": 50000
89
+ "maximum": 1000000
90
90
  }
91
91
  },
92
92
  "date_window": {
@@ -231,7 +231,7 @@
231
231
  "additionalProperties": {
232
232
  "type": "integer",
233
233
  "minimum": 0,
234
- "maximum": 50000
234
+ "maximum": 1000000
235
235
  }
236
236
  },
237
237
  "distributions": {
@@ -2,4 +2,4 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- VERSION = "0.3.0"
5
+ VERSION = "0.3.2"
@@ -2,9 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import shutil
6
7
  from pathlib import Path
7
8
 
9
+ import jsonschema
8
10
  import pytest
9
11
  import yaml
10
12
 
@@ -95,6 +97,26 @@ def test_recipe_record_count_is_bounded(tmp_path: Path) -> None:
95
97
  load_pack(pack)
96
98
 
97
99
 
100
+ def test_manifest_schema_uses_the_pack_record_count_budget(tmp_path: Path) -> None:
101
+ out = tmp_path / "manifest-budget"
102
+ mint(pack=CONFORMANCE, recipe="full", seed=1, out=out, invocation="pytest")
103
+ document = json.loads((out / "MINTMARK.json").read_text(encoding="utf-8"))
104
+ schema = json.loads(
105
+ (Path(__file__).resolve().parents[2] / "schemas" / "manifest.schema.json").read_text(
106
+ encoding="utf-8"
107
+ )
108
+ )
109
+
110
+ document["recipe"]["parameters"]["records"]["transaction"] = MAX_RECORDS_PER_TYPE
111
+ document["stats"]["record_counts"]["transaction"] = MAX_RECORDS_PER_TYPE
112
+ jsonschema.validate(document, schema)
113
+
114
+ document["recipe"]["parameters"]["records"]["transaction"] = MAX_RECORDS_PER_TYPE + 1
115
+ document["stats"]["record_counts"]["transaction"] = MAX_RECORDS_PER_TYPE + 1
116
+ with pytest.raises(jsonschema.ValidationError):
117
+ jsonschema.validate(document, schema)
118
+
119
+
98
120
  def test_runtime_record_override_uses_the_same_budget(tmp_path: Path) -> None:
99
121
  out = tmp_path / "out"
100
122
  with pytest.raises(MintError, match="record-count-limit"):
@@ -171,8 +171,14 @@ def test_release_scans_and_seals_the_exact_built_artifacts_before_oidc() -> None
171
171
  assert "uv build --no-build-isolation" in build_text
172
172
  assert "uv export --locked --no-dev --no-emit-project" in build_text
173
173
  assert "tools/canary.py dist/" in build_text
174
- assert "sha256sum mintmark-*.whl mintmark-*.tar.gz" in build_text
174
+ assert "sha256sum mintmark-*.whl mintmark-*.tar.gz sbom.json" in build_text
175
175
  assert "sha256sum -c SHA256SUMS" in publish_text
176
+ attestation = next(
177
+ step
178
+ for step in publish_steps
179
+ if step.get("uses", "").startswith("actions/attest-build-provenance@")
180
+ )
181
+ assert "dist/sbom.json" in attestation["with"]["subject-path"]
176
182
  publisher = next(
177
183
  step
178
184
  for step in publish_steps
@@ -180,5 +186,9 @@ def test_release_scans_and_seals_the_exact_built_artifacts_before_oidc() -> None
180
186
  )
181
187
  assert publisher["uses"].startswith("pypa/gh-action-pypi-publish@")
182
188
  assert publisher["with"]["verify-metadata"] is True
189
+ github_release = next(
190
+ step for step in publish_steps if "gh release create" in step.get("run", "")
191
+ )
192
+ assert github_release["env"]["GH_REPO"] == "${{ github.repository }}"
183
193
  canary = next(step for step in build_steps if "MINTMARK_CANARY" in step.get("env", {}))
184
194
  assert "refs/tags/v" in canary.get("if", "")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes