← Files Codex ReplayARCHIVED FILE

scripts/verify_claude_sample.py

7.09 KB · Oct 3, 2026 · 06:20 UTC

↓ Download file

#!/usr/bin/env python3
"""Run objective checks for recorded Claude Code samples without changing their checkout."""

from __future__ import annotations

import argparse
import json
import subprocess
import sys
import tempfile
from dataclasses import dataclass
from pathlib import Path
from typing import Sequence, TypedDict

URI_TASK_ID = "jqlang__jq-2157"
ARGUMENT_TASK_ID = "jqlang__jq-2919"

_HOMEBREW_PREFIX = Path("/opt/homebrew/opt")
_FULL_LIBRARY_SOURCES = (
    "builtin.c",
    "bytecode.c",
    "compile.c",
    "execute.c",
    "jq_test.c",
    "jv.c",
    "jv_alloc.c",
    "jv_aux.c",
    "jv_dtoa.c",
    "jv_file.c",
    "jv_parse.c",
    "jv_print.c",
    "jv_unicode.c",
    "linker.c",
    "locfile.c",
    "util.c",
    "jv_dtoa_tsd.c",
    "lexer.c",
    "parser.c",
    "decNumber/decContext.c",
    "decNumber/decNumber.c",
)


class BuildResult(TypedDict):
    command: list[str]
    returncode: int
    stdout: str
    stderr: str


class CheckResult(TypedDict):
    name: str
    arguments: list[str]
    expected_stdout: str
    stdout: str
    stderr: str
    returncode: int
    passed: bool


class VerificationResult(TypedDict):
    task_id: str
    repository: str
    passed: bool
    build: BuildResult
    checks: list[CheckResult]


@dataclass(frozen=True)
class _Check:
    name: str
    arguments: tuple[str, ...]
    expected_stdout: str
    standard_input: str | None = None


_CHECKS: dict[str, tuple[_Check, ...]] = {
    URI_TASK_ID: (
        _Check(
            name="rfc3986_reserved_characters",
            arguments=("-Rr", "@uri"),
            expected_stdout="-_.~%21%27%28%29%2A",
            standard_input="-_.~!'()*\n",
        ),
        _Check(
            name="unicode_remains_percent_encoded",
            arguments=("-Rr", "@uri"),
            expected_stdout="%CE%BC",
            standard_input="μ\n",
        ),
        _Check(
            name="spaces_remain_percent_encoded",
            arguments=("-Rr", "@uri"),
            expected_stdout="hello%20world",
            standard_input="hello world\n",
        ),
    ),
    ARGUMENT_TASK_ID: (
        _Check(
            name="script_after_separator",
            arguments=("--args", "-rn", "--", "$ARGS.positional[0]", "bar"),
            expected_stdout="bar",
        ),
        _Check(
            name="script_before_separator",
            arguments=("--args", "-rn", "1", "--", "$ARGS.positional[0]", "bar"),
            expected_stdout="1",
        ),
        _Check(
            name="plain_filter_after_separator",
            arguments=("-n", "--", "1"),
            expected_stdout="1",
        ),
    ),
}


def _prepare_generated_files(repository: Path, build_directory: Path) -> None:
    generated = build_directory / "src"
    generated.mkdir()
    (generated / "version.h").write_text(
        '#define JQ_VERSION "sample-verification"\n', encoding="utf-8"
    )
    (generated / "config_opts.inc").write_text(
        '#define JQ_CONFIG "sample-verification"\n', encoding="utf-8"
    )

    builtins = repository / "src" / "builtin.jq"
    if builtins.is_file():
        lines = (
            '"' + line.replace("\\", "\\\\").replace('"', '\\"') + '\\n"'
            for line in builtins.read_text(encoding="utf-8").splitlines()
        )
        (generated / "builtin.inc").write_text("\n".join(lines) + "\n", encoding="utf-8")


def _build_command(task_id: str, repository: Path, build_directory: Path) -> list[str]:
    command = [
        "cc",
        "-std=gnu11",
        f"-I{build_directory}",
        f"-I{repository}",
        f"-I{repository / 'src'}",
    ]

    if task_id == URI_TASK_ID:
        oniguruma = _HOMEBREW_PREFIX / "oniguruma"
        command.extend(
            (
                "-DHAVE_LIBONIG",
                "-DHAVE_STRPTIME",
                "-DIEEE_8087",
                f"-I{oniguruma / 'include'}",
            )
        )
        command.extend(
            str(repository / "src" / source)
            for source in _FULL_LIBRARY_SOURCES
            if (repository / "src" / source).is_file()
        )
        command.extend((str(repository / "src" / "main.c"), f"-L{oniguruma / 'lib'}", "-lonig"))
    else:
        command.extend(
            (
                str(repository / "src" / "main.c"),
                f"-L{_HOMEBREW_PREFIX / 'jq' / 'lib'}",
                "-ljq",
            )
        )

    command.extend(("-lm", "-o", str(build_directory / "jq")))
    return command


def _build_jq(task_id: str, repository: Path, build_directory: Path) -> BuildResult:
    command = _build_command(task_id, repository, build_directory)
    try:
        completed = subprocess.run(command, text=True, capture_output=True, check=False)
    except OSError as error:
        return {"command": command, "returncode": 127, "stdout": "", "stderr": str(error)}

    return {
        "command": command,
        "returncode": completed.returncode,
        "stdout": completed.stdout,
        "stderr": completed.stderr,
    }


def _run_check(executable: Path, check: _Check) -> CheckResult:
    completed = subprocess.run(
        [str(executable), *check.arguments],
        input=check.standard_input,
        text=True,
        capture_output=True,
        check=False,
    )
    stdout = completed.stdout.rstrip("\n")
    return {
        "name": check.name,
        "arguments": list(check.arguments),
        "expected_stdout": check.expected_stdout,
        "stdout": stdout,
        "stderr": completed.stderr,
        "returncode": completed.returncode,
        "passed": completed.returncode == 0 and stdout == check.expected_stdout,
    }


def verify_task(task_id: str, repository: Path | str) -> VerificationResult:
    """Compile and verify a task using generated files outside its repository."""
    if task_id not in _CHECKS:
        raise ValueError(f"Unsupported Claude Code sample task: {task_id}")

    repository_path = Path(repository).resolve()
    if not repository_path.is_dir():
        raise ValueError(f"Claude Code sample repository does not exist: {repository_path}")

    with tempfile.TemporaryDirectory(prefix="codex-replay-sample-verification-") as temporary:
        build_directory = Path(temporary)
        _prepare_generated_files(repository_path, build_directory)
        build = _build_jq(task_id, repository_path, build_directory)
        checks = (
            [_run_check(build_directory / "jq", check) for check in _CHECKS[task_id]]
            if build["returncode"] == 0
            else []
        )

    return {
        "task_id": task_id,
        "repository": str(repository_path),
        "passed": build["returncode"] == 0 and all(check["passed"] for check in checks),
        "build": build,
        "checks": checks,
    }


def main(arguments: Sequence[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--task", required=True, choices=tuple(_CHECKS))
    parser.add_argument("--repository", required=True, type=Path)
    parsed = parser.parse_args(arguments)
    result = verify_task(parsed.task, parsed.repository)
    print(json.dumps(result, indent=2, ensure_ascii=False))
    return 0 if result["passed"] else 1


if __name__ == "__main__":
    sys.exit(main())

SHA-256: 09f31dab9549d249bef28f48f685c171c7be305741ef06d929fde01af9426304