specs §1.4 + Doorpost: pyswip 0.2.10 — the pinned version was never published (tablet 35)

Construction §1.4 pinned `pyswip = "0.2.11"`. PyPI has 0.2.10 (2020) and
then 0.3.0; 0.2.11 does not exist and never did. pyproject.toml copied
the spec faithfully, so `pip install .` in korban_processor has failed
since Step 13. Nobody saw it: the Dockerfile installs its dependencies
by hand and already said 0.2.10, and the test run uses PYTHONPATH. The
pin was wrong in the one place that was never executed. Found
2026-10-04, the first time the korban suite was run from a clean
container by installing the package.

The spec is corrected to what the vessel has in fact carried since the
first image:

- specs/shorashim_vayakhel.md §1.4, BUILD_KORBAN.md, terumah §row:
  0.2.11 → 0.2.10. Terumah now also says what is true of this
  material: declared and installed, not imported anywhere, and not
  usable in the korban image as built (no libswipl) — it must be
  tested against SWI-Prolog 9.2.2 before first use.
- korban_processor/pyproject.toml: 0.2.10. `pip install .` succeeds in
  python:3.12.2-slim; 222 passed, 1 skipped against the installed
  package.
- korban_processor/poetry.lock: regenerated (poetry 2.5.1). It had
  never contained pyswip, httpx or hebrew-tokenizer at all.
- Doorpost @expected_hash: ed2a6aec… → 81da49d4…, in this commit, with
  the two witnessed files that moved it (vayakhel, BUILD_KORBAN), per
  the Doorpost's own rule and the precedent of 0572a2c (postgrex).

No behaviour changes: the image installs the same four packages it
installed yesterday.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Scott KarpandClaude Fable 5.1 committed 2026-10-04 17:49:42 +00:00
1 parent 8e4f94c66f
commit 505a967a1c
6 files changed
+148 -8

No files matched your search

