{
  "checker": {
    "details": {
      "argv": [
        "<host-path>",
        "execute",
        "ltv_to_hook",
        "--dry-run"
      ],
      "kind": "cli",
      "needs_browser": false,
      "needs_credentials": false,
      "returncode": 0,
      "scope": "product operation",
      "stderr": "",
      "stdout": "{\"status\": \"success\", \"run_id\": \"9436fc37-6e1e-46a3-8f5d-007e6966711f\", \"activation_id\": \"ltv_to_hook\", \"dry_run\": true, \"rows_read\": 2, \"rows_would_write\": 2, \"dry_run_preview\": [{\"email\": \"<email>\", \"id\": 1, \"ltv\": null, \"name\": \"Alice\"}, {\"email\": \"<email>\", \"id\": 2, \"ltv\": null, \"name\": \"Bob\"}], \"compliance_violations\": [], \"schema_changes\": [], \"duration_ms\": 0, \"message\": \"Dry run: 2 row(s) would be written to webhook (nothing was actually sent)\"}",
      "working": true
    },
    "status": "PASS"
  },
  "deviations": [
    "README Installation uses pip install pyreverseetl from PyPI. The pinned checkout was built with maturin instead, as the task requires.",
    "Default release build was not used. The first maturin build failed on missing libsasl2 (sasl2-sys), then missing cmake (rdkafka-sys). The build then used CARGO_PROFILE_RELEASE_LTO=false and CARGO_PROFILE_RELEASE_CODEGEN_UNITS=16 to avoid the 4 GB guest running out of memory. An earlier default-profile aws-sdk-s3 compile failed, and I did not capture its full error.",
    "README Quick start docker run postgres:16 was unavailable (no docker). Installed PostgreSQL 16 via apt, set the postgres password, created the demo DB, and seeded customers with the README SQL.",
    "README Quick start webhook target (python3 -m http.server) does not accept POST. Used a temporary POST receiver on 127.0.0.1:8000 for the full execute, then stopped it.",
    "Set PYREVERSEETL_STATE_PATH=/tmp/pyreverseetl-probe/state.json so workflow state stays out of the workspace.",
    "Observed: the NUMERIC ltv column arrives as null in both the webhook payload and the dry-run preview. Lineage was empty when queried from a separate process, so it was not used as evidence."
  ],
  "main_blocker": null,
  "operation": "README Quick start: create-workflow (postgres customers) and create-activation (webhook), then `pyreverseetl execute ltv_to_hook --dry-run` (README Dry run section). A full execute to a live webhook was also run once and delivered 2 rows.",
  "operation_scope": "Postgres source is a local apt-installed PostgreSQL 16 instead of the README's docker container. The dry run needs only Postgres on localhost:5432 with the demo DB seeded. The real webhook POST was verified with a temporary local receiver, which has been stopped.",
  "outcome": "working",
  "steps": [
    "apt-get install python3-venv python3-pip build-essential pkg-config libssl-dev curl ca-certificates",
    "rustup install 1.97 (rust-toolchain.toml pin, minimal profile)",
    "python3 -m venv <host-path>; pip install maturin pytest",
    "apt-get install libsasl2-dev cmake zlib1g-dev libcurl4-openssl-dev (needed by sasl2-sys and rdkafka-sys build scripts)",
    "pip install patchelf into the venv, and put the venv bin on PATH for maturin",
    "CARGO_PROFILE_RELEASE_LTO=false CARGO_PROFILE_RELEASE_CODEGEN_UNITS=16 CARGO_BUILD_JOBS=2 maturin build --release -o /tmp/wheels",
    "pip install /tmp/wheels/pyreverseetl-3.1.5-*.whl; pyreverseetl --version prints 3.1.5",
    "apt-get install postgresql; seeded demo.customers with 2 rows (README SQL)",
    "pyreverseetl create-workflow ltv_sync ...; create-activation ltv_to_hook ...; execute ltv_to_hook -> rows_synced 2, receiver got 2 POSTs",
    "pyreverseetl execute ltv_to_hook --dry-run -> rows_read 2, rows_would_write 2 (probe)"
  ],
  "stuck_step": null,
  "suggested_fix": null
}
