GET /releases/:filename: expandRELEASE_FILENAMEallowlist regex fromTGC-BUS-Core-<semver>.ziponly to also acceptBUS-Core-<semver>.zip, matching the current GitHub release asset naming convention. Previously, requests for/releases/BUS-Core-1.0.4.zipwere rejected with404 not_foundbefore R2 was contacted because the filename failed the allowlist check. The R2 key construction (releases/<filename>) was already correct; only the regex guard was wrong.- Preserve full backward compatibility:
TGC-BUS-Core-*.zipfilenames continue to be accepted and served. - Export
isValidReleaseArtifactUrlfor unit testing.
- Runtime behavior changed: yes —
/releases/BUS-Core-<semver>.zipURLs now resolve instead of returning 404. - BUS Core behavior/contract/telemetry shape changed: no.
- Align Lighthouse policy-source references to
TGC Analytics Policie.mdas the governing analytics contract reference for Lighthouse-owned semantics. - Correct stale README wording so shipped BUS Core legacy-hybrid identity-style reporting is described accurately while preserving
event_onlyidentitynullsemantics. - Replace stale completed-pass wording in
plan.mdwith a durable, future-facing Lighthouse policy-alignment baseline artifact.
- Runtime behavior changed: no.
- BUS Core behavior/contract/telemetry shape changed: no.
- Align Lighthouse documentation and contract examples with the newly added TGC Analytics Policy reference while mirroring only implementation-relevant policy truth owned by Lighthouse.
- Update README
view=siteexample to show usefulevent_onlyoutput with explicitevents.top_pathsandevents.top_contents, plus attribution breakdown arrays. - Clarify explicit unsupported-by-design behavior for
event_onlyproperties in docs: traffic metrics remainnullandidentityremainsnull. - Add explicit BUS Core grandfathering wording in SOT and README around per-site
production_onlydefaults andlegacy_hybridsemantics. - Replace stale
plan.mdassumptions with a focused policy-alignment baseline for future Lighthouse work.
- Runtime behavior changed: no.
- BUS Core behavior/contract/telemetry shape changed: no.
- Add
events.top_pathstoGET /report?view=siteresponse: ranked{ path, events }array for accepted events by path, powered byquerySiteEventTopPathsqueryingsite_events_rawdirectly. Populated for all sites with event telemetry includingevent_onlysites. - Add
events.top_contentstoGET /report?view=siteresponse: ranked{ utm_content, events }array for non-emptyutm_contentvalues, powered byquerySiteEventTopContents. Directly supports ad and creative-variant evaluation for operator ad spend review.
- Runtime behavior changed: yes —
view=siteresponse now includesevents.top_pathsandevents.top_contentsfields. event_onlycontract unchanged: Star Map Generator staysevent_only; no traffic layer added; no identity layer added. The fix surfaces event breakdown and attribution aggregates that were always valid forevent_onlysites —event_onlymeans no traffic and no identity, not totals-only.- Root cause for missing breakdowns confirmed:
events.top_pathswas never added to theSiteEventSummarytype,SiteReportPayload.eventstype, or query pipeline. The existing breakdowns (by_event_name,top_sources,top_campaigns,top_referrers) were already present in the code and their query logic is correct. Empty arrays in runtime output for those fields indicate data filtered by theproduction_onlyflag (defaulttrueforstar_map_generator) — events from non-production hosts are excluded by design. top_contentsadded: evaluated and confirmed useful for ad/creative evaluation viautm_contentwhich is already captured insite_events_raw.- Compatibility: additive only. No existing fields removed or changed. Consumers that do not read the new fields are unaffected.
- Fix parameter binding order bug in
querySiteEventObservabilitythat caused all observability counters (included_events,excluded_test_mode,excluded_non_production_host,dropped_rate_limited,dropped_invalid) to return 0 for all sites regardless of actual stored events. - Root cause: the SQL places production-host
?parameters inSELECTCASE WHEN expressions (appearing before theWHEREclause in SQL text), but the.bind()call provided theWHEREclause values (siteKey,startDay,endDay) first. This causedWHERE site_key = ?to receive a production host URL pattern string, matching zero rows, so every aggregated counter returned 0. querySiteEventOverviewwas unaffected because its production host filter is appended to theWHEREclause (not inSELECTCASE WHEN expressions), so its bindings were in the correct left-to-right order. This is whyevents.accepted_eventsreturned correct values whilehealth.included_eventsreturned 0.- Fix: swap binding order in
querySiteEventObservabilityso production host params appear before theWHEREclause params, matching SQL text parameter order.
- Export
buildProductionHostClauseto support direct unit testing of production-host URL pattern generation. - Add explicit contract note in SOT and README:
health.included_eventsandevents.accepted_eventsare computed from the same filter predicate over the same 7-day window and must agree. - Update Star Map section in README to remove stale pre-launch language; canonical production host
starmap.truegoodcraft.cahas been registered since v1.11.1.
- Runtime behavior changed: yes —
health.included_events,excluded_test_mode,excluded_non_production_host,dropped_rate_limited, anddropped_invalidnow return correct values. - Star Map support class remains
event_only. Traffic and identity sections remainnullby design; this was correct before this fix and remains correct after. - Compatibility: low risk. These observability fields were returning 0 (wrong); they now return the correct values operators and reports depend on.
- Normalize Lighthouse telemetry documentation terminology around canonical support classes (
legacy_hybrid,event_only,event_plus_cf_traffic,not_yet_normalized) and canonical capability layers (Layer 1 Registry, Layer 2 Event, Layer 3 Traffic, Layer 4 Identity, Layer 5 Extension). - Add an explicit current site capability matrix for BUS Core, Star Map Generator, and True Good Craft using support-class and layer language.
- Add explicit operator-facing request phrasing guidance (for example: "Add a traffic layer to TGC", "Keep Star Map event_only") and deprecate vague parity phrasing (for example: "make it like Buscore").
- Clarify shared taxonomy handling in docs:
page_view,outbound_click,contact_click, andservice_interestare cross-site comparable; other event names are either legitimate extension-layer events or drift to clean up. - Clarify in docs that normalization does not mean equal telemetry richness, and unsupported sections/layers remain
nullor omitted by rule.
- Documentation and terminology normalization pass only; no runtime behavior changes.
- Freeze canonical shared cross-site comparable event names to
page_view,outbound_click,contact_click, andservice_interest. - Add deterministic support-class and section-availability metadata on
GET /report?view=sitescope (support_class,section_availability). - Add explicit
identitysection toGET /report?view=sitepayload, populated only for support classes with identity support andnullfor event-only sites. - Add normalization tests covering taxonomy helpers, support-class mapping, shared signal semantics, and site-view identity availability.
- Normalize shared event-name aliases in report assembly for standardized-event
by_event_nameoutput so equivalent shared actions are grouped under canonical names without breaking permissive ingest compatibility. - Centralize supported-signal semantics through helper logic used by fleet/site/source-health report assembly (
accepted_signal_7dandhas_recent_signal).
- Runtime ingest validation remains permissive for compatibility: non-empty site-specific event names continue to be accepted as extensions.
- Perform a normalization audit and planning pass for tracked public properties (
buscore,star_map_generator,tgc_site) and record execution-ready inventory inplan.md. - Make fleet normalization rules explicit in docs:
TRACKED_SITEScanonical registry,/metrics/eventcanonical fleet telemetry path, and/metrics/pageviewdocumented as BUS Core legacy-only support. - Freeze shared report-field semantics in docs for
accepted_signal_7d,accepted_events_7d,has_recent_signal,last_received_at, andcloudflare_traffic_enabled. - Add explicit support-class taxonomy (
legacy_hybrid,event_only,event_plus_cf_traffic,not_yet_normalized) and classify current tracked sites by observed current reality.
- Documentation and planning normalization pass only; no runtime behavior changes to ingestion or report outputs.
- Expand authenticated
GET /reportwith explicit query modes: legacy bare/report,/report?view=fleet,/report?view=site&site_key=<site_key>, and/report?view=source_health. - Add fleet-wide operator reporting summarizing each tracked site with deterministic
backend_source, signal freshness, site-scoped accepted-event totals, BUS Core pageview totals where supported, and Buscore Cloudflare traffic totals where supported. - Add site-scoped detailed reporting with
scope,summary,traffic,events, andhealthsections for one tracked property. - Add source-health reporting focused on telemetry integrity with per-site
accepted_signal_7d,last_received_at, and persisted drop counters where supported.
- Preserve the existing bare
/reporttop-level operator contract unchanged while moving legacy assembly behind a dedicated builder. /reportnow rejects invalidviewwith400 {"ok":false,"error":"invalid_view"}and rejectsview=sitewithoutsite_keywith400 {"ok":false,"error":"missing_site_key"}.- Legacy
/reportandview=sitecontinue to reject unknownsite_keywith400 {"ok":false,"error":"invalid_site_key"}. - Legacy
/report,view=fleet, andview=sitekeep the best-effort previous-completed-day Buscore traffic refresh before assembly;view=source_healthintentionally skips the refresh and reads persisted data only. - Unsupported per-site reporting fields now return
nullinstead of synthetic zeroes, including non-BUS Corepageviews_7d, non-traffic-enabled site traffic metrics, anddropped_invalidwhere standardized-event invalid drops are not persisted.
- No migration was added. The new views are composed from existing tracked-site registry data plus current D1 reporting surfaces (
pageview_daily,site_events_raw,buscore_traffic_daily).
- Clarify one cross-site developer/operator analytics suppression integration standard for all Lighthouse-tracked public sites: use
dev_modeas the canonical cookie name with presence-based semantics. - Document that when
dev_modeis present, site-side shared telemetry loaders must suppress Cloudflare Web Analytics injection, Lighthouse pageview emission, and Lighthouse standardized event emission for that page load. - Clarify domain-scoping expectations for separate registrable domains:
.buscore.cafor BUS Core properties and.truegoodcraft.cafor True Good Craft properties/subdomains (includingstarmap.truegoodcraft.ca), while keeping one logical cookie contract.
- Documentation and integration-contract clarification only; no Lighthouse runtime ingestion behavior change.
- Register True Good Craft website tracked-site entry as
site_key: "tgc_site"with production hoststruegoodcraft.caandwww.truegoodcraft.ca. - Add browser origin allow-list entries for
https://truegoodcraft.caandhttps://www.truegoodcraft.caonPOST /metrics/eventvia the active tracked-site registry. - Keep Cloudflare traffic capture disabled for
tgc_site(cloudflare_traffic_enabled: false,cloudflare_host: null).
- Register Star Map launch host/origin in tracked-site registry for
site_key: "star_map_generator":production_hostsnow includesstarmap.truegoodcraft.caandallowed_originsnow includeshttps://starmap.truegoodcraft.ca. - Promote
star_map_generatortracked-site status fromplannedtoactiveso/metrics/eventCORS allow-listing now permits Star Map browser-origin ingestion.
- Add site-scoped standardized-event reporting on
GET /reportusingsite_keyquery parameter with optional filter flagsexclude_test_modeandproduction_only. - Add additive
site_eventsreport block (returned whensite_keyis provided) with:scope,totals,by_event_name,top_sources,top_campaigns,top_referrers, andobservability. - Add D1 migration
0008_add_site_event_rate_limit.sqlcreatingsite_event_rate_limitminute-bucket table for/metrics/eventingestion noise control.
- Harden
POST /metrics/eventwith D1-backed per-IP-hash minute rate limiting (approximately 50/minute), matching the pageview ingestion model. - Rate-limited standardized events are now persisted with
accepted = 0anddrop_reason = "rate_limited"for operator observability. - Standardized-event source attribution in
site_events.top_sourcesfollows precedencesrc -> utm_source -> referrer classification -> (direct). /reportnow rejects unknownsite_keyvalues with400 {"ok":false,"error":"invalid_site_key"}.
- Legacy BUS Core report blocks (
today,yesterday,last_7_days,month_to_date,trends,traffic,human_traffic,identity) remain intact and semantically unchanged. site_eventsis intentionallynullwhensite_keyis not supplied to avoid silent multi-site blending.
- Add a code-level tracked-site registry (
TRACKED_SITES) as the first-class property model for Lighthouse. Each entry carriessite_key,label,status(active|staging|planned),production_hosts,allowed_origins,staging_hosts,cloudflare_traffic_enabled,cloudflare_host, andproduction_only_default. - Register
buscoreas an active tracked site with BUS Core production hosts, CORS origins, and Cloudflare traffic capture host derived from its registry entry. - Register
star_map_generatoras a planned tracked site with empty host and origin fields, awaiting production URL assignment. - Add
POST /metrics/event— standard multi-site event ingestion endpoint. Acceptssite_key,event_name, and all standard attribution fields (client_ts,path,url,referrer,device,viewport,lang,tz,utm, optionalsrc,utm.*,anon_user_id,session_id,is_new_user,event_value,test_mode). Unauthenticated; always returns204 No Content. CORS gated to allowed origins of active tracked sites. - Add D1 migration
0007_add_site_events.sqlcreatingsite_events_rawtable withsite_keyandevent_namediscriminators for multi-site event storage, including standard enrichment and privacy columns.
BUSCORE_HOSTandPAGEVIEW_ALLOWED_ORIGINSare now derived from the tracked-site registry rather than hardcoded constants. Runtime behavior for BUS Core is unchanged.OPTIONS /metrics/eventadvertisesPOST, OPTIONS; CORS policy returns per-origin allow headers for active tracked sites, never wildcard.- Extended
withCorsto apply per-site CORS policy for/metrics/eventusing the union of active tracked-site allowed origins.
POST /metrics/pageview(BUS Core legacy) continues to function without modification. BUS Core pageview ingest, report output, and traffic capture are unaffected.star_map_generatoris registered but inert: itsallowed_originsis empty, so no browser preflight will succeed for that site until a production URL is added to its registry entry.- Per-site report isolation (
GET /reportscoped bysite_key) is reserved for a future pass. - Rate limiting is not applied to
POST /metrics/eventin this pass.
- Resolve migration chain drift in
0005_add_pageview_ingestion.sql: the continuity columnsanon_user_id,session_id,is_new_userand their associated indexes were retroactively added to migration 0005 after it had already shipped, duplicating theALTER TABLEoperations in0006_add_anonymous_continuity.sql. This caused fresh-install failures on D1 when both migrations were applied in sequence. Migration 0005 has been restored to its original form (base table and base indexes only, no continuity columns). Migration 0006 remains the correct and sole source for adding continuity fields. - Add operator risk note to
0006_add_anonymous_continuity.sql: environments that applied a modified 0005 (with continuity columns already present) must verify column existence and mark the migration applied without re-running theALTER TABLEstatements.
- No runtime behavior change. No schema change to already-deployed environments that applied both migrations correctly in sequence. The deployed schema is identical before and after this fix.
- Extend
POST /metrics/pageviewingest contract to accept optional anonymous continuity fields:anon_user_id,session_id, andis_new_userwithout breaking older clients. - Add D1 migration
0006_add_anonymous_continuity.sqladding raw pageview continuity columns and targeted indexes for identity/session retention queries. - Extend
GET /reportwith additive top-levelidentityblock containing:today.{new_users,returning_users,sessions}last_7_days.{new_users,returning_users,sessions,return_rate}top_sources_by_returning_users
- Increase pageview ingest runtime marker to
1.9.0. - Keep identity processing aggregate-first and anonymous by using first-party continuity fields only; no synthetic identity reconstruction from IP or user-agent hashes.
- Ensure malformed continuity fields are sanitized (
anon_user_id/session_idnulled,is_new_usercoerced to0) instead of causing brittle event rejection when the base pageview payload remains valid.
- Fix
POST /metrics/pageviewbody-capture diagnostics to preserve and pass a structured capture result from the request path (raw,body_capture_stage_reached,capture_error) into deferred ingest work. - Complete
POST /metrics/pageviewbody capture on the request path before returning204, then pass that same captured result into deferred ingest processing to eliminate read-after-response race behavior. - Expose previously swallowed body-read exceptions as
capture_errorwhen body capture fails, instead of collapsing all failures tonullbody text. - Ensure invalid-json debug logging uses the same captured raw body string passed to parser handling, so
raw_body_lengthandraw_body_previewreflect the real captured value.
- Add temporary explicit body-capture debug snapshots for both accepted and invalid-json pageview ingest paths with
body_capture_stage_reached,raw_body_length, andcapture_errorfields.
- Bump
ingest_versionemitted to raw pageview rows from1.8.6to1.8.7.
- Fix
POST /metrics/pageviewingest body-read timing by initiatingrequest.text()on the request path before returning204, then parsing and validating from that same raw string in the async ingest path. - Preserve single-read parsing contract (
raw text -> empty check -> JSON.parse(raw)) while preventing unreadable-bodyinvalid_jsondrops caused by deferred body reads.
- Bump
ingest_versionemitted to raw pageview rows from1.8.5to1.8.6.
- Harden
POST /metrics/pageviewingest parsing to an explicit single-read flow: body is read once as raw text, empty-body checked, thenJSON.parse(raw)is applied from that same string. - Remove request cloning on the pageview ingest
waitUntilpath to avoid body stream edge cases that can surface as unreadable-bodyinvalid_jsondrops while preserving fire-and-forget204behavior.
- Bump
ingest_versionemitted to raw pageview rows from1.8.4to1.8.5.
- Add narrow temporary invalid-json ingest debug logging for
POST /metrics/pageviewthat only runs on droppedinvalid_jsonsubmissions and records requestContent-Type, raw body length, first about 500 characters of body text, and an inferred beacon/fetch transport hint.
- Bump
ingest_versionemitted to raw pageview rows from1.8.3to1.8.4to mark runtime with temporary invalid-json diagnostics enabled.
- Align
POST /metrics/pageviewparser and validator with the canonical BUS Core site emitter contract by validating required fields (type,client_ts,path,url,referrer,utm,device,viewport,lang,tz) while allowing omitted optional fields (src,utm.*). - Preserve canonical empty-string values for
referrer,lang, andtzinstead of collapsing them tonull, so accepted raw rows keep populated contract fields. - Keep invalid classification narrow for ingestion (
unreadable body,empty body,invalid JSON, or contract-invalid required field types/shape) while preserving fire-and-forget204responses.
- Add
Access-Control-Allow-Credentials: truetoPOST /metrics/pageviewand itsOPTIONSpreflight for allowed first-party origins (https://buscore.caandhttps://www.buscore.ca), enabling credentialed cross-origin requests from BUS Core.
- Fix first-party pageview ingestion CORS so
POST /metrics/pageviewand itsOPTIONSpreflight return explicit allow-origin headers forhttps://buscore.caandhttps://www.buscore.cainstead of wildcard*. - Prevent non-allowed origins from receiving broad wildcard browser access on the pageview ingestion route while preserving existing
OPTIONS 200andPOST 204behavior.
- Add unauthenticated
POST /metrics/pageviewfor narrow first-party JS-fired pageview ingestion, with204 No Contentresponses for valid, partial, rate-limited, and malformed request bodies. - Add D1 migration
0005_add_pageview_ingestion.sqlwith raw pageview event retention, daily pageview aggregates, per-dimension aggregate rows, and per-minute hashed-IP rate-limit buckets. - Extend authenticated
GET /reportwith additive top-levelhuman_trafficfor compact JS-fired pageview reporting, includingtoday,last_7_days, and cumulativeobservabilitysections.
- Lighthouse now accepts the already-deployed BUS Core site emitter contract as-is: page-load-only events, no auth, no retries, no session logic, and no client contract changes.
- Raw pageview events are retained in D1 for about 30 UTC days with hashed IP and hashed user-agent values for inspectability without introducing identity semantics.
- Scheduled execution now also prunes expired raw pageview rows and stale rate-limit buckets while preserving the existing once-daily Cloudflare traffic capture.
human_traffic.last_7_days.top_sourcesuses deterministic source precedencesrc -> utm.source -> (direct).
- Remove abandoned traffic attribution capture path from runtime and keep daily traffic capture focused on
visits,requests, andcaptured_atonly. - Remove the extra traffic attribution field from
traffic.latest_dayinGET /reportoutput.
- Daily Buscore traffic capture now runs a single totals query and writes only
day,visits,requests, andcaptured_atin runtime upsert/select paths.
- Refine authenticated
GET /reporttraffic behavior to always perform one best-effort refresh capture for the previous completed UTC day before assembling the report, instead of only capturing when that row is missing. - Reuse the same shared per-day capture logic as scheduled daily capture, preserving idempotent one-row-per-day UPSERT semantics.
- If the
/reportrefresh attempt fails, Lighthouse still returns the report successfully using whatever stored traffic data exists.
- Remove temporary development route
GET /_dev/capture-trafficafter live traffic-capture testing.
- Keep scheduled daily traffic capture and authenticated
/reportlazy backfill paths unchanged by removing only the temporary route surface.
- Improve
GET /reporttraffic usability without expanding telemetry scope:traffic.latest_daynow includes storedcaptured_at. - Improve 7-day traffic summary shape to include
visits,requests,avg_daily_visits,avg_daily_requests, anddays_with_data. - Daily averages are now explicitly row-based (
days_with_datadivisor), so Lighthouse does not divide by seven unless seven traffic rows exist.
- Correct Buscore traffic metric semantics for the Cloudflare
httpRequestsAdaptiveGroupscapture path: Lighthouse now stores and reports dailyrequests(fromcount) instead ofpageviews. GET /reporttraffic fields are renamed frompageviewstorequestsin bothtraffic.latest_dayandtraffic.last_7_days.- The shared daily capture helper now validates numeric request
countand no longer depends on unsupportedpageViewsonhttpRequestsAdaptiveGroups.
- Add D1 migration
0004_rename_buscore_traffic_pageviews_to_requests.sqlto renamebuscore_traffic_daily.pageviewstorequests.
- Resolve live capture failure
cloudflare_graphql_payload_unknown field "pageViews"by aligning metric selection with valid fields on the selected query node.
GET /reportnow performs a best-effort lazy backfill check for the previous completed UTC day traffic snapshot: if that day is missing inbuscore_traffic_daily, Lighthouse attempts one capture for that exact day before assembling the report.- Lazy backfill reuses the same traffic capture logic as scheduled daily capture and does not replace cron behavior.
- If lazy backfill fails,
/reportstill returns successfully using currently stored traffic data only; no synthetic traffic rows are created.
- Tighten Cloudflare GraphQL traffic capture validation so a daily snapshot row is only written when a numeric daily
pageViewsmetric is present in the single-query response. - If the GraphQL query returns no daily result row (for example due to dataset/filter mismatch), Lighthouse now treats this as capture failure and skips writing the day instead of inserting synthetic zero traffic.
- Add additive Buscore traffic telemetry capture via a daily Lighthouse cron that pulls one completed UTC day snapshot from the Cloudflare GraphQL Analytics API into D1 table
buscore_traffic_daily. - Extend
GET /reportwith a compact top-leveltrafficobject containinglatest_dayandlast_7_daystraffic summaries.
- Lighthouse now includes scheduled daily traffic capture in addition to the existing
fetchrequest surface. - Traffic capture uses a single Cloudflare GraphQL query per scheduled run, always scoped to the previous completed UTC day for hostname
buscore.caand zoneCF_ZONE_TAG. - Successful traffic pulls upsert one final row per day, making reruns idempotent for the same UTC day.
- If the Cloudflare traffic pull fails or returns GraphQL errors, Lighthouse skips that day rather than writing synthetic zeroes; core metrics and existing
/reportfields continue to operate unchanged. - Traffic
pageviewsare sourced from a direct daily Cloudflare page view metric;visitsremainnullin the current implementation because the chosen single daily query does not use a documented direct visits metric for this path. - Add explicit version/release authority: shipped Lighthouse behavior is authorized by
SOT.md, recorded inCHANGELOG.md, and versioned bypackage.json; behavioral changes are not released unless all three are updated together.
GET /update/checknow incrementsupdate_checksfor all requests (unless IP is inIGNORED_IP), removing the requirement forX-BUS-Update-Source: coreheader.- Restored simple counting logic to
/update/checkwhile maintaining manifest/download route split.
- Fix analytics drift where internal and public manifest reads could inflate
update_checkscounters. - Gate
update_checkscounting inGET /update/checkto only increment when headerX-BUS-Update-Source: coreis present. - Designate
GET /manifest/core/stable.jsonas the canonical public manifest read route with no counter increment. - Preserve counted download intent on
GET /download/latestwithout double-counting viaGET /releases/:filename.
GET /update/checknow requiresX-BUS-Update-Source: coreheader to increment counters; returns manifest normally in all cases, with or without the header.GET /manifest/core/stable.jsonnow explicitly documented as the public manifest hydration route.
- Fix release download path handling so
manifest.latest.download.urlvalues like/releases/TGC-BUS-Core-1.0.2.zipare accepted and redirected correctly by/download/latest. - Add
GET /releases/:filenameto stream release artifacts from R2 keyreleases/:filenameso public Lighthouse release URLs no longer returnnot_foundwhen the object exists.
IGNORED_IPsecret: requests whoseCF-Connecting-IPexactly matches this value skipupdate_checksanddownloadscounter increments while still receiving normal responses.
- Evaluate Price Guard calculation event tracking via D1
calculationsmetric. - Evaluate whether
calculationsshould be included in/reportif and when ingestion ships. - Evaluate migration of future Price Guard metrics from KV-based signaling to D1 aggregates.
- Evaluate introducing
/pg/pingwith strict auth/CORS only if approved and documented in SOT. - Evaluate migration from fixed aggregate columns to a generic metric-ledger model where appropriate.
- Current shipped Lighthouse already uses protected, on-demand reporting via
GET /report. - Current shipped Lighthouse has no cron summaries and no outbound Discord reporting.