gdsdiff 0.1.0__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 (158) hide show
  1. gdsdiff-0.1.0/.github/workflows/ci.yml +88 -0
  2. gdsdiff-0.1.0/.github/workflows/release.yml +124 -0
  3. gdsdiff-0.1.0/AGENTS.md +32 -0
  4. gdsdiff-0.1.0/CHANGELOG.md +17 -0
  5. gdsdiff-0.1.0/CONTRIBUTING.md +15 -0
  6. gdsdiff-0.1.0/LICENSE +674 -0
  7. gdsdiff-0.1.0/MANIFEST.in +8 -0
  8. gdsdiff-0.1.0/PKG-INFO +135 -0
  9. gdsdiff-0.1.0/PROVENANCE.md +11 -0
  10. gdsdiff-0.1.0/QUALIFICATION.md +56 -0
  11. gdsdiff-0.1.0/README.md +90 -0
  12. gdsdiff-0.1.0/SECURITY.md +11 -0
  13. gdsdiff-0.1.0/agents/gdsdiff.md +86 -0
  14. gdsdiff-0.1.0/benchmarks/gdsdiff/README.md +14 -0
  15. gdsdiff-0.1.0/benchmarks/gdsdiff/run_benchmarks.py +177 -0
  16. gdsdiff-0.1.0/docs/api.md +19 -0
  17. gdsdiff-0.1.0/docs/gdsdiff.md +58 -0
  18. gdsdiff-0.1.0/docs/gdsdiff_debugging.md +63 -0
  19. gdsdiff-0.1.0/docs/gdsdiff_engine.md +125 -0
  20. gdsdiff-0.1.0/docs/gdsdiff_report.md +64 -0
  21. gdsdiff-0.1.0/docs/gdsdiff_semantics.md +70 -0
  22. gdsdiff-0.1.0/docs/releasing.md +31 -0
  23. gdsdiff-0.1.0/provenance/scgds-commit-map.txt +16 -0
  24. gdsdiff-0.1.0/pyproject.toml +91 -0
  25. gdsdiff-0.1.0/setup.cfg +4 -0
  26. gdsdiff-0.1.0/src/gdsdiff/__init__.py +148 -0
  27. gdsdiff-0.1.0/src/gdsdiff/__main__.py +7 -0
  28. gdsdiff-0.1.0/src/gdsdiff/_environment.py +12 -0
  29. gdsdiff-0.1.0/src/gdsdiff/_version.py +34 -0
  30. gdsdiff-0.1.0/src/gdsdiff/acceptance_evidence.py +530 -0
  31. gdsdiff-0.1.0/src/gdsdiff/api.py +2955 -0
  32. gdsdiff-0.1.0/src/gdsdiff/backends/__init__.py +26 -0
  33. gdsdiff-0.1.0/src/gdsdiff/backends/base.py +77 -0
  34. gdsdiff-0.1.0/src/gdsdiff/backends/boundary_loop_ctypes.py +191 -0
  35. gdsdiff-0.1.0/src/gdsdiff/backends/cpu.py +20 -0
  36. gdsdiff-0.1.0/src/gdsdiff/backends/cpu_ctypes.py +255 -0
  37. gdsdiff-0.1.0/src/gdsdiff/backends/cuda.py +40 -0
  38. gdsdiff-0.1.0/src/gdsdiff/backends/cuda_ctypes.py +1297 -0
  39. gdsdiff-0.1.0/src/gdsdiff/backends/exact.py +424 -0
  40. gdsdiff-0.1.0/src/gdsdiff/backends/geometry_ctypes.py +252 -0
  41. gdsdiff-0.1.0/src/gdsdiff/backends/identity.py +53 -0
  42. gdsdiff-0.1.0/src/gdsdiff/backends/metal.py +198 -0
  43. gdsdiff-0.1.0/src/gdsdiff/backends/metal_ctypes.py +866 -0
  44. gdsdiff-0.1.0/src/gdsdiff/backends/polygon_extract_ctypes.py +233 -0
  45. gdsdiff-0.1.0/src/gdsdiff/backends/structural_ctypes.py +130 -0
  46. gdsdiff-0.1.0/src/gdsdiff/boundary_loops.py +616 -0
  47. gdsdiff-0.1.0/src/gdsdiff/cache.py +544 -0
  48. gdsdiff-0.1.0/src/gdsdiff/canonicalize.py +176 -0
  49. gdsdiff-0.1.0/src/gdsdiff/cli.py +352 -0
  50. gdsdiff-0.1.0/src/gdsdiff/config.py +257 -0
  51. gdsdiff-0.1.0/src/gdsdiff/cuda_setup.py +174 -0
  52. gdsdiff-0.1.0/src/gdsdiff/design_history.py +65 -0
  53. gdsdiff-0.1.0/src/gdsdiff/diagnostics.py +42 -0
  54. gdsdiff-0.1.0/src/gdsdiff/diff_gds.py +66 -0
  55. gdsdiff-0.1.0/src/gdsdiff/exact_diff_markdown.py +979 -0
  56. gdsdiff-0.1.0/src/gdsdiff/exact_oracle.py +649 -0
  57. gdsdiff-0.1.0/src/gdsdiff/extract.py +376 -0
  58. gdsdiff-0.1.0/src/gdsdiff/gds_metadata.py +43 -0
  59. gdsdiff-0.1.0/src/gdsdiff/geometry.py +112 -0
  60. gdsdiff-0.1.0/src/gdsdiff/grid.py +143 -0
  61. gdsdiff-0.1.0/src/gdsdiff/hierarchy.py +215 -0
  62. gdsdiff-0.1.0/src/gdsdiff/hierarchy_extract.py +263 -0
  63. gdsdiff-0.1.0/src/gdsdiff/inventory.py +153 -0
  64. gdsdiff-0.1.0/src/gdsdiff/multiprocessing_support.py +39 -0
  65. gdsdiff-0.1.0/src/gdsdiff/native.py +135 -0
  66. gdsdiff-0.1.0/src/gdsdiff/native_cache.py +265 -0
  67. gdsdiff-0.1.0/src/gdsdiff/native_src/cpu_prefilter.cpp +349 -0
  68. gdsdiff-0.1.0/src/gdsdiff/native_src/gds_boundary_loops.cpp +505 -0
  69. gdsdiff-0.1.0/src/gdsdiff/native_src/gds_geometry_scan.cpp +601 -0
  70. gdsdiff-0.1.0/src/gdsdiff/native_src/gds_polygon_extract.cpp +594 -0
  71. gdsdiff-0.1.0/src/gdsdiff/native_src/gds_structural_scan.cpp +335 -0
  72. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/CMakeLists.txt +74 -0
  73. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/core.cpp +191 -0
  74. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/core.hpp +96 -0
  75. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/cuda_assignment.cu +304 -0
  76. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/cuda_assignment.cuh +33 -0
  77. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/cuda_candidates.cu +133 -0
  78. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/cuda_candidates.cuh +17 -0
  79. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/cuda_ctypes.cu +4528 -0
  80. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/cuda_memory.cu +194 -0
  81. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/cuda_memory.cuh +34 -0
  82. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/metal_ctypes.mm +2791 -0
  83. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/python_bindings.cpp +21 -0
  84. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/test_core.cpp +93 -0
  85. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/test_cuda_assignment.cu +109 -0
  86. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/test_cuda_candidates.cu +94 -0
  87. gdsdiff-0.1.0/src/gdsdiff/native_src/gdsdiff/test_cuda_memory.cu +97 -0
  88. gdsdiff-0.1.0/src/gdsdiff/policy.py +305 -0
  89. gdsdiff-0.1.0/src/gdsdiff/polygon_components.py +860 -0
  90. gdsdiff-0.1.0/src/gdsdiff/profiles.py +152 -0
  91. gdsdiff-0.1.0/src/gdsdiff/py.typed +1 -0
  92. gdsdiff-0.1.0/src/gdsdiff/rect_coverage.py +384 -0
  93. gdsdiff-0.1.0/src/gdsdiff/report.py +354 -0
  94. gdsdiff-0.1.0/src/gdsdiff/schemas/gdsdiff_report-v1.schema.json +92 -0
  95. gdsdiff-0.1.0/src/gdsdiff/semantics.py +75 -0
  96. gdsdiff-0.1.0/src/gdsdiff/source_edge_diff.py +1120 -0
  97. gdsdiff-0.1.0/src/gdsdiff/spatial.py +71 -0
  98. gdsdiff-0.1.0/src/gdsdiff/structural_guard.py +161 -0
  99. gdsdiff-0.1.0/src/gdsdiff/surplus_coverage.py +255 -0
  100. gdsdiff-0.1.0/src/gdsdiff/synthetic_suite.py +1643 -0
  101. gdsdiff-0.1.0/src/gdsdiff/templates.py +709 -0
  102. gdsdiff-0.1.0/src/gdsdiff/tiling.py +153 -0
  103. gdsdiff-0.1.0/src/gdsdiff/windowed_exact.py +270 -0
  104. gdsdiff-0.1.0/src/gdsdiff/windows.py +184 -0
  105. gdsdiff-0.1.0/src/gdsdiff.egg-info/PKG-INFO +135 -0
  106. gdsdiff-0.1.0/src/gdsdiff.egg-info/SOURCES.txt +156 -0
  107. gdsdiff-0.1.0/src/gdsdiff.egg-info/dependency_links.txt +1 -0
  108. gdsdiff-0.1.0/src/gdsdiff.egg-info/entry_points.txt +4 -0
  109. gdsdiff-0.1.0/src/gdsdiff.egg-info/requires.txt +22 -0
  110. gdsdiff-0.1.0/src/gdsdiff.egg-info/top_level.txt +1 -0
  111. gdsdiff-0.1.0/tests/__init__.py +1 -0
  112. gdsdiff-0.1.0/tests/fixtures.py +137 -0
  113. gdsdiff-0.1.0/tests/generate_fixtures.py +19 -0
  114. gdsdiff-0.1.0/tests/golden/.gitkeep +1 -0
  115. gdsdiff-0.1.0/tests/test_acceptance_evidence.py +122 -0
  116. gdsdiff-0.1.0/tests/test_api.py +854 -0
  117. gdsdiff-0.1.0/tests/test_backend_dispatch.py +170 -0
  118. gdsdiff-0.1.0/tests/test_benchmarks.py +73 -0
  119. gdsdiff-0.1.0/tests/test_boundary_loops.py +82 -0
  120. gdsdiff-0.1.0/tests/test_canonicalize.py +72 -0
  121. gdsdiff-0.1.0/tests/test_cli.py +498 -0
  122. gdsdiff-0.1.0/tests/test_config.py +158 -0
  123. gdsdiff-0.1.0/tests/test_cpp_core.py +41 -0
  124. gdsdiff-0.1.0/tests/test_cpu_tiling.py +143 -0
  125. gdsdiff-0.1.0/tests/test_cuda_assignment.py +42 -0
  126. gdsdiff-0.1.0/tests/test_cuda_candidates.py +64 -0
  127. gdsdiff-0.1.0/tests/test_cuda_memory.py +44 -0
  128. gdsdiff-0.1.0/tests/test_cuda_polygon_record_delta.py +77 -0
  129. gdsdiff-0.1.0/tests/test_cuda_setup.py +23 -0
  130. gdsdiff-0.1.0/tests/test_diagnostics.py +41 -0
  131. gdsdiff-0.1.0/tests/test_exact_oracle.py +603 -0
  132. gdsdiff-0.1.0/tests/test_extract.py +125 -0
  133. gdsdiff-0.1.0/tests/test_golden_corpus.py +44 -0
  134. gdsdiff-0.1.0/tests/test_grid_resolution.py +90 -0
  135. gdsdiff-0.1.0/tests/test_hierarchy_match.py +132 -0
  136. gdsdiff-0.1.0/tests/test_inventory.py +107 -0
  137. gdsdiff-0.1.0/tests/test_metal_polygon_record_delta.py +476 -0
  138. gdsdiff-0.1.0/tests/test_multiprocessing_support.py +50 -0
  139. gdsdiff-0.1.0/tests/test_native_build.py +137 -0
  140. gdsdiff-0.1.0/tests/test_native_cache.py +131 -0
  141. gdsdiff-0.1.0/tests/test_native_geometry_scan.py +106 -0
  142. gdsdiff-0.1.0/tests/test_native_polygon_extract.py +119 -0
  143. gdsdiff-0.1.0/tests/test_outputs.py +382 -0
  144. gdsdiff-0.1.0/tests/test_policy.py +149 -0
  145. gdsdiff-0.1.0/tests/test_polygon_components.py +742 -0
  146. gdsdiff-0.1.0/tests/test_profiles.py +109 -0
  147. gdsdiff-0.1.0/tests/test_property.py +115 -0
  148. gdsdiff-0.1.0/tests/test_rect_coverage.py +97 -0
  149. gdsdiff-0.1.0/tests/test_report_schema.py +150 -0
  150. gdsdiff-0.1.0/tests/test_semantics.py +36 -0
  151. gdsdiff-0.1.0/tests/test_spatial_index.py +36 -0
  152. gdsdiff-0.1.0/tests/test_structural_guard.py +32 -0
  153. gdsdiff-0.1.0/tests/test_surplus_coverage.py +127 -0
  154. gdsdiff-0.1.0/tests/test_synthetic_suite.py +143 -0
  155. gdsdiff-0.1.0/tests/test_template_workflow.py +194 -0
  156. gdsdiff-0.1.0/tests/test_windowed_exact.py +198 -0
  157. gdsdiff-0.1.0/tests/test_windowed_hierarchy_extract.py +159 -0
  158. gdsdiff-0.1.0/tests/test_windows.py +118 -0
