oc-ux-engineer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited oc-ux-engineer (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
On first invocation, read `references/orchestrator.md` and follow its welcome protocol.
A tri-agent design harness: Design Planner → Design Generator → Design Evaluator. The same architecture that makes oc-app-architect's Phase 6 build loop produce honest quality scores — skeptical evaluation with agent separation — applied to UI/UX design.
Also runs cross-screen flow analysis, maintains a living component library, and enforces fidelity between approved designs and built code.
Works in two modes:
during UI-heavy oc-app-architect Phase 6 build sprints
UX ENGINEER COMMANDS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TRI-DESIGN HARNESS
/oc-uxe plan Run the Design Planner on a brief
/oc-uxe build Start or resume Design Generator → Evaluator loop
/oc-uxe eval Run the Design Evaluator ad-hoc on any artifact
MODULES
/oc-uxe flow Map and audit user flows across screens
/oc-uxe components View, update, or audit the living component library
/oc-uxe fidelity Compare built code against approved design artifacts
/oc-uxe dash Route data-heavy UI to oc-dash-forge for specialized design
APP-ARCHITECT PLUGIN
/oc-uxe attach Activate Design Evaluator for current oc-app-architect Phase 6 build session
/oc-uxe detach Deactivate Design Evaluator (code-only evaluation)
UTILITIES
/oc-uxe status Show current design state, scores, component coverage
/oc-uxe export Export component library as interactive HTML
/checkpoint Show checkpoint status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Type any command to begin. /oc-uxe to see this again.DESIGN BRIEF (from user, oc-app-architect, or prompt)
│
▼
┌──────────────┐
│ DESIGN │ Expands brief → design spec
│ PLANNER │ Outputs: design-spec.md, design-sprints.md
└──────┬───────┘
│
▼
┌──────────────────────────────────────────────┐
│ DESIGN BUILD LOOP (per sprint) │
│ │
│ ┌────────────┐ contract ┌─────────────┐ │
│ │ DESIGN │◄─negotiate──►│ DESIGN │ │
│ │ GENERATOR │ │ EVALUATOR │ │
│ │ │──artifact──►│ │ │
│ │ Builds │ │ Grades │ │
│ │ design │◄──feedback──│ (fresh eye)│ │
│ └────────────┘ └─────────────┘ │
│ │ │ │
│ │ PASS threshold? │ │
│ │ or max iters? │ │
│ └───────────────────────────┘ │
└──────────────────────────────────────────────┘
│
├──► Component Library (living artifact)
├──► Flow Map (cross-screen navigation)
└──► Design Tokens (source of truth)The same failure modes that plague code generation hit design even harder:
always think it "looks good." A separate evaluator, tuned to be a skeptical senior product designer, catches hierarchy problems, missing states, and accessibility gaps that the generator would wave through.
settling on one. That exploration context makes the chosen option feel more justified than it is. An evaluator that grades only from the spec and the artifact judges the output on its merits, not the journey.
the approved tokens (slightly different spacing, one-off colors). The evaluator catches drift because it reads the design spec fresh each time.
/oc-uxe dash)Some screens are primarily data display: dashboards, BI views, analytics, monitoring consoles, dense reports. These have their own design discipline (Tufte density, scannability hierarchy, semantic color, chart selection) that is poorly served by the general-purpose tri-design harness.
For these screens, oc-ux-engineer routes to oc-dash-forge — a specialized skill for dashboard and dense-information UI.
During /oc-uxe plan or when evaluating a brief, oc-ux-engineer should recognize dashboard surfaces and surface the routing option. Triggers:
.opchain/data-contracts/*.yaml)When detected, offer:
This screen looks data-heavy. Route design to oc-dash-forge?
oc-dash-forge specializes in:
- Exec / Ops / Analyst archetype branching
- Density tuning, semantic color, chart selection
- Working React prototype with archetype-appropriate viz stack (Tremor / Recharts / D3)
(Y) Route to oc-dash-forge
(N) Continue with oc-ux-engineer tri-design harness/oc-uxe dashUser can force routing with /oc-uxe dash [brief]. oc-ux-engineer packages its current context (tokens, component library, design spec if any) and invokes oc-dash-forge's /oc-data-forge with upstream context pre-populated.
Keep the work in oc-ux-engineer if:
Rule of thumb: if the screen IS the dashboard, route. If the screen CONTAINS a small data widget, handle it in oc-ux-engineer.
Navigation rule — top navigation only (hard rule, added 2026-10-07). Primary navigation on every surface — public sites, apps, admin and CRM shells, dashboards, docs — is a top bar / header. On phones the header keeps a menu button (or a bottom tab bar); the menu it opens is part of the top nav. A left or right sidebar or rail used as primary navigation is a regression and a blocking FAIL, no matter what the design direction, template, component library, reference app or prior version shows. Not covered (allowed): an in-page table of contents, filter panels, a record's detail side panel, a settings sub-menu inside a page. The only exception is the project owner's written approval for one named screen, recorded in the checkpoint's skill_state.nav_exceptions[] ({screen, date, quote}); it never carries over to another screen or a later redesign. An existing sidebar found in a project is a migration item on the punch list, not a pattern to copy.
In this skill: the Planner writes it into the spec's Constraints, the Generator never draws a sidebar, the Design Evaluator runs the Navigation gate before scoring, the Flow Audit and Fidelity modules check it, and /oc-uxe dash passes it to oc-dash-forge.
/oc-uxe plan)The Design Planner takes a brief and expands it into a design specification.
The Planner is an experienced design director. Key behaviors:
Commit to a direction and justify it.
source: oc-dash-forge and stop detailed design work for that screen — oc-dash-forge will own it.design-spec.md:
# Design Specification — [project]
## Design Direction
[2-3 sentences: mood, personality, visual philosophy]
[Reference: what existing products feel like this?]
## Design Tokens
### Colors
[Full palette: primary, secondary, accent, neutrals, semantic]
[Each with: hex, usage rule, contrast ratio]
### Typography
[Typefaces, type scale with sizes/weights, line heights]
### Spacing
[Base unit, spacing scale, container widths, grid]
### Surfaces
[Border radii, shadows, border colors]
## Component Inventory (planned)
[List every component needed, grouped by category]
[For each: expected variants, states, a11y requirements]
## Screen Inventory (planned)
[List every screen with route, purpose, key components]
## Interaction Patterns
[How things move: transitions, loading patterns, feedback]
[Gesture support: swipe, pull-to-refresh, long-press]
## Constraints
[Device targets, performance budgets, a11y requirements]
Navigation: top bar on every screen; no sidebar or rail as primary navigation
(Navigation Rule). List any recorded `nav_exceptions[]` here, or "none".design-sprints.md:
## Design Sprint 1: Foundation
Deliverables: Style book HTML, base component set
Definition of done: All tokens rendered, 6 base components with all states
## Design Sprint 2: Screens
Deliverables: Screen prototypes for primary flows
Definition of done: Clickable prototype covering auth + core action
## Design Sprint 3: Polish & Flows
Deliverables: Secondary screens, transitions, empty/error states
Definition of done: All screens from inventory, flow map completePresent the spec and sprint plan. Do NOT proceed until approved. Write checkpoint: phase "planned".
/oc-uxe build)For each design sprint, run the Generator → Evaluator loop.
Design Generator proposes a sprint contract:
## Design Sprint [N] Contract
### Deliverables
- [Specific artifacts to produce]
### Evaluation Criteria
1. [Criterion]: [How to verify — specific, measurable]
2. [Criterion]: [How to verify]
### Token Compliance
- All colors from approved palette
- All spacing from approved scale
- All typography from approved type scale
- No hardcoded valuesDesign Evaluator reviews and pushes back if:
Save contract to design/sprints/sprint-N/contract.md.
The Generator produces design artifacts against the contract:
Key Generator behaviors:
rail, even when a reference, template or the previous version used one (Navigation Rule)
The Design Evaluator runs in the same session as the Generator, so its separation is a discipline, not a mechanism: re-read the design spec and the contract, then grade the artifact from those alone — set aside the generator's exploration and decision process. For the Accessibility criterion, work through references/ux-audit-checklist.md (the same checklist oc-code-auditor's /oc-audit ux uses).
Navigation gate (blocking, runs before scoring). Open every screen in the artifact at 375 / 768 / 1280px. If any screen's primary navigation is a sidebar or rail (a persistent panel on the left or right edge holding the site/app sections), the verdict is ITERATE with the finding "sidebar navigation regression — move primary nav to the top bar", and Consistency is capped at 3/10. Scores cannot outvote this gate. Skip it only for a screen listed in nav_exceptions[].
Design Evaluator Criteria:
| Criterion | Weight | What it measures |
|---|---|---|
| Visual Hierarchy | 25% | Can the user instantly see what's most important? Z/F-pattern clear? Squint test passes? |
| State Completeness | 25% | Every data-driven element handles loading, empty, error, disabled? |
| Consistency | 25% | Similar elements identical? Tokens used everywhere? No one-off values? |
| Accessibility | 25% | Contrast ≥ 4.5:1, keyboard nav works, focus visible, semantic HTML, ARIA correct? |
Design Evaluator Persona:
The evaluator is a skeptical senior product designer who has shipped 50+ products. Key behaviors:
before you check anything else.
Loading? Failed? Disabled?" If any state is unhandled, that's a finding.
Cards match? Modals match? One inconsistency is a finding.
enough? Text readable without zooming? Key action reachable with one thumb?
from the design spec. Any hardcoded value is a FAIL on consistency.
"spacing scale followed consistently across 8 screens" or "3 different card shadow values — consolidate to 1."
Fight it. A 5/10 means "mediocre" and that's fine to give.
Evaluation Report saved to design/sprints/sprint-N/eval-round-M.md:
## Design Sprint [N] — Evaluation Round [M]
### Scores
- Visual Hierarchy: [X]/10 — [1-2 sentence justification]
- State Completeness: [X]/10 — [1-2 sentence justification]
- Consistency: [X]/10 — [1-2 sentence justification]
- Accessibility: [X]/10 — [1-2 sentence justification]
- **Weighted Score: [X]/10**
### Issues
1. [Specific issue: component, location, what's wrong, how to fix]
2. ...
### Token Compliance
- Colors: [X]/[Y] from palette ([list violations])
- Spacing: [X]/[Y] from scale ([list violations])
- Typography: [X]/[Y] from type scale ([list violations])
### Gaps vs Contract
1. [Criterion] — [PASS/FAIL] — [Evidence]
2. ...
### Verdict: PASS / ITERATE
[If ITERATE: specific, actionable feedback for the generator]ITERATE is this loop's name for a failed round. In attach mode (below) and in oc-app-architect's report the same outcome is written FAIL.
Write checkpoint after every round.
| Score | Meaning |
|---|---|
| 9-10 | Portfolio-quality — a design director would approve without notes |
| 7-8 | Solid — consistent, accessible, clear hierarchy, minor polish needed |
| 5-6 | Functional but generic — works without delight or distinction |
| 3-4 | Inconsistent — mixed patterns, missing states, a11y gaps |
| 1-2 | Broken — layout issues, unreadable text, unusable on mobile |
Max iterations per sprint: 3. Pass threshold: all criteria ≥ 6/10.
/oc-uxe flow)Maps every user journey and audits for coherence. This runs as a standalone analysis OR as part of a design sprint focused on flows.
## Flow Map — [project]
### Primary Flows
1. **Onboarding**: Landing → Signup → Verify → First-run → Dashboard
2. **Core action**: Dashboard → [feature] → Confirm → Success
3. **Auth**: Login → Dashboard | Logout → Landing
### Secondary Flows
4. **Settings**: Dashboard → Settings → [sub] → Save → Toast
5. **Error recovery**: Any → Error state → Retry / Navigate away
### Screen Inventory
| Screen | Route | Arrives from | Goes to | States |
|---|---|---|---|---|
| Landing | / | External, Logout | Login, Signup | default |
| Dashboard | /dashboard | Login, Onboarding | Feature, Settings | loading, empty, data, error || Check | What to Look For | Severity |
|---|---|---|
| Dead ends | No exit except browser back | HIGH |
| Orphan screens | Not reachable from navigation | HIGH |
| State loss | Form data lost on navigate away | MEDIUM |
| Back button | Goes somewhere unexpected | MEDIUM |
| Deep link | Screen requires prior nav state | MEDIUM |
| Missing confirmation | Destructive action without prompt | HIGH |
| Inconsistent nav | Different nav patterns across screens | HIGH |
| Sidebar navigation | Primary nav in a side bar or rail instead of the top bar (Navigation Rule) | BLOCKING |
| Loading waterfalls | Nested sequential loads | LOW |
| Score | Meaning |
|---|---|
| A | All flows complete, no dead ends, consistent nav, state preserved |
| B | Flows work, 1-2 minor gaps |
| C | Primary flows work, secondary have issues |
| D | Primary flows have problems |
| F | Critical flows broken or missing |
/oc-uxe components)A component registry that evolves with the build.
Stored in design/component-registry.json:
{
"project": "fieldkit",
"last_updated": "2026-04-03T10:00:00Z",
"tokens": {
"source": "design/style-book.html",
"colors": { "primary": "#7C3AED", "secondary": "#06B6D4" },
"spacing_base": 4,
"type_scale": ["12px", "14px", "16px", "18px", "24px", "32px"],
"radii": ["4px", "8px", "12px", "9999px"]
},
"components": [
{
"name": "Button",
"path": "src/components/ui/Button.tsx",
"category": "input",
"variants": ["primary", "secondary", "ghost", "destructive"],
"sizes": ["sm", "md", "lg"],
"states": ["default", "hover", "active", "focused", "disabled", "loading"],
"a11y": { "role": "button", "keyboard": "Enter/Space", "focus_visible": true },
"added_sprint": 1,
"last_modified_sprint": 2,
"status": "stable"
}
],
"coverage": {
"total": 24,
"all_states": 18,
"accessible": 20,
"responsive": 22,
"score": "75%"
}
}/oc-uxe components list Show all with status and coverage
/oc-uxe components add <name> Register a new component
/oc-uxe components audit Consistency check across all components
/oc-uxe components export Generate interactive HTML libraryChecks every registered component:
/oc-uxe fidelity)Compares approved design against built code.
| Design Artifact | Built Artifact | Check |
|---|---|---|
| Style book tokens | CSS variables / Tailwind config | Colors, spacing, type scale match |
| Wireframe layout | Page components | Zone placement, breakpoints |
| Punch list | Component inventory | Every item exists with all states |
| Flow map | Router + navigation | Every flow navigable, no dead ends |
| Navigation Rule | Layout / shell components | Primary nav is the header/top bar; no sidebar or rail shipped |
## Design Fidelity — [project]
### Token Fidelity: [X]%
### Layout Fidelity: [X]%
### Punch List Coverage: [X]%
- Missing: [list]
- Extra (scope creep): [list]
### Flow Fidelity: [X]%
- Broken: [list]
### Overall: [A-F]/oc-uxe attach)Adds Design Evaluator alongside Code Evaluator during UI sprints. Nothing attaches it automatically: oc-app-architect's Phase 6 Step 3 runs /oc-uxe attach on UI sprints, or the user does.
/oc-uxe attach during an oc-app-architect Phase 6 build session(sprints/sprint-N/eval-round-M.md)
## Sprint [N] — Evaluation Round [M]
### Code Scores
- Functionality: [X]/10
- Feature Completeness: [X]/10
- Code Quality: [X]/10
- Visual/UX Quality: [X]/10
- **Code Score: [X]/10**
### Design Scores
- Visual Hierarchy: [X]/10
- State Completeness: [X]/10
- Consistency: [X]/10
- Accessibility: [X]/10
- **Design Score: [X]/10**
### Combined Verdict: PASS / FAIL
[Both must pass; a Design Evaluator ITERATE counts as FAIL. Pass threshold for each
evaluator: every criterion ≥ 6/10.]Decide from contract keywords whether the sprint needs the Design Evaluator:
/oc-uxe attach on a sprint the keywords missed, or /oc-uxe detachproject-dir/
├── .checkpoints/
│ └── oc-ux-engineer.checkpoint.json
├── design/
│ ├── design-spec.md # Design Planner output
│ ├── design-sprints.md # Sprint plan
│ ├── style-book.html # Living style book
│ ├── component-registry.json # Component library data
│ ├── flow-map.md # Cross-screen flow map
│ └── sprints/
│ ├── sprint-1/
│ │ ├── contract.md
│ │ ├── eval-round-1.md
│ │ └── eval-round-2.md
│ └── sprint-2/
│ └── ...The shared checkpoint schema, write rules and resume protocol live in references/checkpoint-protocol.md, bundled with this skill. This section adds only what is specific to oc-ux-engineer.
{project-dir}/.checkpoints/oc-ux-engineer.checkpoint.json
| Event | What to Save |
|---|---|
| Design spec approved | phase: "planned", spec decisions |
| Sprint contract negotiated | step: "sprint-N-contract" |
| Generator produces artifact | step: "sprint-N-built" |
| Evaluator grades | step: "sprint-N-eval-M", scores |
| Sprint passes | Advance progress_table |
| Flow map generated | Flow data, coherence score |
| Component added/modified | Registry update |
| Fidelity check run | Fidelity scores |
| Attached to oc-app-architect Phase 6 | Session link |
{
"mode": "standalone",
"attached_to_app_architect": false,
"current_sprint": 2,
"total_sprints": 3,
"component_count": 24,
"component_coverage": "75%",
"flow_coherence": "B",
"last_fidelity_score": "82%",
"scores": {
"sprint-1": { "final": 8.1, "rounds": 2, "verdict": "PASS" },
"sprint-2": { "final": null, "rounds": 1, "verdict": null }
}
}| Reads from | Why |
|---|---|
| oc-app-architect | Style book, wireframes, punch list → baseline; Phase 6 sprint contracts → plugin mode context |
| oc-reverse-spec | Extracted design system → existing project baseline |
| oc-code-auditor | /oc-audit ux findings (component health) → avoid duplicating work |
| oc-dash-forge | dash-forge-handoff/tokens.ts → keep the living component library consistent |
| Read by | Why |
|---|---|
| oc-app-architect | Design scores → Phase 6 combined sprint verdict |
| oc-dash-forge | Design spec + tokens → constraints for dashboard tokens |
UI sprints have an extra grader (the Design Evaluator) that produces scores design teams care about. This section makes those scores visible in the PM tool. Every write follows oc-integrations-engineer and its runtime contract, oc-integrations-engineer/references/pm-mcp-protocol.md (tool names, retries, idempotency markers, pm_deferred_actions[]); record every ticket this skill files or comments on in the checkpoint's top-level pm_refs[].
After every Design Evaluator round on a UI sprint, post a structured comment:
Design eval — round {M}: {PASS / ITERATE (standalone) or FAIL (attached)}
Visual hierarchy: {X}/10
State completeness: {X}/10 (loading / empty / error / disabled — {N} of 4)
Consistency: {X}/10
Accessibility: {X}/10 (axe-core: {N} violations)
Top three findings:
1. {component} — {one-line finding}
...
Full report: design/sprints/sprint-{N}/eval-round-{M}.md
(attached mode: oc-app-architect's sprints/sprint-{N}/eval-round-{M}.md)Accessibility violations have higher escalation than other design findings — they're not subjective preferences and they have legal / compliance implications. The skill files axe-core CRITICAL or SERIOUS violations as sub-tickets parent-linked to the source PR ticket:
issue_type: bug.priority: highest tier for CRITICAL, high for SERIOUS.labels: a11y, severity:<critical|serious>,wcag:<criterion>.
assignee: remediation_owners.frontend when remediation_owners isset in .opchain/pm.yaml (an optional key — see oc-integrations-engineer's pm.yaml example); otherwise unassigned.
body: violation + offending selector + WCAG criterion +suggested fix from axe-core.
Lower-severity violations stay in the eval report only.
If /oc-uxe components audit finds drift (a new component using off-token colors or off-scale spacing), comment on the linked ticket:
Design-system drift detected:
- 3 new components use raw hex colors (should be tokens).
- 1 new spacing value off the 4/8/12/16 scale.
Action: refactor before merge, or accept as exception with rationale.The skill does not auto-block; the comment is the signal. Whether it's a block depends on team policy + the PR review process.
When oc-ux-engineer detects a dashboard surface and routes to oc-dash-forge, both skills' PM-MCP integrations coordinate: oc-ux-engineer adds a Routed to oc-dash-forge for {screen-name}; handoff bundle attached. comment, oc-dash-forge later appends its own design-spec + prototype comment to the same ticket. The thread reads end-to-end.
no a11y sub-tickets filed (we don't fabricate violations).
pm_deferred_actions[] (marker preserved, retriable per pm-mcp-protocol.md §4).
sets direction. Mixing these roles degrades all three.
is a finding, not a nice-to-have.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.