For the complete documentation index, see llms.txt. This page is also available as Markdown.

luciq-verify

Verify a Luciq SDK upgrade end to end before shipping, using the Luciq MCP server as the audit oracle.

End-to-end behavioral verification of a Luciq SDK upgrade. The mechanism is the dashboard as oracle: drive a debug build through a deterministic smoke, let the new SDK ship telemetry, then pull that occurrence back through MCP and audit what landed against the customer's integration contract. The skill catches integration regressions that don't break a build — redaction callbacks that no longer fire, header-preservation hooks that silently dropped, attribute APIs whose keys got renamed, new auto-instrumentation that captured PII.

The verification harness is not a published package. The skill generates it directly inside the customer's debug variant on first run and reuses it on every subsequent upgrade. First invocation does the heavy work (harness scaffold, rule-pack bootstrap, environment confirmation); every subsequent SDK upgrade reuses the same harness.

Use this skill when

  • The user mentions verifying an SDK upgrade, auditing a Luciq version bump, or asks "is it safe to release" after bumping the Luciq dependency.

  • The user pastes a build with a freshly bumped Luciq dependency and asks whether to release.

  • The user wants to smoke-test the new SDK to confirm that URL redirection, masking, preserved headers, user attributes, PII redaction, feature flags, and experiments all behave correctly against the new version.

What the agent does

  • Tier detection. Classifies the project into one of four maturity tiers (full T3 harness + rule pack, harness-only T2, organic telemetry T1, or no telemetry T0) and shapes the rest of the workflow accordingly.

  • Harness scaffold. Generates LuciqVerifyHarness.<ext> inside the customer's debug variant on first run; reuses and optionally regenerates it on subsequent runs. Shows diffs before applying any change.

  • Rule pack bootstrap. Writes luciq-verify.yaml with the base verification rules and stubs for customer-specific checks. Infers a draft rule pack from existing telemetry when enough baseline data is available.

  • Static audit. Inspects source and build config — SDK version, module activation, masking configuration, dSYM/mapping upload setup — without running the app. Reports findings by S-* code.

  • Pre-flight safety checks. Confirms the build has the new SDK pinned, is pointed at a non-production backend, has a device or emulator running, and that the Luciq MCP server is reachable. Refuses to proceed against a production backend.

  • Smoke. Drives the build through a canonical trigger sequence (set persona → fire network burst → exercise feature flags → file a bug report → flush → crash), then polls all three MCP channels (crash, bug, APM) for the resulting occurrence.

  • Runtime audit. Applies the merged rule pack (base + customer-specific rules) against the captured payload. A single FAIL blocks release.

  • Report + drift. Renders luciq-verify-report.html and luciq-verify-report.md with evidence citations. Produces a rule-pack drift diff the user accepts or rejects hunk by hunk.

Install

The fastest path is the plugin install. Add the marketplace and install:

Works in Claude Code and Cursor. The plugin install also wires up the Luciq MCP server in one step.

After install, the skill is available as /luciq-skills:luciq-verify.

For other agents, install via npm:

Or copy SKILL.md from the public repo to ~/.claude/skills/luciq-verify/SKILL.md (user-global) or .claude/skills/luciq-verify/SKILL.md (project-local). The full SKILL.md is reproduced in the expandable below.

📋 Click to expand the full SKILL.md

Prerequisites

Three hard dependencies. The skill refuses to run without all of them.

Dependency
What for
If missing

Luciq MCP server, authenticated

The entire audit is grounded in what the MCP exposes — list_applications, list_crashes, list_bugs, list_occurrences_tokens, get_occurrence_details, bug_details, crash_patterns, and apm_*.

Stop at pre-flight. Route to luciq-setup step 7 or the MCP setup guide.

A debug-variant build with the new SDK

Produces the deterministic occurrence the audit reads.

Phase 1 generates the harness.

A device, simulator, or emulator

Runs the build that produces the occurrence.

Boot one before invoking. The skill will not spawn a device without confirmation.

The skill also works with the optional mobile-mcp server. When present, it drives the smoke using the device's accessibility tree (tap_by_label) and captures diagnostic screenshots on smoke end or timeout. Without it, tap_by_label triggers degrade to manual — the skill prints the trigger sequence and waits for the user to tap.

How the agent verifies

The skill runs a linear six-phase workflow. Every phase is tracked in a progress checklist. The agent stops on any failed step — a misleading "PASS" report is worse than no report.