@@ -0,0 +1,88 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ concurrency:
11
+ group: ci-${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ env:
15
+ UV_VERSION: 0.11.29
16
+
17
+ jobs:
18
+ test:
19
+ timeout-minutes: 30
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ os: [ubuntu-latest, macos-latest, windows-latest]
24
+ python-version: ["3.10", "3.14"]
25
+ runs-on: ${{ matrix.os }}
26
+ env:
27
+ UV_PYTHON: ${{ matrix.python-version }}
28
+ steps:
29
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
30
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
31
+ with:
32
+ python-version: ${{ matrix.python-version }}
33
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
34
+ with:
35
+ version: ${{ env.UV_VERSION }}
36
+ enable-cache: true
37
+ - run: uv lock --check
38
+ - run: uv sync --locked --extra test
39
+ - run: uv run --locked --extra test python -m pytest
40
+
41
+ package:
42
+ timeout-minutes: 20
43
+ runs-on: ubuntu-latest
44
+ steps:
45
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
46
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
47
+ with:
48
+ python-version: "3.14"
49
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
50
+ with:
51
+ version: ${{ env.UV_VERSION }}
52
+ - run: uv build --no-sources
53
+ - run: uvx --from twine==6.2.0 twine check --strict dist/*
54
+ - name: Smoke-test installed wheel
55
+ shell: bash
56
+ run: |
57
+ uv venv --python 3.14 /tmp/gdsdiff-wheel-smoke
58
+ uv pip install --python /tmp/gdsdiff-wheel-smoke/bin/python dist/*.whl jsonschema
59
+ cd /tmp
60
+ /tmp/gdsdiff-wheel-smoke/bin/python "$GITHUB_WORKSPACE/scripts/installed_smoke.py"
61
+ - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
62
+ with:
63
+ name: gdsdiff-distributions
64
+ path: dist/*
65
+ if-no-files-found: error
66
+ retention-days: 14
67
+
68
+ compilerless-cpu:
69
+ timeout-minutes: 15
70
+ runs-on: ubuntu-latest
71
+ steps:
72
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
73
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
74
+ with:
75
+ python-version: "3.14"
76
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
77
+ with:
78
+ version: ${{ env.UV_VERSION }}
79
+ - run: uv sync --locked --extra test
80
+ - name: Verify passive CPU operation with no toolchain on PATH
81
+ shell: bash
82
+ run: |
83
+ python_path=$(uv run --locked python -c 'import sys; print(sys.executable)')
84
+ mkdir -p /tmp/gdsdiff-no-tools /tmp/gdsdiff-empty-cache
85
+ cd /tmp
86
+ PATH=/tmp/gdsdiff-no-tools GDSDIFF_NATIVE_CACHE_DIR=/tmp/gdsdiff-empty-cache \
87
+ "$python_path" -c 'import gdsdiff; d=gdsdiff.backend_diagnostics(); assert d["capabilities"]["cpu_available"]; assert not d["capabilities"]["nvcc_available"]'
88
+ test -z "$(find /tmp/gdsdiff-empty-cache -type f -print -quit)"
@@ -0,0 +1,124 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ concurrency:
11
+ group: release-${{ github.ref }}
12
+ cancel-in-progress: false
13
+
14
+ env:
15
+ UV_VERSION: 0.11.29
16
+
17
+ jobs:
18
+ build:
19
+ timeout-minutes: 20
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
23
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
24
+ with:
25
+ python-version: "3.14"
26
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
27
+ with:
28
+ version: ${{ env.UV_VERSION }}
29
+ - name: Verify tag and package versions
30
+ shell: bash
31
+ run: |
32
+ package_version=$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')
33
+ test "v$package_version" = "$GITHUB_REF_NAME"
34
+ - run: uv lock --check
35
+ - run: uv sync --locked --extra test
36
+ - run: uv run --locked --extra test python -m pytest
37
+ - run: uv build --no-sources
38
+ - run: uvx --from twine==6.2.0 twine check --strict dist/*
39
+ - name: Stage immutable release artifacts and hashes
40
+ shell: bash
41
+ run: |
42
+ mkdir -p release/packages
43
+ cp dist/* release/packages/
44
+ cd release/packages
45
+ sha256sum * > ../SHA256SUMS
46
+ - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
47
+ with:
48
+ name: release-distributions
49
+ path: release/
50
+ if-no-files-found: error
51
+ retention-days: 30
52
+
53
+ testpypi:
54
+ needs: build
55
+ timeout-minutes: 10
56
+ runs-on: ubuntu-latest
57
+ environment: testpypi
58
+ permissions:
59
+ id-token: write
60
+ steps:
61
+ - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
62
+ with:
63
+ name: release-distributions
64
+ path: release
65
+ - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
66
+ with:
67
+ packages-dir: release/packages
68
+ repository-url: https://test.pypi.org/legacy/
69
+
70
+ verify-testpypi:
71
+ needs: testpypi
72
+ timeout-minutes: 15
73
+ runs-on: ubuntu-latest
74
+ steps:
75
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
76
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
77
+ with:
78
+ python-version: "3.14"
79
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
80
+ with:
81
+ version: ${{ env.UV_VERSION }}
82
+ - name: Install exact TestPyPI release without dependency confusion
83
+ shell: bash
84
+ run: |
85
+ version=${GITHUB_REF_NAME#v}
86
+ uv venv /tmp/gdsdiff-testpypi
87
+ uv pip install --python /tmp/gdsdiff-testpypi/bin/python --index-url https://pypi.org/simple gdstk numpy jsonschema
88
+ uv pip install --python /tmp/gdsdiff-testpypi/bin/python --index-url https://test.pypi.org/simple --no-deps "gdsdiff==$version"
89
+ cd /tmp
90
+ /tmp/gdsdiff-testpypi/bin/python "$GITHUB_WORKSPACE/scripts/installed_smoke.py"
91
+
92
+ pypi:
93
+ if: ${{ !contains(github.ref_name, 'rc') }}
94
+ needs: verify-testpypi
95
+ timeout-minutes: 10
96
+ runs-on: ubuntu-latest
97
+ environment: pypi
98
+ permissions:
99
+ id-token: write
100
+ steps:
101
+ - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
102
+ with:
103
+ name: release-distributions
104
+ path: release
105
+ - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
106
+ with:
107
+ packages-dir: release/packages
108
+
109
+ github-release:
110
+ if: ${{ !contains(github.ref_name, 'rc') }}
111
+ needs: pypi
112
+ timeout-minutes: 10
113
+ runs-on: ubuntu-latest
114
+ permissions:
115
+ contents: write
116
+ steps:
117
+ - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
118
+ with:
119
+ name: release-distributions
120
+ path: release
121
+ - name: Create GitHub release
122
+ env:
123
+ GH_TOKEN: ${{ github.token }}
124
+ run: gh release create "$GITHUB_REF_NAME" release/packages/* release/SHA256SUMS --verify-tag --generate-notes
@@ -0,0 +1,32 @@
1
+ # Agent Notes
2
+
3
+ This repository is the standalone `gdsdiff` GDSII comparison library. Durable
4
+ implementation belongs under `src/gdsdiff/`; tests belong under `tests/`.
5
+ Read `agents/gdsdiff.md` before changing comparator semantics, reports,
6
+ artifacts, acceleration, or agent-facing diff workflows.
7
+
8
+ ## Environment
9
+
10
+ - Identify the host OS and architecture before environment-sensitive work.
11
+ - Use `.venv_wsl/bin/python` on Windows 11 through WSL,
12
+ `.venv_mac/bin/python` on macOS, and `.venv/bin/python` on native Linux.
13
+ - Do not use the base system Python for imports, builds, or tests.
14
+ - CPU behavior must remain usable without CUDA, Metal, CMake, or a compiler.
15
+ - Use the exact `uv` version required by `pyproject.toml`. On WSL under
16
+ `/mnt/f`, set `UV_PROJECT_ENVIRONMENT=.venv_wsl`, `UV_LINK_MODE=copy`, and
17
+ `TMPDIR=/tmp` for pytest. Use `.venv_mac` on macOS and `.venv` on Linux.
18
+
19
+ ## Development Rules
20
+
21
+ - Work on the current branch unless the user explicitly requests another one.
22
+ - Preserve neutral report wording and stable exit-code semantics.
23
+ - Treat report schemas, CLI behavior, and root exports as public contracts.
24
+ - Do not commit generated GDS, build products, native binaries, caches, or
25
+ benchmark results.
26
+ - Use `.tmp/` for disposable local work and ignored `results/` for retained
27
+ local qualification evidence.
28
+ - Run `python -m pytest` plus distribution build/inspection for packaging work.
29
+ - For performance-sensitive changes, compare exact semantics first, then use a
30
+ warm-up and at least seven measured runs.
31
+ - CUDA and Metal are optional runtime capabilities. Never make their toolchains
32
+ mandatory installation dependencies.
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 - 2026-07-18
4
+
5
+ - Promote the independently verified `0.1.0rc1` package without behavior or
6
+ dependency changes.
7
+ - Record successful OIDC Trusted Publishing, signed attestations, exact
8
+ GitHub/TestPyPI artifact parity, clean indexed installation, and the complete
9
+ Python 3.10/3.14 Ubuntu, macOS, and Windows release-candidate matrix.
10
+
11
+ ## 0.1.0rc1 - 2026-07-17
12
+
13
+ - Extract `gdsdiff` from `scgds` as an independently installable package while
14
+ preserving its comparator history and public behavior.
15
+ - Replaced executable pickle geometry caches with versioned JSON/NumPy caches.
16
+ - Added side-effect-free CUDA inspection, explicit preparation, stronger native
17
+ cache identity/permissions, packaged-schema validation, and release workflows.
@@ -0,0 +1,15 @@
1
+ # Contributing
2
+
3
+ Use Python 3.10 or newer and the pinned `uv` release. On WSL use:
4
+
5
+ ```bash
6
+ UV_PROJECT_ENVIRONMENT=.venv_wsl UV_LINK_MODE=copy uv sync --locked --extra dev
7
+ TMPDIR=/tmp .venv_wsl/bin/python -m pytest
8
+ ```
9
+
10
+ Use `.venv_mac` on macOS and `.venv` on native Linux. Ordinary `pip` installs
11
+ remain a required distribution-compatibility gate.
12
+
13
+ Changes to comparison semantics, report fields, exit codes, root exports, or
14
+ native acceleration must include focused tests and compatibility notes. Keep
15
+ CPU-only operation fully supported.