Dashboard › institutional-transition-lab › Session 0zfaOX4o4ZhX
0zfaOX4o4ZhXDsjpIPerform a fresh read-only security audit of only the filesystem/archive half of issue #4 frozen-input verification in /home/byk/Code/institutional-transition-lab. This replaces a reviewer that returned empty twice and is disjoint from the JSON/pin/snapshot reviewer. Never edit files and never inspect governance record bodies, coding decisions, outcomes, reports, dates, detector output, or source-adjudication scopes.
Scope only:
Do not review strict JSON parsing, frozen pin identity/order, canonical hash semantics, or CLI output writing; other reviewers own those. Primary files are src/institution_lab/governance_adjudication.py and only relevant tests in tests/test_governance_adjudication.py. Review current working copy read-only.
Return substantive evidence, never empty. Findings first, severity ordered, with exact current file:line references and PASS/CONCERN/MUST-FIX/BLOCKED labels. Every defect needs a deterministic regression. If no defects, state PASS and identify tests/probes plus residual risks. End exactly MERGE or DO-NOT-MERGE.
Found 52 matches
/home/byk/Code/institutional-transition-lab/src/institution_lab/governance_adjudication.py:
Line 10: import zipfile
Line 30: REQUIRED_INPUT_PINS = {
Line 41: FROZEN_INPUT_PINS = {
Line 65: MAX_INPUT_BYTES = 16 * 1024 * 1024
Line 66: MAX_ARTIFACT_BYTES = 32 * 1024 * 1024
Line 67: MAX_ARCHIVE_MEMBERS = 128
Line 68: MAX_ARCHIVE_MEMBER_BYTES = 16 * 1024 * 1024
Line 69: MAX_ARCHIVE_EXPANDED_BYTES = 64 * 1024 * 1024
Line 94: def _read_regular_file(path: Path, *, max_bytes: int = MAX_INPUT_BYTES) -> bytes:
Line 95: flags = os.O_RDONLY | os.O_NONBLOCK | getattr(os, "O_NOFOLLOW", 0)
Line 102: if not stat.S_ISREG(metadata.st_mode):
Line 106: payload = source.read(max_bytes + 1)
Line 113: return _bytes_sha256(_read_regular_file(path, max_bytes=MAX_ARTIFACT_BYTES))
Line 146: if set(manifest) != REQUIRED_INPUT_PINS:
Line 152: for field, value in FROZEN_INPUT_PINS.items():
Line 180: with zipfile.ZipFile(io.BytesIO(artifact)) ...
Found 31 matches
/home/byk/Code/institutional-transition-lab/tests/test_governance_adjudication.py:
Line 8: import zipfile
Line 65: with zipfile.ZipFile(paths["artifact"], "w") as archive:
Line 66: archive.writestr("documents.json", paths["documents"].read_bytes())
Line 67: archive.writestr(
Line 331: @pytest.mark.parametrize("mutation", ["duplicate", "missing"])
Line 334: if mutation == "duplicate":
Line 703: with zipfile.ZipFile(artifact, "w") as archive:
Line 704: archive.writestr("documents.json", documents.read_bytes())
Line 705: archive.writestr("v1.2-adjudication-package.json", coding_package.read_bytes())
Line 743: with zipfile.ZipFile(artifact, "w") as archive:
Line 744: archive.writestr("documents.json", b"different documents")
Line 745: archive.writestr("v1.2-adjudication-package.json", coding_package.read_bytes())
Line 772: with pytest.raises(ValueError, match="artifact member mismatch: documents.json"):
Line 813: ...
<path>/home/byk/Code/institutional-transition-lab/src/institution_lab/governance_adjudication.py</path>
<type>file</type>
<content>
60: "announced_on",
61: "effective_on",
62: "affected_scope",
63: "body_patch_relation",
64: }
65: MAX_INPUT_BYTES = 16 * 1024 * 1024
66: MAX_ARTIFACT_BYTES = 32 * 1024 * 1024
67: MAX_ARCHIVE_MEMBERS = 128
68: MAX_ARCHIVE_MEMBER_BYTES = 16 * 1024 * 1024
69: MAX_ARCHIVE_EXPANDED_BYTES = 64 * 1024 * 1024
70:
71:
72: @dataclass(frozen=True)
73: class VerifiedInputBundle:
74: pins: dict[str, Any]
75: documents: dict[str, Any]
76: coding_package: dict[str, Any]
77: adjudication_schema: dict[str, Any]
78:
79:
80: def canonical_sha256(value: Any) -> str:
81: payload = json.dumps(
82: value,
83: sort_keys=True,
84: separators=(",", ":"),
85: allow_nan=False,
86: ).encode()
87: return hashlib.sha256(payload).hexdigest()
88:
89:
90: def _bytes_sha256(payload: bytes) -> str:
91: return hashlib.sha256(payload).hexdigest()
92:
93:
94: def ...
<path>/home/byk/Code/institutional-transition-lab/tests/test_governance_adjudication.py</path>
<type>file</type>
<content>
680: assert summary["canonicalization_gate"] == "closed"
681:
682:
683: def test_input_manifest_rejects_changed_file_bytes(
684: tmp_path: Path,
685: monkeypatch: pytest.MonkeyPatch,
686: ) -> None:
687: artifact = tmp_path / "artifact.zip"
688: documents = tmp_path / "documents.json"
689: coding_package = tmp_path / "coding-package.json"
690: protocol = tmp_path / "protocol.md"
691: coding_schema = tmp_path / "coding-schema.json"
692: adjudication_schema = tmp_path / "adjudication-schema.json"
693: paths = {
694: "artifact": artifact,
695: "documents": documents,
696: "coding_package": coding_package,
697: "protocol": protocol,
698: "coding_schema": coding_schema,
699: "adjudication_schema": adjudication_schema,
700: }
701: for path in paths.values():
702: path.write_text(path.name)
703: with zipfile.ZipFile(artifact, "w") as ...
<path>/home/byk/Code/institutional-transition-lab/tests/test_governance_adjudication.py</path>
<type>file</type>
<content>
875: documents=Path("unused"),
876: coding_package=Path("unused"),
877: protocol=Path("unused"),
878: coding_schema=Path("unused"),
879: adjudication_schema=Path("unused"),
880: )
881:
882:
883: def test_input_manifest_rejects_duplicate_artifact_members(
884: tmp_path: Path,
885: monkeypatch: pytest.MonkeyPatch,
886: ) -> None:
887: manifest, paths = _write_pinned_cli_inputs(tmp_path, monkeypatch)
888: with (
889: pytest.warns(UserWarning, match="Duplicate name"),
890: zipfile.ZipFile(paths["artifact"], "a") as archive,
891: ):
892: archive.writestr("documents.json", paths["documents"].read_bytes())
893: manifest["artifact_sha256"] = file_sha256(paths["artifact"])
894: monkeypatch.setattr(governance_adjudication, "FROZEN_INPUT_PINS", dict(manifest))
895:
896: with pytest.raises(ValueError, match="artifact member is not unique: ...
/home/byk/Code/institutional-transition-lab/uv.lock /home/byk/Code/institutional-transition-lab/pyproject.toml
<path>/home/byk/Code/institutional-transition-lab/pyproject.toml</path> <type>file</type> <content> 1: [build-system] 2: requires = ["hatchling"] 3: build-backend = "hatchling.build" 4: 5: [project] 6: name = "institutional-transition-lab" 7: version = "0.1.0" 8: description = "Empirical analysis of institutional power transitions and performance regimes" 9: readme = "README.md" 10: requires-python = ">=3.12" 11: dependencies = [ 12: "jsonschema>=4.23,<5", 13: ] 14: 15: [project.scripts] 16: institution-lab-oss = "institution_lab.oss_pipeline:main" 17: institution-lab-llm-eval = "institution_lab.llm_event_probe:main" 18: institution-lab-llm-triage = "institution_lab.llm_candidate_triage:main" 19: institution-lab-retrieve-oss-sources = "institution_lab.source_retrieval:main" 20: institution-lab-enrich-oss-sources = "institution_lab.source_enrichment:main" 21: institution-lab-governance-coding = "institution_lab.governance_coding:main" 22: institution-lab-governance-adjudication = ...
No files found
/usr/bin/bash: line 1: python: command not found
Python 3.12.3 Traceback (most recent call last): File "<string>", line 1, in <module> ModuleNotFoundError: No module named 'pytest'
<path>/home/byk/Code/institutional-transition-lab</path> <type>directory</type> <entries> .git/ .github/ .gitignore .lore.md .pytest_cache/ .ruff_cache/ .venv/ AGENTS.md cases/ data/ docs/ node_modules/ package-lock.json package.json PROTOCOL.md pyproject.toml README.md research/ schema/ scripts/ src/ tests/ uv.lock (23 entries) </entries>
<path>/home/byk/Code/institutional-transition-lab/.venv/bin</path> <type>directory</type> <entries> activate activate_this.py activate.bat activate.csh activate.fish activate.nu activate.ps1 deactivate.bat f2py httpx idna institution-lab-enrich-oss-sources institution-lab-governance-adjudication institution-lab-governance-coding institution-lab-llm-eval institution-lab-llm-triage institution-lab-oss institution-lab-retrieve-oss-sources jsonschema numpy-config py.test pydoc.bat pygmentize pytest python python3 python3.13 ruff (28 entries) </entries>
<path>/home/byk/Code/institutional-transition-lab/src/institution_lab/governance_adjudication.py</path>
<type>file</type>
<content>
1: from __future__ import annotations
2:
3: import argparse
4: import hashlib
5: import io
6: import json
7: import os
8: import stat
9: import tempfile
10: import zipfile
11: from collections import Counter
12: from contextlib import suppress
13: from dataclasses import dataclass
14: from pathlib import Path
15: from typing import Any
16:
17: from jsonschema import Draft202012Validator, FormatChecker
18:
19: from institution_lab.governance_coding import validate_response
20:
21: DECISIONS = {"accept", "revise", "reject", "abstain"}
22: INSTITUTIONAL_CLASSES = {
23: "effective_institutional_change",
24: "announced_institutional_change",
25: "proposal_only",
26: }
27: REVIEWER_TYPES = {"human", "llm", "human_llm_assisted"}
28: REVIEWER_ROLES = {"source_adjudicator", "evidence_auditor", "synthesizer"}
29: RESPONSE_SOURCES = {"luna_a", "luna_b", ...
<path>/home/byk/Code/institutional-transition-lab/src/institution_lab/governance_adjudication.py</path>
<type>file</type>
<content>
218:
219:
220: def verify_input_manifest(
221: manifest: Any,
222: *,
223: artifact: Path,
224: documents: Path,
225: coding_package: Path,
226: protocol: Path,
227: coding_schema: Path,
228: adjudication_schema: Path,
229: ) -> dict[str, Any]:
230: _validate_manifest_identity(manifest)
231: return _verify_input_payloads(
232: manifest,
233: artifact=_read_regular_file(artifact, max_bytes=MAX_ARTIFACT_BYTES),
234: documents=_read_regular_file(documents),
235: coding_package=_read_regular_file(coding_package),
236: protocol=_read_regular_file(protocol),
237: coding_schema=_read_regular_file(coding_schema),
238: adjudication_schema=_read_regular_file(adjudication_schema),
239: ).pins
240:
241:
242: def _duplicates(values: list[str]) -> set[str]:
243: counts = Counter(values)
244: return {value for value, count in ...
<path>/home/byk/Code/institutional-transition-lab/tests/test_governance_adjudication.py</path> <type>file</type> <content> 1: from __future__ import annotations 2: 3: import copy 4: import json 5: import os 6: import subprocess 7: import sys 8: import zipfile 9: from pathlib import Path 10: 11: import pytest 12: 13: from institution_lab import governance_adjudication 14: from institution_lab.governance_adjudication import ( 15: DECISIONS, 16: FROZEN_INPUT_PINS, 17: REQUIRED_INPUT_PINS, 18: REVIEWER_ROLES, 19: REVIEWER_TYPES, 20: canonical_sha256, 21: file_sha256, 22: validate_adjudication, 23: validate_adjudication_fragment, 24: validate_against_schema, 25: verify_input_manifest, 26: ) 27: from institution_lab.governance_coding import ( 28: BODY_PATCH_RELATIONS, 29: CHANGE_STATUSES, 30: DIRECTIONS, 31: EVENT_KINDS, 32: RECORD_CLASSES, 33: RIGHT_KINDS, 34: ) 35: 36: ROOT = Path(__file__).parents[1] 37: MAX_TEST_ARCHIVE_MEMBERS = 256 38: 39: 40: def ...
c686c4878409e68b958dd61850a59e9234416d817fc2fa3246fc728d51ebe0a5 src/institution_lab/governance_adjudication.py abf64b5e78a616d53b703dee5291ce7bf23fa9156fe59263a702e01cb8667bc5 tests/test_governance_adjudication.py
============================= test session starts ============================== platform linux -- Python 3.13.11, pytest-8.4.2, pluggy-1.6.0 rootdir: /home/byk/Code/institutional-transition-lab configfile: pyproject.toml plugins: anyio-4.14.2 collected 78 items / 74 deselected / 4 selected tests/test_governance_adjudication.py .... [100%] ======================= 4 passed, 74 deselected in 0.25s =======================
baseline: ACCEPTED unsafe-and-colliding-names: ACCEPTED required-member-with-symlink-mode: ACCEPTED oversize-unrequired-member: ACCEPTED encrypted-unrequired-member: ACCEPTED
exact-limit: ACCEPTED b'1234' over-limit: REJECTED ValueError: input file exceeds 4 bytes: /tmp/tmp2emgh4uf/oversized direct-symlink: REJECTED ValueError: cannot open input as a regular file: /tmp/tmp2emgh4uf/direct-link directory: REJECTED IsADirectoryError: [Errno 21] Is a directory: 5 fifo: REJECTED ValueError: input path is not a regular file: /tmp/tmp2emgh4uf/fifo unix-socket: REJECTED ValueError: cannot open input as a regular file: /tmp/tmp2emgh4uf/socket character-device: REJECTED ValueError: input path is not a regular file: /dev/null symlinked-parent: ACCEPTED b'ok'
descriptor-count before=5 after=1029 delta=1024
declared-size= 2 compressed-size= 16314 logical-read= b'{}' hidden-expanded-bytes= 16778240
underreported-required-member: ACCEPTED
Found 14 matches
/home/byk/Code/institutional-transition-lab/tests/test_governance_adjudication.py:
Line 813: @pytest.mark.parametrize("alias_kind", ["direct", "symlink", "hardlink"])
Line 951: assert "input path is not a regular file" in result.stderr
Line 961: input_directory = ROOT / "cases/review/oss-governance-adjudication-v1"
Line 968: artifact=input_directory / "artifact-9642983578.zip",
Line 969: documents=input_directory / "documents.json",
Line 970: coding_package=input_directory / "v1.2-coding-package.json",
Line 980: input_directory = ROOT / "cases/review/oss-governance-adjudication-v1"
Line 981: fragment = json.loads((input_directory / "fragments/opentofu-a2.json").read_text())
Line 982: documents = json.loads((input_directory / "documents.json").read_text())
Line 983: coding_package = json.loads((input_directory / "v1.2-coding-package.json").read_text())
Line 991: input_directory = ROOT / ...
def _read1(self, n):
# Read up to n compressed bytes with at most one read() system call,
# decrypt and decompress them.
if self._eof or n <= 0:
return b''
# Read from file.
if self._compress_type == ZIP_DEFLATED:
## Handle unconsumed data.
data = self._decompressor.unconsumed_tail
if n > len(data):
data += self._read2(n - len(data))
else:
data = self._read2(n)
if self._compress_type == ZIP_STORED:
self._eof = self._compress_left <= 0
elif self._compress_type == ZIP_DEFLATED:
n = max(n, self.MIN_READ_SIZE)
data = self._decompressor.decompress(data, n)
self._eof = (self._decompressor.eof or
self._compress_left <= 0 and
not self._decompressor.unconsumed_tail)
if self._eof:
data += self._decompressor.flush()
...
central-metadata: file_size=2 compress_size=16777219 artifact_bytes=16777483 forged-required-member: ACCEPTED
compressed-hidden-expansion: ACCEPTED actual=1026 declared=2 member_limit=64 total_limit=128
O_NOFOLLOW-unavailable: ACCEPTED b'safe'
declared-total-over-limit: REJECTED ValueError: artifact expanded size exceeds limit declared-required-member-over-limit: REJECTED ValueError: artifact member exceeds size limit: documents.json
entry-count-gate: REJECTED ValueError: artifact member count exceeds limit ZipInfo objects constructed before rejection: 1002
Your prior result was empty. Complete the same read-only filesystem/archive security audit now and return substantive evidence or an explicit blocker. Never edit files. Scope remains only: regular-file descriptor opening and rejection of symlinks/FIFOs/devices/special files without blocking; input byte limits/read behavior; ZIP entry count and total/per-member resource limits; duplicate members and normalized/path/case/backslash collisions; absolute/parent paths, symlink/encryption metadata; decompression and exact required-member byte comparisons; and narrowly corresponding tests/probes in src/institution_lab/governance_adjudication.py and tests/test_governance_adjudication.py. Do not review JSON parsing, frozen pin identity/order, canonical hash semantics, CLI output writing, governance bodies/codings/outcomes/reports/dates, or source-adjudication scopes. Review the unchanged current working copy. Findings first with exact current file:line evidence and PASS/CONCERN/MUST-FIX/BLOCKED labels; include a deterministic regression for each defect and commands/probes run. Never return empty. End exactly MERGE or DO-NOT-MERGE.
🔴 (04:32) User stated the prior result was empty and directed that responses must never be empty. 🔴 (04:32) User directed never to edit files; the audit must be read-only and review the unchanged current working copy. 🔴 (04:32) [requested-security-audit] User requested completion of the same filesystem/archive security audit, requiring substantive evidence or an explicit blocker. 🔴 (04:32) Us…
🟡 (04:29) Test result: `declared-total-over-limit` was `REJECTED` with `ValueError: artifact expanded size exceeds limit`. 🟡 (04:29) Test result: `declared-required-member-over-limit` was `REJECTED` with `ValueError: artifact member exceeds size limit: documents.json`. 🟡 (04:30) Test result: `entry-count-gate` was `REJECTED` with `ValueError: artifact member count exceeds limit`; 1002 `ZipInfo…
🟡 (04:25) Test result: ZIP central-directory metadata reported `file_size=2`, `compress_size=16777219`, and `artifact_bytes=16777483`; `forged-required-member` was `ACCEPTED`. 🟡 (04:27) Test result: `compressed-hidden-expansion` was `ACCEPTED` with `actual=1026`, `declared=2`, `member_limit=64`, and `total_limit=128`, demonstrating accepted decompressed output far beyond both declared size and …
🟡 (04:24) Inspection of Python ZIP reading internals showed `_read1(self, n)` decompresses data and then truncates it with `data = data[:self._left]`, decrements the declared remaining size via `self._left -= len(data)`, and forces `self._eof = True` when `self._left <= 0`; thus output beyond the ZIP member’s declared uncompressed size can be discarded after decompression rather than returned to…
🟡 (04:16) Descriptor-leak probe reported file-descriptor count before=5, after=1029, delta=1024. 🟡 (04:20) ZIP resource-limit probe created an underreported required member with declared-size=2, compressed-size=16314, logical-read=b'{}', and hidden-expanded-bytes=16778240; verification ACCEPTED it. 🟡 (04:22) Search of tests/test_governance_adjudication.py found 14 matches: line 813 parametrize…
🔴 (04:03) User directed: never edit files and never inspect governance record bodies, coding decisions, outcomes, reports, dates, detector output, or source-adjudication scopes. 🔴 (04:03) User defined the audit as read-only against the current working copy of /home/byk/Code/institutional-transition-lab. 🟡 (04:03) [requested-review] User requested a fresh, substantive security audit of only the…