# Risk map — nextlevelbuilder/ui-ux-pro-max-skill

> Canonical page: https://codevetter.com/unpack/ui-ux-pro-max-skill/risk-map

# Risk map — nextlevelbuilder/ui-ux-pro-max-skill

Scanned commit dcc40ff5133ef78276117db0cc34e7b83cc8aeba (2026-09-21). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

The codebase is defensively written (closed decision-rule grammar, slug sanitization, atomic writes, calibrated abstention), but risk concentrates in (a) triple-mirrored data that must stay byte-identical, (b) dead/legacy install paths in the CLI, (c) a hand-rolled CSV parser in the gallery, (d) doc drift, and (e) CI-only network surfaces (GitHub API token, Google Fonts key, npm install of pinned packages). The symlinked gallery data file also contradicts the repo's stated no-symlink rule.
- Triple-mirror consistency is the biggest blast radius: a CSV edited in src/ but not re-synced silently ships stale data through both the npm CLI and the Claude plugin; mitigation is sync-assets.mjs --check in CI, but local edits still rely on the human running `npm run sync:assets`. — [cli/scripts/sync-assets.mjs#L15-50](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/scripts/sync-assets.mjs#L15-L50) [.github/workflows/check-asset-sync.yml#L39-40](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/.github/workflows/check-asset-sync.yml#L39-L40) [CLAUDE.md](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/CLAUDE.md)
- Dead code: init.ts keeps a legacy ZIP-install path (tryGitHubInstall -> installFromZip -> extractZip shelling out to `unzip`/PowerShell Expand-Archive) gated on options.legacy, but index.ts never registers a --legacy flag, so the entire network-download + shell-out path is unreachable from the CLI. — [cli/src/commands/init.ts#L46-110](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/commands/init.ts#L46-L110) [cli/src/commands/init.ts#L198-217](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/commands/init.ts#L198-L217) [cli/src/index.ts#L25-48](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/index.ts#L25-L48) [cli/src/utils/extract.ts#L13-24](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/utils/extract.ts#L13-L24)
- extractZip interpolates zipPath/destDir into a shell command string (`unzip -o "${zipPath}"`, powershell -Command) — a command-injection shape that is currently dead code but would be exploitable if the legacy flag were ever re-exposed. (inferred) — [cli/src/utils/extract.ts#L13-24](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/utils/extract.ts#L13-L24) [cli/src/commands/init.ts#L198-217](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/commands/init.ts#L198-L217)
- update.ts shells out to npm install -g; it mitigates with execFileSync + explicit args + a semver regex gate on the tag, and shell:true only on Windows — but a compromised or malformed GitHub release feed remains the trust boundary. — [cli/src/commands/update.ts#L57-81](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/commands/update.ts#L57-L81) [cli/src/utils/github.ts#L74-92](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/utils/github.ts#L74-L92)
- The gallery contains a second, hand-written CSV parser (parseCSVLine/splitCSVRecords) independent of Python's csv module; divergence in quoting/CRLF handling would surface only as a runtime throw ('Unterminated quoted CSV field') or misparsed styles. — [gallery/lib/parseStyles.ts#L5-63](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/gallery/lib/parseStyles.ts#L5-L63)
- gallery/data/styles.csv is a symlink to ../../src/ui-ux-pro-max/data/styles.csv even though CLAUDE.md states the repo avoids symlinks because git-on-Windows checks them out as text pointer files — the gallery would read a path string instead of CSV on such a checkout. (inferred) — [gallery/data/styles.csv](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/gallery/data/styles.csv) [CLAUDE.md](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/CLAUDE.md) [gallery/app/page.tsx#L6-10](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/gallery/app/page.tsx#L6-L10)
- Doc drift: CONTRIBUTING.md tells contributors to edit 'data/rules.csv' (the real file is ui-reasoning.csv) and references a .factory/ directory that does not exist at repo root; README install commands list platforms like 'antigravity' that map to an 'agent.json' template name via AI_TO_PLATFORM indirection. — [CONTRIBUTING.md#L80-81](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/CONTRIBUTING.md#L80-L81) [src/ui-ux-pro-max/scripts/design_system.py#L38](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/src/ui-ux-pro-max/scripts/design_system.py#L38) [cli/src/utils/template.ts#L37-58](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/utils/template.ts#L37-L58)
- Search correctness is threshold-tuned by hand (_DOMAIN_SCORE_FLOORS like style 4.3, icons 5.8, _STACK_THRESHOLD 3.6 + coverage 1/3) and pinned by a calibration version string; a CSV content change can flip abstention behavior repo-wide, which is why the relevance fingerprint gate exists. — [src/ui-ux-pro-max/scripts/core.py#L197-213](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/src/ui-ux-pro-max/scripts/core.py#L197-L213) [scripts/evaluate-relevance.py#L34-59](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/scripts/evaluate-relevance.py#L34-L59)
- The only network egress in shipped runtime code is cli/src/utils/github.ts (GitHub releases API, optional bearer token from --token/UI_PRO_MAX_GITHUB_TOKEN/GITHUB_TOKEN); refresh-catalogs.yml additionally uses GOOGLE_FONTS_API_KEY and `npm install` of pinned phosphor packages in a sandboxed weekly job. — [cli/src/utils/github.ts#L49-111](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/src/utils/github.ts#L49-L111) [.github/workflows/refresh-catalogs.yml#L47-157](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/.github/workflows/refresh-catalogs.yml#L47-L157)
- Persistence writes outside the repo by design (--output-dir defaults to cwd); safe_slug prevents traversal but nothing stops an agent from pointing --output-dir at an arbitrary directory — mitigated only by SKILL.md instruction text, not code. (inferred) — [src/ui-ux-pro-max/scripts/design_system.py#L961-1020](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/src/ui-ux-pro-max/scripts/design_system.py#L961-L1020) [.claude/skills/ui-ux-pro-max/SKILL.md#L88-104](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/.claude/skills/ui-ux-pro-max/SKILL.md#L88-L104)
- bump-versions.yml auto-opens a PR editing three JSON manifests on release publish; skill/plugin manifests (2.13.0) and cli/package.json (2.5.0) are already out of step between releases, so version drift is normal rather than an error. — [.github/workflows/bump-versions.yml#L29-61](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/.github/workflows/bump-versions.yml#L29-L61) [skill.json](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/skill.json) [cli/package.json#L3](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/package.json#L3)
- Sub-skill directories (.claude/skills/{design,brand,banner-design,ui-styling,slides,design-system}) contain their own scripts/tests not covered by this report's read set; the bundled-skill CI contract treats them as shipped surface, so bugs there ship through every install. (inferred) — [cli/scripts/sync-assets.mjs#L26-28](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/cli/scripts/sync-assets.mjs#L26-L28) [.github/workflows/check-asset-sync.yml#L124-156](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/dcc40ff5133ef78276117db0cc34e7b83cc8aeba/.github/workflows/check-asset-sync.yml#L124-L156)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
