Install any skill in seconds. Free to start, no credit card required.
Get Started Free →프로젝트 DESIGN.md를 UI/시각 작업의 brand context로 적용. 컴포넌트·색상·폰트·레이아웃 수정 같은 구체적 요청과 톤·분위기 표현 — KR '좀 더 따뜻하게', EN 'make it warmer/cooler', 日本語「もう少し暖かく」, 繁體中文「更溫暖一點」 — 모두에 트리거. DESIGN.md 부재 시 omd:init 우선. 화면 전체 신규 디자인은 omd:harness, 교정 기록은 omd:remember.
.claude/skills/kwakseongjae-omd-apply-1c52c1/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 306% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 1005% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 511% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 483% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 846% | 0% |
DESIGN.md를 모든 UI/디자인 작업의 권위 있는 컨텍스트로 사용한다. 책임은 세 가지:
전문 역할은 자문자다. 역할이 없거나 자문이 read-only여도 구현 요청을 감사 결과로 끝내거나 아무 변경 없이 종료하지 않는다.
다음 중 하나가 감지되면 SKILL 전체를 로드한다.
먼저 요청의 완료 조건을 구분한다.
기존 화면의 수정·리디자인은 규모가 커도 omd:apply의 implement/change다. /omd-harness는 새 surface를 처음부터 설계하거나 사용자가 명시적으로 요청한 경우에만 추천한다.
작업 시작 전에 어떤 처리 경로인지 결정한다. 다음 표를 위에서부터 순차 매칭, 첫 번째 매칭 행으로 진행:
| 사용자 요청 패턴 | 처리 경로 | 이유 | |---|---|---| | "에셋 / 아이콘 / 일러스트 / 차트 / 사진 / 로고 / 그래프 / SVG 만들어" | dispatch omd-asset-curator | 매체 선택 + 스택 매칭이 전문 영역 | | "새 메인 화면 / 새 landing / 새 surface / 처음부터 / 와이어프레임" | 사용자에게 /omd-harness 추천 | 10-phase 파이프라인이 적합 | | "접근성 / a11y / 색약 / 키보드 네비" 감사 | dispatch omd-a11y-auditor | 전문 감사 | | "마이크로카피만 다듬어 / 카피 톤 정리 / empty state 문구 전부" 복수 | dispatch omd-microcopy | voice 일관성 | | "사용자 시나리오 / 페르소나 walk through / 4명 입장에서 검토" | dispatch omd-persona-tester | adversarial 4-페르소나 | | "이 카피 좋은지 / hero 카피 약점 / 섹션별 카피 전문가 의견 / A/B 후보" | dispatch omd-ux-writer | UX writing 분석 + 대안 + 근거 | | "이 인터랙션 / 모션 / 포커스 / 모바일 / 지각 성능 / 섹션별 UX 약점" | dispatch omd-ux-engineer | 코드 레벨 인터랙션 감사 + fix | | "기존 랜딩 / 메인 화면 / 페이지 전체를 전문가 의견으로 개선" | advisory dispatch omd-ux-writer + omd-ux-engineer (병렬) | 두 트랙 자문 후 본 에이전트가 구현 | | "이게 왜 안 좋은지 critique / postmortem / root cause" | dispatch omd-critic | 비판적 분석 | | "DESIGN.md 만들어 / reference 골라 / 카탈로그에서 추천" | dispatch omd-init skill (또는 omd-add-reference) | reference 매칭 | | "preference 정리 / 누적된 교정 반영 / DESIGN.md 업데이트" | dispatch omd-learn skill | fold-in 로직 | | "이 한 줄 / 이 컬러 / 이 spacing 좀" 단발 명확 | 인라인 처리 | 분명한 단일 변경 | | 위 어디에도 안 맞는 자유로운 디자인 작업 | 본 에이전트가 처리 후 Phase 3 (교정 캡처) | 일반 케이스 |
dispatch 전에 실제 역할 가용성을 확인하고 아래 첫 번째 가능한 경로를 사용한다.
implement/change 요청은 어떤 recovery 경로에서도 본 에이전트가 자문을 반영해 실제 파일을 편집하고 검증한다. audit/advice 요청만 자문 결과 요약으로 종료할 수 있다.
복합 작업은 dispatch 전에 아래 필드를 인라인으로 고정한다. 2개 이상 specialist를 쓰거나 다음 턴으로 이어질 때만 .omd/work/<timestamp>-<slug>.json에 기록한다. 단일 변경에 파일을 만들지 않는다.
yamlintent: audit | implement task: <사용자가 원하는 결과> consumer_route: <사용자가 실제로 진입하는 route> acceptance: [<관찰 가능한 완료 조건>] protected_behaviors: [<깨지면 안 되는 동작>] protected_contract: cardinality: [<동작을 가진 control/row/form/disclosure의 현재 개수와 허용 변화>] state_transitions: [<before → action → after>] facts: [<보존할 값·카피·hook·필드명>] change_authority: original-user-task-only visual_equity: - identity: <task-helpful 기존 시각 결정> user_value: <사용자 판단·안심·상태 인지에 주는 가치> before_evidence: <같은 route/state의 code·DOM·screenshot> decision: preserve | reinforce | replace change_authority: <original user task | explicit DESIGN.md rule | same consumer route measured defect> evidence: [DESIGN.md, screenshot, code, browser observation] unknowns: [<확인되지 않은 정보 — fallback으로 채우지 않음>] implementation_owner: main-agent | none verification: routes: [] viewports: [] states: [] commands: [] budget: required: [] optional: [] delivery_reserve: true first_product_edit: 50% advisory_to_first_edit: min(90s, 10%) stop_optional_verification: 80% begin_final_delivery: 90% first_safe_edit: target: <기존 파일의 정확한 snippet 또는 selector> smallest_useful_change: <acceptance에 기여하는 실제 변경> protected_contract_effect: none acceptance_check: <변경 직후 확인할 한 가지>
설치된 채널 data root에 workflow-capabilities.json이 있으면 선언된 workflow와 필드명을 사용한다. 파일이 없어도 위 계약으로 계속하며 설치를 강요하지 않는다.
specialist handoff에는 전체 대화 대신 이 packet과 필요한 파일·스크린샷만 전달한다. 기존 UI repair의 specialist는 기본적으로 mode: bounded-repair-advisory를 사용하고 요청된 위험 영역 1-2개, finding 최대 3개, 약 300단어로 제한한다. 전 섹션 audit, 8/10항목 전수평가, A/B 옵션, 추가 아이디어 발산은 별도 full audit 요청에서만 한다. specialist 응답은 main agent가 설명 없이 바로 적용할 수 있는 first_safe_edit를 맨 앞에 두고 다음 shape로 제한한다.
yamlfirst_safe_edit: target: <기존 파일의 정확한 snippet 또는 selector> evidence: <route·line·DOM·screenshot 근거> smallest_useful_change: <완료 조건에 기여하는 최소 유효 수정> protected_contract_effect: none acceptance_check: <적용 직후 어떻게 확인할지> findings: - finding: <무엇이 문제인가> evidence: <근거> smallest_useful_change: <최소 유효 수정> acceptance_check: <어떻게 통과를 확인할지> unresolved: [<확인 불가 항목>]
서로 다른 specialist가 같은 제품 파일을 동시에 수정하지 않는다. implementation_owner: main-agent만 자문을 합치고 코드를 편집한다. specialist는 protected ledger나 visual equity ledger를 수정·완화할 권한이 없다. handoff는 current_count, allowed_delta, states, facts, change_authority와 visual equity 항목을 그대로 복사해야 하며, 이를 벗어난 제안은 implementation 후보가 아니라 rejected_contract_drift로 폐기한다.
실제 변경 또는 디자인 판단 전에 진행:
DESIGN.md를 전체 읽는다. 요약 금지, Read 툴로 직접 로드..omd/preferences.md가 있으면 같이 읽는다. status: pending 엔트리는 아직 DESIGN.md에 반영 안 된 교정 — DESIGN.md보다 우선 적용.DESIGN.md frontmatter의 bootstrapped_from 또는 .omd/init-context.json의 reference_id로 brand id를 얻고, assets/_reference/<id>/가 존재하면:tokens.json — live_overrides 블록 우선structure.json — composition cues (hero/cta/nav idiom)fonts.json — live_observed: true 항목은 출력 HTML <head>에 html_link 그대로 박을 것. 미로드 시 시스템 fallback으로 둥근 폰트 mismatch.screenshots/hero-desktop.png — UI 작업이 hero/landing 류면 Read 툴로 이미지로 직접 읽고 시각 grounding.omd/init-context.json의 mode 필드):clone → 헤더 logo는 assets/_reference/<id>/logo.<ext> 직접 사용. project root에 CLONE-MODE.md + replace-checklist.md가 있어야 함.inspired (또는 미지정) → 헤더 logo는 [YOUR LOGO] placeholder. captured 자산은 product DOM 미사용. .omd/preferences.md (pending) > assets/_reference/<id>/tokens.json#live_overrides (visual surface tokens만) > DESIGN.md (essence: voice/principles/motion 철학·canonical token) > framework defaults essence (voice/principles/motion philosophy)는 항상 DESIGN.md가 권위. visual surface 토큰만 live_overrides가 우위.
DESIGN.md 없으면 사용자에게 알리고 omd:init 스킬 트리거. 임의 생성 금지.
consumer_route의 viewport·state·핵심 동작을 기록하고, 변경 후 같은 consumer route·viewport·state를 다시 연다. 공유 renderer나 진단 route만 확인해 통과 처리하지 않는다.unresolved에 남긴다. 자문 완료를 구현 완료로 간주하지 않음.시각적 확장보다 먼저 기존 제품 계약을 잠근다. 목적은 디자인을 보수적으로 만드는 것이 아니라, 더 나은 화면을 만들면서 이미 동작하는 제품을 다른 제품으로 바꾸지 않는 것이다.
아래 세 항목은 서로 다른 문서 작업이 아니라 첫 edit transaction의 완료 조건이다. 긴 ledger를 다시 설명하거나 검증을 반복하지 말고, 제품을 읽을 때 위험을 표시한 뒤 한 번의 edit으로 같이 고친다.
사용자 prompt·task packet·DESIGN.md가 이미 실패라고 말한 항목은 must_fix다. 첫 제품 diff 직후, static closure 전에 딱 한 번 아래 순서로 확인한다.
ID-A + ID-B처럼 둘 이상의 atomic token을 담고 wrapper에 one-line 계약이 있으면 wrapper와 원문 순서를 보존한 채 각 token을 visible semantic child로 감싸더라도 parent 전체가 한 줄이어야 한다. child나 separator 사이 wrap도 실패다. parent를 display:grid/column/flex-wrap으로 쪼개지 말고, carrier를 full-row→stack→relocate해 필요한 연속 폭을 회수한다. 그래도 전체 compound value가 물리적으로 안 맞을 때만 text가 아닌 관계 carrier 전체에 이름 있는 comparison-scroll을 쓴다. protected target/identifier/state 같은 passive text 자체에 overflow:auto|scroll을 두는 것은 금지다. comparison carrier는 row selector와 다른 selector, accessible name, keyboard reachability, visible focus를 모두 가져야 한다. page overflow, word-break, 임의 글자 축소, 숨김·복제는 금지다.must_fix 중 제품 diff에 실제 교정이 없는 항목이 하나라도 있으면 static proof로 넘어가지 않고 두 번째 제품 edit을 한다. finalize-unresolved는 수정 대신 쓰는 출구가 아니다.브라우저 명령은 static closure 뒤 한 번만 실행한다. host hook이 있는 환경에서는 artifact의 browser_attempt 자가진술로 충분하지 않다. helper가 .omd/proof-policy의 실제 실행 관측을 확인해야 finalize-unresolved를 허용한다. hook이 명령을 실행 전에 차단했다면 attempt가 아니므로, deny guidance에 따라 올바르게 분류되는 browser command 한 번을 실행하거나 delivery를 unresolved로 남긴다.
편집 전에 아래 세 값을 한 줄씩 확정한다. 빈 값이 있으면 제품 edit을 시작하지 않는다.
yamlpre_edit_release_invariant: known_failure_ledger: "every supplied baseline failure and every pre-edit measured failing critical gate → selector/condition + evidence + required correction or fail-closed outcome" foreground_change: "selector + surface + exact before ratio → existing verified text-role/ink token + exact after ratio or fail-closed replacement" comparison_carrier_set: "every protected or named relationship scope containing registered atomic text → named containment or exact relocation + concrete 390px + 320px + actual 200% zoom/reflow outcomes per carrier" browser_attempt: "one prepared command that navigates the same consumer route"
known_failure_ledger AND foreground_change AND comparison_carrier_set이 한 transaction에서 모두 닫혀야 한다. 사용자 요청·task packet·baseline 증거가 실패로 명시한 gate와 pre-edit 계산에서 실제 실패한 gate는 headline 수정 영역이 아니어도 모두 ledger에 올린다. 값을 계산하거나 실패라고 언급한 뒤 제품 diff에서 교정하지 않으면 measured-but-unchanged로 transaction은 미완료다. known failure가 하나라도 open|unresolved|measured-but-unchanged면 static closure·browser proof·delivery로 넘어가지 않는다.
known failure를 메모리에만 두지 않는다. reflow artifact의 acceptance_debt_ledger에 사용자 prompt·DESIGN.md·baseline이 직접 언급한 모든 실패 범주를 한 행씩 기록한다. 각 행은 pre-edit selector, baseline evidence, required correction/outcome, static guardrail, proof mode를 가지며 guardrail assertion은 static_closure_manifest에도 동일하게 존재해야 lock이 통과한다. contrast를 요구했는데 reflow 행만 등록하거나, baseline이 4.5:1 미만임을 알고도 low-contrast source pattern을 forbidden guardrail에 묶지 않으면 제품 edit을 시작하지 않는다.
이것은 계획 메모가 아니라 conjunctive edit 범위다. foreground_change AND comparison_carrier_set이 한 transaction에서 모두 구체화되어야 한다. carrier set은 protected ledger와 reflow row에서 target|identifier|evidence|state|control-label을 담는 모든 보호된 또는 이름 붙은 relationship scope를 포함한다. 인접한 scope를 대표 carrier 하나로 합치거나 주요 다이어그램만 기록하지 않는다. 첫 diff와 consolidated static closure에는 foreground의 exact numeric result(또는 verified text-role fail-close)와 carrier별 390px·320px·실제 200% 결과가 있어야 한다. 한 breakpoint, 최대 너비, width:100%, page overflow 0, 또는 미계측 placeholder는 carrier 결과가 아니다. carrier 하나나 viewport 결과 하나라도 빠지면 static closure로 넘어가지 않고 transaction을 미완료로 둔다. static grep은 결과가 아니며 browser session 생성은 결과가 아니다. static closure 뒤 browser_attempt가 실제 route를 열어야 하며, infrastructure가 막힌 실제 navigate 시도만 unresolved로 닫을 수 있다.
comparison-scroll이다. 숨기고 unbound visual copy를 만들지 않으며, stack이 필요하면 기존 semantic carrier의 identity·cardinality·visibility를 mobile parent로 옮긴다.unresolved로 닫고 다른 browser·port·runtime을 찾지 않은 채 전달한다.이 pass가 끝난 뒤에만 optional polish로 간다. 아래 packet은 이 세 결정을 증명하는 필드 정의이지 추가 실행 단계가 아니다.
Acceptance packet은 실행 파일이 아니라 체크리스트와 관찰 결과다. 이 표현은 verify.*, verifier.*, check.*, probe.*, 임시 shell 파일, CDP/browser automation, 새 test runner를 작성할 권한을 주지 않는다. 새 프로그램이 실제 Chrome을 실행하더라도 replacement verifier다. 저장소에 이미 있는 테스트·평가기 또는 파일을 만들지 않는 직접 browser command만 실행하고, 그런 수단이 한 번 막히면 browser proof를 unresolved로 남기고 전달을 시작한다.
current_count, allowed_delta, states, facts, initial_visibility, own_geometry를 가진다. 사용자가 원 요청에서 추가·삭제를 명시하지 않았다면 언제나 allowed_delta: 0이다. agent, specialist, DESIGN.md, 미적 아이디어, “production-ready” 같은 품질 표현은 변경 권한이 아니다. 부모가 handoff를 만들 때도 이 값을 완화할 수 없다. 특히 초기 문자열이 비어 있는 dynamic status/live region도 protected selector 자체의 baseline rendered box를 기록한다. 편집 뒤 부모 wrapper에만 min-height를 주거나 selector를 DOM에 남겼다는 사실은 그 selector의 가시성 보존이 아니다. baseline에서 보이던 protected selector는 자신의 rendered width·height를 유지해야 하며, 확인할 수 없으면 pre-edit geometry 선언을 복원한다.1a. 첫 편집 전 visual equity ledger를 만든다. 같은 consumer route/state에서 task-helpful 기존 시각 결정만 최대 5개 기록한다. 각 항목은 identity, user_value, before_evidence, decision(preserve|reinforce|replace), change_authority를 가진다. eligible 결정이 없는 low-salience 변경은 visual_equity: []와 visual-equity closure: N/A로 기록해 inline 작업을 지연시키지 않는다. 대상은 decision hierarchy, risk/reversibility cue, active/selected-state distinction, primary-action prominence, 서로 다른 사용자 결정을 가르는 spatial boundary다. task value 없는 장식과 모든 옛 스타일은 보호 대상이 아니다. 항목을 replace하거나 약화할 권한은 original user task, explicit DESIGN.md rule, same consumer route measured defect 중 하나뿐이다. 이 authority는 protected behavior, foreground, geometry-token, interactive 계약을 override하지 않으며 충돌하면 더 엄격한 계약이 이긴다. “cleaner”, “more consistent/minimal”, component consolidation, generic best practice, specialist preference, model taste는 권한이 아니다. consolidation은 자동 simplification이 아니며 restraint도 안전한 token-backed state signal을 중립화할 허가가 아니다. ledger를 지키려고 DESIGN.md에 없는 token·fallback 값을 만들지 않는다.
semantic_color_ledger를 잠근다. 의미 있는 foreground/background pair를 token, surface, content_type, contrast_proof로 기록한다. muted, secondary, supporting도 normal text면 exact pair를 계산하며 반올림 전 값이 4.5 미만이면 실패다. 실패·미계측 pair는 확인된 text-role/ink token으로 fail-close하고, accent는 인접한 non-text cue에만 남긴다. 대체 token이 없으면 새 hex를 만들지 않는다. 일반 텍스트로 의미를 보존한다.2a. 편집 직후 foreground closure를 한 번 수행한다. changed foreground와 ledger의 기존 실패 pair를 실제 surface에서 다시 대조한다. token 이름·굵기·“거의 4.5”는 proof가 아니다. normal text는 exact 4.5:1을 통과하거나 확인된 text-role token으로 교체되어야 하며, 색만으로 상태를 구분하지 않는다. failed_or_unresolved_normal_text_pairs: 0이 되기 전에는 acceptance를 시작하지 않는다. 2b. foreground 교정 직후 geometry-token closure를 수행한다. 마지막 제품 편집과 interactive closure 전에 이번 product diff에서 추가·변경한 모든 border-radius 선언과 그 선언을 받는 실제 surface를 전수한다. card, control/input/button, dialog/sheet, badge/tag처럼 기존 DOM·component name·제품 계약으로 이미 식별되는 역할만 사용하며, 모양이 비슷하다는 이유로 역할을 추측하지 않는다. 각 항목에 identity, product_role, before_declaration, after_declaration, declared_role_token, evidence(source-token|computed-value|unresolved), decision(keep|correct|restore)를 붙인다. DESIGN.md에 해당 역할의 radius token이 있으면 source에서 그 exact token을 참조하거나 computed value가 exact token 값과 일치해야 한다. “거의 같다”, 다른 역할 token, 임의 literal, 평균값은 proof가 아니다. changed surface의 역할 또는 token이 없으면 plausible radius를 새로 만들거나 인접 component 값을 빌리지 않고 pre-edit geometry를 복원한다. 새 surface가 원 사용자 요청에 필수인데 역할 token이 없으면 radius 없이 두고 사실을 보존하며 새 token을 만들지 않는다. closure는 mismatched_declared_radius: 0, invented_radius_value: 0, unresolved_changed_radius: 0이 모두 성립하기 전에는 acceptance를 시작하지 않는다. browser/computed proof가 없더라도 exact source token 대조 또는 pre-edit 복원으로 fail-close하고, 이를 위해 replacement verifier를 만들지 않는다. 2c. 마지막 제품 편집 직후 interactive closure를 수행한다. optional browser 검증이나 전달로 넘어가기 전에 이번 product diff에서 추가·변경한 모든 focusable element를 전수한다. native control과 link뿐 아니라 tabindex, contenteditable, focusable ARIA widget, skip/navigation control을 포함하고, 각 항목에 identity, before_count, after_count, allowed_delta, change_authority, hidden_method, focus_reveal_path, decision(keep|remove|make-visible)를 붙인다. 실제 diff를 protected ledger와 대조했을 때 원 사용자 요청의 추가 권한이 없고 allowed_delta: 0이면 접근성 개선 의도, “production-ready”, specialist 제안과 무관하게 그 focusable addition을 검증 전에 제거한다. 의도적으로 숨긴 focusable control은 기존 제품 계약 또는 원 사용자 요청의 권한이 있어야 하고, 같은 selector의 source-level :focus/:focus-visible reveal path가 clip·크기·위치를 해제하며 same-route keyboard acceptance에서 viewport 안에 들어오는지 확인한다. base .sr-only/visually-hidden 규칙만 있고 focus reveal이 없으면 영구 clipping으로 판정한다. browser proof가 불가능한 새 hidden focusable은 unresolved로 출고하지 않고 제거하거나, 원 요청상 control이 꼭 필요하면 평상시에도 보이게 만든다. closure는 unauthorized_focusable_delta: 0, permanently_clipped_focusable: 0, unresolved_focus_reveal: 0이 모두 성립하기 전에는 acceptance를 시작하지 않는다. 새 verifier를 만드는 대신 기존 diff·테스트·같은 route 검증으로 이 transaction을 증명한다. 2d. visual-equity closure를 수행한다. visual_equity: []이면 desktop/mobile 대조 없이 visual-equity closure: N/A로 종료한다. ledger가 비어 있지 않으면 마지막 제품 편집 뒤 같은 consumer route/state의 desktop과 mobile을 before/after로 대조한다. 변경된 high-salience 항목은 ledger의 authority에 매핑하고, 권한 없는 변경은 token 안에서 복원한다. unsupported_hierarchy_loss: 0, unsupported_state_signal_weakening: 0, unsupported_reassurance_removal: 0, unsupported_decision_boundary_collapse: 0이 모두 성립하기 전에는 acceptance를 시작하지 않는다. visual equity 보존은 모든 옛 스타일의 동결이 아니며, 근거 있는 replace/reinforce와 measured defect 교정은 허용한다. 2e. 고위험 결정 화면에서 decision-context hierarchy closure를 수행한다. 삭제·승인·권한·송금처럼 실행 후 되돌리기 어렵거나 피해가 큰 결정을 최종 확인하는 화면에만 적용한다. 결정 경계 안에서 (1) 선택된 대상, (2) 결정에 직접 필요한 제공된 사실·증거, (3) 현재 상태 또는 blocker, (4) 취소와 최종 action boundary가 한 번에 구분되는지 확인한다. 이 네 역할이 긴 설명 한 문단이나 서로 동등한 장식 카드로 평평해졌다면 기존 DESIGN.md 토큰과 사실만 사용해 label-value metadata, semantic table/list, summary block 중 현재 구조에 가장 작은 표현으로 hierarchy를 복원한다. 좁은 화면에서도 대상→사실/증거→상태→행동 순서를 유지하고 dense-data 열의 비교 geometry를 안정적으로 보존한다. 이 closure는 새 warning banner, risk score, 법적 판단, 상태, control, token, container, 색, 아이콘 또는 사실을 만들 권한이 아니다. 대상이나 blocker가 unresolved면 추측하지 않고 해당 unresolved field만 생략한다. 기존 화면이 이미 네 역할을 명확히 구분하면 decision-context hierarchy closure: preserve로 끝내고 시각 변형을 추가하지 않는다. 2e. reflow-integrity closure는 compact group packet 하나로 실행한다. 같은 consumer route의 390px·320px·actual 200% reflow를 검사한다. 200%는 640px viewport만 뜻하지 않는다. viewport_width: 640과 document.documentElement.style.zoom = "2"를 함께 적용해 effective CSS width 320px 조건을 만든다. 첫 CSS 편집 전에 필요한 source inspection을 전부 끝내고 .omd/reflow-closure.json에 schema 0.3 초안을 실제 저장한다. acceptance_sequence.source_inspection_complete: true는 이후 제품 source를 rg/sed/awk로 다시 읽지 않겠다는 latch다. 같은 selector·역할·longest value를 공유하는 반복 행은 인스턴스마다 복제하지 않고 row_groups.expected_count로 전부 계상한다. 인접한 의미 관계가 다른 carrier는 합치지 않는다.
초안을 저장한 즉시 scripts/reflow-artifact.mjs snapshot .omd/reflow-closure.json으로 ordered inventory와 편집 전 source를 잠근다. 이어 OMD_REFLOW_MODE=plan인 shipped runner를 exact named consumer browser에서 한 번 실행한다. runner는 모든 row의 intrinsic nowrap text width를 세 조건에서 실측하고 각 값에 16 CSS px를 더한 pre_edit_fit_plan을 plan-close로 잠근다. 이 수치가 나온 뒤에만 한 번의 product edit을 계획한다. 제품 편집 뒤에는 carrier/row group·selector·count·binding·fit plan을 바꾸지 않는다. 최종 browser proof command 내부에서 실제 측정 결과를 group final에 기록하고 같은 process가 scripts/reflow-artifact.mjs finalize를 한 번 실행한다. browser command가 반환된 뒤 helper를 별도 shell command로 실행하거나 artifact를 다시 읽지 않는다. 이 helper는 등록 row/carrier 하나라도 unresolved면 resolved finalize를 거부한다.
snapshot-backed row selector는 pre-edit source에 존재하는 stable anchor여야 하며 row selector 자체의 rendered text/value가 longest_value와 정확히 대응해야 한다. 제품 edit에서 새로 붙일 .event-log-form 같은 class를 selector provenance로 제출하지 않는다. browser를 시도하지 않았거나 제품 결함을 발견한 상태는 unresolved accounting으로 우회할 수 없다. 첫 product edit 뒤 첫 shell command 하나가 static closure 전체이고 두 번째 shell command는 duplicate static closure다. final runner는 static_closure.state: passed일 때만 성공하며 command 반환 뒤 artifact rg/sed/cat을 실행하지 않는다. sed/rg/awk/wc/diff도 제품 diff 뒤 실행하면 static closure로 소비되고, 이후 수정으로 revision을 올려도 task-level proof compliance는 복구되지 않는다. shipped runner를 실수로 plain Python으로 실행해도 runner 자체가 artifact를 읽거나 바꾸기 전 exact browser-harness stdin 경로로 한 번 self-dispatch한다. 이 safety path를 retry로 사용하지 않고 원래의 exact command를 우선한다.
helper source나 hash 알고리즘을 읽지 않는다.
yaml reflow_work_packet: schema_version: "0.3" browser_connection_contract: { transport: existing-cdp, connection_name_env: BU_NAME, cdp_url_env: BU_CDP_URL, allow_browser_launch: false, mechanism: "browser-harness named consumer CDP attachment" } measurement_conditions:
acceptance_sequence: source_inspection_complete: true product_edit_transaction: single-planned-transaction post_edit_commands: consolidated-static-closure, browser-harness-terminal] pre_edit_fit_plan: { state: pending } # snapshot 뒤 plan runner가 row intrinsic width와 aggregate carrier outer width를 각각 +16px budget으로 measured/locked acceptance_debt_ledger:
gate: "contrast|document-overflow|clipped-control|inline-fit-reserve|focus|other" selector: "stable pre-edit selector" baseline_evidence: "exact supplied or measured failure" required_correction: "one concrete product edit using existing DESIGN.md tokens/contracts" required_outcome: "observable pass condition" proof_mode: static-fail-close|browser-row bound_row_group_ids: ]|"registered row group id"] status: must-fix-before-static-close static_guardrail: { required_literals: "manifest-bound correction when applicable"], forbidden_literals: "manifest-bound bad literal when applicable"], forbidden_patterns: "manifest-bound bad source pattern when applicable"], forbidden_css_declarations: { selector: ".fixed-carrier", property: "min-width", value_contract: "positive-length" }] } static_closure_manifest: product_path: index.html required_literals: "known fact or required hook fixed before editing"] forbidden_literals: "forbidden fallback or supplied-bad literal"] forbidden_patterns: "forbidden\\s+source\\s+pattern"] forbidden_css_declarations: { selector: ".fixed-carrier", property: "min-width", value_contract: "positive-length" }] count_literals:
inventory: state: "filled by lock helper" carrier_ids: "filled by lock helper"] row_group_ids: "filled by lock helper"] sha256: "filled by lock helper" carriers:
selector: "one selector covering this relationship scope" expected_count: 1 binds_row_groups: "registered row group id"] # 각 row group은 정확히 한 aggregate carrier에만 결박 final: { outcome_390: pass|unresolved, outcome_320: pass|unresolved, outcome_200pct: pass|unresolved } row_groups:
selector: "one selector matching every instance in the group" role: target|identifier|evidence|state|control-label expected_count: 1 longest_value: "longest actual state/template value in this group" atomic_parts: null|"ordered atomic child 1", "ordered atomic child 2"] line_contract: single-token|parent-one-line typography_contract: { source: deterministic-pre-edit-snapshot } required_fit_reserve_css_px: 8 planned_fit_reserve_css_px: 16 decision: full-row|stack|relocate|comparison-scroll|keep|unresolved scroll_contract: null|{ container_selector: "distinct relationship carrier selector", accessible_name: "non-empty name", keyboard_reachable: true, focus_visible: true, passive_text_scroll_container: false } final: { outcome_390: pass|unresolved, outcome_320: pass|unresolved, outcome_200pct: pass|unresolved, status: pass|unresolved, passive_text_scroll_container: false, measurements: { id: 390|320|200pct, observed_font_size_px: number, observed_line_height_px: number, observed_font_weight: string|number, inline_reserve_css_px: number }] } invariants: { same_row_count: true|false, same_decision_boundary: true|false, all_registered_carriers_closed: true|false, no_text_hack: true|false } browser_attempt: { attempts: 0|1, outcome: not-run|infrastructure-error|measured, mechanism: null|"browser-harness named consumer CDP attachment", connection: { transport: existing-cdp, connection_name: "$BU_NAME exact value", cdp_url: "$BU_CDP_URL/$BU_CDP_WS exact value when disclosed, otherwise null", attached_existing: true|false, launched_browser: false }, oracle: "character-range-line-tops", conditions: { id: "390", viewport_width: 390, zoom: 1, observed_document_zoom: 1, document_scroll_width: number, document_client_width: number, body_scroll_width: number, body_client_width: number }, { id: "320", viewport_width: 320, zoom: 1, observed_document_zoom: 1, document_scroll_width: number, document_client_width: number, body_scroll_width: number, body_client_width: number }, { id: "200pct", viewport_width: 640, zoom: 2, observed_document_zoom: 2, document_scroll_width: number, document_client_width: number, body_scroll_width: number, body_client_width: number }] } known_failure_closure: { state: open|closed|unresolved, unresolved: null|0|positive_integer } closure: { state: open|closed|unresolved } closure_manifest: "filled by finalize helper; includes group counts, expanded instance counts, quality_pass, and browser attempt"
Protected decision target inventory. pre-edit source에 data-bench-decision-role="target" 같은 protected decision-target hook가 있으면 정확히 하나의 role: target row를 그 hook와 cardinality에 결박하고, row selector와 다른 target-only carrier 하나를 plan-close 전에 등록한다. 이 target을 생략하거나 evidence·state·action과 같은 carrier에 묶으면 inventory는 fail-closed다.
row_groups에는 one-line 계약이 있는 visible atomic identifier, 선택 target/source/artifact filename, short control label, 그리고 측정 시작 state에서 non-empty로 보이는 dynamic state/status만 넣는다. evidence·summary·metadata·supplied-count는 rendered text가 48자 이하이고 제품 계약이 명시적으로 one-line을 요구할 때만 atomic row다. 그 밖의 evidence 문장·일반 heading/body prose·현재 비어 있거나 hidden인 status는 row가 아니라 carrier 안의 보존 콘텐츠로 남긴다. row selector 자체의 rendered text/value가 longest_value와 정확히 대응해야 한다. 여러 unrelated descendant를 포함하는 card/container나 외부 label의 이름을 대신 적은 empty input을 row로 등록하지 않고, 그 atomic text를 직접 소유하는 가장 작은 stable selector를 사용한다. 같은 selector/role의 반복은 expected_count로 묶되 측정 시작 state에서 실제 렌더되는 값 중 가장 긴 값을 longest_value로 기록한다. 하나의 protected wrapper에 복수 exact token이 있으면 ordered atomic_parts와 line_contract: parent-one-line을 반드시 기록한다. 각 row는 그 row와 함께 폭을 소비하는 버튼·보조문구·padding·border·gap을 모두 포함한 가장 작은 stable existing layout carrier 하나에 정확히 결박한다. 반복 carrier는 하나의 group과 expected_count로 묶을 수 있지만 row를 누락하거나 여러 carrier에 중복 결박하면 inventory가 닫히지 않는다. static_closure_manifest에는 편집 전 product path, required/forbidden literal·pattern, hook cardinality를 선언한다. snapshot helper가 product source와 sha256을 잠근 뒤 OMD_REFLOW_MODE=plan OMD_REFLOW_ARTIFACT=.omd/reflow-closure.json OMD_REFLOW_PRODUCT=<locked-product-path> OMD_REFLOW_HELPER=<current-skill-dir>/scripts/reflow-artifact.mjs browser-harness < <current-skill-dir>/scripts/reflow-browser.py를 한 번 실행한다. 모델은 모든 row에 typography_contract: { source: deterministic-pre-edit-snapshot }을 쓰고 plan stdout의 row별 exact width budget과 carrier별 aggregate width budget을 첫 edit payload의 양의 계약으로 사용한다.longest_value의 intrinsic nowrap width를 실측해 row의 required carrier inner width를 intrinsic + 16px로 잠근다. 동시에 registered carrier 전체를 max-content clone으로 실측해 버튼·인접 copy·padding·border·gap을 포함한 intrinsic_outer_width_css_px, chrome, gap, available document width와 required_outer_width_css_px = intrinsic_outer + 16px를 조건별로 잠근다. row의 16px budget만 green이어도 aggregate carrier가 available width를 넘으면 계획은 red이며 첫 edit에서 full-row/stack/relocate가 필수다. 반대로 row의 intrinsic+16px 자체가 available document width보다 크면 full-row/stack으로는 물리적으로 해결되지 않으므로 plan-close 전에 named comparison-scroll과 접근 가능한 관계 carrier를 선언해야 한다. helper가 출력하는 fit_strategy_feasibility가 row별로 이 결정을 잠그며 stack 선언 뒤 local scroll을 구현하는 전략 불일치를 허용하지 않는다. 글자 수나 padding으로 폭을 추정하거나 선언형 planned_fit_reserve_css_px만 적는 것은 계획이 아니다. final runner는 잠긴 snapshot과 편집 후 product를 동일 조건으로 렌더해 computed font size·line height·weight를 exact 비교한다. DESIGN.md type role과 target emphasis를 보존하고 더 작은 임의 type, 축약, clamp() 하한으로 맞추지 않는다. pass는 모든 조건에서 snapshot typography가 exact하고 comparison-scroll이 아닌 각 row에 최소 8 CSS px의 측정된 inline reserve가 남을 때만 가능하다. source-only 또는 경계에 딱 맞는 결과는 unresolved다. 첫 edit은 plan이 잠근 row·aggregate carrier 16px budget을 모두 만족하도록 viewport → page inset → card padding → section inset → reading width → carrier full-row → carrier stack/relocate 순서로 폭을 회수한다.full-row, 다음으로 stack한다. compound wrapper는 protected selector·accessible text·원문 순서를 유지하고 각 atomic_parts만 관측 가능한 child span으로 감싼다. wrapper 자체에 one-line 계약이 있으면 atomic_parts는 separator wrap 허가가 아니다. parts와 separator 전체를 한 atomic group으로 유지하고, fit하지 않으면 carrier를 full-row/stack/relocate해 폭을 회수한다. mobile cascade에서 desktop track·basis·min-width를 해제하고 필요한 child에 min-width: 0을 둔다. 그래도 물리적으로 안 맞고 shared header·legend가 의미 관계를 제공할 때만 row selector와 다른 named 관계 carrier를 comparison-scroll로 쓴다. decision target은 evidence·state·action을 포함하지 않는 target-only carrier여야 한다. register처럼 여러 row가 하나의 비교 관계를 이루면 shared carrier를 쓸 수 있지만, 그 carrier가 묶는 row는 passive identifier 역할뿐이어야 하고 focusable action을 포함하면 안 된다. carrier는 exact accessible name, tabindex="0", visible :focus-visible을 갖고 scroll_contract에 기록한다. runner는 허용되지 않은 carrier overflow, comparison carrier 안의 focusable descendant, 초기 위치에서 잘린 focusable control을 실패 처리한다. protected target/identifier/state 같은 passive text 자체의 computed overflow가 auto|scroll이면 geometry가 맞아도 실패다. stack은 기존 carrier 자체를 relocate한다. display:none 뒤 generated content·data-*·aria-label·hook 없는 span 복제, passive text scroller, word-break, token 내부 break character, generated separator는 실패다.BU_NAME의 browser-harness named socket으로 consumer Chrome에 attach해야 한다. controller는 raw BU_CDP_URL/BU_CDP_WS를 의도적으로 숨길 수 있으므로 endpoint 값은 attachment 전제조건이 아니며, 공개된 경우에만 exact metadata로 기록한다. browser-harness Python 안에서 p.chromium.launch(), 새 Playwright/Chromium/Chrome process, 다른 port 또는 독립 engine을 띄우는 fallback은 금지이며 attach 실패는 즉시 infrastructure unresolved다. 각 condition마다 viewport를 설정하고 pre-edit snapshot과 product에 동일하게 document.documentElement.style.zoom = String(zoom)을 적용한다. 특히 200pct는 {viewport_width: 640, zoom: 2}이며 computed document zoom이 실제 2인지 읽어 observed_document_zoom에 기록한다. 매 condition의 document/body scrollWidth와 clientWidth를 모두 기록하고 어느 하나라도 overflow면 pass가 아니다. 640px만 열고 zoom을 생략한 결과는 200% proof가 아니다. 각 visible text node의 공백이 아닌 문자마다 Range를 만들고 top 좌표의 고유 개수를 세며, element.getClientRects().length는 line-count proof로 사용하지 않는다. line_contract: parent-one-line은 child별 line 수가 아니라 parent selector 전체의 non-space character top 고유값이 정확히 1이어야 한다. 하나라도 실패하거나 count가 expected_count와 다르면 그 group은 pass가 아니다. 같은 browser command가 실제 결과와 pre-edit snapshot sha256, exact connection identity, launched_browser: false, browser_attempt.oracle: character-range-line-tops, 세 condition의 observed zoom/page widths를 artifact에 쓰고 finalize까지 실행한다. helper가 runtime env와 exact named connection·snapshot typography·fit reserve·page overflow를 대조한다. helper가 closure state에서 OMD_DELIVERY_READY 또는 OMD_DELIVERY_UNRESOLVED를 자동 출력하며 이 stdout이 terminal closure다. 반환 뒤 artifact rg/sed/cat이나 별도 finalize를 실행하지 않는다. 대표 instance, 다른 browser의 결과, page overflow 0만, element rectangle, screenshot 육안, source 추정은 group proof가 아니다. helper가 만든 manifest의 expanded registered_carriers/registered_rows가 시작 count와 다르거나 미계측 instance가 있으면 성공을 말하지 않는다.quality closure는 same_row_count: true, same_decision_boundary: true, all_registered_carriers_closed: true, no_text_hack: true, unresolved_rows: 0, unresolved_carriers: 0, page_overflow: 0, quality_pass: true, known_failure_closure: { state: closed, unresolved: 0 }일 때만 통과한다. finalize-unresolved는 실제 browser infrastructure attempt가 기록된 경우에만 accounting을 closure.state: unresolved로 잠그며 quality closure나 구현 완료를 통과시키지 않는다. 2f. proof execution close latch로 끝난 증명을 다시 열지 않는다. 품질 gate는 유지하고 아래 state를 같은 consumer route의 acceptance까지 유지한다. word-break: normal도 generic forbidden pattern을 피하는 대체값이 아니다.
yaml proof_execution_latch: revision: 0 inventory: open|closed product_edit: pending|changed|stable known_failure_closure: { state: open|closed, unresolved: 0 } static_closure: { state: open|closed, revision: null, runs: 0 } browser_proof: { state: open|closed|unresolved, revision: null, attempts: 0, mechanism: null } delivery: blocked|ready violations: { browser_recovery: 0, duplicate_static_closure: 0, verification_after_ready: 0 }
source_inspection_complete: true로 둔다. snapshot 뒤 pre-edit fit-plan browser 1회를 실행해 measured plan과 inventory: closed를 잠근다. 첫 product edit 뒤에는 그 edit이 마지막인지 확신이 없어도 제품 source를 다시 읽지 않는다.revision을 1 올리고 product_edit: changed, 두 proof state를 open으로 만든다. product edit 뒤 첫 shell command는 node <current-skill-dir>/scripts/reflow-artifact.mjs static-close .omd/reflow-closure.json <locked-product-path> 한 번뿐이다. 이 결정론 helper가 pre-edit static_closure_manifest의 literal 존재/부재, structured CSS declaration, hook cardinality, supplied fact, forbidden text hack을 제품 파일 한 번의 read로 함께 닫는다. plan-close stdout의 static_edit_guardrails.first_edit_checklist를 edit payload의 완전한 양·부정 계약으로 취급하고 모든 항목을 한 번의 patch 안에서 충족한 뒤에만 static-close로 넘어간다. 양수 고정폭처럼 값의 의미가 중요한 CSS 금지는 광범위한 regex 대신 forbidden_css_declarations의 { selector, property, value_contract: positive-length }를 써서 min-width:0 같은 안전한 containment reset과 구분한다. property 자체가 금지라면 value_contract: any-declaration을 쓴다. 일반 forbidden_patterns가 CSS property를 가리키면 그 선언은 완전히 삭제하며 normal, initial, unset, revert, inherit 같은 중립값으로 바꾸지도 않는다. patch를 적용하기 전 checklist의 required/forbidden/CSS/count 계약을 payload에 한 번 대조하고 하나라도 불확실하면 patch 자체를 고친다. model이 post-edit node - <<, inline JS, rg/sed/awk/wc, 임시 verifier 또는 ad-hoc regex static check를 작성하거나 실행하지 않는다. helper 전 일부 확인 명령도 범위와 결과에 관계없이 이미 static budget을 소비한 것이다. helper가 red면 exactly-once static budget이 소비된다. 그 뒤 제품을 다시 수정하거나 helper를 고쳐서 다시 실행하지 않고 이번 run을 proof noncompliant로 전달한다.closed, attach/실행 infrastructure error면 unresolved로 잠근다. 둘 다 현재 revision과 mechanism을 기록한다. 그 뒤 --doctor, --help, executable/process/port discovery, 직접 Chrome launch, 다른 browser/port/runtime, 설치·권한 변경이나 두 번째 browser command를 시작하면 browser_recovery 위반이다.OMD_REFLOW_MODE=plan을 붙여 row intrinsic width와 aggregate carrier outer width에 각각 +16px budget을 잠근 뒤 종료한다. post-edit command는 OMD_REFLOW_ARTIFACT=.omd/reflow-closure.json OMD_REFLOW_PRODUCT=<locked-product-path> OMD_REFLOW_HELPER=<current-skill-dir>/scripts/reflow-artifact.mjs browser-harness < <current-skill-dir>/scripts/reflow-browser.py로 세 조건 acceptance와 finalize를 수행한다. 둘 다 exact BU_NAME에 attach하며 새 browser나 fallback을 만들지 않는다.pre-edit fit-plan browser 1회 + task 전체 deterministic static-close helper 1회 + post-edit acceptance browser 1회다. plan browser는 제품 edit 전에만 실행한다. 편집 뒤에는 static-close 한 번과 post-edit acceptance browser 한 번만 실행하며, 결과가 red여도 제품을 다시 고치지 않고 unresolved를 전달한다.static_closure: open, browser_proof: unresolved로 다시 연다. corrective static closure는 한 번 수행할 수 있지만 browser attempt는 다시 열지 않는다. 제품 파일이 바뀌지 않았다면 어느 proof state도 reopen하지 않는다.closed이고 browser proof가 closed|unresolved면 delivery: ready로 잠근다. 이 뒤 verification shell/browser command는 verification_after_ready 위반이다. 추가 탐색 대신 최소 완성 diff와 unresolved를 전달한다.bounded-repair-advisory로 보낸다. state/status/accent token이 있으면 engineer 질문 중 하나는 semantic color ledger의 모든 planned pair를 normal text와 non-text 역할로 분리하고 unmeasured pair를 지적해야 한다. 자문 뒤 새 pair를 추가하면 별도 2차 audit 대신 위 fail-closed text+non-text 기본값을 적용한다.min(90초, 총 예산의 10%) 안에 first_safe_edit 하나를 먼저 적용한다. 그 사이 사용자-facing ledger recap, 자문 요약, 계획 설명, 전체 파일 재독해, 2차 분석 pass를 출력하지 않는다. 기존 snippet을 안전하게 바꿀 수 있으면 첫 transaction은 targeted Edit이며 whole-file Write가 아니다. 첫 transaction은 원 요청의 acceptance에 기여하고 protected ledger를 보존하는 실제 제품 변경이어야 한다. 공백·주석·timestamp·동일값 치환 같은 no-op으로 clock만 찍지 않는다. specialist의 first_safe_edit가 ledger를 어기면 폐기하고, 이미 읽은 DESIGN.md와 원 요청이 직접 허용하는 가장 작은 계약-중립 변경을 같은 방식으로 적용한다. timeout을 알 수 없어도 ledger와 필수 자문이 준비된 뒤 optional 탐색을 한 번 더 돌리지 않는다. deadline을 놓치면 기능을 더 추가하지 않고 가장 작은 완성 diff와 정직한 unresolved 전달을 우선한다.unresolved로 전달한다.measured_but_unchanged: 0, unresolved_known_failures: 0protected_selector_visibility_loss: 0unresolved normal-text accent pair가 0mismatched_declared_radius, invented_radius_value, unresolved_changed_radius가 모두 0unauthorized_focusable_delta, permanently_clipped_focusable, unresolved_focus_reveal이 모두 0visual_equity: []이면 visual-equity closure: N/A; ledger가 비어 있지 않으면 같은 route/state의 desktop·mobile before/after를 대조하고 unsupported_hierarchy_loss, unsupported_state_signal_weakening, unsupported_reassurance_removal, unsupported_decision_boundary_collapse가 모두 0same_row_count: true, same_decision_boundary: true, no_text_hack: true, unresolved_rows: 0, page_overflow: 0<table>·<th scope>를 사용한다. ARIA table/grid를 쓰면 table/grid > row > columnheader|rowheader|cell parentage를 완성한 뒤 출고한다. 좁은 화면에서 의미상 필요한 horizontal scroll region은 이름을 제공하고, 내부에 자연스러운 focus target이 없으면 region 자체를 tabindex="0"으로 keyboard-reachable하게 만든다. 장식용 wrapper에 table/grid role을 붙이지 않는다.unresolved로 남긴다. 단, 의미 있는 normal text의 contrast가 unresolved인 pair 자체는 남기지 않는다. text-role token + non-text accent 조합으로 먼저 교체한 뒤 계측하지 못한 나머지 route 검증만 unresolved로 보고한다.이 packet은 benchmark selector를 맞추는 절차가 아니다. 실제 제품에서 사용자 동작과 접근성·reflow 계약을 보존하기 위한 일반 acceptance layer다.
검증은 결과 전달을 막지 않는 범위에서 fail-closed로 수행한다.
verify.*, verifier.*, check.*, probe.*, 임시 shell 파일, CDP/browser automation, 새 test runner도 작성하지 않는다. 새 프로그램이 실제 browser를 실행해도 금지다. 저장소에 이미 있는 테스트·검증기·정적 검사 또는 파일을 만들지 않는 직접 browser command만 사용하고, 없는 증명은 unresolved로 남긴다. 사용자가 테스트 인프라 구현 자체를 요청한 경우만 예외다.implemented / verified / unresolved로 나눠 무엇이 완성됐고 무엇이 실행되지 못했는지 명시한다.timeout 직전까지 optional verification을 계속해 final response를 잃는 것은 실패다. artifact가 만들어졌더라도 사용자가 결과·근거·남은 위험을 전달받지 못하면 delivery complete로 처리하지 않는다.
턴 종료 전에 다음 중 하나가 있었는지 확인:
감지되면 omd:remember 스킬을 트리거한다 (CLI 호출 X — .omd/preferences.md에 직접 append). 트리거 메서드: omd-remember SKILL.md의 Step 1-6 절차를 따라 Edit 툴로 파일 수정.
교정 기록 시 턴 끝에 한 줄:
Logged to .omd/preferences.md — say "preference 정리해줘" later to fold into DESIGN.md.일반 작업에는 불필요. 과한 알림 금지.
omd remember, omd learn 등) 금지 — 1.0.0부터 모두 스킬 prose| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 49,380 | 9,872 | -80% | 1 | 1 | 0% | 8,298 | 15,605 | +88% | 0 | 0 | — |
case-02 | fail→fail | 13,988 | 8,626 | -38% | 1 | 1 | 0% | 2,383 | 15,357 | +544% | 0 | 0 | — |
case-03 | fail→fail | 19,503 | 44,265 | +127% | 1 | 1 | 0% | 4,328 | 15,456 | +257% | 0 | 0 | — |
case-04 | pass→pass | 17,827 | 17,818 | -0% | 1 | 1 | 0% | 3,085 | 18,020 | +484% | 0 | 0 | — |
case-05 | pass→pass | 16,135 | 15,514 | -4% | 1 | 1 | 0% | 2,765 | 17,834 | +545% | 0 | 0 | — |
case-06 | pass→fail | 25,249 | 9,419 | -63% | 1 | 1 | 0% | 4,944 | 15,521 | +214% | 0 | 0 | — |
case-07 | fail→pass | 20,338 | 5,774 | -72% | 1 | 1 | 0% | 3,897 | 15,807 | +306% | 0 | 0 | — |
case-08 | fail→pass | 12,095 | 6,040 | -50% | 1 | 1 | 0% | 1,443 | 15,940 | +1005% | 0 | 0 | — |
case-09 | pass→pass | 10,102 | 5,077 | -50% | 1 | 1 | 0% | 1,516 | 15,760 | +940% | 0 | 0 | — |
case-10 | pass→fail | 20,208 | 10,226 | -49% | 1 | 1 | 0% | 3,120 | 15,545 | +398% | 0 | 0 | — |
case-11 | fail→pass | 37,258 | 10,278 | -72% | 1 | 1 | 0% | 2,715 | 16,588 | +511% | 0 | 0 | — |
case-12 | pass→pass | 18,556 | 5,408 | -71% | 1 | 1 | 0% | 2,814 | 15,766 | +460% | 0 | 0 | — |
case-13 | pass→pass | 21,337 | 6,283 | -71% | 1 | 1 | 0% | 2,390 | 15,995 | +569% | 0 | 0 | — |
case-14 | pass→pass | 15,823 | 7,898 | -50% | 1 | 1 | 0% | 2,505 | 16,097 | +543% | 0 | 0 | — |
case-15 | pass→pass | 13,423 | 5,156 | -62% | 1 | 1 | 0% | 1,833 | 15,729 | +758% | 0 | 0 | — |
case-16 | pass→pass | 11,023 | 9,958 | -10% | 1 | 1 | 0% | 1,659 | 16,240 | +879% | 0 | 0 | — |
case-17 | fail→pass | 18,802 | 14,583 | -22% | 1 | 1 | 0% | 2,974 | 17,343 | +483% | 0 | 0 | — |
case-18 | fail→pass | 13,052 | 4,647 | -64% | 1 | 1 | 0% | 1,659 | 15,692 | +846% | 0 | 0 | — |
case-19 | pass→pass | 12,870 | 6,255 | -51% | 1 | 1 | 0% | 1,859 | 15,981 | +760% | 0 | 0 | — |
case-20 | fail→pass | 131,392 | 6,245 | -95% | 1 | 1 | 0% | 1,596 | 15,941 | +899% | 0 | 0 | — |
case-21 | pass→pass | 14,337 | 6,734 | -53% | 1 | 1 | 0% | 2,015 | 15,925 | +690% | 0 | 0 | — |
case-22 | fail→pass | 25,600 | 8,915 | -65% | 1 | 1 | 0% | 1,891 | 16,326 | +763% | 0 | 0 | — |
case-23 | fail→pass | 16,129 | 8,542 | -47% | 1 | 1 | 0% | 2,212 | 16,338 | +639% | 0 | 0 | — |
case-24 | pass→pass | 20,467 | 6,550 | -68% | 1 | 1 | 0% | 1,992 | 15,902 | +698% | 0 | 0 | — |
case-25 | pass→pass | 18,525 | 11,096 | -40% | 1 | 1 | 0% | 2,367 | 16,803 | +610% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 20 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +24 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.