diff --git a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action.png b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action.png
index 617c8a270..a42e03bca 100644
Binary files a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action.png and b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action.png differ
diff --git a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action@2x.png b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action@2x.png
index b72dee216..0617970b8 100644
Binary files a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action@2x.png and b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/action@2x.png differ
diff --git a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action.png b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action.png
index 771443dcc..eb73006f5 100644
Binary files a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action.png and b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action.png differ
diff --git a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action@2x.png b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action@2x.png
index 899b08e53..1b0f77946 100644
Binary files a/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action@2x.png and b/apps/streamdeck/com.cluesmith.codev.sdPlugin/icons/list/action@2x.png differ
diff --git a/apps/streamdeck/scripts/render-action-icons.mjs b/apps/streamdeck/scripts/render-action-icons.mjs
index ae839707a..365c370dd 100644
--- a/apps/streamdeck/scripts/render-action-icons.mjs
+++ b/apps/streamdeck/scripts/render-action-icons.mjs
@@ -1,10 +1,18 @@
-// Render the dedicated manifest action icons for `send-queue` and `open-terminal` (#1440).
+// Render the dedicated manifest action icons for `send-queue`, `open-terminal` (#1440) and the
+// catch-all `action` (#1444).
//
// SINGLE SOURCE: the glyph vectors are NOT re-drawn here — they are parsed out of
// `src/face.ts`'s GLYPHS map, the same vectors the runtime key face draws via
// `labelFaceSvg('comment'|'terminal', …)`. So the action-picker icon and the live hardware key
// agree by construction; changing a glyph in face.ts and re-running this script keeps them aligned.
//
+// BRAND-SOURCED: the `action` icon is the exception — it renders from the plugin's own brand mark
+// (`icons/plugin.svg`), not a face.ts glyph. `Codev Action` is a configurable catch-all that runs
+// any verb, so #1440's terminal glyph both mislabeled it and collided with the new open-terminal
+// icon; the Codev mark reads as "a generic Codev action" and needs no new artwork (#1444). The mark
+// is already monochrome white on the same viewBox we reuse, so it flows through the identical
+// trim → fit → composite pipeline as the glyphs.
+//
// FIT: the glyphs don't fill their authored 24×24 box (comment ≈ 18×17, terminal ≈ 20×16), and a
// transparent list icon needs far less padding than a rounded-key image. So we render the glyph,
// trim it to its true drawn bounding box, then scale that bbox to the SAME fill fraction the
@@ -26,6 +34,7 @@ import { tmpdir } from 'node:os';
const HERE = dirname(fileURLToPath(import.meta.url));
const PLUGIN = join(HERE, '..', 'com.cluesmith.codev.sdPlugin');
const FACE_TS = join(HERE, '..', 'src', 'face.ts');
+const BRAND_SVG = join(PLUGIN, 'icons', 'plugin.svg');
// name → the GLYPHS key in face.ts it renders from.
export const ICONS = [
@@ -33,6 +42,9 @@ export const ICONS = [
{ name: 'open-terminal', glyph: 'terminal' },
];
+// name → rendered from the brand mark in icons/plugin.svg instead of a face.ts glyph (#1444).
+export const BRAND_ICONS = [{ name: 'action' }];
+
const GLYPH_COLOR = '#ffffff';
const BG = '#1C2128'; // rounded-key ground, matching icons/action.png & siblings
const CORNER_RADIUS = 12; // measured from the existing 72px key images (scales with size)
@@ -72,6 +84,25 @@ function glyphSvg(inner) {
return ``;
}
+/**
+ * Pull the brand mark out of icons/plugin.svg: its single `` group (the white handshake path)
+ * and the SVG's viewBox. The opaque background `` is left behind, so the mark renders
+ * transparent — the same raster shape renderKey/renderList expect. Throws loudly if the mark's
+ * shape drifts, so a silent stale-icon build can't happen. Returns the group already white; unlike
+ * the glyphs it carries no `${c}` placeholder, so no recolor step is needed.
+ */
+export function extractBrandMark(svgSrc) {
+ const viewBox = svgSrc.match(/viewBox="([^"]*)"/);
+ const group = svgSrc.match(/]*>[\s\S]*?<\/g>/);
+ if (!viewBox || !group) throw new Error('brand mark: expected