open-design/craft
Vedank Vansia ee3ca5f4f0
refine typography-hierarchy craft docs — clarify edge cases and make lint measurable (#979)
* add typography-hierarchy and typography-hierarchy-editorial craft rules

Adds two layered craft files extending typography.md:

- typography-hierarchy.md: core hierarchy contract, vectors, failure modes,
  controlled violations, and lint checklist
- typography-hierarchy-editorial.md: editorial pacing, dramatic scale jumps,
  whitespace hierarchy, display tracking overrides, and editorial-specific lint

Both files are registered in craft/README.md with guidance on when to require them.
Includes a new editorial stack example showing the layered opt-in pattern.

Validation:
- pnpm guard: PASSED
- Universal craft knowledge (not brand-specific)
- Stable slugs: typography-hierarchy, typography-hierarchy-editorial
- No new dependencies or breaking changes

Passes craft additions lane per code-review-guidelines.md.

* wire typography base into editorial skills craft stack

All three editorial skills now require the complete layered stack:
  [typography, typography-hierarchy, typography-hierarchy-editorial, rtl-and-bidi]

The new hierarchy files (typography-hierarchy.md, typography-hierarchy-editorial.md)
explicitly extend typography.md and depend on its base contract (scale ranges,
tracking values, line-height guidance, weight system). Without typography in
requires[], the hierarchy rules arrive at runtime without their foundational
contracts, making them incomplete.

Skills updated:
- skills/blog-post/SKILL.md
- skills/docs-page/SKILL.md
- skills/digital-eguide/SKILL.md

This completes the craft injection for the editorial stack as documented in
craft/README.md and ensures both base typography and hierarchy extensions load
together at runtime.

* refine craft docs for clarity and edge cases

Address P2/P3 reviewer feedback:

- typography-hierarchy-editorial.md §4: Add script-aware exception for Arabic/Hebrew/Persian
  tracking (cursive joining breaks with negative letter-spacing; use scale/space instead)

- typography-hierarchy.md Controlled violations: Add concrete safeguards for 'information
  flow remains intact' (reading order, proximity grouping, single primary, quick scanability)

- typography-hierarchy-editorial.md §2 Whitespace: Qualify 'no divider' rule to allow
  separators for publication identity, not just space alone

- typography-hierarchy-editorial.md Anti-patterns: Add docs-page carve-out for 'UI chrome'
  (functional controls in code/API blocks are OK; decorative badges belong outside measure)

- typography-hierarchy-editorial.md Lint: Make checks measurable — display/deck ratio >=1.5x,
  section spacing ratio rules (one gap >=1.5x baseline, another <=1.2x), separator identity
  check, and explicit guidance markers for auditability

* address P1/P2/P3 reviewer feedback: RTL conflicts, script accuracy, tracking scope, measurability

P1 — RTL physical-direction conflicts:
  - typography-hierarchy-editorial.md: Change 'ragged right' to 'text-align: start with
    ragged inline-end' for RTL compatibility
  - Separators in RTL: Add note on logical directions (inline-start/inline-end)
  - skills/digital-eguide/SKILL.md: Replace 'cover left, spread right' with
    'inline-start/inline-end' and 'pinned right-side' with 'pinned to inline-end'

P2 — Script-group accuracy:
  - Split script groups correctly: Arabic/Persian/Urdu cursive-joining (letter-spacing 0);
    Hebrew is RTL but not cursive-joining

P2 — Tracking exception scope:
  - Extend script exception to pull-quote tracking row (was only on display)
  - Mark both as Latin-only with joining-script carve-out

P2 — Primary-count inconsistency:
  - Clarify 'one at a time per visual region' with explicit long-form pacing resets note

P3 — Measurable lint:
  - Replace vague 'meaningfully larger' with >=1.5x baseline rhythm OR one token scale step

P3 — Orphaned reference:
  - Fix cross-ref to 'typography.md §letter-spacing' (was §display tracking)

P3 — Markdown typo:
  - Fix backtick nesting in '1.6–1.7' line-height range

* fix: RTL logical 'ragged' wording; make digital-eguide pull-quote script-aware; align section-separators lint with prose

* fix(P2): include Persian/Urdu in pull-quote script exception; remove 'space' from section-separators lint

* fix: align pull-quote bullet indentation in digital-eguide SKILL.md

* fix: align digital-eguide pull-quote bullet nesting

* fix: use logical pull-quote alignment wording in editorial craft
2026-05-09 08:13:35 +08:00
..
accessibility-baseline.md feat(craft): accessibility-baseline module + opt-ins on dashboard, hr-onboarding, mobile-onboarding (#587) 2026-05-06 09:18:59 +08:00
animation-discipline.md feat(craft): animation-discipline module + opt-ins on mobile-app, mobile-onboarding, gamified-app (#515) 2026-05-05 18:32:30 +08:00
anti-ai-slop.md feat(craft): add brand-agnostic craft references + Refero-derived lint rules (#225) 2026-05-02 11:00:33 +08:00
color.md feat(craft): add brand-agnostic craft references + Refero-derived lint rules (#225) 2026-05-02 11:00:33 +08:00
form-validation.md craft: add form-validation so generated forms aren't stuck in 2018 RHF/Formik patterns (#625) 2026-05-06 20:09:30 +08:00
laws-of-ux.md feat: agent-callable research command and /search (#615) 2026-05-08 10:33:44 +08:00
README.md add typography-hierarchy and typography-hierarchy-editorial craft rules (#975) 2026-05-09 02:15:33 +08:00
rtl-and-bidi.md craft: add rtl-and-bidi so OD artifacts don't break for Arabic / Hebrew / Persian users (#595) 2026-05-06 12:43:48 +08:00
state-coverage.md feat(craft): state-coverage module + opt-ins on dashboard, mobile-app, kanban-board (#502) 2026-05-05 16:31:05 +08:00
typography-hierarchy-editorial.md refine typography-hierarchy craft docs — clarify edge cases and make lint measurable (#979) 2026-05-09 08:13:35 +08:00
typography-hierarchy.md refine typography-hierarchy craft docs — clarify edge cases and make lint measurable (#979) 2026-05-09 08:13:35 +08:00
typography.md feat(craft): add brand-agnostic craft references + Refero-derived lint rules (#225) 2026-05-02 11:00:33 +08:00

Craft references

Brand-agnostic craft knowledge. Each file is a small, dense rulebook on one dimension of professional UI craft (typography, color, motion, …). Skills opt into the references they need; the daemon injects only the requested ones into the system prompt above the active skill body.

Why a third axis next to skills/ and design-systems/

Axis Scope Example
skills/ Artifact shape saas-landing, dashboard, pricing-page
design-systems/ Brand visual language (the 9-section DESIGN.md) linear-app, apple, notion
craft/ Universal craft knowledge — true regardless of brand letter-spacing rules, accent-overuse caps, anti-AI-slop

DESIGN.md tells the agent which colors and fonts a brand uses. craft/ tells the agent the universal rules a competent designer applies on top — e.g. ALL CAPS always needs ≥0.06em tracking, regardless of the brand.

How a skill opts in

Add an od.craft.requires array to the skill's front-matter. Only the listed sections are injected, so a skill that needs only typography pays no token cost for color/motion content.

od:
  craft:
    requires: [typography, color, anti-ai-slop]

Use the layered stack for editorial skills that require authored hierarchy and sustained reading behavior:

od:
  craft:
    requires: [typography, typography-hierarchy, typography-hierarchy-editorial]

Allowed values match the file names in this directory minus the .md extension. Unknown values are silently ignored (forward-compatible).

Why silent fallback instead of fail-fast?

A skeptical reader will ask: "If a skill requests a planned-but-not-yet-vendored section and the corresponding file doesn't exist yet, shouldn't we warn the user?" We chose forward-compatibility over fail-fast: a skill authored today can list a planned slug and start benefiting the moment the matching craft/<slug>.md is vendored in a follow-up PR, with no skill edit needed. The cost of a missed reference is a missing paragraph in the system prompt, not a broken skill — so the loud failure mode is not worth the friction.

Note for skill authors arriving from older guidance: an earlier draft used motion as the future-slug placeholder. The shipped equivalent today is animation-discipline. Use that one if your skill emits motion.

Enforcement levels

Craft files mix auto-checked rules and guidance.

  • Auto-checked. Rules wired into apps/daemon/src/lint-artifact.ts — currently the P0 list in anti-ai-slop.md (Tailwind-indigo accent, two-stop hero gradients, emoji-as-icons, etc.). The linter reports these as findings back to the UI (for P0/P1 badges) and to the agent (as a system reminder for self-correction). Artifact persistence is not currently hard-blocked on P0 hits.
  • Guidance. The rest. The agent reads the rules, reviewers apply them, the linter doesn't check them.

A purely behavioral craft file (state-coverage, animation-discipline) is guidance unless a specific rule is later promoted into lint-artifact.ts.

Files

File Section name When to require
typography.md typography Any skill that emits typed content (~all skills)
typography-hierarchy.md typography-hierarchy Any skill that emits typed content where hierarchy must feel authored, not assembled — especially surfaces with a strong entry point, varied levels, or intentional rhythm. Compose with typography.
typography-hierarchy-editorial.md typography-hierarchy-editorial Skills whose primary artifact is a sustained reading surface: blog-post, docs-page, digital-eguide. Requires typography + typography-hierarchy.
color.md color Any skill that emits styled output (~all skills)
anti-ai-slop.md anti-ai-slop Marketing pages, landing pages, decks
state-coverage.md state-coverage Any skill with stateful UI (dashboards, mobile apps, forms, list/table views)
animation-discipline.md animation-discipline Any skill that ships motion: mobile apps, multi-screen flows, gamified UI, transitions, microinteractions
accessibility-baseline.md accessibility-baseline Any skill that ships interactive UI: dashboards, forms, mobile flows, anything with focus/labels/keyboard paths
rtl-and-bidi.md rtl-and-bidi Any skill that ships localized text or layout: blogs, docs, financial tables, mobile apps, anything that may render Arabic / Hebrew / Persian
form-validation.md form-validation Any skill whose primary artifact contains an interactive form: lead capture, sign-in, signup, settings, multi-step intake
laws-of-ux.md laws-of-ux Any skill whose composition decisions hit named cognitive limits: pricing pages (Hick's, Choice Overload, Von Restorff), dashboards (Pareto, Selective Attention, Working Memory), onboarding (Goal-Gradient, Zeigarnik, Peak-End), modals (Fitts's, Tesler's). Sibling axis to the rendering-rule files above — covers what to compose, not how to render.

Partial-stateful skills. A skill that's mostly static but contains an embedded form, data table, or query surface should opt in. State-coverage rules apply to the stateful component, not the whole page.

More sections (icons, craft-details) will be added in follow-up PRs as we wire the linter side.

Attribution

Craft content is adapted from the MIT-licensed refero_skill project (© Refero Design), with edits to fit Open Design's house style and link back to OD's design tokens (var(--accent) etc.) instead of generic Tailwind hex values.