diff --git a/PUBLIC_DATA_POLICY.md b/PUBLIC_DATA_POLICY.md index 3adbe1f..bc7e6a4 100644 --- a/PUBLIC_DATA_POLICY.md +++ b/PUBLIC_DATA_POLICY.md @@ -12,8 +12,9 @@ distribution. - Invented dimensions and quantities that do not reproduce a private project. - Placeholder configuration such as `Example Fabricator` and `Example City, ST`. - Product behavior and generic steel-domain terminology. -- Public demo media reviewed before publication and pinned in the scanner by exact - repository path and SHA-256 digest. Replacing it requires a new review and digest. +- Public gallery media reviewed before publication and pinned in the scanner by + exact repository path and SHA-256 digest. Replacing it requires a new review and + digest. ## Prohibited diff --git a/docs/assets/pi-steel-gallery.webp b/docs/assets/pi-steel-gallery.webp new file mode 100644 index 0000000..300daee Binary files /dev/null and b/docs/assets/pi-steel-gallery.webp differ diff --git a/package.json b/package.json index 40ae844..fdd5625 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@structupath/pi-steel", "version": "0.2.2", - "description": "Structural steel estimating skills for the Pi coding agent — AISC takeoffs, bills of material, tonnage calcs, plate nesting with burn-table DXF output, and vendor RFQ generation.", + "description": "Structural steel estimating for Pi — validated takeoffs, plate nesting, guarded DXF output, and review-ready RFQ packages.", "type": "module", "keywords": [ "pi-package", @@ -10,7 +10,6 @@ "structural-steel", "estimating", "takeoff", - "aisc", "bom", "rfq", "construction", @@ -48,7 +47,8 @@ "pi": { "skills": [ "./skills" - ] + ], + "image": "https://raw.githubusercontent.com/StructuPath/pi-steel/main/docs/assets/pi-steel-gallery.webp" }, "files": [ "skills", @@ -66,6 +66,7 @@ "DATA_PROVENANCE.md", "DATA_PROVENANCE.json", "docs/assets/pi-steel-demo.gif", + "docs/assets/pi-steel-gallery.webp", "README.md", "PUBLIC_DATA_POLICY.md", "LICENSE" diff --git a/scripts/check-public-data.py b/scripts/check-public-data.py index 495131b..3b1fd47 100644 --- a/scripts/check-public-data.py +++ b/scripts/check-public-data.py @@ -38,6 +38,8 @@ AUDITED_PUBLIC_BINARY_SHA256 = { Path("docs/assets/pi-steel-demo.gif"): "ae6ad7286fc5f1eca31e960d4ac4414b7a32a566b975ddacc7d662824c34d91c", + Path("docs/assets/pi-steel-gallery.webp"): + "9d8f2b1dedb00fa6c53c78f4578a12225f84bded4f7bbabe33182486372d12a8", } PATTERNS = { "private operating-company claim": re.compile( diff --git a/tests/test_package_contents.py b/tests/test_package_contents.py index 1b7b747..7f7781c 100644 --- a/tests/test_package_contents.py +++ b/tests/test_package_contents.py @@ -28,6 +28,7 @@ def test_npm_dry_run_contains_runtime_contract_and_excludes_private_artifacts(): "DATA_PROVENANCE.json", "PUBLIC_DATA_POLICY.md", "docs/assets/pi-steel-demo.gif", + "docs/assets/pi-steel-gallery.webp", "scripts/check-data-provenance.py", "scripts/doctor.py", "skills/_shared/schemas/estimate-package.schema.json", diff --git a/tests/test_public_data_policy.py b/tests/test_public_data_policy.py index d112e1d..cc44696 100644 --- a/tests/test_public_data_policy.py +++ b/tests/test_public_data_policy.py @@ -79,18 +79,22 @@ def test_scanner_checks_unlisted_text_and_unquoted_credentials(self): self.assertTrue(any("credential assignment" in item for item in findings)) - def test_audited_binary_requires_exact_path_and_hash(self): + def test_audited_binaries_require_exact_paths_and_hashes(self): scanner = load_scanner() - relative = Path("docs/assets/pi-steel-demo.gif") - content = (ROOT / relative).read_bytes() - - self.assertTrue(scanner.is_audited_public_binary(relative, content)) - self.assertFalse( - scanner.is_audited_public_binary(relative, content + b"modified") - ) - self.assertFalse( - scanner.is_audited_public_binary(Path("docs/assets/other.gif"), content) - ) + for relative in scanner.AUDITED_PUBLIC_BINARY_SHA256: + with self.subTest(relative=relative): + content = (ROOT / relative).read_bytes() + self.assertTrue( + scanner.is_audited_public_binary(relative, content) + ) + self.assertFalse( + scanner.is_audited_public_binary(relative, content + b"modified") + ) + self.assertFalse( + scanner.is_audited_public_binary( + Path("docs/assets/other.bin"), content + ) + ) def test_scanner_detects_high_confidence_secret_formats_without_echoing_value(self): scanner = load_scanner()