Phase 0. Detect maturity tier

Before doing anything, the agent reads the project locally and probes MCP to classify which tier applies. Tiers determine how the rest of the workflow runs:

Tier
Marker
What runs

T3 (full)

Harness present + luciq-verify.yaml exists

Full synthetic audit with customer-specific rule pack

T2 (harness only)

Harness present, no rule pack

Synthetic audit against the base rule pack only

T1 (telemetry only)

No harness, but MCP returns ≥ 1 record from the new SDK version in the last 30 days

Audit the most recent organic occurrence; synthetic-marker checks become SKIP

T0 (empty)

Neither

Cannot audit — run Phase 1, produce one occurrence, re-invoke

The agent surfaces the detected tier explicitly. Most users don't know which tier they're in until the agent tells them.

On Flutter (DART) and React Native (JAVASCRIPT) projects, APM is permanently N/A — the bug and crash channels carry the full audit on those platforms.

Phase 1. Setup (idempotent)

First invocation only. On a clean repo this phase produces a single PR-shaped change set scoped to the debug variant. Sub-steps whose artifacts already exist are skipped.

Platform detection reuses the same root-marker rules as luciq-setup. Ambiguous workspaces stop here.

Harness scaffold or reuse — two modes controlled by harness.mode in luciq-verify.yaml:

  • Scaffold mode (default): the skill generates LuciqVerifyHarness.<ext> inside the debug variant. The harness is ≈ 100–200 lines per platform, reachable by deep link, and gated to the debug variant. The skill shows the diff before applying. Release and production source sets are never touched — a release-variant harness with a public deep link is a security issue.

  • Reuse mode: for projects that already have a debug menu with crash/hang/bug triggers. The skill drives the existing surface instead of generating one. A marker_view, optional deep link, and trigger map are declared in the rule pack. Unmapped triggers become no-ops; the audit degrades gracefully.

Rule pack bootstrap — the skill writes luciq-verify.yaml at the repo root with base rules inlined and TODO stubs for customer-specific checks. If MCP returns ≥ 10 occurrences from the baseline SDK version, the skill proposes an inferred draft (committed only on user approval). PII regexes and attribute slot mappings are never auto-committed.

Phase 2. Static audit

Inspects source and build config without running the app. Catches integration issues that never surface at runtime: wrong SDK version pinned, modules disabled in code, masking off, dSYM/mapping upload not wired.

The audit is agent-native — the skill reads files and greps patterns using the agent's own tools. No external scanner is needed. Per-platform extractors cover:

  • SDK install and version detection

  • Module activation (Bug Reporting, Crash Reporting, APM, Session Replay, NDK, Surveys, network auto-masking)

  • Invocation events configuration

  • User identification and attribute hooks

  • Feature flag API usage

  • Masking and privacy configuration

  • dSYM / mapping upload setup

Each finding produces a S-* coded row (status, file path + line range, remediation hint). FAIL findings block release the same way runtime FAIL findings do.

Skipped when invoked with --runtime.

Phase 3. Pre-flight safety checks

Runs on every invocation. Refuses to verify the wrong thing — a "PASS" from a build still on the old SDK, or pointing at production, is worse than no report.

Check
Stop condition

New SDK version in lockfile

Lockfile still pins the old version

Build variant is debug

Active variant is release / production

Backend is non-production

Build points at a production API

Dashboard mode matches build environment

Build env and MCP mode mismatch

Device or emulator available

Nothing booted or connected

Luciq MCP reachable

Auth expired or MCP not configured

The production-backend refusal is not overridable in default mode. See Modes below for the explicit prod-canary path.

Skipped when invoked with --static.

Phase 4. Smoke

The skill drives the harness end to end. No manual input unless the user explicitly prefers it.

Platform-native commands (Xcode, Gradle, Flutter, React Native) install and launch the debug build via deep link. If mobile-mcp is available, it can serve as a unified driver across iOS and Android.

The canonical trigger sequence runs in this order — attributes before network traffic, bug report before crash:

  1. LuciqVerifyHarness.setTestPersona(...) — sets user attributes

  2. LuciqVerifyHarness.fireNetworkBurst(...) — generates network log evidence

  3. LuciqVerifyHarness.exerciseFeatureFlags() — iterates declared flags and experiments

  4. LuciqVerifyHarness.reportBugReport() — produces a clean bug-channel record

  5. LuciqVerifyHarness.flushNow() — ships pending telemetry synchronously

  6. LuciqVerifyHarness.forceCrash() — produces the auditable crash