+1 -1
View File
@@ -33,7 +33,7 @@ The offering protocol — semichah, shechitah, zerikah, haktarah, routing — is
python = "3.12.2"
httpx = "0.27.0"
pydantic = "2.6.1"
pyswip = "0.2.11"
pyswip = "0.2.10"
hebrew-tokenizer = "2.3.0"
```
+143 -3
View File
@@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand.
# This file is automatically @generated by Poetry 2.5.1 and should not be changed by hand.
[[package]]
name = "annotated-types"
@@ -12,6 +12,37 @@ files = [
{file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
]
[[package]]
name = "anyio"
version = "4.14.2"
description = "High-level concurrency and networking framework on top of asyncio or Trio"
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494"},
{file = "anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f"},
]
[package.dependencies]
idna = ">=2.8"
typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
[package.extras]
trio = ["trio (>=0.32.0)"]
[[package]]
name = "certifi"
version = "2026.7.22"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
{file = "certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775"},
{file = "certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55"},
]
[[package]]
name = "colorama"
version = "0.4.6"
@@ -25,6 +56,91 @@ files = [
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
[[package]]
name = "h11"
version = "0.16.0"
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"},
{file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"},
]
[[package]]
name = "hebrew-tokenizer"
version = "2.3.0"
description = "A very simple python tokenizer for Hebrew text"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
groups = ["main"]
files = [
{file = "hebrew_tokenizer-2.3.0.tar.gz", hash = "sha256:ce96a160baa001785f52eeb095dfb9d219cf6d70654d3a8ac3aec5bedf969ace"},
]
[[package]]
name = "httpcore"
version = "1.0.9"
description = "A minimal low-level HTTP client."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"},
{file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"},
]
[package.dependencies]
certifi = "*"
h11 = ">=0.16"
[package.extras]
asyncio = ["anyio (>=4.0,<5.0)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
trio = ["trio (>=0.22.0,<1.0)"]
[[package]]
name = "httpx"
version = "0.27.0"
description = "The next generation HTTP client."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"},
{file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"},
]
[package.dependencies]
anyio = "*"
certifi = "*"
httpcore = "==1.*"
idna = "*"
sniffio = "*"
[package.extras]
brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""]
cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
[[package]]
name = "idna"
version = "3.20"
description = "Internationalized Domain Names in Applications (IDNA)"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c"},
{file = "idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44"},
]
[package.extras]
all = ["coverage (>=7.10.0)", "hypothesis (>=6.141.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.16.0)", "ty (>=0.0.37)"]
[[package]]
name = "iniconfig"
version = "2.3.0"
@@ -175,7 +291,7 @@ files = [
]
[package.dependencies]
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
typing-extensions = ">=4.6.0,!=4.7.0"
[[package]]
name = "pygments"
@@ -192,6 +308,18 @@ files = [
[package.extras]
windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pyswip"
version = "0.2.10"
description = "PySwip enables querying SWI-Prolog in your Python programs."
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "pyswip-0.2.10-py2.py3-none-any.whl", hash = "sha256:7abc3009f8badc7d0c23d72422960e9f229059a731430c9acd7e9a718cbd2832"},
{file = "pyswip-0.2.10.tar.gz", hash = "sha256:7698584ddf73d051d22d5fed728b9e89bb444a9d384d48c9f5e6fd7060bbdb9f"},
]
[[package]]
name = "pytest"
version = "8.4.2"
@@ -214,6 +342,18 @@ pygments = ">=2.7.2"
[package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
[[package]]
name = "sniffio"
version = "1.3.1"
description = "Sniff out which async library your code is running under"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
{file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
{file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
]
[[package]]
name = "typing-extensions"
version = "4.15.0"
@@ -229,4 +369,4 @@ files = [
[metadata]
lock-version = "2.1"
python-versions = "==3.12.2"
content-hash = "05edb007ce5b000462960d9caaa0110ef611d4ffc74e97b38fcec20a3004b754"
content-hash = "37941043b8c8347259009cc14f757e3e68a6b3b0cf97c8bdcfefcd0c03aa40de"
+1 -1
View File
@@ -9,7 +9,7 @@ requires-python = "==3.12.2"
dependencies = [
"pydantic==2.6.1",
"httpx==0.27.0",
"pyswip==0.2.11",
"pyswip==0.2.10",
"hebrew-tokenizer==2.3.0",
]
+1 -1
View File
@@ -94,7 +94,7 @@ All pinned via lock files per Construction Specification §§1.3-1.5.
|---------|---------|--------|-------|
| httpx | 0.27.0 | ✅ | PyPI (free) — API calls |
| pydantic | 2.6.1 | ✅ | PyPI (free) — data validation |
| pyswip | 0.2.11 | ⚠️ | PyPI. Needs testing with SWI-Prolog 9.2.2. |
| pyswip | 0.2.10 | ⚠️ | PyPI. (0.2.11 was pinned here until 2026-10-04 and was never published.) Declared and installed, not yet imported; needs libswipl in the image and testing with SWI-Prolog 9.2.2 before first use. |
| hebrew-tokenizer | 2.3.0 | ⚠️ | PyPI. Needs evaluation for biblical vs. modern Hebrew. |
| pytest | latest stable | ✅ | PyPI (free) |
| llama-cpp-python | 0.2.55 | ✅ | PyPI (free) — Mistral inference |
+1 -1
View File
@@ -80,7 +80,7 @@ constraints:
python = "3.12.2"
httpx = "0.27.0"
pydantic = "2.6.1"
pyswip = "0.2.11"
pyswip = "0.2.10"
hebrew-tokenizer = "2.3.0"
# Kushya generator additional
+1 -1
View File
@@ -175,7 +175,7 @@ defmodule VavPipeline.Doorpost do
# changes; the update is a deliberate operator commit. A bare
# hash-update commit (without a corresponding spec change in the
# same commit) is itself a drift signal.
@expected_hash "ed2a6aece482392b4d900d4e3f9947076746b3103e3a8c70d3a97436b72c2e22"
@expected_hash "81da49d4e37f3d01cb2cd11eafc745adc4360a399871ba391f8f78dd05c1e555"
@doc "Return the list of files that constitute the category-grade specification."
@spec files() :: [String.t()]