From 505a967a1c33064bc1d0d378026ba5112574cc35 Mon Sep 17 00:00:00 2001 From: Scott Karp Date: Sun, 4 Oct 2026 17:49:42 +0000 Subject: [PATCH] =?UTF-8?q?specs=20=C2=A71.4=20+=20Doorpost:=20pyswip=200.?= =?UTF-8?q?2.10=20=E2=80=94=20the=20pinned=20version=20was=20never=20publi?= =?UTF-8?q?shed=20(tablet=2035)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- BUILD_KORBAN.md | 2 +- korban_processor/poetry.lock | 146 +++++++++++++++++++++- korban_processor/pyproject.toml | 2 +- specs/shorashim_terumah.md | 2 +- specs/shorashim_vayakhel.md | 2 +- vav_pipeline/lib/vav_pipeline/doorpost.ex | 2 +- 6 files changed, 148 insertions(+), 8 deletions(-) diff --git a/BUILD_KORBAN.md b/BUILD_KORBAN.md index 5cdecfc5..68b222fa 100644 --- a/BUILD_KORBAN.md +++ b/BUILD_KORBAN.md @@ -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" ``` diff --git a/korban_processor/poetry.lock b/korban_processor/poetry.lock index 4dba9ee9..4ae36e23 100644 --- a/korban_processor/poetry.lock +++ b/korban_processor/poetry.lock @@ -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" diff --git a/korban_processor/pyproject.toml b/korban_processor/pyproject.toml index 646c2afb..1a8dcbbb 100644 --- a/korban_processor/pyproject.toml +++ b/korban_processor/pyproject.toml @@ -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", ] diff --git a/specs/shorashim_terumah.md b/specs/shorashim_terumah.md index 57b7e921..bb7e84f6 100644 --- a/specs/shorashim_terumah.md +++ b/specs/shorashim_terumah.md @@ -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 | diff --git a/specs/shorashim_vayakhel.md b/specs/shorashim_vayakhel.md index b7c50a8b..530d918c 100644 --- a/specs/shorashim_vayakhel.md +++ b/specs/shorashim_vayakhel.md @@ -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 diff --git a/vav_pipeline/lib/vav_pipeline/doorpost.ex b/vav_pipeline/lib/vav_pipeline/doorpost.ex index 69765515..d47601f9 100644 --- a/vav_pipeline/lib/vav_pipeline/doorpost.ex +++ b/vav_pipeline/lib/vav_pipeline/doorpost.ex @@ -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()]