All notable changes to this project are documented here. Format follows Keep a Changelog.
- Step 2 "Run Agent 2" now shows an in-flight indicator
("Analyzing duplicates — this takes 1–2 minutes…") and the button is
disabled while the synchronous run is in progress
(
IST_CD/templates/_step2_review.html). Added the missing standard.htmx-indicatorCSS rules (IST_CD/static/style.css), which also fixes the previously non-functional upload/search/generate indicators iningest.html/outreach.html. - Step 2 dedup scoring policy (
POC/dedup_agent/scoring.py): a conflicting email/phone no longer forces a pair to "likely distinct" (confidence 0.2). People change jobs, numbers, and mailboxes, so conflict now caps the pair below the auto-duplicate threshold and routes it to the judge/review queue instead of dismissing it.scorer_versionbumped todeterministic-v2, which invalidates previously cached pair assessments.
- Owner-only building materials untracked from git (kept on the owner's
local disk; history not rewritten):
data-samples/,docs/,archive/,reference/,.agents/,.superpowers/,ENGINEER/,tools/, and root meta filesAGENTS.md,AI_CONTEXT.md,CONTEXT.md,MISSION.md,NOTES.md,RESOURCES.md— all now in.gitignoreand excluded from future release packages. The repo and IT package now contain only the functional codebase plus deployment-necessary files.README.mdupdated to match (directory table, quick start, run instructions). - Gemini Step 1 public-research provider (
gemini_public_research.pydeleted; git history preserves it): the Gemini API is unreachable from the HK office LAN. Perplexity Sonar is now the default Step 1 provider (STEP1_RESEARCH_PROVIDERand CLI/UI defaults);GEMINI_API_KEY_IST/GEMINI_STEP1_MODELare replaced byPERPLEXITY_API_KEY/PERPLEXITY_MODELin.env.templateand DEPLOYMENT docs.
- Bulk database save: new
save_contacts()inIST_CD/db.pyappends many contacts with a single workbook read/write instead of one full rewrite per contact (IST_CD/db.py:475). Single-contactsave_contact()behavior is unchanged. - Duplicate protection on legacy Excel import: rows whose name+company already
exist in the master database, or repeat within the uploaded file, are skipped
and counted. Import response now reports
"Imported X contacts. Skipped Y duplicates. Total: Z"
(
IST_CD/app.py:450). - Explicit user-facing 409 warning on import when
master_database.xlsxis locked (e.g. open in Excel), matching the existing lock-handling convention. POC/tests/test_bulk_import.py: coverage for bulk save (sequential IDs, append-without-touching-existing) and import duplicate skipping.POC/tests/robustness_ist50.py: offline robustness runner used to test the pipeline againstdata-samples/ist/IST_test_sample_50.xlsx(49 contacts).- SiliconFlow Step 1 public-research provider
(
POC/sprint_2/siliconflow_public_research.py): a deterministic search-fetch-evaluate pipeline as an alternative to the Gemini Google-Search-grounding path. Code builds queries, searches the web (Tavily when configured, else DuckDuckGo via the optionalddgspackage), fetches and extracts public pages, and calls the SiliconFlow chat API only to judge the fetched evidence; verbatim-citation checks, two-domain corroboration, and confidence tiers (>=85 strong, 60-84 review, <60 quarantine) are enforced in code, with one bounded retry round on insufficient evidence. Enable withSTEP1_RESEARCH_PROVIDER=siliconflow; requiresSILICONFLOW_API_KEY(plus optionalSILICONFLOW_MODEL), andTAVILY_API_KEYis the optional preferred search backend. No new pinned dependencies (ddgs/trafilatura/beautifulsoup4are optional imports). - Perplexity Sonar Step 1 public-research provider
(
POC/sprint_2/perplexity_public_research.py): a minimal one-call alternative to the Gemini path — one grounded chat completion (Perplexity runs the web search itself), then citation extraction, verdict mapping, and the shared identity guards (matched_identitygate plus the name-token-overlap veto reused from the SiliconFlow provider). No fetch stage, no corroboration rule. Enable withSTEP1_RESEARCH_PROVIDER=perplexity; requiresPERPLEXITY_API_KEY(plus optionalPERPLEXITY_MODEL, defaultsonar-pro). No new dependencies.
- DEPLOYMENT.md / DEPLOYMENT.html: corrected the OCR setup to match actual
behavior (
POC/sprint_1/ocr_enhanced.py).TESSDATA_PREFIXno longer claims a nonexistent "bundled tessdata" default — the doc now instructs setting it to the bundledtessdata\folder (shipseng,chi_sim,chi_tra), documents that OCR always runschi_sim+chi_tra+eng, and adds Tesseract/tessdata checks to the §7 acceptance checklist. - Removed hardcoded owner-machine paths (
C:\Users\fengy\...) from the Step 1 corrections-cache lookup inPOC/sprint_2/verify_contacts.py. The cache now defaults to the repo-relativedata\pre_check_results.jsonanddata\final_corrections.jsoncopies, with optionalSTEP1_PRE_CHECK_CACHE_PATH/STEP1_FINAL_CORRECTIONS_PATHenv overrides — so the lookup behaves identically on any host. - SiliconFlow Step 1 provider: wrong-person evidence can no longer drive
corrections. The LLM evaluation must now gate every citation with
matched_identity(same_person/different_person/uncertain; name+company+title judged jointly, company match required), and a deterministic veto drops any proposed name correction that shares no name token with the stored name — fixing a live A/B failure where "Luke Li" was "corrected" to a different person ("Lei Zhang").
- Legacy Excel import is ~51x faster at 50 contacts (3.65s -> 0.07s in local benchmark); the improvement grows with batch size, making ~2000-row imports practical (previously tens of minutes with browser-timeout and partial-import risk).
- No new dependencies (
requirements.txtunchanged), no new required env vars (theSTEP1_PRE_CHECK_CACHE_PATH/STEP1_FINAL_CORRECTIONS_PATHoverrides are optional), no database schema change. Update per DEPLOYMENT.md section 5: replace code, keep the existingdata\folder, run the smoke test.