All notable changes to this actor are recorded here.
Unreleased local candidate. This source package has not yet completed the
governed GitHub/Apify build, run, storage, Store, or rendered release loop.
- Repositioned the product as directional public-source market intelligence,
not an official detector or legal determination.
- Added
demoMode and three deterministic demo-v1 scenarios:
shared_kitchen_cluster, quiet_market, and partial_coverage. Demo work is
fictional, source-free, enrichment-free, and charge-free while still
publishing dataset rows, JSON OUTPUT, and OUTPUT.html to platform
storage.
- Added additive
ghost-kitchen-batch-output-v2 identity with top-level and
per-location runMode, reachability-based sourceCoverage, bounded
addressClusters, and coverage-gated qualitative marketScorecard products.
Existing live input keys and legacy dataset/OUTPUT field names, JSON types,
and meanings remain compatible.
- Added all five source-coverage grades:
complete, partial, limited,
unavailable, and not_started. Reached-empty sources remain distinct from
failed or unstarted sources, and result count is not used as a coverage
proxy.
- Added bounded shared-address dossiers derived only from emitted rows with
exact location, cluster-id, and normalized-address identity. Dossiers include
traceable counts and explicit no-ownership/no-legal/no-demand limitations.
- Added four qualitative scorecard signals:
concentrated_candidates,
candidate_presence, quiet_or_inconclusive, and
insufficient_coverage. Limited, unavailable, and not-started coverage
overrides candidate and cluster counts.
- Added a self-contained, script-free, contextually escaped HTML report capped
at 512 KiB and linked from the Actor output as
OUTPUT.html with
text/html; charset=utf-8.
- Added a fixture-backed plain-English market-brief preview and direct output
links to
BATCH_STATE and LOCATION-#### so buyers and agents can discover
the report, market evidence, and operational retry/charge checkpoints without
confusing checkpoint state with settled platform counters.
- Unified artifact publication through one dataset -> JSON
OUTPUT -> raw
OUTPUT.html coordinator. Live charge eligibility begins only after the
complete bundle is durable; selected write failures preserve truthful
partial-artifact state and make no charge attempt.
- Added a whole-location deadline derived from the platform timeout with a
separate 45-second finalization reserve. Deadline exhaustion now releases the
reserved charge slot and publishes explicit durable nonchargeable JSON, HTML,
and checkpoint state without borrowing source evidence from another
location; incomplete artifact finalization still cannot charge.
- Retained the 128 MiB local minimum/default and 1024 MiB maximum as an explicit
candidate disposition. Local benchmark and bounded prior 128 MiB live
evidence show no memory-pressure reason to adopt the older hosted 256 MiB
default, while Mission 7 remains responsible for final-build live memory
reconciliation and proof.
- Reorganized the existing eleven input fields into four documented Console
sections without removing legacy fields or changing runtime defaults,
prefills, ranges, enum values, nullable flags, secret treatment, or the
canonical live smoke.
- Preserved prior bounded batch behavior:
locations[], deterministic
per-request rows, duplicate aliases, spend-limit skips, source-health
diagnostics, output-safe checkpoints, serialized charges, and
batchConcurrency from 1 to 3.
- Kept the Pay Per Event boundary unchanged at
$0.10 per eligible
location-analyzed event. Demo scenarios, duplicate aliases, spend-limit
skips, all-source blackouts, pre-output failures, and incomplete artifact
bundles are not separate charged units.
- Repaired the Uber Eats source path to use the current web feed
endpoint shape with an explicit CSRF header and encoded delivery
location cookie.
- Requested identity encoding from Uber Eats and made feed/detail parse
failures report a concise response summary instead of a generic body
decode error.
- Enabled response decompression in the ghost actor build so proxy-routed
Uber Eats responses can still be decoded when upstream ignores the
identity-encoding request.
- Added store-detail fetching when feed cards omit physical addresses,
while filtering obvious retail and grocery entries out of restaurant
analysis.
- Kept Apify proxy use sticky per actor run by allowing scraper clients
to pass username parameters using Apify's documented
groups-auto,session-... form.
- Kept successful output publication from failing solely because the
actor is not configured for pay-per-event charging.
- Preserved total upstream blackout as a failed run while writing a
structured
OUTPUT failure summary with scraper diagnostics before
exit when storage is available.
- Suppressed raw HTML challenge bodies in scraper diagnostics while
preserving the platform, HTTP status, and concise failure reason.
- Added regression coverage for the blackout failure summary so future
scraper outages do not fall back to log-only evidence.
- Made
radiusMiles and maxRestaurants materially affect candidate collection and analysis selection.
- Preserved source distance when available and removed explicitly out-of-radius listings before enrichment.
- Made dine-in, external-listing, website, and photo signals conservative and nullable instead of defaulting unknowns to false.
- Stopped upgrading known virtual brands into ghost kitchens without shared-address evidence.
- Surfaced per-scraper partial coverage and run diagnostics in the
OUTPUT summary.
- Failed runs on total upstream scraper blackout instead of returning a misleading empty success.
- Added Uber Eats and Grubhub scrapers with pagination.
- Added Yelp Fusion API enrichment as an optional input.
- Added enrichment rate limiting to respect Yelp API quotas.
- Renamed output fields from
google* to external*.
- Added panic recovery in
ActorRuntime for graceful failure reporting.
- Added
LazyLock RegexSet matching for virtual brand patterns.
- Added classification threshold validation and stronger platform diagnostics.
- Enabled CI/CD deployment on main branch pushes.
- Initial release.
- Added DoorDash restaurant listing scraping.
- Added address normalization and multi-brand clustering.
- Added the weighted scoring classification engine.
- Added known virtual brand mappings and pay-per-event pricing.