batch_web.py
Language Python3.3 KB72 lines
#!/usr/bin/env python3"""batch_web.py: write-back for web-search signals (client-enrich, no-credit mode).For stubs where company LinkedIn posts were unavailable, this fills the Signalssection from web-search findings while preserving Person (from frontmatter) andCompany (minimal) content. Uses enrich_writeback.py so the vault contract holds.Usage:python3 batch_web.py --batch checkin_batch.json --signals web_signals.json \--stubdir "/path/03-Clients/Check-In" --script "/path/enrich_writeback.py" [--date YYYY-MM-DD]web_signals.json: { "Stub File.md": {"signals": ["- 2026: ...", ...],"sources": ["- https://...", ...]}, ... }signals/sources are pre-formatted markdown bullet lines. If a company yieldednothing, pass {"signals": [], "sources": []} and a [TBD] line is written."""import argparse, json, os, subprocess, sys, datetime, tempfiledef main():ap = argparse.ArgumentParser()ap.add_argument("--batch", required=True)ap.add_argument("--signals", required=True)ap.add_argument("--stubdir", required=True)ap.add_argument("--script", required=True)ap.add_argument("--date", default=datetime.date.today().isoformat())args = ap.parse_args()batch = {r["file"]: r for r in json.load(open(args.batch, encoding="utf-8"))}sig = json.load(open(args.signals, encoding="utf-8"))rows = []for fname, data in sig.items():r = batch.get(fname, {"file": fname})person = []if r.get("title"): person.append(f"- Title: {r['title']}")if r.get("seniority"): person.append(f"- Seniority: {r['seniority']}")loc = ", ".join([x for x in [r.get("city"), r.get("state")] if x])if loc: person.append(f"- Location: {loc}")if r.get("linkedin"): person.append(f"- LinkedIn: {r['linkedin']}")person = person or ["[TBD]"]company = []if r.get("company"): company.append(f"- {r['company']}")if r.get("company_li"): company.append(f"- LinkedIn: {r['company_li']}")company.append("- [TBD: firmographics (revenue/headcount/funding) not pulled, Apollo skipped this run]")signals = list(data.get("signals") or [])sources = list(data.get("sources") or [])if not signals:signals = ["[TBD: no recent public news found via web search]"]sources.append(f"- Web search, {args.date}")sources.append("- Stub frontmatter (prior enrichment)")payload = {"frontmatter": {}, "person": person, "company": company,"signals": signals, "sources": sources}with tempfile.NamedTemporaryFile("w", suffix=".json", delete=False) as tf:json.dump(payload, tf); pj = tf.nameres = subprocess.run([sys.executable, args.script, "--stub",os.path.join(args.stubdir, fname), "--payload", pj,"--date", args.date], capture_output=True, text=True)os.unlink(pj)rows.append((fname, len([s for s in signals if not s.startswith("[TBD")]),res.returncode == 0, res.stderr.strip()[:120]))ok = sum(1 for _,_,k,_ in rows if k)print(f"WROTE {ok}/{len(rows)} stubs OK")for f, n, k, err in rows:print(f" {f[:34]:36} | {n} sig | {'OK' if k else 'FAIL: '+err}")if __name__ == "__main__":main()