After triggering, the skill polls all three MCP channels simultaneously (crash, bug, APM) every 5 seconds for up to 90 seconds. Any channel that returns data is used for the audit. Full timeout triggers diagnostics; the skill does not silently continue.

When selecting among multiple crash tokens returned by list_occurrences_tokens, the skill takes max(tokens) lexicographically — ULIDs are time-prefixed, so the lex-max is the newest occurrence.

Skipped when invoked with --static.

Phase 5. Runtime audit

Applies every rule in the merged rule pack (base + customer rules) against the captured payload. Channel preference: APM > Bug > Crash for behavioral checks — APM exposes per-request structured data; the bug payload splits logs into typed archives; the crash payload requires decompressing a combined archive.

Status values:

Status
Meaning

PASS

Evidence matches the expected contract

FAIL

Regression detected — blocks release

WARN

Potential issue worth reviewing

SKIP

Evidence unavailable; reason stated

DISABLED

Feature intentionally off (workspace policy or rule pack)

N/A

Rule doesn't apply to this platform or channel

MANUAL

Requires human judgment; surfaced at the top of the report

Empty evidence is never PASS. A missing field or empty array is SKIP with a stated reason — silently passing absent data is the exact failure mode this skill exists to catch. DISABLED (feature intentionally off) is not FAIL; the skill distinguishes between a feature that's absent because of a regression and one that's absent because it was configured off.

When default mode runs both static and runtime, Phase 2's S-MODULE-* findings gate Phase 5 rule evaluation: a module disabled in source causes all dependent runtime rules to emit SKIP with a traceable cross-link.

Phase 6. Report and drift detection

Two artifacts are always produced:

  • luciq-verify-report.html — colored status pills, expandable evidence rows, network audit table, occurrence list

  • luciq-verify-report.md — same content in plain Markdown, suitable for PR comments and CI logs

Both include a summary bar (counts per status), test environment block (slug, mode, app version, backend, SDK version), selected occurrence detail (type, number, ULID, current_view), APM coverage when available, the full checks table, network log audit, user attributes, and experiments.

Drift detection always runs afterward. The agent compares the observed payload to the declared rule pack and produces a unified diff proposing updates. The user accepts, rejects, or edits per hunk. luciq-verify.yaml is never auto-updated.

Invocation flags

Flags trim scope when only part of the audit is needed. They compose with audit mode.

Flag
Phases run
When to use

(none — default)

0, 1, 2, 3, 4, 5, 6

Full audit: static config inspection + runtime smoke + MCP-driven audit

--static

0, 1, 2, 6

Static config inspection only; no device or MCP call needed

--runtime

0, 1, 3, 4, 5, 6

Skip static phase; go straight to pre-flight and smoke

--static --mode=prod-canary is an error — static doesn't read telemetry, so the mode flag has nothing to apply to. The skill surfaces the conflict and stops.

Modes

Mode
When
What changes

synthetic (default)

Pre-release SDK upgrade verification

Smoke phase runs; harness produces a fresh occurrence; MCP mode is whatever non-production value matches the build's backend

prod-canary (--mode=prod-canary)

Day-1 of a staged rollout; auditing real-user traffic from the new SDK

Smoke phase skipped; audits the most recent occurrence from mode: production; S* rules SKIP; recency window is 24h; PII findings are release-blocking. Adds SDK-version regression diffs via crash_patterns and apm_list_groups.

Prod-canary mode is invoked explicitly. The production-backend pre-flight refusal is intentionally inverted in this mode — production is the target. All other pre-flight checks still apply.

Out of scope

  • Aggregate metrics that are dashboard-only (crash-free session rate, MTTR, retention). The audit is per-occurrence behavioral.

  • Computing "is this string PII" by LLM judgment alone. Customer PII regex is the source of truth; the skill suggests candidates only.

  • Real UI tests (Espresso, XCUITest). The smoke is a single deep-link launch plus the canonical trigger sequence. Broader scenario coverage belongs in customer-owned tests.

  • Modifying the customer's actual integration code. The skill edits the debug variant's harness and the rule pack only.

  • Verifying against mode: production without explicit --mode=prod-canary.

Last updated