Live smoke — targeted web evidence
Nothing in this document has been run. The change ships with a hermetic test suite only: every automated test fakes the executor at the port, so no test in CI has ever reached a real provider. This runbook exists so a human with credentials can close that gap deliberately. Do not treat “the tests pass” as evidence that the live path works. They prove the contract, the budget, the redaction and the citation resolution. They prove nothing about the executor’s current wire format, its latency, or whether the credential in your environment is still valid.What is already proven, and where
Prerequisites
PARALLEL_API_KEYset in the environment you are smoking against. It is read server-side inside the adapter and never leaves it.COMMERCIAL_FEATURE_PARALLEL_DISABLEDunset (any value oftruereports the capability as unconfigured, which is a supported state, not a failure).- A workspace with the market-data warehouse reachable, so the run has a warehouse half to compare against.
1. The capability end to end (one search request — start here)
This is the step this change adds, and the only one that smokes the path the harness actually uses:WebEvidenceService → port → adapter → live endpoint. It
prints the normalized result, because printing the wire response would smoke
a layer nothing in production reads.
<ORGANIZACION REAL> with a real organization you can verify by hand.
Cost is one search request at the cheapest tier with max_results: 5. Without
both environment variables the script refuses to run.
The script prints the checklist after the payload. In order:
search_idisw_0— the platform’s id, not one the executor supplied.- Every
evidence_idmatches^wev_[0-9a-f]{20}$. - Every
observed_atis the same timestamp, and it is now. source_domainequals the host of its ownurl, withwww.stripped.published_atis either a date the page really states, ornull. If a page with no visible date came back with a date here, stop and open a bug — that is the freshness lie this design exists to prevent.- Each
claim.statusis justified by its own excerpts. Read them. - Grep the whole payload for the executor’s name, an API key fragment, an endpoint, a request id: there must be none.
2. The adapter’s own smoke (optional, ~$0.10 — exercises DISCOVERY, not this)
src/radar/adapters/parallel.smoke.spec.ts predates this change and drives the
exhaustive-discovery path, which is not what the harness uses. Run it only if
you are separately validating discovery:
3. A full research turn (most expensive — a model run plus up to two searches)
Ask a question whose freshness half the warehouse cannot answer, through the normal chat research path, in a staging workspace:¿Hay evidencia reciente de que <ORGANIZACION REAL> esté ejecutando una expansión ahora mismo, y qué ha ganado históricamente en compras públicas?What to check:
- The
ResearchReportcarries both evidence kinds, and every one points at aqueryIdpresent inqueryAudit. coverage.relationsdeclares both the warehouse relation(s) andweb_evidence.- Web citations render as title · domain · URL · excerpt · published date · observed date. No executor name anywhere in the answer or the citations.
- At most two
search_web_evidencerows in the audit. If the model tried a third, there is aweb_budget_exhaustedrow — that is correct behaviour. - The artifact body carries a
reflectionobject, and nothing from it appears in the answer, the facts or the citations.
