@3xhaust/oh-my-design 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +282 -0
  3. package/README.md +282 -0
  4. package/adapters/build.ts +184 -0
  5. package/adapters/claude.ts +111 -0
  6. package/adapters/codex.ts +68 -0
  7. package/adapters/tokens.ts +21 -0
  8. package/adapters/tool-map.json +7 -0
  9. package/bin/omd-install.ts +76 -0
  10. package/bin/omd.ts +1774 -0
  11. package/core/asset-sourcing/index.ts +187 -0
  12. package/core/coach/index.ts +98 -0
  13. package/core/composition/app-shell-workbench.md +168 -0
  14. package/core/composition/asymmetric-diagonal-grid.md +178 -0
  15. package/core/composition/bento-grid.md +223 -0
  16. package/core/composition/editorial-index-labels.md +173 -0
  17. package/core/composition/form-wizard-stepper.md +132 -0
  18. package/core/composition/master-detail-flow.md +129 -0
  19. package/core/composition/section-inversion.md +182 -0
  20. package/core/composition/sidebar-margin-annotation.md +184 -0
  21. package/core/composition/split-screen-hero.md +224 -0
  22. package/core/composition/sticky-sidebar-scroll.md +219 -0
  23. package/core/composition/typographic-hero.md +100 -0
  24. package/core/composition-contract/index.ts +233 -0
  25. package/core/composition-contract/visual-richness.ts +101 -0
  26. package/core/config/index.ts +27 -0
  27. package/core/copy/index.ts +296 -0
  28. package/core/craft/finish-pass.md +356 -0
  29. package/core/craft/index.ts +33 -0
  30. package/core/design/index.ts +581 -0
  31. package/core/design/interaction-states.ts +189 -0
  32. package/core/eval-harness/index.ts +225 -0
  33. package/core/evidence/final.ts +444 -0
  34. package/core/evidence/task.ts +459 -0
  35. package/core/figma/client.ts +312 -0
  36. package/core/figma/diff.ts +261 -0
  37. package/core/figma/responsive.ts +310 -0
  38. package/core/figma/system.ts +466 -0
  39. package/core/figma/types.ts +185 -0
  40. package/core/frame/check-ux.ts +180 -0
  41. package/core/frame/index.ts +39 -0
  42. package/core/frame/write.ts +168 -0
  43. package/core/graphics/css-illustration-primitives.md +189 -0
  44. package/core/graphics/duotone-image-presets.md +173 -0
  45. package/core/graphics/gradient-mesh.md +178 -0
  46. package/core/graphics/noise-grain-texture.md +150 -0
  47. package/core/graphics/placeholder-policy.md +185 -0
  48. package/core/graphics/svg-geometric-patterns.md +145 -0
  49. package/core/history/index.ts +39 -0
  50. package/core/install/detect.ts +32 -0
  51. package/core/install/install.ts +321 -0
  52. package/core/install/patch-claude.ts +109 -0
  53. package/core/install/patch-codex.ts +82 -0
  54. package/core/interaction/index.ts +101 -0
  55. package/core/interaction/recipes/signature-lighting.md +203 -0
  56. package/core/ir/dom.ts +352 -0
  57. package/core/ir/normalize.ts +177 -0
  58. package/core/motion/easing.md +151 -0
  59. package/core/motion/energy.ts +188 -0
  60. package/core/motion/recipes/image-hover-distortion.md +198 -0
  61. package/core/motion/recipes/magnetic-hover.md +229 -0
  62. package/core/motion/recipes/marquee.md +202 -0
  63. package/core/motion/recipes/number-counter.md +242 -0
  64. package/core/motion/recipes/page-loader.md +240 -0
  65. package/core/motion/recipes/parallax.md +233 -0
  66. package/core/motion/recipes/scroll-reveal.md +210 -0
  67. package/core/motion/recipes/section-color-inversion.md +217 -0
  68. package/core/motion/recipes/split-text-entrance.md +222 -0
  69. package/core/motion/recipes/stagger-orchestrator.md +227 -0
  70. package/core/motion/recipes/sticky-scene-transition.md +246 -0
  71. package/core/motion/recipes/view-transitions.md +239 -0
  72. package/core/probe/index.ts +186 -0
  73. package/core/probe/schema.json +46 -0
  74. package/core/protocol/composition-contract.md +192 -0
  75. package/core/protocol/copy-deck.md +96 -0
  76. package/core/protocol/human-design-loop.md +447 -0
  77. package/core/protocol/slop-review.md +71 -0
  78. package/core/ref/batch.ts +94 -0
  79. package/core/ref/blueprint.ts +199 -0
  80. package/core/ref/distance.ts +225 -0
  81. package/core/ref/invariants.ts +162 -0
  82. package/core/ref/signal.ts +37 -0
  83. package/core/ref/store.ts +122 -0
  84. package/core/render/index.ts +607 -0
  85. package/core/rules/attribution.ts +159 -0
  86. package/core/rules/builtin/contrast.yaml +8 -0
  87. package/core/rules/builtin/focus.yaml +8 -0
  88. package/core/rules/builtin/hit-area.yaml +8 -0
  89. package/core/rules/builtin/ko.yaml +6 -0
  90. package/core/rules/builtin/motion.yaml +80 -0
  91. package/core/rules/builtin/slop.yaml +365 -0
  92. package/core/rules/builtin/spacing.yaml +9 -0
  93. package/core/rules/builtin/system.yaml +42 -0
  94. package/core/rules/builtin/token.yaml +8 -0
  95. package/core/rules/builtin/ux.yaml +125 -0
  96. package/core/rules/engine.ts +88 -0
  97. package/core/rules/leakage.ts +72 -0
  98. package/core/rules/motion-spec.ts +204 -0
  99. package/core/site/index.ts +100 -0
  100. package/core/slop/index.ts +427 -0
  101. package/core/slop/text-slop.ts +220 -0
  102. package/core/source-seal/index.ts +174 -0
  103. package/core/stack/index.ts +53 -0
  104. package/core/target/index.ts +183 -0
  105. package/core/theory/color.md +285 -0
  106. package/core/theory/components.md +272 -0
  107. package/core/theory/craft.md +270 -0
  108. package/core/theory/expressive.md +213 -0
  109. package/core/theory/imagegen.md +105 -0
  110. package/core/theory/layout.md +159 -0
  111. package/core/theory/motion.md +283 -0
  112. package/core/theory/typography.md +134 -0
  113. package/core/theory/ux.md +580 -0
  114. package/core/theory/voice.md +595 -0
  115. package/core/types.ts +684 -0
  116. package/package.json +40 -0
  117. package/src/agents/composer.agent.yaml +174 -0
  118. package/src/agents/eye.agent.yaml +208 -0
  119. package/src/agents/framer.agent.yaml +52 -0
  120. package/src/agents/glance.agent.yaml +19 -0
  121. package/src/agents/hand.agent.yaml +200 -0
  122. package/src/agents/scout.agent.yaml +71 -0
  123. package/src/agents/sketch.agent.yaml +64 -0
  124. package/src/agents/typesetter.agent.yaml +52 -0
  125. package/src/agents/writer.agent.yaml +63 -0
  126. package/src/skills/omd-coach/SKILL.md +40 -0
  127. package/src/skills/omd-critique/SKILL.md +77 -0
  128. package/src/skills/omd-figma/SKILL.md +256 -0
  129. package/src/skills/omd-humanize/SKILL.md +160 -0
  130. package/src/skills/omd-scout/SKILL.md +77 -0
  131. package/src/skills/omd-ultradesign/SKILL.md +521 -0
