metrics-tagging — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited metrics-tagging (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Analyze a UI mockup or screenshot and produce a complete analytics event taxonomy, ready for handoff to a tag implementation team.
Before generating the table, always frame the output across three levels. This helps designers understand why each tag matters — not just what it is.
| Level | What it answers | Example |
|---|---|---|
| Page | What happened on screen | User clicked "Save" button |
| App | What workflow is this part of | Account setup flow completion |
| Business | Which KPI does this feed | Task completion rate, time-on-task, abandonment rate |
Accept any of:
The designer may also provide:
If the designer does not provide product or flow context, ask for it before generating the table. The "Purpose" column cannot be filled accurately without knowing what the flow is trying to accomplish.
Use camelCase. Follow this pattern: noun + Verb
Format: [object/screen][Action]
General examples:
checkoutViewed — page load on checkout screencartItemRemoved — user removes item from cartplanSelected — user selects a pricing planpasswordChanged — user updates their passwordformSubmitted — generic form submitmodalDismissed — user closes a modalflowCancelled — user exits a multi-step flowRules:
Saved, Selected, Changed, Entered)Start, Viewed)Produce a markdown table with exactly these six columns:
| # | Event or Action | ID or Variable | Definition | Properties | Purpose | Event Name |
|---|
Event or Action — Plain English label. What the user did or what happened. Use the element type + label text. Examples:
Button Click: "Save Changes"Dropdown: "Account Type"Page LoadText Input: "Email Field Changed"Radio: "Billing Frequency"ID or Variable — The DOM-level selector or variable name the tag team will hook into. Use kebab-case. Infer from the label text if not visible in the mockup. Examples:
save-changes-btnaccount-type-selectemail-inputbilling-frequency-radioDefinition — When exactly does this event fire? Be precise. Start with "When the user..." or "The moment the page..."
Properties — The contextual data that rides along on the event payload, not the event name itself. This is where variation belongs — do NOT create a separate event for every possible value. Examples:
planSelected → properties: plan_type (starter/pro/enterprise)personaCreateBtnClicked → properties: flow_id (see Task-Level Events below)formSubmitted → properties: error_code (if validation failed)If a field has no meaningful downstream property (e.g. a static page load), write "—".
Never put PII in a property — no email, name, phone, or address. Reference a user/account ID instead and let the backend join it if needed.
Purpose — Which business question does tracking this answer? Connect to a KPI. If flow context was provided, map directly to a stated KPI. If not, use the most likely KPI for that element type:
Event Name — camelCase event name following the naming convention above.
Not all inputs are equal. When deciding whether to tag a specific input field, apply these two tests. If either passes, the input must be tagged and flagged.
Test 1 — Does it cascade? If changing this field's value causes anything else in the flow to change — other fields appearing or hiding, validation rules shifting, downstream behavior changing — it must be tagged. These inputs explain why users take different paths through the same flow.
Test 2 — Does it have sizeable outcome impact? Even if nothing visually changes, does this field's value directly affect the product's core outcome — pricing, eligibility, access level, subscription tier, risk calculation, permissions? If yes, tag it.
General examples of must-tag inputs:
General examples of lower-priority inputs:
When analyzing a mockup, mark each cascading or high-impact input with a [CASCADE] or [HIGH IMPACT] flag in the Purpose column. This tells the tag team what to prioritize if they need to phase implementation.
If cascade behavior of any input is unclear from the mockup, flag it in the Coverage Gaps section and prompt the designer to verify with a PM or business analyst before handoff.
When analyzing a screen, systematically check for all of these. Do not skip any category.
Always tag:
Tag if present and notable:
Flag but do not generate — prompt the designer:
Individual click events tell you what happened at one moment. They don't tell you whether the user actually finished what they set out to do. That requires a second, higher-level layer: pairing a start event with an end event to measure completion of a whole task, not just a single interaction.
When to generate this table: any time the screen (or set of screens) contains a create/edit/delete/setup pattern where a user initiates an action and completes it one or more steps later — e.g. personaCreateBtnClicked (start) → personaSaveBtnClicked (end) = "Add New Persona" task. If the flow spans multiple screens and only one has been shared, generate the table with the available half and flag the missing screen in Coverage Gaps.
How linking actually works: analytics tools (Amplitude, Mixpanel, GA4) don't have a native "paired event" object. They stitch a start and end event together via a shared property fired on both — typically a flow_id (a UUID generated the moment the start event fires, attached to every event in that task until it ends). Always specify this linking property; without it, "task completion rate" isn't computable, just a hopeful correlation.
Produce a second markdown table:
| Task Name | Start Event | End Event | Linking Property | Success Definition | Abandonment Rule | Purpose |
|---|
addNewPersona, not saveBtnClicked)flow_id, unless the product already uses something else (e.g. session_id, draft_id) — check existing conventions firstEdge cases to flag, not silently resolve:
More events isn't better tracking — it's noise that makes funnels unreadable. Before finalizing:
billingFrequencyChanged + frequency: monthly/annual, not billingFrequencyMonthlySelected and billingFrequencyAnnualSelected).Every run of this skill invents event names and selector IDs fresh, with no memory of what got named last time. Left unchecked, that's how the same "Save" button pattern ends up as saveBtn on one screen and saveChangesBtn on another a few weeks later — the exact naming-drift problem the Quality Check dedup rule above is trying to catch within a single run, extended across runs.
Fix: maintain a running ledger at references/event-registry.md (in the same repo/workspace as this skill, not bundled with it — it's project-specific, not skill-specific).
Before tagging a new screen:
references/event-registry.md if it exists.After finalizing output: Append one row per new event (skip ones reused from the registry) to a table with this shape:
| Event Name | ID or Variable | Screen/Flow | Date Added |
|---|
Don't rewrite history — only add rows for genuinely new events. If naming conventions in the registry conflict with this skill's default pattern (e.g. the project already uses snake_case), follow the registry, not the skill defaults, and note that in the Naming Convention Reference block.
After the table, always output a Coverage Gaps section: The following were NOT visible in the provided mockup or could not be determined from it. Verify these before handoff:
Error state: What fires if form validation fails? Loading state: Is there a spinner or skeleton? Should it be tracked? Empty state: What fires if the list/section is empty on load? [Any cascading inputs flagged as unclear] [Any conditional logic that depends on user state or permissions]
If the designer provides flow context, use it to sharpen the Purpose column. Common KPIs by product type to map to:
SaaS / internal tools:
E-commerce:
Consumer apps:
If no context is provided, use generic KPI language and note in the output that Purpose column accuracy will improve with flow context.
Before finalizing output, verify:
nounVerb patternreferences/event-registry.md exists, it was checked for reusable names before new ones were invented, and new events were appended to it after finalizing~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.