walkeros-create-cmp-so…
A CMP source is a specialized walkerOS source that listens to a consent management platform's events and translates consent…
| Symptom | Likely Cause | Check | | ---------------------------------- | ---------------------------- | ---------------------------------------- | | No events at all | Source not initialized | Console for errors, verify `startFlow()` | | Events fire but destination silent |
$ npx -y skills add elbwalker/walkerOS --skill walkeros-debugging --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/walkeros-debuggingContext preview
The summary Claude sees to decide when to auto-load this skill.
| Symptom | Likely Cause | Check | | ---------------------------------- | ---------------------------- | ---------------------------------------- | | No events at all | Source not initialized | Console for errors, verify `startFlow()` | | Events fire but destination silent |
name: walkeros-debugging description: Use when walkerOS events aren't reaching destinations, debugging event flow, or troubleshooting mapping issues. Covers common problems and debugging strategies.
| Symptom | Likely Cause | Check | | ---------------------------------- | ---------------------------- | ---------------------------------------- | | No events at all | Source not initialized | Console for errors, verify `startFlow()` | | Events fire but destination silent | Mapping mismatch | Event name matches mapping? | | Partial data missing | Path doesn't exist | Log event structure, check nested paths | | Consent blocking | Required consent not granted | Check `consent` config, grant consent | | Destination error | Vendor API issue | Check network tab, vendor console |
**Log all events at collector level:**
import { startFlow } from '@walkeros/collector';
const { elb } = await startFlow({
destinations: {
debug: {
push: async (event, context) => {
console.log('[walkerOS Event]', {
name: event.name,
data: event.data,
context: event.context,
consent: event.consent,
timestamp: event.timestamp,
});
},
config: {},
},
// ... other destinations
},
});For destinations that make HTTP calls:
1. Open DevTools → Network tab 2. Filter by destination domain (e.g., `google-analytics.com`, `facebook.com`) 3. Trigger event 4. Inspect request payload
**What to look for:**
| Vendor | Debug Tool | | --------- | --------------------------------------------------------------------------------------------- | | GA4 | [GA4 DebugView](https://support.google.com/analytics/answer/7201382) | | Meta | [Facebook Pixel Helper](https://developers.facebook.com/docs/meta-pixel/support/pixel-helper) | | Plausible | [Plausible Dashboard real-time](https://plausible.io/docs) |
Test mapping without sending to vendor:
const destination = {
...actualDestination,
config: {
...actualDestination.config,
dryRun: true, // Events processed but not sent
},
};**Problem:** Event fires but destination doesn't receive it.
// Event pushed
elb({ name: 'product view', data: { id: 'P123' } });
// Mapping expects different name
mapping: {
Product: {
// Wrong: capital P
View: {
// Wrong: capital V
name: 'view_item';
}
}
}**Fix:** Event names are case-sensitive. Use exact match:
mapping: {
product: {
view: {
name: 'view_item';
}
}
}**Problem:** `items` array is empty in destination.
// Event structure
{
name: 'order complete',
data: { total: 100 },
nested: [
{ entity: 'product', data: { id: 'P1' } }
]
}
// Mapping tries wrong path
data: {
map: {
items: {
loop: [
'data.items', // Wrong: nested is at root, not in data
{ map: { id: 'data.id' } }
]
}
}
}**Fix:** Use correct path to nested array:
items: {
loop: [
'nested', // Correct: root-level nested
{ map: { item_id: 'data.id' } },
];
}**Problem:** Events not reaching destination.
**Check 1:** Does destination require consent?
// Destination config
config: {
consent: {
marketing: true;
} // Requires marketing consent
}**Check 2:** Is consent granted?
// Check current consent state
console.log(event.consent);
// Grant consent
elb('walker consent', { marketing: true });`walkeros push flow.json -e event.json --simulate destination.X` prints why a destination sent nothing, from the collector's own records (`--json` and MCP: `skipped` on the result):
| Line (`skipped`) | Meaning | Fix in simulate | | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ---------------------------------------------------------------- | | `pending: waits for consent (require)` (`{ reason: 'pending', require: ['consent'] }`) | `require: ["consent"]`: never started, no consent state exists | `--consent '{"functional":true}'` (MCP `state.consent`) | | `skipped: consent (requires marketing; granted functional)` (`{ reason: 'consent', required, granted }`) | Started, but `config.consent` denied the event (collector + event consent) | Grant the key in `--consent` or the event's `consent` | | `mapping: none (skipped before mapping)`, no `skipped` line | Not consent: a filter, a `before` chain stop, or an error | Check `--verbose` logs, the `before` chain and the mapping rules |
`require` checks that consent state is present at all; `config.consent` checks each event's keys. `--consent` is the collector's starting state: any value clears the consent `require`, and its granted keys f
From browser to BigQuery and ad platforms - warehouse-native, and ready for AI agents via MCP.
A CMP source is a specialized walkerOS source that listens to a consent management platform's events and translates consent…
Use when creating a new walkerOS destination to send events to a vendor or API (GA4/gtag, Meta/Facebook Pixel, Mixpanel,…
Use when creating a new walkerOS source to capture events (browser source, dataLayer interception, server/HTTP source, webhook…
Read [understanding-mapping](../walkeros-understanding-mapping/SKILL.md) first for core concepts.
You are an AI agent running inside a **code-execution host**, not issuing tool calls one at a time through the model. Examples: