docs(intel): unlock creative decisions across brand + design + assets specs
Adds brand-identity.md (Brief #1: name + blurb + creative slate). Rewrites design-system.md and assets-spec.md to flip aesthetic prescriptions into options while keeping Chrome MV3 / WCAG / icon-size floors as binding (marked (FLOOR) inline). Mokosh codename is the only locked decision; every other creative choice delegated to brand + design teams with explicit ownership annotations. Three-file intel pack now consistent: - brand-identity.md: brand-team primary (naming, voice, blurb) - design-system.md: design-team primary (palette, type, components) - assets-spec.md: design-team primary (deliverables + floors) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,12 +1,33 @@
|
||||
# Mokosh Asset Specification
|
||||
|
||||
Concrete deliverables list derived from `design-system.md`. Each entry tells a
|
||||
contributor (you, an agent, a hired designer) exactly what file to produce,
|
||||
what dimensions/format, what to draw, and where to commit it. Authored
|
||||
2026-05-17 to unblock Plan 01-09's notification-icon failure + Plan 01-10's
|
||||
welcome page.
|
||||
contributor (you, an agent, a hired designer) exactly what file to produce
|
||||
and where to commit it. **Path / dimensions / format / file-size floors / validation
|
||||
are technical constraints from Chrome and MV3 — those are floors.** Subject,
|
||||
colors, illustration choices, and aesthetic intent are open and owned by the
|
||||
design team.
|
||||
|
||||
Status: `draft` — first iteration; revise as actual designs surface.
|
||||
Authored 2026-05-17 to unblock Plan 01-09's notification-icon failure +
|
||||
Plan 01-10's welcome page. Status: `draft` — every aesthetic description below
|
||||
is a starting suggestion; the design team picks the actual direction per
|
||||
`brand-identity.md` + `design-system.md`.
|
||||
|
||||
---
|
||||
|
||||
## What's locked vs what's open in this file
|
||||
|
||||
| Cell | Status |
|
||||
|---|---|
|
||||
| **Path** | **FLOOR** — Chrome/manifest look at exact paths |
|
||||
| **Dimensions** | **FLOOR** — Chrome notification + extension APIs enforce |
|
||||
| **Format** (PNG/SVG) | **FLOOR** — Chrome API requirements per surface |
|
||||
| **Min file size** | **FLOOR** — Chrome `imageUtil` silent-rejection floors |
|
||||
| **Validation command** | **FLOOR** — these are the checks Chrome runs |
|
||||
| **Subject** | **OPEN** — design team picks the mark, motif, illustration |
|
||||
| **Color** | **OPEN** — per `design-system.md` palette direction |
|
||||
| **Style notes** | OPEN — engineering's sketch only |
|
||||
|
||||
Floors are non-negotiable. Everything else is direction the design team owns.
|
||||
|
||||
---
|
||||
|
||||
@@ -19,40 +40,40 @@ land its operator-empirical UAT until valid versions exist.
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Path** | `icons/icon16.png` (commit to source tree; vite copies to `dist/icons/` on build) |
|
||||
| **Dimensions** | 16 × 16 px |
|
||||
| **Format** | PNG, RGBA (transparent background), 8-bit |
|
||||
| **Min file size** | ≥ 200 bytes (current placeholder is 79 B — Chrome rejects it) |
|
||||
| **Subject** | The Mokosh mark per `design-system.md` §5.2. At 16px most detail is lost; produce as a single recognizable silhouette. |
|
||||
| **Color** | Single accent color OR transparent + accent. Recommended: a filled circle in `#212121` (near-black, neutral) for visibility on both light and dark Chrome themes. Adding the recording dot in `--mks-rec` makes this state-coloured, which conflicts with the "neutral mark + state via badge" decision (design-system §5.2). **Pick neutral.** |
|
||||
| **Path** **(FLOOR)** | `icons/icon16.png` (commit to source tree; vite copies to `dist/icons/` on build) |
|
||||
| **Dimensions** **(FLOOR)** | 16 × 16 px |
|
||||
| **Format** **(FLOOR)** | PNG, RGBA (transparent background), 8-bit |
|
||||
| **Min file size** **(FLOOR)** | ≥ 200 bytes (Chrome rejects below this) |
|
||||
| **Subject** *(OPEN — design team)* | Engineering currently ships a dark-square + green-dot placeholder. Design team picks the actual mark per `design-system.md` §5.3 — could be a recording-dot in a frame, a thread/spool motif, a wordmark fragment, an abstract glyph, or anything else. At 16 px most detail is lost; aim for a single recognizable silhouette. |
|
||||
| **Color** *(OPEN — design team)* | Engineering's placeholder uses neutral dark + accent green. Design team picks per palette direction. Note: if the team lands on "neutral mark + state via badge" (one of several options in `design-system.md` §5.2), the icon stays neutral across all states; if the team picks "per-state icon swaps", separate variants per state are needed (see Priority 2 A-06). |
|
||||
| **Where used** | Chrome menu bars, Extensions page list, autocomplete popup |
|
||||
| **Validation** | After committing: `npm run build && grep -q '"16"' dist/manifest.json && [ -s dist/icons/icon16.png ]` |
|
||||
| **Validation** **(FLOOR)** | `npm run build && grep -q '"16"' dist/manifest.json && [ -s dist/icons/icon16.png ]` |
|
||||
|
||||
### A-02 — `icons/icon48.png`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Path** | `icons/icon48.png` |
|
||||
| **Dimensions** | 48 × 48 px |
|
||||
| **Format** | PNG, RGBA, 8-bit |
|
||||
| **Min file size** | ≥ 500 bytes (current placeholder is 123 B) |
|
||||
| **Subject** | Same mark as A-01, more visible internal detail. The frame/ring around the dot can resolve at this size. |
|
||||
| **Color** | Same constraint: neutral. |
|
||||
| **Where used** | Chrome Extensions page (chrome://extensions card icon), some context menus |
|
||||
| **Validation** | `grep -q '"48"' dist/manifest.json && [ -s dist/icons/icon48.png ]` |
|
||||
| **Path** **(FLOOR)** | `icons/icon48.png` |
|
||||
| **Dimensions** **(FLOOR)** | 48 × 48 px |
|
||||
| **Format** **(FLOOR)** | PNG, RGBA, 8-bit |
|
||||
| **Min file size** **(FLOOR)** | ≥ 500 bytes |
|
||||
| **Subject** *(OPEN — design team)* | Same concept as A-01; this size carries more internal detail, so glyph elements that don't resolve at 16 px (frame, ring, secondary shape) can appear here. |
|
||||
| **Color** *(OPEN — design team)* | Same direction as A-01. |
|
||||
| **Where used** | Chrome Extensions page card icon, some context menus |
|
||||
| **Validation** **(FLOOR)** | `grep -q '"48"' dist/manifest.json && [ -s dist/icons/icon48.png ]` |
|
||||
|
||||
### A-03 — `icons/icon128.png`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Path** | `icons/icon128.png` |
|
||||
| **Dimensions** | 128 × 128 px (REQUIRED minimum for `chrome.notifications.create({type:'basic'})`) |
|
||||
| **Format** | PNG, RGBA, 8-bit |
|
||||
| **Min file size** | ≥ 1 KB (current placeholder is 306 B — silently rejected by `chrome.imageUtil` per the empirical finding) |
|
||||
| **Subject** | Full Mokosh mark, all detail visible. This is the primary brand asset. |
|
||||
| **Color** | Neutral mark; the badge layer adds state colour. |
|
||||
| **Where used** | Chrome Web Store thumbnail (someday), notification iconUrl (per `design-system.md` §8.2), about-extension dialogs |
|
||||
| **Validation** | `[ $(stat -c%s dist/icons/icon128.png) -gt 1024 ]` AND `chrome.notifications.create` succeeds in smoke without `imageUtil` error |
|
||||
| **Path** **(FLOOR)** | `icons/icon128.png` |
|
||||
| **Dimensions** **(FLOOR)** | 128 × 128 px (REQUIRED minimum for `chrome.notifications.create({type:'basic'})`) |
|
||||
| **Format** **(FLOOR)** | PNG, RGBA, 8-bit |
|
||||
| **Min file size** **(FLOOR)** | ≥ 1 KB (Chrome's `imageUtil` silently rejects smaller files per the Plan 01-09 empirical finding) |
|
||||
| **Subject** *(OPEN — design team)* | Primary brand asset — full mark, every detail visible. Design team has full latitude. |
|
||||
| **Color** *(OPEN — design team)* | Same direction as A-01/A-02. |
|
||||
| **Where used** | Chrome Web Store thumbnail (someday), notification `iconUrl`, about-extension dialogs |
|
||||
| **Validation** **(FLOOR)** | `[ $(stat -c%s dist/icons/icon128.png) -gt 1024 ]` AND `chrome.notifications.create` succeeds in smoke without `imageUtil` error |
|
||||
|
||||
---
|
||||
|
||||
@@ -62,86 +83,98 @@ land its operator-empirical UAT until valid versions exist.
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Path** | `icons/icon192.png` |
|
||||
| **Dimensions** | 192 × 192 px |
|
||||
| **Format** | PNG, RGBA, 8-bit |
|
||||
| **Min file size** | ≥ 2 KB |
|
||||
| **Subject** | Identical to A-03 at higher resolution; for hi-DPI displays in notification rendering |
|
||||
| **Status** | Optional but recommended. If skipped, A-03 (128px) is the fallback. |
|
||||
| **Path** **(FLOOR if shipped)** | `icons/icon192.png` |
|
||||
| **Dimensions** **(FLOOR if shipped)** | 192 × 192 px |
|
||||
| **Format** **(FLOOR if shipped)** | PNG, RGBA, 8-bit |
|
||||
| **Min file size** | ≥ 2 KB (suggested) |
|
||||
| **Subject** *(OPEN)* | Identical concept to A-03 at higher resolution for hi-DPI notification rendering |
|
||||
| **Status** | Optional. Skip if not producing hi-DPI variants; A-03 is the fallback. |
|
||||
|
||||
### A-05 — Welcome page hero mark (Plan 01-10)
|
||||
### A-05 — Welcome page hero (Plan 01-10)
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Path** | `src/welcome/hero.svg` (preferred — vector) OR `src/welcome/hero.png` (1024×512 fallback) |
|
||||
| **Format** | SVG (inline-safe, no external refs) OR PNG |
|
||||
| **Subject** | Lockup of the Mark + the wordmark "Mokosh" OR "AI Call Recorder". Type lockup at large scale. Per `design-system.md` §10 ODD-4, default is "type-only hero" if no illustration exists — in that case the SVG can be a stylized rendering of the wordmark alone. |
|
||||
| **Path** *(suggested)* | `src/welcome/hero.svg` (vector preferred) OR `src/welcome/hero.png` (≥ 1024 × 512 fallback) |
|
||||
| **Format** **(FLOOR)** | SVG (inline, no external refs **(FLOOR for CSP)**) OR PNG |
|
||||
| **Subject** *(OPEN — design team owns entirely)* | Could be wordmark-only lockup, mark + wordmark, illustrated scene, photographic backdrop, type-only treatment, video, or no hero at all (some welcome pages start with copy). Design team picks. |
|
||||
| **Used by** | `src/welcome/welcome.html` (Plan 01-10) |
|
||||
| **Status** | Required for Plan 01-10 closure. Acceptable interim: type-only HTML/CSS lockup (no asset file needed) |
|
||||
| **Status** | Required for Plan 01-10 closure IF the design team's welcome layout uses a hero. Acceptable interim: type-only HTML/CSS lockup (no asset file needed). |
|
||||
|
||||
---
|
||||
|
||||
## Priority 2 — refinement passes (future phases)
|
||||
|
||||
### A-06 — Status-glyph variants for badge composition
|
||||
### A-06 — Per-state icon variants (only if "per-state icon swaps" direction is picked)
|
||||
|
||||
The current architecture uses Chrome's badge API (text + background color) for
|
||||
state communication. If a future phase wants richer state indication (e.g. a
|
||||
recording-dot embedded in the toolbar icon itself, swapped via
|
||||
`chrome.action.setIcon`), we'd need per-state icon variants:
|
||||
`design-system.md` §5.2 lists two iconography directions:
|
||||
|
||||
| Variant | Dimensions | When used |
|
||||
- **Neutral mark + state via badge** (Chrome's `chrome.action.setBadgeBackgroundColor` does the state work) — only A-01/A-02/A-03 needed
|
||||
- **Per-state icon swaps via `chrome.action.setIcon`** — needs full sets per state
|
||||
|
||||
If the design team picks per-state swaps, the deliverables expand:
|
||||
|
||||
| Variant set | Dimensions | When used |
|
||||
|---|---|---|
|
||||
| `icons/icon-rec-16.png` etc. | 16/48/128 | When recording active (red dot overlay) |
|
||||
| `icons/icon-err-16.png` etc. | 16/48/128 | When in error state |
|
||||
| `icons/icon-off-16.png` etc. | 16/48/128 | When idle |
|
||||
| `icons/icon-rec-{16,48,128}.png` | 16/48/128 | When recording active |
|
||||
| `icons/icon-err-{16,48,128}.png` | 16/48/128 | When in error state |
|
||||
| `icons/icon-off-{16,48,128}.png` | 16/48/128 | When idle |
|
||||
|
||||
Recommendation: defer to Phase 5 hardening unless badge text proves insufficient.
|
||||
The performance cost of setIcon swaps every state change is non-trivial.
|
||||
Trade-off: visual richness vs. perf cost of `setIcon` swaps every state change.
|
||||
Design team weighs.
|
||||
|
||||
### A-07 — Popup polish
|
||||
### A-07 — Popup polish *(OPEN — defer)*
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Path** | `src/popup/popup-bg.svg` |
|
||||
| **Subject** | Optional subtle background pattern OR colour for popup container; currently popup uses solid `--mks-popup-bg-dark/light` |
|
||||
| **Status** | Skip; current solid background is fine |
|
||||
| **Path** *(suggested)* | `src/popup/popup-bg.svg` or similar |
|
||||
| **Subject** *(OPEN)* | Background pattern, gradient, illustration, or nothing (current placeholder is a solid color). |
|
||||
| **Status** | Defer until the design team picks popup direction. Solid background is the working placeholder. |
|
||||
|
||||
### A-08 — Operator runbook visuals (smoke.sh page enhancements)
|
||||
### A-08 — Operator runbook visuals (smoke-test page)
|
||||
|
||||
The smoke test page (in `smoke.sh`'s SMOKE_HTML) currently uses emoji and
|
||||
inline CSS. Could be replaced with a properly-designed instructional page if
|
||||
The dev smoke page (`smoke.sh`'s SMOKE_HTML) currently uses Unicode emoji and
|
||||
inline CSS. Could be replaced with properly-designed instructional visuals if
|
||||
operators actually use it for onboarding. Currently dev-only; defer.
|
||||
|
||||
---
|
||||
|
||||
## Implementation pathways for the contributor
|
||||
## Implementation pathways
|
||||
|
||||
Pick ONE based on availability:
|
||||
Pick ONE per asset:
|
||||
|
||||
### Path A — auto-generated solid-color placeholder set
|
||||
### Path A — auto-generated placeholders (engineering's current default)
|
||||
|
||||
**Use case:** quickly unblock Plan 01-09 closeout. Replace placeholders with
|
||||
real designed assets later.
|
||||
**Use case:** unblock Plan 01-09 closeout immediately. Designer-team assets
|
||||
swap in cleanly later. The currently committed placeholders in working tree
|
||||
were produced this way.
|
||||
|
||||
```bash
|
||||
# Quick generator using ImageMagick (one-liner per size)
|
||||
convert -size 16x16 xc:'#212121' -draw "fill #00C853 circle 8,8 8,4" icons/icon16.png
|
||||
convert -size 48x48 xc:'#212121' -draw "fill #00C853 circle 24,24 24,12" icons/icon48.png
|
||||
convert -size 128x128 xc:'#212121' -draw "fill #00C853 circle 64,64 64,32" icons/icon128.png
|
||||
# Example placeholder generator using ImageMagick (one-liner per size)
|
||||
convert -size 16x16 xc:'<bg-color>' -draw "fill <accent> circle 8,8 8,4" icons/icon16.png
|
||||
convert -size 48x48 xc:'<bg-color>' -draw "fill <accent> circle 24,24 24,12" icons/icon48.png
|
||||
convert -size 128x128 xc:'<bg-color>' -draw "fill <accent> circle 64,64 64,32" icons/icon128.png
|
||||
```
|
||||
|
||||
Produces dark-square + green-dot icons (~1 KB each). Functional, not branded.
|
||||
Engineering's current run used `'#212121'` background + `'#00C853'` accent
|
||||
(neither is direction — both are placeholder picks). Design team can either
|
||||
swap in branded assets per Path B/C, or rerun this command with different
|
||||
colors as a stepping-stone placeholder.
|
||||
|
||||
Produces dark-square + accent-dot icons (~1 KB each at 128 px). Functional,
|
||||
not branded.
|
||||
|
||||
### Path B — design-first
|
||||
|
||||
You produce the assets per the `design-system.md` constraints. Drop them at the
|
||||
spec'd paths. Run `npm run build`, smoke.sh, confirm notification fires.
|
||||
The design team produces the assets per `brand-identity.md` + `design-system.md`
|
||||
direction. Drop them at the spec'd paths. Run `npm run build`, smoke.sh,
|
||||
confirm notification fires.
|
||||
|
||||
### Path C — hire / commission
|
||||
|
||||
Send `design-system.md` + this file to a designer. Acceptance: deliverables at
|
||||
the listed paths, dimensions, formats, with file sizes above the floors.
|
||||
Send `brand-identity.md` + `design-system.md` + this file to an external
|
||||
designer. Acceptance: deliverables at the listed paths, dimensions, formats,
|
||||
with file sizes above the floors. The design team or product owner approves
|
||||
brand fit independently of engineering.
|
||||
|
||||
---
|
||||
|
||||
@@ -149,25 +182,23 @@ the listed paths, dimensions, formats, with file sizes above the floors.
|
||||
|
||||
Plan 01-09's operator UAT can resume when ALL of these are true:
|
||||
|
||||
- [ ] `icons/icon16.png` exists, ≥ 200 bytes, is 16×16 PNG
|
||||
- [ ] `icons/icon48.png` exists, ≥ 500 bytes, is 48×48 PNG
|
||||
- [ ] `icons/icon128.png` exists, ≥ 1024 bytes, is 128×128 PNG
|
||||
- [ ] `npm run build` mirrors them to `dist/icons/`
|
||||
- [ ] Smoke run: `chrome.notifications.create` does NOT throw `imageUtil` error
|
||||
- [ ] Recovery notification visibly appears after click "Stop sharing" in Chrome
|
||||
- [ ] `icons/icon16.png` exists, ≥ 200 bytes, is 16 × 16 PNG **(FLOOR)**
|
||||
- [ ] `icons/icon48.png` exists, ≥ 500 bytes, is 48 × 48 PNG **(FLOOR)**
|
||||
- [ ] `icons/icon128.png` exists, ≥ 1024 bytes, is 128 × 128 PNG **(FLOOR)**
|
||||
- [ ] `npm run build` mirrors them to `dist/icons/` **(FLOOR)**
|
||||
- [ ] Smoke run: `chrome.notifications.create` does NOT throw `imageUtil` error **(FLOOR)**
|
||||
- [ ] Recovery notification visibly appears after clicking "Stop sharing" in Chrome
|
||||
|
||||
Once those pass + Plan 01-09 Bug B fix (state routing for `user-stopped-sharing`
|
||||
→ `setIdleMode`) lands, the wave closes.
|
||||
Brand fit / design approval is a separate gate — owned by the design team and
|
||||
product, not blocking the functional Plan 01-09 closure.
|
||||
|
||||
---
|
||||
|
||||
## Related
|
||||
|
||||
- `design-system.md` — visual + interaction language this spec realises
|
||||
- `.planning/phases/01-stabilize-video-pipeline/01-09-PLAN.md` — the plan that
|
||||
surfaced the icon need
|
||||
- `.planning/debug/01-09-recovery-flow.md` — the debug session that confirmed
|
||||
the icon files are the blocker
|
||||
- `src/background/index.ts` lines 54, 833-840 — NOTIFICATION_ICON_PATH constant
|
||||
+ the chrome.notifications.create call site that needs valid icons
|
||||
- `manifest.json` `icons` and `action.default_icon` — declare which sizes exist
|
||||
- `brand-identity.md` — naming + blurb + creative slate (Brief #1)
|
||||
- `design-system.md` — visual + interaction language this spec realises (engineering sketch + technical floors)
|
||||
- `.planning/phases/01-stabilize-video-pipeline/01-09-PLAN.md` — the plan that surfaced the icon need
|
||||
- `.planning/debug/resolved/01-09-recovery-flow.md` *(when written)* — the debug session that confirmed the icon files are the blocker
|
||||
- `src/background/index.ts` lines 54, 833-840 — `NOTIFICATION_ICON_PATH` constant + the `chrome.notifications.create` call site that needs valid icons
|
||||
- `manifest.json` `icons` and `action.default_icon` — declare which sizes ship
|
||||
|
||||
Reference in New Issue
Block a user