@@ -0,0 +1,256 @@
1
+ ---
2
+ name: omd-figma
3
+ description: >-
4
+ Implement a Figma design end to end: pull the file, synthesize the design system,
5
+ build each frame pixel-faithfully with an iterative diff loop, match responsive
6
+ pairs, and ship with a fidelity report. Use when a figma.com link is present in
7
+ the brief — the design decisions were already made in Figma; the job here is
8
+ faithful implementation and systematization, not concept invention.
9
+ Triggers: 피그마, figma link, 피그마 그대로 구현, any figma.com URL in the brief.
10
+ ---
11
+
12
+ # omd-figma
13
+
14
+ When Figma exists, the design is already decided. The frame/concept/reference steps
15
+ of the design loop are not needed — someone made those choices, and they are visible
16
+ in the file. The job here is different: read what was designed, build it faithfully,
17
+ systematize it so the implementation can be maintained, and tell the user honestly
18
+ how close the build got.
19
+
20
+ The slop linter still runs. If the *original Figma design* fires slop rules, report
21
+ that to the user as information — never silently "fix" their design. The user hired
22
+ a faithful implementation, not a corrected one.
23
+
24
+ ---
25
+
26
+ ## Before anything: check the environment and the token
27
+
28
+ ```bash
29
+ omd doctor
30
+ ```
31
+
32
+ Run `omd doctor` first, quietly. If any check fails, surface the failure in one
33
+ sentence and stop. A missing Playwright installation or an unwritable `.omd/` will
34
+ break every subsequent step, and discovering that mid-loop is wasteful.
35
+
36
+ `omd figma pull` requires a Figma personal access token. This is the **one allowed
37
+ user interaction** in the skill. Check for it before pulling:
38
+
39
+ ```bash
40
+ echo $FIGMA_TOKEN
41
+ ```
42
+
43
+ If `FIGMA_TOKEN` is absent, tell the user exactly how to create one and where to set
44
+ it, then stop:
45
+
46
+ > To use `omd-figma`, you need a Figma personal access token.
47
+ >
48
+ > 1. Open Figma → **Account settings** (your avatar, top-left) → **Security** tab.
49
+ > 2. Under **Personal access tokens**, click **Generate new token**.
50
+ > Scopes: **File content** (read) is sufficient.
51
+ > 3. Copy the token and set it in your shell:
52
+ > ```bash
53
+ > export FIGMA_TOKEN=figd_...
54
+ > ```
55
+ > To persist it, add that line to `~/.zshrc` or `~/.bashrc`.
56
+ > 4. Then re-run the skill.
57
+
58
+ Do not attempt to proceed without the token. Do not invent a workaround.
59
+
60
+ ---
61
+
62
+ ## 1. PULL — read the Figma file
63
+
64
+ ```bash
65
+ omd figma pull <figma-url>
66
+ ```
67
+
68
+ This writes `.omd/figma/snapshot.json` — the normalized page → frame → node tree —
69
+ and prints a page/frame inventory so the implementer can see what they are building.
70
+ The snapshot includes a `responsive` section: frames grouped into breakpoint sets by
71
+ the name-suffix and structure-similarity heuristics. Read this section before
72
+ building. It is the answer to "which frames go together."
73
+
74
+ The pull also computes responsive pairs (F4). Read the `responsive.breakpointSets`
75
+ section to understand which frames are desktop/tablet/mobile variants of the same
76
+ screen. Unpaired frames are in `responsive.unmatched` — they will fall back to the
77
+ dual-viewport rule (build once, diff at the frame's own width; record that the
78
+ pairing was a fallback).
79
+
80
+ ---
81
+
82
+ ## 2. SYSTEM — design system before any frame
83
+
84
+ ```bash
85
+ omd figma system
86
+ ```
87
+
88
+ This reads the snapshot and writes two artifacts:
89
+ - `.omd/figma/design-system.md` — color palette, type scale, spacing, radii,
90
+ shadows, and the component inventory as a human-readable table.
91
+ - A `:root` CSS file with all tokens as custom properties, ready to paste into
92
+ the build's stylesheet.
93
+
94
+ **Build the design system before any frame.** Components with variants become React
95
+ components (when the project is React) or standalone CSS classes with modifier
96
+ variants. Build each component set once; every frame that uses it is an instance,
97
+ not a copy. A component that appears in three frames is implemented three times
98
+ only if you did not read the inventory.
99
+
100
+ Record the component decisions:
101
+
102
+ ```bash
103
+ omd decision "Button component: 3 variants (Size=sm/md, State=default/hover)" \
104
+ --why "component set from snapshot; variant props map directly to CSS modifiers"
105
+ ```
106
+
107
+ ---
108
+
109
+ ## 3. BUILD LOOP — per-frame, pixel-faithful, max 4 iterations
110
+
111
+ For each frame in the inventory (name-matched responsive pairs count as one build
112
+ target with multiple viewports):
113
+
114
+ **① Build the frame** — using the design system tokens from step 2, not hardcoded
115
+ values. Every color is a `var(--color-*)`, every spacing is a `var(--spacing-*)`,
116
+ every radius is a `var(--radius-*)`.
117
+
118
+ **② Diff**
119
+
120
+ ```bash
121
+ omd figma diff <frame-id> <rendered-page> --json
122
+ ```
123
+
124
+ Read the `cells` array. Find the worst cells (highest `mismatch`). The cell
125
+ coordinates are in the reference image's pixel space — they tell you *where* the
126
+ divergence is, not just how much.
127
+
128
+ **③ Fix** — address the worst cells. Typical causes: wrong component size, wrong
129
+ spacing token, missing border, wrong font weight. Fix the specific region the diff
130
+ named; do not guess.
131
+
132
+ **④ Re-diff** — repeat until `score ≥ 0.97` or the iteration ceiling is reached.
133
+
134
+ **Ceiling: 4 iterations per frame.** After 4, record the final score and move on.
135
+ A frame that reaches the ceiling with score < 0.97 is not a failure of the loop —
136
+ it is honest data. The fidelity report will show it.
137
+
138
+ Record each frame's final score:
139
+
140
+ ```bash
141
+ omd decision "Hero frame: final score 0.983 (3 iterations)" \
142
+ --why "font rendering divergence on large display text; within antialiasing tolerance"
143
+ ```
144
+
145
+ ---
146
+
147
+ ## 4. RESPONSIVE — paired frames, honest fallbacks
148
+
149
+ For each breakpoint set in `responsive.breakpointSets`:
150
+ - Build each variant at its own viewport width.
151
+ - Diff each variant against its own Figma export (the diff tool renders at the
152
+ frame's declared width).
153
+ - Report scores per variant in the fidelity table.
154
+
155
+ For frames in `responsive.unmatched` (no Figma-side viewport partner):
156
+ - Apply the dual-viewport rule: build once, render at 1280px and 375px, check both,
157
+ record that the responsive pairing was a **fallback** (no Figma reference for the
158
+ missing viewport).
159
+ - The fallback is not a gap in the implementation — it is an honest statement that
160
+ the design did not specify a mobile layout, and the build interpolated one.
161
+
162
+ ```bash
163
+ omd decision "Contact page: no mobile variant in Figma — dual-viewport fallback applied" \
164
+ --why "responsive.unmatched; mobile layout interpolated from desktop, not diffed"
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 5. SLOP CHECK — the original design, honestly reported
170
+
171
+ After all frames are built, run the slop linter on each page:
172
+
173
+ ```bash
174
+ omd check <page> --category slop --json
175
+ ```
176
+
177
+ If the slop linter fires on findings that trace back to the original Figma design
178
+ (the indigo gradient that was in Figma, the three identical feature cards that were
179
+ in the design), **report them to the user as information, not corrections**:
180
+
181
+ > The original Figma design has these slop findings: `SLOP-GRADIENT` (hero
182
+ > background), `SLOP-TRIPLE-CARD` (features section). The build implements the
183
+ > design as specified. If you want these addressed, update the Figma file and
184
+ > re-pull, or override them with a written reason.
185
+
186
+ Never silently "fix" the design. The user's Figma file is the source of truth.
187
+
188
+ If findings arise from the *implementation* (a gradient the build introduced that
189
+ was not in the Figma file), fix them — those are build errors, not design choices.
190
+
191
+ ---
192
+
193
+ ## 6. SHIP — fidelity report, attribution, deliver
194
+
195
+ Run the full check suite:
196
+
197
+ ```bash
198
+ omd check <page> --json --viewport 1280x800
199
+ omd check <page> --json --viewport 375x812
200
+ ```
201
+
202
+ Then deliver the working implementation plus a fidelity report table. The table is
203
+ not a decoration — it is the honest record of how close the build got to the design.
204
+
205
+ **Fidelity report format:**
206
+
207
+ | Frame | Viewport | Score | Iterations | Notes |
208
+ |---|---|---|---|---|
209
+ | Hero | 1440px (desktop) | 0.983 | 3 | Font AA delta on display heading |
210
+ | Hero | 375px (mobile) | 0.978 | 2 | — |
211
+ | Features | 1440px | 0.997 | 1 | — |
212
+ | Contact | 1440px | 0.965 | 4 | Ceiling reached; map embed diff |
213
+ | Contact | 375px | — | — | Fallback: no Figma mobile frame |
214
+
215
+ Include the attribution map. The frame IDs are the sources. `.omd/attribution.md`
216
+ should record which Figma frame each token group was extracted from:
217
+
218
+ ```
219
+ | Decision | Source | Reason |
220
+ |---|---|---|
221
+ | --color-bg: #ffffff | snapshot frame:1:2 (Hero) | dominant fill, luminance=1 |
222
+ | --type-scale-1: 48px | snapshot frame:1:2 (Hero) | display heading fontSize |
223
+ | Button component | component set "Button" | variant matrix from system step |
224
+ ```
225
+
226
+ Everything lands in `.omd/figma/` and `.omd/attribution.md`, committed with the repo.
227
+
228
+ ---
229
+
230
+ ## Relationship to omd-ultradesign
231
+
232
+ When a Figma file is in the brief, the design decisions — concept, colour, type,
233
+ layout — were made in Figma. The ultradesign loop's frame/concept/reference steps
234
+ (steps 1–3) are not needed and should not run. Hand off here.
235
+
236
+ The discipline of the ultradesign loop that *does* carry over:
237
+ - The slop linter runs. If the original design fires findings, report them honestly.
238
+ - Attribution is tracked. Frame IDs are the source entries.
239
+ - Motion: if the Figma file includes motion prototyping, read it and record a
240
+ `.omd/motion-spec.md`; if not, the motion decision falls to the implementer and
241
+ must be recorded.
242
+
243
+ ---
244
+
245
+ ## Constraints
246
+
247
+ - **Never ask the user for the token twice.** If it was set, `$FIGMA_TOKEN` is there.
248
+ - **Never fix the original design silently.** Report slop findings that trace back
249
+ to Figma; let the user decide.
250
+ - **Never hardcode a hex value from the snapshot.** Use `var(--color-*)` from the
251
+ design system output.
252
+ - **Never copy a component implementation across frames.** Build it once, use it
253
+ everywhere.
254
+ - **Never stop the loop before running the diff.** An unverified build is not a
255
+ faithful implementation — it is a guess.
256
+ - **Never claim a score you did not measure.** Read the diff output; do not estimate.
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: omd-humanize
3
+ description: >-
4
+ Rewrite chat, assistant replies, UI copy, pages, essays, and documentation into natural,
5
+ situation-aware discourse without changing facts. Repairs mechanical prose locally or
6
+ reconstructs a misshapen message from verified facts and its voice contract.
7
+ Triggers: humanize, 사람같이, 사람처럼 써, AI티 빼줘, 자연스럽게 바꿔, 글 다듬어,
8
+ make it sound human, de-AI, rewrite naturally.
9
+ ---
10
+
11
+ # omd-humanize
12
+
13
+ Natural writing is not text with detector bait removed. It is a person, in a specific
14
+ situation, trying to change what a specific listener knows, feels able to do, or does next.
15
+ Edit that discourse. Do not optimize for detector evasion, add mistakes, imitate a person,
16
+ or manufacture quirky rhythm.
17
+
18
+ ## Hard laws
19
+
20
+ 1. **Freeze the evidence.** Preserve facts, numbers, names, verified claims, uncertainty,
21
+ and verbatim quotations. Never invent a promise, comparison, emotion, motive, personal
22
+ experience, customer, result, or degree of certainty. If an exact quote cannot stay
23
+ verbatim, remove it; never paraphrase it as a quote.
24
+ 2. **Preserve the job and register.** Chat remains dialogue, a support reply remains
25
+ support, an essay remains an essay, and documentation remains documentation. Formality,
26
+ language, accessibility needs, and the requested genre do not drift toward generic
27
+ marketing voice.
28
+ 3. **Edit the smallest coherent discourse unit.** Repair a sentence, exchange, paragraph,
29
+ or section that has one communicative job. Do not perform token-by-token synonym swaps;
30
+ they preserve the broken logic while making factual drift harder to see.
31
+ 4. **Do the requested work.** The first useful sentence carries the answer, decision, or
32
+ next action. Do not announce an answer before giving it, substitute an offer of help for
33
+ the help, or continue after the communicative job is complete.
34
+
35
+ ## Required input contract
36
+
37
+ Identify these before rewriting:
38
+
39
+ - **Speaker** — who is speaking and what authority they have;
40
+ - **Listener** — who needs this and what context they already share;
41
+ - **Situation** — what just happened or prompted the message;
42
+ - **Intended change / next move** — what should become clearer or possible;
43
+ - **Genre and register** — chat reply, UI state, landing page, essay, tutorial, policy,
44
+ support response, or another named form, including language and formality;
45
+ - **Facts and quotes** — the allowed factual ledger, uncertainty, and exact quotations.
46
+
47
+ In an OMD run, derive this contract from `.omd/copy-deck.md`: Voice contract `Audience`,
48
+ `Language`, and `Register`, then each surface's `Main message`, `Supporting fact`, `Next
49
+ action`, and `Claim refs`. Only `verified` facts may support shipped claims. `open` and
50
+ `fixture` facts cannot ship. When speaker, listener, situation, intent, genre, register,
51
+ fact status, or quote status is missing, return the gap to `omd-writer`; do not guess.
52
+
53
+ ## Choose one mode
54
+
55
+ ### Mode A — local repair
56
+
57
+ Use local repair when the message already has a sound order: it answers the right question,
58
+ each section has a distinct job, and the next move is clear. Rewrite only the smallest unit
59
+ whose wording blocks that job. Typical repairs make the actor and action concrete, move a
60
+ caveat next to its claim, remove a redundant restatement, or replace translation-shaped
61
+ nominalization with a direct verb while preserving register.
62
+
63
+ ### Mode B — reconstruct from facts
64
+
65
+ Use reconstruction only when the prompt has shaped the discourse itself: the response
66
+ mirrors the request instead of answering it, explains its own plan before acting, repeats
67
+ the same proposition under symmetrical headings, or buries a simple next move under
68
+ exhaustive framing. Patching sentences cannot repair that order.
69
+
70
+ Discard the generated outline, not the evidence. Rebuild from the verified fact ledger,
71
+ voice contract, and the surface's real action/state. For non-OMD conversation, rebuild only
72
+ from the supplied facts and established conversational context. Preserve every honest
73
+ unknown. Never import a new claim merely to make the reconstruction sound complete.
74
+
75
+ ## Diagnose the discourse, not isolated tokens
76
+
77
+ These are contextual root causes. A word or structure is not a verdict by itself.
78
+
79
+ - **Ceremonial acknowledgement** delays the payload with thanks, praise, or agreement that
80
+ changes nothing. Keep acknowledgement when relationship repair, support, or a sensitive
81
+ event genuinely requires it; make it specific and brief.
82
+ - **Request echo** repeats what the listener just said. Restatement is useful when confirming
83
+ a dangerous, ambiguous, legal, or multi-step instruction; otherwise answer directly.
84
+ - **Answer narration** describes what the reply will cover before covering it. Tutorials and
85
+ long reference documents may need a map; a simple question does not.
86
+ - **Deferred service** offers to investigate, draft, or help when the speaker can perform
87
+ that work now. Ask a question only for a real gap that changes the result.
88
+ - **Scale mismatch** gives a taxonomy, lecture, or caveat wall to a small practical request.
89
+ Legal, medical, security, and safety-critical material may need explicit limits; place
90
+ each limit beside the claim it qualifies.
91
+ - **Redundant recap** repeats a proposition in the title, opening, bullets, conclusion, or
92
+ CTA without adding a decision. Recap is legitimate in long tutorials, handoffs, and
93
+ accessibility-oriented instructions when it supports recall or safe completion.
94
+ - **Performed empathy** names an emotion the speaker cannot know or uses a stock sympathy
95
+ line. Support writing may acknowledge an observed consequence; do not invent the person's
96
+ feelings.
97
+ - **Template geometry** forces equal headings, matching paragraph sizes, repeated triads,
98
+ or balanced contrast clauses onto ideas that do not have equal weight. Keep lists and
99
+ parallel structure when the content is genuinely enumerable or comparable.
100
+ - **Abstract agency** hides the actor and action inside nouns, passive layers, or
101
+ translation-shaped phrasing. Restore a concrete subject and verb unless the genre needs
102
+ the actor omitted for legal, scientific, or procedural precision.
103
+ - **Automatic closing** adds a generic invitation after the answer is already complete.
104
+ Keep a closing action only when the listener needs a real escalation route or next step.
105
+
106
+ ## Language and surface judgment
107
+
108
+ For Korean, choose the speech level from the genre and voice contract, then hold it. Product
109
+ copy often uses 해요체 or 합니다체; essays, developer notes, dialogue, legal text, and quoted
110
+ speech may require different registers. Treat repeated literal subjects, stacked particles,
111
+ translation-shaped passive forms, connective punctuation, and nominal padding as symptoms
112
+ only when they make this speaker sound unnatural in this situation. Korean connectives can
113
+ carry real logic; do not delete them mechanically.
114
+
115
+ For English, inspect hedging stacks, abstract nouns, formulaic openings, symmetrical contrast,
116
+ and reflexive politeness in context. A policy caveat, support acknowledgement, or tutorial
117
+ signpost may be doing necessary work. Keep it when removing it would reduce truth, safety,
118
+ orientation, or care.
119
+
120
+ UI copy is action/state language: say what happened, what remains true, and what the person
121
+ can do next. Assistant dialogue uses established context and answers at the listener's
122
+ altitude. Essays may retain unresolved thought and a personal cadence only when the supplied
123
+ speaker genuinely owns that experience. Documentation favors stable terminology,
124
+ prerequisites, and scan paths over conversational warmth.
125
+
126
+ ## Rewrite procedure
127
+
128
+ 1. Write the six input-contract fields. Mark unknowns; do not fill them creatively.
129
+ 2. Extract a factual ledger before editing. Include exact numbers, proper nouns, claim
130
+ status, uncertainty, and quotes.
131
+ 3. State the message's single job and the next move. Choose local repair or reconstruction.
132
+ 4. Rewrite in the chosen genre. Put the payload first, keep each proposition once, and place
133
+ evidence or caveats beside the claim they support.
134
+ 5. Compare the result against the factual ledger. Any added, removed, strengthened, or
135
+ weakened proposition is a failure. Quotes are byte-for-byte unchanged or absent.
136
+ 6. Read aloud for speaker/listener fit. Repair only genuine friction; do not add artificial
137
+ sentence-length variation or deliberate roughness.
138
+ 7. Stop when the job is done.
139
+
140
+ ## OMD ownership and invalidation
141
+
142
+ `omd-humanize` diagnoses and proposes a rewrite; it does not bypass the copy owner. Only
143
+ `omd-writer` changes `.omd/copy-deck.md`. After the writer's revision, run `omd copy --check`,
144
+ then `omd-hand` synchronizes production source and rerenders. A changed shipped line, claim,
145
+ or action invalidates the affected blind copy review and typography proof. Rerun the relevant
146
+ proof instead of carrying an earlier approval forward.
147
+
148
+ ## Acceptance
149
+
150
+ - The first useful sentence carries the payload.
151
+ - Title, body, and CTA do not repeat the same proposition.
152
+ - A concrete actor performs a concrete action where the genre permits it.
153
+ - Caveats and uncertainty remain honest and sit beside the claims they qualify.
154
+ - The next move is explicit when one exists; there is no empty closing offer.
155
+ - The text sounds natural when read aloud without manufactured rhythm or fake quirks.
156
+ - The factual-ledger diff is clean, and every shipped OMD claim still cites `verified` facts.
157
+
158
+ Return the rewritten result by default. Do not lead with a violation inventory. Provide a
159
+ brief audit only when the user requests one or when filling the durable Humanize audit in
160
+ the copy deck.
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: omd-scout
3
+ description: >-
4
+ Build a measured reference board without designing anything: whole pages for feel,
5
+ tight selectors for component anatomy, typography studies, motion studies, image refs
6
+ for the unrenderable. Use when the user asks for references, inspiration, benchmarks,
7
+ or "how do good sites do X" — standalone, before or without a build.
8
+ Triggers: 레퍼런스 찾아줘, 레퍼런스 수집, 참고 사이트, 벤치마킹, find references,
9
+ inspiration board, how do other sites do.
10
+ ---
11
+
12
+ # omd-scout
13
+
14
+ A reference board, measured instead of pinned. This skill collects evidence and names
15
+ transferable principles; it does not design or implement the result.
16
+
17
+ Spawn `omd-scout` with the concept (ask one short question only when neither the request nor
18
+ `.omd/frame.md` supplies one), the component inventory, working directory, and user URLs.
19
+ User URLs are captured first and marked `--from-user`.
20
+
21
+ ## Coverage contract
22
+
23
+ Build for decision coverage, not capture counts. Before searching, list the decisions the
24
+ later design must make and the components it must support. The board is complete only when
25
+ it contains useful, non-duplicate evidence for every applicable category:
26
+
27
+ - domain conventions and user expectations;
28
+ - direct competitors and meaningful alternatives;
29
+ - first-party or user/community language;
30
+ - typography and voice;
31
+ - motion when the concept or interaction actually needs it;
32
+ - every required component or state whose anatomy is uncertain.
33
+
34
+ There is no minimum query count, capture quota, famous-site quota, or mandatory award
35
+ gallery. A small board with complete, independent evidence is better than a large gallery of
36
+ near-duplicates. If a category is irrelevant, record why. If evidence remains weak or
37
+ contradictory, report the gap and uncertainty instead of filling a slot with decoration.
38
+
39
+ Use the narrowest useful capture:
40
+
41
+ ```bash
42
+ omd ref add <user-url> --as <name> --from-user
43
+ omd ref add <url> --as <name>
44
+ omd ref add <url> --as <name> --selector ".component"
45
+ omd ref add <url> --as <name> --selector ".component" --blueprint
46
+ omd ref add <image-url> --as <name> --image
47
+ omd ref principles <url> --as <name> --add "..."
48
+ omd ref list
49
+ ```
50
+
51
+ Whole-page captures establish rhythm or product feel; tight selectors establish component
52
+ anatomy; type and motion studies establish measured behavior; image references support only
53
+ what cannot be rendered. A blueprint is allowed only for an explicitly requested exact
54
+ component transplant or a structurally equivalent component problem. Structure may
55
+ transfer; skin and pixels do not.
56
+
57
+ ## Evidence quality and contamination
58
+
59
+ Prefer first-party product sources and direct user/community evidence over SEO summaries.
60
+ Label source trust, uncertainty, and whether evidence is independent or derivative. Reject
61
+ a non-user source with two or more slop signals. Keep a user-provided contaminated source
62
+ only as a named anti-reference. Drop kin at similarity `>= .85`; a cluster of related pages
63
+ is one evidence family, not independent corroboration. A blocked page is not retried; use an
64
+ honest image/discourse fallback or discard it.
65
+
66
+ Every retained capture records:
67
+
68
+ - the decision or coverage gap it answers;
69
+ - measured invariants and the reason they matter;
70
+ - what contradicts the concept;
71
+ - source trust and uncertainty;
72
+ - the token, component, motion, voice, or composition question it may inform.
73
+
74
+ Never describe a page for imitation, show reference screenshots to the builder, copy visual
75
+ skin, or turn award status into evidence. Hand off measurements, principles, contradictions,
76
+ coverage gaps, and trust. Raw captures remain under `.omd/refs/`; downstream agents receive
77
+ only the sanitized evidence summary required for their decision.