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

luciq-symbolicate

The luciq-symbolicate skill installs the Luciq CLI to upload symbol files and wires symbolication into CI release pipelines.

Fix an unsymbolicated crash report by uploading the right symbol files, then make the fix permanent by wiring the upload into a release pipeline. Symbol files are how Luciq turns a raw address like 0x1004a2f18 back into Checkout.applyPromo(Checkout.kt:214), and there is no MCP tool for uploading them — the luciq CLI is the only path.

Use this skill when

  • Crash reports or stack traces are unreadable — obfuscated, minified, or showing raw hex addresses and memory offsets instead of class and method names.

  • The user asks to upload iOS dSYMs, Android ProGuard/R8 mapping files, NDK .so symbols, React Native source maps, or Flutter Dart symbols.

  • The user wants symbolication wired permanently into a release pipeline — GitHub Actions, Fastlane, Gradle, Bitrise, CircleCI, an Xcode build phase, or cron.

  • Triggers include "my crashes aren't symbolicated", "the stack trace is obfuscated / unreadable / just hex", "upload dSYMs / mapping / source maps to Luciq", "symbolicate in CI", "add symbol upload to our build", "deobfuscate our crashes", "our beta builds need symbols too".

  • For investigating why a crash happens once its trace is already readable, use luciq-debug instead. For exports, scheduled reports, or gating a build on a metric, use luciq-automate. For first-time SDK integration, use luciq-setup — this skill installs a CLI, not an SDK.

What the agent does

  • Install, authenticate, verify. Checks whether the CLI is installed, installs it if not, authenticates with luciq login or LUCIQ_AUTH_TOKEN, and confirms with luciq whoami before running anything that talks to the API.

  • Locates the real artifact. Detects the platform and build system, then finds the actual dSYM, mapping file, NDK .so, source map, or Dart symbol file for the build in question — it never guesses a path that isn't on disk.

  • Picks the exact upload command. Matches the file type to its required subcommand and flags, and confirms the flag set against luciq upload help <subcommand> rather than assuming.

  • Requires a proven upload before touching CI. Runs one upload manually and confirms the before wiring anything into a pipeline — an untested pipeline step is how symbolication silently breaks.

  • Wires the pipeline. Adds the upload step to the release pipeline with the token sourced from a secret, and states where that secret needs to be configured.

  • Triages a still-unreadable crash. Works down a fixed checklist — was anything uploaded, did the step actually succeed, is it the right subcommand for the artifact, do the version fields match — rather than guessing.

  • luciq help as the final authority. Treats the installed binary, not its own reference tables, as ground truth. Any rejected flag or unknown subcommand sends it to luciq upload help <subcommand> rather than inventing one.

  • No leaked credentials. Never echoes, logs, commits, or pastes a token, and avoids running luciq info in shared output since it prints the configured token in plaintext.

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-symbolicate.

For other agents, install via npm:

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

📋 Click to expand the full SKILL.md

Prerequisites

  • A shell. The Luciq MCP server isn't involved in this skill at all — it installs and authenticates the CLI itself in Step 1.

  • A CLI token, generated at dashboard.luciq.ai/company/luciq-cli. It's a personal credential tied to the user's own dashboard role, not a service account, and it authenticates every command, uploads included.

  • For symbol uploads specifically: the settings.mapping_files.modify permission on top of app access. A token that queries fine can still be refused for uploads.

Self-hosted or single-tenant clusters need LUCIQ_URL pointed at the cluster's API host (https://api.<cluster>.luciq.ai), generated from that cluster's own dashboard — a token from one cluster 401s against another.

How the agent symbolicates a build

Step 1. Install, authenticate, verify

The agent checks whether the CLI is installed (luciq version), installs it if missing (Homebrew or the gem), gets a token in place via luciq login or LUCIQ_AUTH_TOKEN, points at the right cluster if self-hosted, and confirms with luciq whoami — never declaring success without that verification. A green whoami proves the token works, not that it's authorized to upload; that surfaces on the first real upload.

Step 2. Upload the symbols

The agent detects the platform and build system, locates the real artifact on disk, and picks the exact upload subcommand and required flags for the file type (dSYM, ProGuard/R8 mapping, NDK, React Native source map, or Flutter Dart symbols). --version-name, --version-code, and --mode all fail silently on a mismatch, so the agent reads the version from the build system rather than from memory, and runs one upload manually to confirm the before touching any CI file.

Step 3. Wire it into the pipeline

Only after a proven manual upload does the agent add the step to the pipeline — GitHub Actions, Fastlane, Gradle, Bitrise, CircleCI, an Xcode build phase, or cron — with the token sourced from a secret. It shows the diff, states where the secret must be configured, and stops. The 100-requests-per-60-seconds-per-IP rate limit covers uploads too, so a matrix build pushing several platforms and ABIs shares that allowance with the rest of the CI runner's traffic.

Triage a still-unreadable crash

If a crash is still unreadable after an upload, the agent works down a fixed list rather than guessing: whether anything was uploaded for that build, whether the step actually succeeded (a step wrapped in || true fails invisibly), whether it used the right subcommand for the artifact, whether the version fields match the crashing build exactly, whether --mode matches where the crashes land, whether hybrid apps have both JS/Dart and native symbols, whether NDK uploads are unstripped and per-ABI, and whether --slug resolves to the right app.

Out of scope

The skill won't fabricate CLI output — if a command wasn't run, it says so and shows the command rather than presenting a plausible-looking ✓ uploaded line. It treats luciq help as outranking its own reference tables: any rejected flag or unknown subcommand sends it to the live help text instead of inventing one. It never echoes, logs, or pastes a token, and avoids luciq info in shared output since that command prints the token in plaintext. For data questions it won't shell out to the CLI as a workaround for a blocked MCP call, since both hit the same backend under the same permissions — uploads are the one genuine capability gap that runs the other way.

Last updated