walkerOS v4.4.0
Changes
Every event now gets its span id at entry, so all of its records carry the same
id and its journey is whole from the first hop. Batched deliveries report per
entry: each event in a batch gets its own flush or error frame, so an event in a
failed batch is never reported as delivered. Those frames emit when the batch
settles rather than when the flush starts.
The js command is no longer sent when gtag already exists. It announces that
gtag initialised, so sending a second one after a tag manager has already
bootstrapped gtag asserts a false, later initialisation time. walkerOS now sends
it only when it bootstraps gtag itself.
Added ga4.init for the stronger case: set it to false when your container
already configures the measurement ID, and walkerOS skips js, config and the
script load entirely, sending only events.
GA4 parameter names carrying characters GA4 rejects are now rewritten, so a
tagged creative-type arrives as data_creative_type instead of going missing.
source_platform and user_id are no longer sent: GA4 reads the first as a
manual campaign and reports that traffic as Unassigned. Event names are
unchanged.
Fixed gtag.js failing to load when server_container_url was set, which
requested the script from the server container and was rejected. First-party
loading now uses the new ga4.scriptSrc setting, pointing at the tag serving
path configured in your server container, and falls back to googletagmanager.com
if that script fails to load.
Fixed journey assembly dropping records when several runtime instances (page
reloads, container restarts) reported overlapping sequence numbers. Every
instance's records now survive into journeys and gap detection stays truthful.
Each journey hop also carries the release of the runtime that produced it.
Journeys now assemble per event: one journey per event, identified by that
event's id, with the run trace carried as a handle so every event of one page
load or container run still groups together. A $flow crossing that decodes
into several events yields one journey per event, linked by parentEventId,
instead of folding them into a single row. A new optional unattributed summary
reports records the assembly could not attribute to any event instead of
dropping them silently.
observe_journeys now passes the unattributed integrity summary through
alongside journeys and gaps, so an agent sees the records that could not be
attributed to any event rather than a silently short list. A non-empty array
means telemetry was lost; an absent one means there was nothing to report.
Globals tagged with data-elbglobals are page level again: walker init on an
element no longer hides globals defined outside it. Collector globals are merged
into the event during enrichment, so destinations and post-collector
transformers see the same finished values. An event keeps the globals it was
captured with, so a later walker globals never reaches an event awaiting
consent.
Multiple browser sources now run in parallel on one page with isolated trigger,
element and visibility state, sharing only the DOM. The elb and elbLayer
names belong to their first claimant, and conflicts are logged instead of
silently disabling the source. elb: false installs no global. A page that
includes the bundle twice now collects every event twice, once per source.
SourceBrowser.Context now requires registry.
Events pushed before the collector runs are now held and replayed at run instead
of being dropped, bounded by queueMax. walker init <element> re-fires load
triggers for already-tracked elements, restoring the SPA re-init pattern. Queue
sources start consuming at run and no longer acknowledge messages the pipeline
did not accept.
A source's env is now unambiguously the author's dependency bag: the
collector-provided push, elb, command, logger and sources always win,
so setting them in env has no effect. Sources that need the pipeline to end
elsewhere declare the new terminus, which receives the raw event and skips the
pipeline entirely; previously an env.push silently replaced the pipeline's end
and disabled some, but not all, of its stages, and flows that set it should move
to terminus. Stored flows now also reject unknown keys on a source entry at
validation instead of silently ignoring them.
The top-level run flag now reaches the collector. Setting run: false, in
window.elbConfig or inline via data-elbconfig="run:false", previously had no
effect and the collector started anyway. It now holds the collector until you
send walker run yourself.
Web sources now send events through the collector's source pipeline, so
next/before chains, source mapping, cache, state and per-source status
work on web like they do on server. Walker commands are unaffected and still go
straight to the collector. Flows that already configured these fields on a web
source will see them take effect for the first time.