diff --git a/implementation/auditing/audit_pipeline.sh b/implementation/auditing/audit_pipeline.sh index 2b02246..83c9686 100755 --- a/implementation/auditing/audit_pipeline.sh +++ b/implementation/auditing/audit_pipeline.sh @@ -3,17 +3,15 @@ set -euo pipefail # VeriPath Audit Pipeline # Usage: ./audit_pipeline.sh "Business Name" "City, ST" [output-dir] -# Sequence: multi_scraper.py → audit_engine.py → findings + raw capture in target folder +# Sequence: multi_scraper.py → audit_engine.py → findings + report in target folder SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -BUSINESS="${1:?Usage: ./audit_pipeline.sh \"Business Name\" \"City, ST\" [output-dir]}" -LOCATION="${2:?Usage: ./audit_pipeline.sh \"Business Name\" \"City, ST\" [output-dir]}" +BUSINESS="${1:?Usage: audit_pipeline.sh \"Business Name\" \"City, ST\" [output-dir]}" +LOCATION="${2:?Usage: audit_pipeline.sh \"Business Name\" \"City, ST\" [output-dir]}" OUTPUT_DIR="${3:-}" -# cwd-proof: resolve to absolute once, so relative output dirs can't break capture copy -if [ -n "$OUTPUT_DIR" ]; then - mkdir -p "$OUTPUT_DIR" - OUTPUT_DIR="$(cd "$OUTPUT_DIR" && pwd)" -fi + +# Scraper deps live in a separate uv project (no pyproject in this dir) +export UV_PROJECT="${UV_PROJECT:-$HOME/deps/google-maps-scraper}" # Temporary working dir for this run WORK_DIR=$(mktemp -d /tmp/veripath.XXXXXX) @@ -23,43 +21,39 @@ ENGINE_ARGS=("--md") echo "[$(date +%T)] Scraping: $BUSINESS @ $LOCATION" -# Step 1: Multi-surface extraction (3rd arg = output DIR; scraper writes /multi_surface.json/.json) +# Step 1: Multi-surface extraction (3rd arg is an output DIR) uv run python3 "$SCRIPT_DIR/multi_scraper.py" "$BUSINESS" "$LOCATION" "$WORK_DIR" SCRAPER_OUT=$(find "$WORK_DIR" -name "*multi_surface*.json" | head -1) -if [ ! -s "$SCRAPER_OUT" ]; then +if [ -z "$SCRAPER_OUT" ] || [ ! -s "$SCRAPER_OUT" ]; then echo "[FAIL] multi_scraper.py produced no output" >&2 exit 1 fi echo "[OK] Extraction complete: $SCRAPER_OUT" +# Persist the raw capture into the run dir (WORK_DIR is wiped on exit; +# report_generate / report_gate need it for evidence validation) +if [ -n "$OUTPUT_DIR" ]; then + mkdir -p "$OUTPUT_DIR" + cp "$SCRAPER_OUT" "$OUTPUT_DIR/$(basename "$SCRAPER_OUT")" +fi + # Step 2: Audit engine if [ -n "$OUTPUT_DIR" ]; then mkdir -p "$OUTPUT_DIR" - # Required artifact set (locked beta process v1.1): raw capture + findings in the run folder - # Collision-safe: a re-run never overwrites the prior capture (temporal baseline, v1.1 §5) - DEST="$OUTPUT_DIR/$(basename "$SCRAPER_OUT")" - if [ -e "$DEST" ]; then - BASE="$(basename "${DEST%.*}")"; EXT="${DEST##*.}" - DEST="$OUTPUT_DIR/${BASE}__$(date +%Y%m%d-%H%M%S).$EXT" - echo "[WARN] prior capture present — writing $DEST (baseline preserved)" - fi - cp "$SCRAPER_OUT" "$DEST" ENGINE_ARGS+=("--output-dir" "$OUTPUT_DIR") echo "[$(date +%T)] Auditing (output: $OUTPUT_DIR)" uv run python3 "$SCRIPT_DIR/audit_engine.py" "$SCRAPER_OUT" "${ENGINE_ARGS[@]}" - - # Step 3: Report + validation (locked process v1.1 §3) - echo "[$(date +%T)] Generating report + validation" - uv run python3 "$SCRIPT_DIR/report_generate.py" "$OUTPUT_DIR" - - # Step 4: Pre-delivery consistency gate (v1.1 §6) — FAIL blocks delivery - echo "[$(date +%T)] Consistency gate" - if ! uv run python3 "$SCRIPT_DIR/report_gate.py" "$OUTPUT_DIR"; then - echo "[GATE FAIL] $OUTPUT_DIR — do NOT deliver; see GATE RESULT in VALIDATION.md" >&2 - exit 1 - fi - echo "[DONE] Findings + raw capture + report + gate written to $OUTPUT_DIR/" + echo "[DONE] Findings written to $OUTPUT_DIR/" else echo "[$(date +%T)] Auditing (stdout)" uv run python3 "$SCRIPT_DIR/audit_engine.py" "$SCRAPER_OUT" "${ENGINE_ARGS[@]}" fi + +# Step 3: report + strict delivery gate (one-command e2e) +if [ -n "$OUTPUT_DIR" ]; then + echo "[$(date +%T)] Building report" + uv run python3 "$SCRIPT_DIR/report_generate.py" "$OUTPUT_DIR" + echo "[$(date +%T)] Running delivery gate (strict)" + uv run python3 "$SCRIPT_DIR/report_gate.py" "$OUTPUT_DIR" --strict + echo "[GATE DONE]" +fi