ai-design-context 0.4.0

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 (288) hide show
  1. package/AGENTS.md +156 -0
  2. package/CHANGELOG.md +71 -0
  3. package/CODE_OF_CONDUCT.md +29 -0
  4. package/CONTRIBUTING.md +128 -0
  5. package/LICENSE +21 -0
  6. package/README.md +283 -0
  7. package/RELEASE_NOTES_v0.1.0.md +45 -0
  8. package/RELEASE_NOTES_v0.3.0.md +47 -0
  9. package/RELEASE_NOTES_v0.4.0.md +29 -0
  10. package/RELEASE_READINESS.md +107 -0
  11. package/ROADMAP.md +60 -0
  12. package/SECURITY.md +40 -0
  13. package/assets/logo.svg +9 -0
  14. package/benchmarks/README.md +19 -0
  15. package/benchmarks/chat.md +37 -0
  16. package/benchmarks/mobile-home-screen.md +38 -0
  17. package/benchmarks/notes-app.md +37 -0
  18. package/benchmarks/settings.md +37 -0
  19. package/benchmarks/shopping-list.md +37 -0
  20. package/benchmarks/todo-app.md +144 -0
  21. package/checklists/DESIGN_QA.md +102 -0
  22. package/checklists/GENERATED_INDEX.md +7 -0
  23. package/docs/AGENT_CONTEXT.md +111 -0
  24. package/docs/BENCHMARK.md +170 -0
  25. package/docs/DESIGNLINT_READINESS.md +110 -0
  26. package/docs/DESIGN_SYSTEM.md +23 -0
  27. package/docs/EVALUATION_RUBRIC.md +154 -0
  28. package/docs/GITHUB_SETUP.md +28 -0
  29. package/docs/GLOSSARY.md +45 -0
  30. package/docs/INDEX.md +109 -0
  31. package/docs/KNOWLEDGE_ENGINE.md +594 -0
  32. package/docs/MOBILE_FIRST.md +18 -0
  33. package/docs/NPM_RELEASE.md +43 -0
  34. package/docs/PATTERN_SPEC.md +113 -0
  35. package/docs/PHILOSOPHY.md +25 -0
  36. package/docs/PRODUCT_THINKING.md +26 -0
  37. package/docs/STYLE_GUIDE.md +49 -0
  38. package/docs/TRACEABILITY.md +45 -0
  39. package/evidence/README.md +64 -0
  40. package/evidence/TEMPLATE.md +46 -0
  41. package/evidence/chat/.gitkeep +1 -0
  42. package/evidence/mobile-home/.gitkeep +1 -0
  43. package/evidence/notes/.gitkeep +1 -0
  44. package/evidence/settings/.gitkeep +1 -0
  45. package/evidence/shopping/.gitkeep +1 -0
  46. package/evidence/todo/.gitkeep +1 -0
  47. package/evidence/todo/2026-06-25-codex-gpt-5/EVALUATION.md +66 -0
  48. package/evidence/todo/2026-06-25-codex-gpt-5/README.md +40 -0
  49. package/evidence/todo/2026-06-25-codex-gpt-5/ai-design-rules/generated-output.md +163 -0
  50. package/evidence/todo/2026-06-25-codex-gpt-5/ai-design-rules/metadata.json +38 -0
  51. package/evidence/todo/2026-06-25-codex-gpt-5/ai-design-rules/notes.md +20 -0
  52. package/evidence/todo/2026-06-25-codex-gpt-5/ai-design-rules/prompt.md +16 -0
  53. package/evidence/todo/2026-06-25-codex-gpt-5/ai-design-rules/scores.md +18 -0
  54. package/evidence/todo/2026-06-25-codex-gpt-5/baseline/generated-output.md +98 -0
  55. package/evidence/todo/2026-06-25-codex-gpt-5/baseline/metadata.json +19 -0
  56. package/evidence/todo/2026-06-25-codex-gpt-5/baseline/notes.md +19 -0
  57. package/evidence/todo/2026-06-25-codex-gpt-5/baseline/prompt.md +9 -0
  58. package/evidence/todo/2026-06-25-codex-gpt-5/baseline/scores.md +18 -0
  59. package/evidence/todo/2026-09-28-codex-paired-todo/EVALUATION.md +70 -0
  60. package/evidence/todo/2026-09-28-codex-paired-todo/README.md +52 -0
  61. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/GENERATION_NOTES.md +133 -0
  62. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/app.js +289 -0
  63. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/context/context-preserving-preview.json +443 -0
  64. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/context/daily-home-surface.json +373 -0
  65. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/context/quick-capture.json +301 -0
  66. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/context/sources-read.txt +36 -0
  67. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/generated-output.md +11 -0
  68. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/index.html +64 -0
  69. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/launch-prompt.md +1 -0
  70. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/metadata.json +55 -0
  71. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/notes.md +15 -0
  72. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/parent-status-message.md +1 -0
  73. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/prompt.md +49 -0
  74. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/runtime-checks.json +776 -0
  75. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/scores.md +20 -0
  76. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-completed.png +0 -0
  77. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-default.png +0 -0
  78. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-detail-reduced-motion.png +0 -0
  79. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-detail.png +0 -0
  80. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-empty.png +0 -0
  81. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-keyboard-focus.png +0 -0
  82. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-save-error.png +0 -0
  83. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-saved.png +0 -0
  84. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-saving.png +0 -0
  85. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/desktop-validation.png +0 -0
  86. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-completed.png +0 -0
  87. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-default.png +0 -0
  88. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-detail-reduced-motion.png +0 -0
  89. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-detail.png +0 -0
  90. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-empty.png +0 -0
  91. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-keyboard-focus.png +0 -0
  92. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-save-error.png +0 -0
  93. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-saved.png +0 -0
  94. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-saving.png +0 -0
  95. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/screenshots/mobile-validation.png +0 -0
  96. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/source-hashes.json +5 -0
  97. package/evidence/todo/2026-09-28-codex-paired-todo/ai-design-rules/styles.css +122 -0
  98. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/GENERATION_NOTES.md +86 -0
  99. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/app.js +303 -0
  100. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/generated-output.md +11 -0
  101. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/index.html +71 -0
  102. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/launch-prompt.md +1 -0
  103. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/metadata.json +55 -0
  104. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/notes.md +15 -0
  105. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/parent-status-message.md +1 -0
  106. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/prompt.md +49 -0
  107. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/runtime-checks.json +772 -0
  108. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/scores.md +20 -0
  109. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-completed.png +0 -0
  110. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-default.png +0 -0
  111. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-detail-reduced-motion.png +0 -0
  112. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-detail.png +0 -0
  113. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-empty.png +0 -0
  114. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-keyboard-focus.png +0 -0
  115. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-save-error.png +0 -0
  116. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-saved.png +0 -0
  117. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-saving.png +0 -0
  118. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/desktop-validation.png +0 -0
  119. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-completed.png +0 -0
  120. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-default.png +0 -0
  121. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-detail-reduced-motion.png +0 -0
  122. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-detail.png +0 -0
  123. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-empty.png +0 -0
  124. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-keyboard-focus.png +0 -0
  125. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-save-error.png +0 -0
  126. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-saved.png +0 -0
  127. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-saving.png +0 -0
  128. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/screenshots/mobile-validation.png +0 -0
  129. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/source-hashes.json +5 -0
  130. package/evidence/todo/2026-09-28-codex-paired-todo/baseline/styles.css +9 -0
  131. package/evidence/todo/2026-09-28-codex-paired-todo/capture-ai-design-rules.js +60 -0
  132. package/evidence/todo/2026-09-28-codex-paired-todo/capture-baseline.js +60 -0
  133. package/evidence/todo/2026-09-28-codex-paired-todo/common/brief.md +35 -0
  134. package/evidence/todo/2026-09-28-codex-paired-todo/common/knowledge-files.json +127 -0
  135. package/evidence/todo/2026-09-28-codex-paired-todo/common/knowledge.patch +890 -0
  136. package/evidence/todo/2026-09-28-codex-paired-todo/common/review-context.json +550 -0
  137. package/evidence/todo/2026-09-28-codex-paired-todo/common/seed.json +86 -0
  138. package/evidence/todo/2026-09-28-codex-paired-todo/common/setup.json +47 -0
  139. package/evidence/todo/2026-09-28-codex-paired-todo/common/technical-envelope.md +11 -0
  140. package/evidence/todo/2026-09-28-codex-paired-todo/layout-metrics.json +133 -0
  141. package/evidence/todo/2026-09-28-codex-paired-todo/layout-probe.js +15 -0
  142. package/examples/GENERATED_INDEX.md +8 -0
  143. package/examples/INDEX.md +16 -0
  144. package/examples/README.md +15 -0
  145. package/examples/consequential-action-confirmation-reference.md +83 -0
  146. package/examples/todo-app-benchmark.md +117 -0
  147. package/examples/todo-reference/README.md +29 -0
  148. package/examples/todo-reference/app.js +154 -0
  149. package/examples/todo-reference/favicon.svg +4 -0
  150. package/examples/todo-reference/index.html +67 -0
  151. package/examples/todo-reference/review-evidence/2026-07-15/desktop-default.png +0 -0
  152. package/examples/todo-reference/review-evidence/2026-07-15/desktop-detail.png +0 -0
  153. package/examples/todo-reference/review-evidence/2026-07-15/mobile-detail.png +0 -0
  154. package/examples/todo-reference/review-evidence/2026-07-15/mobile-error.png +0 -0
  155. package/examples/todo-reference/styles.css +241 -0
  156. package/graph/GENERATED_GRAPH.md +71 -0
  157. package/observations/README.md +23 -0
  158. package/observations/accessibility/reduced-interaction-motion.md +49 -0
  159. package/observations/accessibility/textual-error-recovery.md +50 -0
  160. package/observations/accessibility/visible-keyboard-focus.md +49 -0
  161. package/observations/ai/agent-consequential-action-controls.md +56 -0
  162. package/observations/ai/agent-work-visibility-and-intervention.md +51 -0
  163. package/observations/ai/figma-agent-context-and-skills.md +52 -0
  164. package/observations/finance/high-risk-wallet-recovery-flows.md +55 -0
  165. package/observations/finance/market-interface-adaptive-trading-surfaces.md +55 -0
  166. package/observations/interaction/chrome-scoped-view-transitions.md +52 -0
  167. package/observations/interaction/figma-motion-as-system-capability.md +53 -0
  168. package/observations/mobile/mobile-bottom-sheet-choice-contracts.md +55 -0
  169. package/observations/performance/reserved-loading-space.md +51 -0
  170. package/observations/product-repos/pinned-ai-design-rules-integration.md +49 -0
  171. package/observations/visual/apple-liquid-glass-functional-layer.md +52 -0
  172. package/observations/visual/chrome-content-first-adaptive-ui.md +51 -0
  173. package/observations/visual/material-3-expressive-system.md +52 -0
  174. package/package.json +65 -0
  175. package/patterns/GENERATED_INDEX.md +13 -0
  176. package/patterns/INDEX.md +41 -0
  177. package/patterns/README.md +5 -0
  178. package/patterns/consequential-action-confirmation.md +127 -0
  179. package/patterns/context-preserving-preview.md +145 -0
  180. package/patterns/daily-home-surface.md +134 -0
  181. package/patterns/mobile-primary-action.md +110 -0
  182. package/patterns/object-status-list.md +114 -0
  183. package/patterns/progressive-detail.md +113 -0
  184. package/patterns/quick-capture.md +132 -0
  185. package/prompts/CONSEQUENTIAL_ACTION_REVIEW.md +100 -0
  186. package/prompts/DESIGN_EVIDENCE_REVIEW.md +49 -0
  187. package/prompts/GENERATED_INDEX.md +11 -0
  188. package/prompts/INDEX.md +24 -0
  189. package/prompts/PROTOTYPE_REVIEW.md +189 -0
  190. package/prompts/QUICK_CAPTURE_STATE_REVIEW.md +74 -0
  191. package/prompts/TODO_APP_BENCHMARK.md +88 -0
  192. package/registry/objects.json +568 -0
  193. package/registry/relationships.json +972 -0
  194. package/research/GENERATED_INDEX.md +18 -0
  195. package/research/INDEX.md +40 -0
  196. package/research/accessibility/keyboard-focus-and-interaction-motion.md +62 -0
  197. package/research/accessibility/textual-error-recovery.md +57 -0
  198. package/research/performance/reserved-loading-space.md +56 -0
  199. package/research/products/apple-reminders.md +59 -0
  200. package/research/products/arc.md +61 -0
  201. package/research/products/linear.md +62 -0
  202. package/research/products/telegram.md +61 -0
  203. package/research/products/things-3.md +60 -0
  204. package/research/ux/contextual-agentic-interface.md +68 -0
  205. package/research/ux/high-risk-operational-flows.md +89 -0
  206. package/research/ux/motion-as-state-continuity.md +71 -0
  207. package/research/visual/expressive-system-ui-2026.md +75 -0
  208. package/reviews/GENERATED_INDEX.md +9 -0
  209. package/reviews/README.md +25 -0
  210. package/reviews/consequential-action-confirmation-review.md +92 -0
  211. package/reviews/todo-app-benchmark-reference-review.md +86 -0
  212. package/reviews/todo-reference-fixture-review.md +77 -0
  213. package/rules/GENERATED_INDEX.md +23 -0
  214. package/rules/INDEX.md +37 -0
  215. package/rules/accessibility/A11Y-001.md +58 -0
  216. package/rules/accessibility/A11Y-002.md +55 -0
  217. package/rules/accessibility/A11Y-003.md +54 -0
  218. package/rules/accessibility/A11Y-004.md +54 -0
  219. package/rules/ia/IA-001.md +60 -0
  220. package/rules/ia/IA-002.md +61 -0
  221. package/rules/performance/PERF-001.md +55 -0
  222. package/rules/product/PRD-001.md +61 -0
  223. package/rules/product/PRD-002.md +61 -0
  224. package/rules/ux/UX-001.md +58 -0
  225. package/rules/ux/UX-002.md +61 -0
  226. package/rules/ux/UX-003.md +60 -0
  227. package/rules/ux/UX-004.md +61 -0
  228. package/rules/ux/UX-005.md +62 -0
  229. package/rules/ux/UX-006.md +69 -0
  230. package/rules/visual/VIS-001.md +59 -0
  231. package/rules/visual/VIS-002.md +59 -0
  232. package/schema/checklist.schema.json +21 -0
  233. package/schema/common.schema.json +178 -0
  234. package/schema/observation.schema.json +21 -0
  235. package/schema/pattern.schema.json +21 -0
  236. package/schema/prompt.schema.json +21 -0
  237. package/schema/reference-project.schema.json +21 -0
  238. package/schema/research.schema.json +21 -0
  239. package/schema/review.schema.json +21 -0
  240. package/schema/rule.schema.json +21 -0
  241. package/skills/README.md +48 -0
  242. package/skills/accessibility-reviewer/SKILL.md +101 -0
  243. package/skills/agent-context/SKILL.md +34 -0
  244. package/skills/agent-context/agents/openai.yaml +4 -0
  245. package/skills/design-evidence-researcher/SKILL.md +47 -0
  246. package/skills/design-evidence-researcher/agents/openai.yaml +4 -0
  247. package/skills/design-reviewer/SKILL.md +113 -0
  248. package/skills/design-system-architect/SKILL.md +101 -0
  249. package/skills/information-architect/SKILL.md +97 -0
  250. package/skills/interaction-designer/SKILL.md +104 -0
  251. package/skills/knowledge-graph-architect/SKILL.md +96 -0
  252. package/skills/mobile-ux-expert/SKILL.md +105 -0
  253. package/skills/motion-designer/SKILL.md +100 -0
  254. package/skills/performance-reviewer/SKILL.md +97 -0
  255. package/skills/product-designer/SKILL.md +104 -0
  256. package/skills/prompt-architect/SKILL.md +105 -0
  257. package/skills/reference-driven-design/SKILL.md +119 -0
  258. package/skills/ux-reviewer/SKILL.md +99 -0
  259. package/skills/visual-designer/SKILL.md +107 -0
  260. package/starter-kit/AGENTS.md +37 -0
  261. package/starter-kit/BOOTSTRAP.md +13 -0
  262. package/starter-kit/INSTALL_WITH_AGENT.md +133 -0
  263. package/starter-kit/PROJECT_INTEGRATION.md +60 -0
  264. package/starter-kit/README.md +41 -0
  265. package/starter-kit/benchmarks/BENCHMARK_CHECKLIST.md +10 -0
  266. package/starter-kit/docs/DESIGN_DECISIONS.md +22 -0
  267. package/starter-kit/docs/INFORMATION_ARCHITECTURE.md +25 -0
  268. package/starter-kit/docs/PERSONAS.md +14 -0
  269. package/starter-kit/docs/PRD.md +32 -0
  270. package/starter-kit/docs/USER_FLOWS.md +19 -0
  271. package/starter-kit/reviews/DESIGN_REVIEW.md +49 -0
  272. package/starter-kit/templates/FEATURE_TEMPLATE.md +36 -0
  273. package/starter-kit/templates/TASK_TEMPLATE.md +22 -0
  274. package/templates/CHECKLIST_TEMPLATE.md +43 -0
  275. package/templates/OBSERVATION_TEMPLATE.md +41 -0
  276. package/templates/PATTERN_TEMPLATE.md +100 -0
  277. package/templates/PROMPT_TEMPLATE.md +46 -0
  278. package/templates/PROTOTYPE_REVIEW.md +50 -0
  279. package/templates/REFERENCE_PROJECT_TEMPLATE.md +49 -0
  280. package/templates/REVIEW_TEMPLATE.md +55 -0
  281. package/templates/RULE_TEMPLATE.md +57 -0
  282. package/tools/cli.mjs +46 -0
  283. package/tools/context.mjs +342 -0
  284. package/tools/designlint.mjs +77 -0
  285. package/tools/generate-indexes.mjs +621 -0
  286. package/tools/init.mjs +99 -0
  287. package/tools/validate-benchmark-evidence.mjs +248 -0
  288. package/tools/validate-knowledge.mjs +481 -0
@@ -0,0 +1,20 @@
1
+ # baseline scores
2
+
3
+ Evaluator: Codex parent agent, internal and unblinded. See [the full evaluation](../EVALUATION.md) for category evidence and limitations.
4
+
5
+ | Category | Score |
6
+ | --- | ---: |
7
+ | Product Thinking | 8 |
8
+ | UX | 7 |
9
+ | Information Architecture | 8 |
10
+ | Navigation | 8 |
11
+ | Accessibility | 6 |
12
+ | Mobile-first | 7 |
13
+ | Visual Hierarchy | 8 |
14
+ | State Design | 8 |
15
+ | Consistency | 8 |
16
+ | Performance Awareness | 6 |
17
+ | Simplicity | 8 |
18
+ | Overall Product Quality | 7 |
19
+
20
+ Total: 89/120. Average: 7.42/10. These are subjective rubric ratings for one pair, not a statistical quality estimate.
@@ -0,0 +1,5 @@
1
+ {
2
+ "index.html": "542a5453c2dd816e2572f4f9a03472a0a3196361963e0c6c8f4cee2d53f0328c",
3
+ "styles.css": "3d3687bdcd0dfdb2df2021acbbca49c17521a9c8d931c270ab1cefe446d27bac",
4
+ "app.js": "2c15e81d2ef006e10c9727ab92ce5995126e84c7ed9cc2f8016b74f5674cef78"
5
+ }
@@ -0,0 +1,9 @@
1
+ :root{--background:#f6f7f3;--paper:#fff;--ink:#26342d;--muted:#6f796f;--green:#355e49;--green-dark:#264936;--line:#e3e7df;--soft:#e8eee5;--error:#a33530;--radius:14px;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--ink);background:var(--background);font-synthesis:none}
2
+ *{box-sizing:border-box}body{margin:0}button,input,textarea{font:inherit}button,a,input,textarea,summary{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{cursor:wait;opacity:.6}button{color:inherit}button:focus-visible,a:focus-visible,summary:focus-visible,input:focus-visible,textarea:focus-visible{outline:3px solid #6c9171;outline-offset:3px}input,textarea{min-width:0}a{color:inherit}svg{width:23px;height:23px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}[hidden]{display:none!important}
3
+ .app-shell{min-height:100vh;display:grid;grid-template-columns:252px 1fr}.sidebar{padding:47px 25px 24px;border-right:1px solid var(--line);display:flex;flex-direction:column;background:#f0f2eb}.brand{display:flex;align-items:center;gap:9px;font-size:27px;font-weight:750;letter-spacing:-1.2px;text-decoration:none;white-space:nowrap}.brand-mark{display:grid;place-items:center;background:var(--green);color:#ebefbd;width:36px;height:36px;border-radius:11px;font-size:30px;font-weight:400;line-height:1}.brand-dot{margin-left:-8px;color:#668344}.brand-caption{font-size:12px;color:var(--muted);padding-left:2px;margin:15px 0 42px}.views{display:flex;flex-direction:column;gap:7px}.view-button{min-height:50px;display:flex;align-items:center;gap:12px;border:0;border-radius:10px;background:transparent;padding:10px 13px;text-align:left;color:#64705e;font-size:14px;font-weight:600}.view-button:hover{background:#e7ebdf}.view-button.active{background:#e0e7d9;color:#294b35}.nav-count{margin-left:auto;background:#d2dec9;border-radius:6px;font-size:11px;padding:3px 6px;min-width:24px;text-align:center}.view-button:not(.active) .nav-count{background:transparent;color:#7d8776}.sidebar-footer{margin-top:auto;padding-top:64px;display:flex;align-items:center;gap:12px;font-size:12px;line-height:1.8;color:#5b6957}.sidebar-footer p{margin:0}.sidebar-footer p span{color:#85907e}.small-sun{font-size:27px;color:#a3ae8b}
4
+ main{width:100%;max-width:850px;padding:66px 64px 32px;margin:0 auto}.page-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:32px}.eyebrow{font-size:10px;letter-spacing:1.7px;font-weight:700;color:#78816c;margin:0 0 12px}h1{font-size:46px;line-height:1.12;font-weight:650;letter-spacing:-2px;margin:0}.title-dot{color:#8a9d59}.page-description{font-size:14px;color:var(--muted);margin:12px 0 0}.remaining-badge{font-size:12px;white-space:nowrap;padding:8px 12px;background:#e8eddf;border:1px solid #dce3d0;border-radius:20px;color:#547043;margin-top:11px}.quick-add{display:flex;align-items:center;gap:12px;background:var(--paper);border:1px solid #d6ded0;border-radius:var(--radius);padding:9px 10px 9px 16px;box-shadow:0 3px 12px #2c422006;min-height:62px}.quick-add:focus-within{border-color:#7c9772;box-shadow:0 0 0 3px #768d5520}.add-symbol{font-size:26px;color:#889778;font-weight:300}.quick-add input{border:0;background:transparent;outline:none;padding:9px 0;flex:1;font-size:14px;color:var(--ink);width:100%}.quick-add input:focus-visible{outline:none}.quick-add input::placeholder{color:#858c80}.quick-add button,.primary-button{border:0;background:var(--green);color:white;border-radius:9px;min-height:44px;padding:0 16px;font-size:12px;font-weight:650;white-space:nowrap}.quick-add button:hover,.primary-button:hover{background:var(--green-dark)}.quick-add button span:last-child{opacity:.65;margin-left:4px}.capture-hint{font-size:11px;color:#818b78;margin:11px 0 0 2px}.save-feedback{min-height:37px;display:flex;gap:8px;align-items:center;font-size:12px;padding:8px 0;color:var(--green);line-height:1.4}.save-feedback.error{color:var(--error)}.feedback-copy{flex:1}.retry-button{border:1px solid currentColor;background:transparent;color:inherit;border-radius:7px;padding:7px 11px;min-height:38px;font-size:12px;font-weight:650}.section-heading{display:flex;justify-content:space-between;align-items:center;margin:15px 1px 14px}.section-heading h2{font-size:10px;letter-spacing:1.8px;font-weight:700;color:#818b77;margin:0}.section-heading>span{font-size:11px;color:#87917d}.task-list{border:1px solid var(--line);background:white;border-radius:var(--radius);overflow:hidden}.task-list:empty{display:none}.task-row{display:flex;align-items:center;min-height:62px;padding:0 12px 0 9px;gap:1px;border-bottom:1px solid #edf0e9}.task-row:last-child{border-bottom:0}.task-row:hover{background:#fbfcf8}.task-check-label{display:flex;align-items:center;justify-content:center;min-width:44px;min-height:52px;cursor:pointer}.task-checkbox{appearance:none;-webkit-appearance:none;width:20px;height:20px;margin:0;border:1.5px solid #cad3c3;border-radius:50%;background:#fff;cursor:pointer;display:grid;place-items:center}.task-checkbox:hover{border-color:var(--green)}.task-checkbox:checked{background:#e7eddf;border-color:#c1d1b4}.task-checkbox:checked::after{content:"✓";font-size:13px;color:#527441;font-weight:700}.task-open{min-height:61px;background:transparent;border:0;display:flex;align-items:center;text-align:left;gap:14px;flex:1;min-width:0;padding:9px 0 9px 2px}.task-title{font-size:14px;font-weight:450;line-height:1.5;overflow-wrap:anywhere}.task-text{flex:1;min-width:0}.task-meta{display:block;font-size:11px;color:#849078;margin-top:2px}.task-meta.overdue{color:#a85b39}.note-icon{width:15px;height:15px;color:#97a28b;flex:none}.row-arrow{font-size:19px;color:#bec7b4;padding:0 5px 0 0}.task-row.is-complete .task-title{color:#8b9581;text-decoration:line-through;text-decoration-color:#b2bda5}.completed-section{margin-top:23px}.completed-section summary{display:flex;align-items:center;gap:8px;list-style:none;min-height:44px;font-size:12px;color:#7a866f;cursor:pointer;width:100%}.completed-section summary::-webkit-details-marker{display:none}.completed-count{background:#e9ede3;padding:2px 6px;border-radius:5px;font-size:10px}.chevron{margin-left:auto;font-size:19px;transition:transform .15s}.completed-section[open] .chevron{transform:rotate(180deg)}.completed-section[open] summary{margin-bottom:6px}.main-footer{display:flex;align-items:center;justify-content:center;gap:7px;font-size:11px;color:#97a08c;margin-top:32px}.main-footer>span{font-size:20px}.empty-state{padding:36px 28px;text-align:center;border:1px dashed #d1dac6;border-radius:var(--radius);background:#f0f3e9}.empty-icon{width:48px;height:48px;display:grid;place-items:center;font-size:21px;background:#dfe8d4;border-radius:50%;margin:0 auto 17px;color:#607b43}.empty-state h2{font-size:18px;font-weight:600;letter-spacing:-.4px;margin:0 0 10px}.empty-state p{font-size:13px;line-height:1.6;max-width:290px;margin:0 auto;color:#7a866b}.text-button{border:0;background:transparent;color:var(--green);min-height:44px;margin-top:15px;font-size:13px;font-weight:650}.skeleton-row{height:63px;display:flex;align-items:center;gap:18px;padding:0 20px;border-bottom:1px solid #edf0e9}.skeleton-circle{height:20px;width:20px;border-radius:50%;background:#edf1e7}.skeleton-line{width:60%;height:12px;border-radius:4px;background:#edf1e7;animation:pulse 1.1s ease-in-out infinite alternate}.skeleton-row:nth-child(2n) .skeleton-line{width:43%}.spinner{width:14px;height:14px;border:2px solid #d5dfcb;border-top-color:var(--green);border-radius:50%;display:inline-block;animation:spin .8s linear infinite;flex:none}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{to{opacity:.35}}
5
+ dialog{border:1px solid #dbe2d5;border-radius:20px;padding:30px;max-width:470px;width:calc(100% - 32px);color:var(--ink);background:#fcfdf9;box-shadow:0 24px 120px #15261230}dialog::backdrop{background:#23302155;backdrop-filter:blur(3px)}.dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:15px;margin-bottom:28px}.dialog-header h2{font-size:25px;font-weight:600;letter-spacing:-.8px;margin:0}.dialog-header .eyebrow{font-size:9px;margin-bottom:8px}.icon-button{width:44px;height:44px;border:0;background:#edf1e7;border-radius:50%;font-size:27px;line-height:1;color:#6a795e}.dialog-header .icon-button{margin:-7px -7px 0 0}#detail-form>label{display:flex;justify-content:space-between;font-size:12px;font-weight:650;margin:21px 0 8px}.optional{font-weight:400;color:#8a9480;font-size:11px}#detail-form>input,#detail-form>textarea{width:100%;min-height:47px;border:1px solid #d6dfcc;background:white;border-radius:9px;color:var(--ink);padding:12px;font-size:14px;line-height:1.5}#detail-form>textarea{resize:vertical;min-height:110px;max-height:250px}.dialog-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:20px}.dialog-actions button{min-height:46px;padding:0 18px;font-size:13px}.secondary-button{border:1px solid #d6dfcc;border-radius:9px;background:transparent}.detail-feedback{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:8px;line-height:1.5;min-height:24px;margin-top:12px}.detail-feedback.error{color:var(--error)}
6
+ @media(min-width:1400px){main{margin:0 0 0 9%;padding-top:74px;max-width:850px}}
7
+ @media(max-width:850px){.app-shell{grid-template-columns:200px 1fr}.sidebar{padding:40px 17px 24px}.brand{font-size:24px}.brand-caption{font-size:10px}main{padding:48px 28px}.quick-add{gap:9px}.desktop-label{display:none}}
8
+ @media(max-width:620px){.app-shell{display:block}.sidebar{padding:22px 22px 0;background:var(--background);border:0;display:block}.brand{font-size:25px;gap:9px}.brand-mark{width:31px;height:31px;border-radius:9px;font-size:26px}.brand-caption,.sidebar-footer{display:none}.views{flex-direction:row;margin-top:25px;gap:7px;padding:4px;border-radius:12px;background:#e9ede2}.view-button{flex:1;min-height:43px;border-radius:9px;padding:8px 12px;gap:8px;font-size:12px;justify-content:center}.view-button svg{height:18px;width:18px}.view-button.active{background:#fff;box-shadow:0 1px 4px #30401b0c}.nav-count{margin-left:3px;min-width:21px;font-size:10px;padding:2px 4px}.view-button:not(.active) .nav-count{background:#e0e6d8}main{padding:30px 22px 26px}.page-header{margin-bottom:25px;align-items:center}.eyebrow{font-size:9px;letter-spacing:1.4px;margin-bottom:10px}h1{font-size:39px;letter-spacing:-1.6px}.page-description{font-size:12px;margin-top:10px}.remaining-badge{font-size:11px;padding:7px 10px;margin-top:6px}.quick-add{min-height:60px;gap:10px;padding:7px 8px 7px 13px;border-radius:12px}.quick-add input{font-size:13px}.quick-add button{font-size:12px;padding:0 12px;min-height:44px}.quick-add button span:last-child{display:none}.capture-hint{font-size:10px;margin-top:10px;line-height:1.5}.save-feedback{min-height:32px;font-size:11px}.section-heading{margin-top:10px;margin-bottom:13px}.section-heading h2{font-size:9px;letter-spacing:1.5px}.section-heading>span{font-size:10px}.task-row{min-height:63px;padding-left:6px;padding-right:10px}.task-title{font-size:13px}.task-open{min-height:62px}.task-list{border-radius:12px}.completed-section{margin-top:15px}.main-footer{margin-top:24px}dialog{padding:25px 23px;max-height:calc(100dvh - 32px);overflow-y:auto}.dialog-header{margin-bottom:23px}.dialog-header h2{font-size:23px}.dialog-actions .primary-button{flex:1}.dialog-actions .secondary-button{flex:.7}}
9
+ @media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}
@@ -0,0 +1,60 @@
1
+ async (page) => {
2
+ const variant = 'ai-design-rules';
3
+ const config = {input:'#task-title',add:'#add-task',feedback:'#feedback',dialog:'#detail',retry:'#add-task',complete:'button.check',completed:'#completed-section',completionToggle:'#completed-toggle'};
4
+ const reports=[]; const errors=[];
5
+ page.on('pageerror',error=>errors.push(error.message));
6
+ const state=()=>page.evaluate(()=>window.__benchmark.getState());
7
+ const waitSave=()=>page.waitForFunction(()=>!window.__benchmark.getState().pending);
8
+ const focus=()=>page.evaluate(()=>({tag:document.activeElement.tagName,id:document.activeElement.id,label:document.activeElement.getAttribute('aria-label'),text:document.activeElement.textContent.slice(0,100),scrollY:window.scrollY}));
9
+ for(const [name,width,height] of [['mobile',390,844],['desktop',1440,900]]) {
10
+ await page.setViewportSize({width,height}); await page.emulateMedia({reducedMotion:'no-preference',colorScheme:'light'});
11
+ await page.evaluate(()=>{window.__benchmark.reset('seed');document.activeElement.blur();window.scrollTo(0,0);});
12
+ const report={viewport:name,artifacts:[],checks:{}};
13
+ const shot=async(suffix)=>{const file=`${variant}/screenshots/${name}-${suffix}.png`;await page.screenshot({path:file});report.artifacts.push(file);};
14
+ report.checks.initial={count:(await state()).tasks.length,overflow:await page.evaluate(()=>document.documentElement.scrollWidth>innerWidth),inputBox:await page.locator(config.input).boundingBox()};
15
+ report.checks.targets=await page.locator('button,a,input,summary').evaluateAll(elements=>elements.filter(e=>e.getClientRects().length).map(e=>{const target=e.matches('input[type=checkbox]')?e.closest('label')||e:e; const r=target.getBoundingClientRect();return {label:e.getAttribute('aria-label')||e.textContent.trim()||e.id,width:r.width,height:r.height};}));
16
+ await shot('default');
17
+ await page.evaluate(()=>{window.__benchmark.reset('empty');window.scrollTo(0,0);});await shot('empty');
18
+ await page.evaluate(()=>{window.__benchmark.reset('seed');window.__benchmark.setSaveDelay(2500);window.__benchmark.failNextSave();window.scrollTo(0,0);});
19
+ await page.locator(config.input).fill('Buy apples');
20
+ const beforeBox=await page.locator(config.input).boundingBox();
21
+ await page.locator(config.add).click();
22
+ report.checks.saving={input:await page.locator(config.input).inputValue(),beforeBox,afterBox:await page.locator(config.input).boundingBox(),submitDisabled:await page.locator(config.add).isDisabled(),tasks:(await state()).tasks.length};
23
+ await shot('saving'); await waitSave();
24
+ report.checks.failedSave={input:await page.locator(config.input).inputValue(),tasks:(await state()).tasks.length,feedback:await page.locator(config.feedback).innerText()};
25
+ await shot('save-error');
26
+ await page.evaluate(()=>window.__benchmark.setSaveDelay(50));
27
+ await page.locator(config.retry).click(); await waitSave();
28
+ report.checks.retry={matchingTasks:(await state()).tasks.filter(t=>t.title==='Buy apples').length,feedback:await page.locator(config.feedback).innerText()};
29
+ await shot('saved');
30
+ await page.evaluate(()=>window.__benchmark.reset('seed'));
31
+ await page.locator('[data-task-id="t01"]').locator(config.complete).click();await waitSave();
32
+ if(await page.locator(config.completed).evaluate(e=>e.tagName==='DETAILS'&&!e.open)) await page.locator(config.completionToggle).click();
33
+ await page.locator(config.completed).scrollIntoViewIfNeeded();
34
+ report.checks.completed={completed:(await state()).tasks.find(t=>t.id==='t01').completed,focus:await focus()};await shot('completed');
35
+ await page.evaluate(()=>window.__benchmark.reset('seed'));
36
+ const source=page.locator('[data-task-id="t11"] .task-open');await source.evaluate(e=>e.scrollIntoView({block:'center',behavior:'instant'}));
37
+ const sourceScroll=await page.evaluate(()=>window.scrollY);await source.click();await page.waitForTimeout(250);
38
+ report.checks.detail={sourceScroll,open:await page.locator(config.dialog).evaluate(e=>e.open),title:await page.locator('#detail-title').inputValue(),focus:await focus()};await shot('detail');
39
+ await page.keyboard.press('Escape');await page.waitForTimeout(250);
40
+ report.checks.detailClose={focus:await focus(),sourceFocused:await source.evaluate(e=>e===document.activeElement),scrollDelta:await page.evaluate(y=>window.scrollY-y,sourceScroll)};
41
+ await source.click();await page.keyboard.press('Escape');await page.waitForTimeout(300);
42
+ report.checks.interruption={open:await page.locator(config.dialog).evaluate(e=>e.open),focus:await focus()};
43
+ await page.emulateMedia({reducedMotion:'reduce'});await source.click();
44
+ report.checks.reducedMotion={title:await page.locator('#detail-title').inputValue(),focus:await focus(),animations:await page.evaluate(()=>document.getAnimations().length)};await shot('detail-reduced-motion');await page.keyboard.press('Escape');
45
+ await page.emulateMedia({reducedMotion:'no-preference'});
46
+ await page.evaluate(()=>window.__benchmark.reset('seed'));await page.locator('[data-task-id="t01"] .task-open').click();
47
+ await page.locator('#detail-notes').fill('Call before 10 am.');await page.evaluate(()=>window.__benchmark.failNextSave());await page.locator('#save-detail').click();await waitSave();
48
+ report.checks.editFailure={draft:await page.locator('#detail-notes').inputValue(),saved:(await state()).tasks.find(t=>t.id==='t01').notes,feedback:await page.locator('#detail-feedback').innerText()};
49
+ await page.locator('#save-detail').click();await waitSave();report.checks.editRetry={saved:(await state()).tasks.find(t=>t.id==='t01').notes};
50
+ await page.reload();await page.waitForFunction(()=>window.__benchmark&&!window.__benchmark.getState().loading);
51
+ report.checks.persistence=(await state()).tasks.find(t=>t.id==='t01').notes;
52
+ await page.evaluate(()=>{window.__benchmark.reset('seed');document.activeElement.blur();window.scrollTo(0,0);});
53
+ let tabs=0;while(tabs<50){await page.keyboard.press('Tab');tabs++;if(await page.locator(config.input).evaluate(e=>e===document.activeElement))break;}
54
+ report.checks.keyboard={tabsToCapture:tabs,focus:await focus(),style:await page.locator(config.input).evaluate(e=>({outline:getComputedStyle(e).outline,shadow:getComputedStyle(e).boxShadow}))};await shot('keyboard-focus');
55
+ await page.locator(config.input).fill(' ');await page.locator(config.add).click();
56
+ report.checks.blankValidation={state:await state(),feedback:await page.locator(config.feedback).innerText(),nativeMessage:await page.locator(config.input).evaluate(e=>e.validationMessage)};
57
+ await shot('validation');reports.push(report);
58
+ }
59
+ return {variant,errors,reports};
60
+ }
@@ -0,0 +1,60 @@
1
+ async (page) => {
2
+ const variant = 'baseline';
3
+ const config = {input:'#new-task',add:'#add-button',feedback:'#save-feedback',dialog:'#task-dialog',retry:'.retry-button',complete:'input.task-checkbox',completed:'details#completed-section',completionToggle:'details#completed-section summary'};
4
+ const reports=[]; const errors=[];
5
+ page.on('pageerror',error=>errors.push(error.message));
6
+ const state=()=>page.evaluate(()=>window.__benchmark.getState());
7
+ const waitSave=()=>page.waitForFunction(()=>!window.__benchmark.getState().pending);
8
+ const focus=()=>page.evaluate(()=>({tag:document.activeElement.tagName,id:document.activeElement.id,label:document.activeElement.getAttribute('aria-label'),text:document.activeElement.textContent.slice(0,100),scrollY:window.scrollY}));
9
+ for(const [name,width,height] of [['mobile',390,844],['desktop',1440,900]]) {
10
+ await page.setViewportSize({width,height}); await page.emulateMedia({reducedMotion:'no-preference',colorScheme:'light'});
11
+ await page.evaluate(()=>{window.__benchmark.reset('seed');document.activeElement.blur();window.scrollTo(0,0);});
12
+ const report={viewport:name,artifacts:[],checks:{}};
13
+ const shot=async(suffix)=>{const file=`${variant}/screenshots/${name}-${suffix}.png`;await page.screenshot({path:file});report.artifacts.push(file);};
14
+ report.checks.initial={count:(await state()).tasks.length,overflow:await page.evaluate(()=>document.documentElement.scrollWidth>innerWidth),inputBox:await page.locator(config.input).boundingBox()};
15
+ report.checks.targets=await page.locator('button,a,input,summary').evaluateAll(elements=>elements.filter(e=>e.getClientRects().length).map(e=>{const target=e.matches('input[type=checkbox]')?e.closest('label')||e:e; const r=target.getBoundingClientRect();return {label:e.getAttribute('aria-label')||e.textContent.trim()||e.id,width:r.width,height:r.height};}));
16
+ await shot('default');
17
+ await page.evaluate(()=>{window.__benchmark.reset('empty');window.scrollTo(0,0);});await shot('empty');
18
+ await page.evaluate(()=>{window.__benchmark.reset('seed');window.__benchmark.setSaveDelay(2500);window.__benchmark.failNextSave();window.scrollTo(0,0);});
19
+ await page.locator(config.input).fill('Buy apples');
20
+ const beforeBox=await page.locator(config.input).boundingBox();
21
+ await page.locator(config.add).click();
22
+ report.checks.saving={input:await page.locator(config.input).inputValue(),beforeBox,afterBox:await page.locator(config.input).boundingBox(),submitDisabled:await page.locator(config.add).isDisabled(),tasks:(await state()).tasks.length};
23
+ await shot('saving'); await waitSave();
24
+ report.checks.failedSave={input:await page.locator(config.input).inputValue(),tasks:(await state()).tasks.length,feedback:await page.locator(config.feedback).innerText()};
25
+ await shot('save-error');
26
+ await page.evaluate(()=>window.__benchmark.setSaveDelay(50));
27
+ await page.locator(config.retry).click(); await waitSave();
28
+ report.checks.retry={matchingTasks:(await state()).tasks.filter(t=>t.title==='Buy apples').length,feedback:await page.locator(config.feedback).innerText()};
29
+ await shot('saved');
30
+ await page.evaluate(()=>window.__benchmark.reset('seed'));
31
+ await page.locator('[data-task-id="t01"]').locator(config.complete).click();await waitSave();
32
+ if(await page.locator(config.completed).evaluate(e=>e.tagName==='DETAILS'&&!e.open)) await page.locator(config.completionToggle).click();
33
+ await page.locator(config.completed).scrollIntoViewIfNeeded();
34
+ report.checks.completed={completed:(await state()).tasks.find(t=>t.id==='t01').completed,focus:await focus()};await shot('completed');
35
+ await page.evaluate(()=>window.__benchmark.reset('seed'));
36
+ const source=page.locator('[data-task-id="t11"] .task-open');await source.evaluate(e=>e.scrollIntoView({block:'center',behavior:'instant'}));
37
+ const sourceScroll=await page.evaluate(()=>window.scrollY);await source.click();await page.waitForTimeout(250);
38
+ report.checks.detail={sourceScroll,open:await page.locator(config.dialog).evaluate(e=>e.open),title:await page.locator('#detail-title').inputValue(),focus:await focus()};await shot('detail');
39
+ await page.keyboard.press('Escape');await page.waitForTimeout(250);
40
+ report.checks.detailClose={focus:await focus(),sourceFocused:await source.evaluate(e=>e===document.activeElement),scrollDelta:await page.evaluate(y=>window.scrollY-y,sourceScroll)};
41
+ await source.click();await page.keyboard.press('Escape');await page.waitForTimeout(300);
42
+ report.checks.interruption={open:await page.locator(config.dialog).evaluate(e=>e.open),focus:await focus()};
43
+ await page.emulateMedia({reducedMotion:'reduce'});await source.click();
44
+ report.checks.reducedMotion={title:await page.locator('#detail-title').inputValue(),focus:await focus(),animations:await page.evaluate(()=>document.getAnimations().length)};await shot('detail-reduced-motion');await page.keyboard.press('Escape');
45
+ await page.emulateMedia({reducedMotion:'no-preference'});
46
+ await page.evaluate(()=>window.__benchmark.reset('seed'));await page.locator('[data-task-id="t01"] .task-open').click();
47
+ await page.locator('#detail-notes').fill('Call before 10 am.');await page.evaluate(()=>window.__benchmark.failNextSave());await page.locator('#save-detail').click();await waitSave();
48
+ report.checks.editFailure={draft:await page.locator('#detail-notes').inputValue(),saved:(await state()).tasks.find(t=>t.id==='t01').notes,feedback:await page.locator('#detail-feedback').innerText()};
49
+ await page.locator('#save-detail').click();await waitSave();report.checks.editRetry={saved:(await state()).tasks.find(t=>t.id==='t01').notes};
50
+ await page.reload();await page.waitForFunction(()=>window.__benchmark&&!window.__benchmark.getState().loading);
51
+ report.checks.persistence=(await state()).tasks.find(t=>t.id==='t01').notes;
52
+ await page.evaluate(()=>{window.__benchmark.reset('seed');document.activeElement.blur();window.scrollTo(0,0);});
53
+ let tabs=0;while(tabs<50){await page.keyboard.press('Tab');tabs++;if(await page.locator(config.input).evaluate(e=>e===document.activeElement))break;}
54
+ report.checks.keyboard={tabsToCapture:tabs,focus:await focus(),style:await page.locator(config.input).evaluate(e=>({outline:getComputedStyle(e).outline,shadow:getComputedStyle(e).boxShadow}))};await shot('keyboard-focus');
55
+ await page.locator(config.input).fill(' ');await page.locator(config.add).click();
56
+ report.checks.blankValidation={state:await state(),feedback:await page.locator(config.feedback).innerText(),nativeMessage:await page.locator(config.input).evaluate(e=>e.validationMessage)};
57
+ await shot('validation');reports.push(report);
58
+ }
59
+ return {variant,errors,reports};
60
+ }
@@ -0,0 +1,35 @@
1
+ ## Product Brief
2
+
3
+ Create a modern consumer todo app for everyday personal task management.
4
+
5
+ The app should help a busy person capture tasks quickly, see what matters today, complete tasks, and inspect optional details without turning the product into a project management dashboard.
6
+
7
+ ## Expected User
8
+
9
+ - Adult consumer managing personal errands, reminders, and daily tasks.
10
+ - Uses mobile frequently and desktop occasionally.
11
+ - Wants low friction more than advanced planning.
12
+
13
+ ## Expected Platform
14
+
15
+ - Responsive web app.
16
+ - Must work well at mobile width around 390px.
17
+ - Desktop layout may use additional space but must preserve the same product model.
18
+
19
+ ## Constraints
20
+
21
+ - No authentication flow required.
22
+ - No team collaboration required.
23
+ - No analytics dashboard.
24
+ - No project management concepts such as sprints, roadmaps, or velocity.
25
+ - Include realistic empty, loading, and error states.
26
+ - Include accessible labels and touch-friendly controls.
27
+ - Keep optional metadata secondary.
28
+
29
+ ## Core User Tasks
30
+
31
+ - Add a task quickly.
32
+ - See today's tasks.
33
+ - Mark a task complete.
34
+ - Inspect or edit task details.
35
+ - Recover from a failed save.
@@ -0,0 +1,127 @@
1
+ {
2
+ "AGENTS.md": "56808b867d486d6b911eb84cb45d8b6a3acf1bd62621a01e42bcdebc90502b80",
3
+ "checklists/DESIGN_QA.md": "d6a3a4f35c84da35b3f0994da097b03009f39c21b4c75fb173739cf1dd4b32cf",
4
+ "checklists/GENERATED_INDEX.md": "af9df31dfd5ac5682e3b15c72810e6e05a934c0bf929c0da04cd6493bec37bd0",
5
+ "docs/AGENT_CONTEXT.md": "3dc4c5c09396c3a9682ae283f733fb47bf1e3a4e2718b3d360d7620c23fb378d",
6
+ "docs/BENCHMARK.md": "69ae89a7e2b0afa0f14401d3045cc8f5fc6280a72f227f3db0ae18db90a8eec3",
7
+ "docs/DESIGNLINT_READINESS.md": "0b777636ac5b849350d446fdc8f4ae76d8e145b3e55ddb013dfd1a13e3d8c124",
8
+ "docs/DESIGN_SYSTEM.md": "4e0b16a8be45c68f981b11a0fe8f6f4deb850ea784acf403d43acc59219fc9c2",
9
+ "docs/EVALUATION_RUBRIC.md": "729b79447856421fc8c633626caf830a9e1114b825a6d25624e865fb8d7fe18f",
10
+ "docs/GITHUB_SETUP.md": "d9b19d489c32e68c088ef2ac6745d02dd681e8cfe44977bcc7109e35d44776b2",
11
+ "docs/GLOSSARY.md": "45ebdf8958aaf7e84837ba858784939cbd764b0dea6406d79f22a71177647218",
12
+ "docs/INDEX.md": "cbde85a35337638c33479df6bc3cf6d65eecc6a3f7687c6734e3d0dff202b0e3",
13
+ "docs/KNOWLEDGE_ENGINE.md": "e2d2665d33992ceee6d1466b64abc79bc3709f491d6695bc1e87177a5c627dee",
14
+ "docs/MOBILE_FIRST.md": "d33976b98c48e5a07dc453156eed21930b96538eb3e3657d231c803b52e491e9",
15
+ "docs/PATTERN_SPEC.md": "8e1297ea05f8466c39cefbd7dbe47882c925cf0da47d06eed71b05c5895b947b",
16
+ "docs/PHILOSOPHY.md": "4b07ddad0d870e050b90325e71a66cfc34128be425ebc72499d7dd7b86807bde",
17
+ "docs/PRODUCT_THINKING.md": "0dc90648007f149585ebd7c1e121b5639b88c4a7ac8bceb8736878780db2e026",
18
+ "docs/STYLE_GUIDE.md": "d7935b83dc9084136161a283dc0f43691c31542fce09b90d13aacf0b6c47b200",
19
+ "docs/TRACEABILITY.md": "c5c7cc70cf9f010855079b0bf2b0d74b02a65b41505328c56771d372dea3fe52",
20
+ "observations/README.md": "cad109b0d47bc83e968e6006ac204561d59ffcfa464a377048451d66437c943a",
21
+ "observations/accessibility/reduced-interaction-motion.md": "53314a7b434ff15c2bf8427e498e17004e5f20471d349c0b3eb8ca43fc361cc0",
22
+ "observations/accessibility/textual-error-recovery.md": "a63a431c5ed6c08ad7c7f7e44b1264128fda7dfd5f9dd438ac4117f0a2550edd",
23
+ "observations/accessibility/visible-keyboard-focus.md": "e36620cc3436e8f8b8762564bf35dd3bd56eb212e8acc1cc8c4caea1ca298c7c",
24
+ "observations/ai/agent-consequential-action-controls.md": "e1a7e48d58e8fbca41621381bca687fd7c0812a509575412df642b89511f10ca",
25
+ "observations/ai/agent-work-visibility-and-intervention.md": "0d7a2a228006c9001c669fe07a076a73d2f85ebca85fd498e2ea4098e1e7007f",
26
+ "observations/ai/figma-agent-context-and-skills.md": "3c397eb864ca1e346c6bfdda54e80c012bbbfe297cf0b98def99a31e0135fcb5",
27
+ "observations/finance/high-risk-wallet-recovery-flows.md": "ff1863745f929d78a04bba78c14555efacffacf27d855f3c097d7678529dc000",
28
+ "observations/finance/market-interface-adaptive-trading-surfaces.md": "49cb71c3988c467727cb23d2fa543ac188544b1829fd5581771a8334164665c1",
29
+ "observations/interaction/chrome-scoped-view-transitions.md": "2609effbd03ff097eba0c41a784b0e18f49fed03c7a4ba37668021803193c086",
30
+ "observations/interaction/figma-motion-as-system-capability.md": "4258eb75f571531407aef8c2a6262e4cdb36e4dc18dc5251a35e87e4ef03305e",
31
+ "observations/mobile/mobile-bottom-sheet-choice-contracts.md": "36161885d045ab4c188ab58428232edcb4b1016d107158f8a549a530f2a11862",
32
+ "observations/performance/reserved-loading-space.md": "3a559e3fb1dcccd4203afff138f3f063cb675dbc84dbab184b942e765aae66b8",
33
+ "observations/product-repos/pinned-ai-design-rules-integration.md": "5253f46ae8873020861a8e1e508050229ec1a427743506ce713fa16feaf897eb",
34
+ "observations/visual/apple-liquid-glass-functional-layer.md": "e1744b42fc7de538a8c3b922e6e5483f16dbd5c58c72ccc0c19d41b37f3189de",
35
+ "observations/visual/chrome-content-first-adaptive-ui.md": "0c3dc17a997c54e60bd91431375e194339ee7c5810b6dcbacecbde448f7d1d76",
36
+ "observations/visual/material-3-expressive-system.md": "393e10899c0bfdeb1d4a3607918b7f0eb1beb4dfa1397d6e5bb782b8611b07a6",
37
+ "patterns/GENERATED_INDEX.md": "3d12fffd000695562b3ea3b2cd1e7a915b166e32a68f435d5eb8d8a5d76277eb",
38
+ "patterns/INDEX.md": "18b3c3ca4b618abe96ee67557e28c9ad0b219e782d521ec00c9c81ecd8fd6109",
39
+ "patterns/README.md": "f80a45f3315539c9443491b6d06d6ffd12bd3639101be3f1db11310629d69525",
40
+ "patterns/consequential-action-confirmation.md": "d14424ba5a0a7ce4ef1faf43773fe5097ed1b5149b6759b036de76203ae01c75",
41
+ "patterns/context-preserving-preview.md": "ba5d3a67bb77bd197e46a8eba917f9cf712eb6383d9d1a913826ffb10a1e2078",
42
+ "patterns/daily-home-surface.md": "580aac815cb65f55bf04aadc80f57fd552bf0622f63fcabd46ee994a076c4e45",
43
+ "patterns/mobile-primary-action.md": "bebf84dcff3611093b9aa692ab6ba4418e05289bf8b2f9b3edfad2ecf0222d40",
44
+ "patterns/object-status-list.md": "9ed067c5fa68153651112b1c1184d2d027c00efa8d5889a2d3d68a9d153b9f64",
45
+ "patterns/progressive-detail.md": "d2ebc9fe63ce324c5b43cf3a131df81ddefa533ee68760919f95f8630af67a7d",
46
+ "patterns/quick-capture.md": "3f58b65a4cde2397d813f92283ed8fbed9a4d5b0721d6f16bb2cc93a989a8a71",
47
+ "prompts/CONSEQUENTIAL_ACTION_REVIEW.md": "128b728d00e8f30c005276262d0170249a897da8fa5a5658ef4556834ac7fcc6",
48
+ "prompts/DESIGN_EVIDENCE_REVIEW.md": "59ad575a2f4170d0f8b4b3a79ca00fec089d54fea8a7feca6f79e42477fb24ce",
49
+ "prompts/GENERATED_INDEX.md": "182461229624328276e9da107f4954b115a60e5638f5937aed23aacaa35e2efc",
50
+ "prompts/INDEX.md": "813caee52293bdda9c10e8a3305cedd230dab8f745f7b1728d0b47fb3e572d41",
51
+ "prompts/PROTOTYPE_REVIEW.md": "43233264764ff1b4682fa1651108d92ace03662ab1607481d98eb11e7636f9a7",
52
+ "prompts/QUICK_CAPTURE_STATE_REVIEW.md": "584fece5eaa65ecfc2957e4c63db06269328699c89b88d532d6bd95f1ea5ce0e",
53
+ "prompts/TODO_APP_BENCHMARK.md": "09ef9d5eab45845cba7ab6c23f78c146c2c8f40def551ca6b061d3d6d86807b2",
54
+ "registry/objects.json": "2ba009b01ef3ffc1a71ea6c6b58a2ebccc1038eb34d869c4fac8ecdf5bf02033",
55
+ "registry/relationships.json": "ddfdd42b61b8a23b16bfac5fcb5e811627757925d1f42342cef247d2b7e3839d",
56
+ "research/GENERATED_INDEX.md": "df0444ef6671aefda81bbb25b4ae625f1fd53a56d8e9b06ed704e23ee646d445",
57
+ "research/INDEX.md": "cfe75503eca963d078b6759ff27215ad854d1182471ce0bed6559a348d3f2111",
58
+ "research/accessibility/keyboard-focus-and-interaction-motion.md": "cce9ab858ec3db1d7b47b82c8f5e7ce867dcbce1f3957431ef6a98a6bc2ae355",
59
+ "research/accessibility/textual-error-recovery.md": "d3f7fbee4740f36b22546b2a67c5382c2135db7e1611eea4bf08ccd9ae40cdc3",
60
+ "research/performance/reserved-loading-space.md": "387491d52ea94f04c3a4091843e926528522cb1536ca673b465fe0af8761431a",
61
+ "research/products/apple-reminders.md": "50e0a63995502419ce510610f77ae48083ea182f3a55cb8b5d78035bc82de58d",
62
+ "research/products/arc.md": "0508fb87fcd5712ba0db6824799837547a2bd9eac89e3b60eafda6446ea184e9",
63
+ "research/products/linear.md": "476ed0ac154452f929ae8a39cc3ee5580a2f317649f68bee4fac30413f2175ee",
64
+ "research/products/telegram.md": "fe0556621563225a3a1bc634c6bdab177b445fbfa3e1c6041bcee8b0e1c4b7d0",
65
+ "research/products/things-3.md": "fe25a4babd414e9216b55c84d2d8c36ba79d8f7f21e1b8fd478b1e04cdc02890",
66
+ "research/ux/contextual-agentic-interface.md": "f70bd6480866bd3fdadfce66068f964d4d5512cb9d881ca87e0e1cde9981e998",
67
+ "research/ux/high-risk-operational-flows.md": "6e3dbb43f885fa66ed583783da70db5cadb646f2f376682ca618baae7e8b72b7",
68
+ "research/ux/motion-as-state-continuity.md": "02e98b385b07ff552ca6977159e2266ec346d6e2f28f0e21e92a9851b730fc4b",
69
+ "research/visual/expressive-system-ui-2026.md": "1087fcd32d3597b5927d08bb0e4c62c727539e8bcfbaaf36bb9b1c0f81ec3d3b",
70
+ "rules/GENERATED_INDEX.md": "89fd98f3c702b76e61d98cd7cb4a74cc0476504cc8c41edb562e9e2c4904e538",
71
+ "rules/INDEX.md": "302097dabf20ed1dd7847131730ce0d6120c1dad73046bc33e82ee192d9d89f3",
72
+ "rules/accessibility/A11Y-001.md": "0a3f2bb067fce9aeefbf8b4b24fd2c4eb5d39def28333196f2764d2bead568da",
73
+ "rules/accessibility/A11Y-002.md": "b3e9469cde848bc3d00a2e8708d7da0716ae19c13ea07cdd16903bb817dc1bcd",
74
+ "rules/accessibility/A11Y-003.md": "3eb894effd4617107e5da9a1ab0f2ef62999d2361ce92981763d156edcf82287",
75
+ "rules/accessibility/A11Y-004.md": "a2ac18c030f74242dcf0fc902013a93ba3d47ac21f0692dbf5732d35ca35bb26",
76
+ "rules/ia/IA-001.md": "49aeacd8fafe56164e3b0fb2213ffcad7ef677bd769182eb71d3b11ab958e408",
77
+ "rules/ia/IA-002.md": "ec0feb6400421d43140753600f052df9071710eec46dfc4d883bdbe44e375dae",
78
+ "rules/performance/PERF-001.md": "1fac6bfdcd2a29c6d5518049edf67259f5ef770d0f44f463663be805d4bd105c",
79
+ "rules/product/PRD-001.md": "59767c071dbcf51823caa401e650cee7b1e43020cb420dedec00838529611a82",
80
+ "rules/product/PRD-002.md": "b81c034d94a6b4c3ac5432a2dbc299153520522ab57e889277875c085f33c58a",
81
+ "rules/ux/UX-001.md": "cd2f96da07184d59fde50e18b8414f4b6509151467e4466123302544cc5c5e8a",
82
+ "rules/ux/UX-002.md": "f5b1be8f304a428c1c73e9fef83cc8a66e07dd2fced270c496433767fa8706a1",
83
+ "rules/ux/UX-003.md": "6fa78e9514de809424f2a952b5bb247363079fa12097afb6c346cf6206d63e5a",
84
+ "rules/ux/UX-004.md": "8d3bc45c741baf57d2226c99e996db7ed864563ce4a1a8e6d30daf5e44c55aba",
85
+ "rules/ux/UX-005.md": "3ca0d28b784374a0ae5e5d5a597acf7a78027471411e404fa24b8449f426186a",
86
+ "rules/ux/UX-006.md": "162542635c7d84cd7a3fc7b6d1cff39ff1474eeff62110e157d32ee9443af4d3",
87
+ "rules/visual/VIS-001.md": "5f77d195e06a8f01086d14e5e55d2ec419a22dbbb8ad650529213226500010a5",
88
+ "rules/visual/VIS-002.md": "5e41bb46741ad2a46eb8eb6e1ee666ab70a740ddf095f090edaa5f6bc67c735c",
89
+ "schema/checklist.schema.json": "f55f49654799426d4c403349c1939a6460001b8c708d134a5cb5ba84c1a4478c",
90
+ "schema/common.schema.json": "7a4293a99fc19ccc146c4d1aa65c174184271df38c384b486bef4379e5034fef",
91
+ "schema/observation.schema.json": "c59ad6de12cf78cf15198c93473d0a306c45a691faf2dc39ba03ed628d32818e",
92
+ "schema/pattern.schema.json": "86c27290e9c7a6625f69e0815cb5ede30c78fa7ea747cfa46b67498ed1e37030",
93
+ "schema/prompt.schema.json": "15ce281dee4800ec7a9761d5b6c8c57a8320a3ccf370538a88d4b8185fe6b0f6",
94
+ "schema/reference-project.schema.json": "c1a56c9df2c6356987525561c5900716bb4f84de88cacb3a22c0afffa41b94b2",
95
+ "schema/research.schema.json": "5fc70bbf8805fbf38e129440fba452738e565c0428e9d1b8fd3d858c8336be62",
96
+ "schema/review.schema.json": "8bbe71e749d20fb7154dbd9d437d02007df1e59f2f1bb5b5d4b0662b7f5a76c2",
97
+ "schema/rule.schema.json": "f5eba95e93a1e06026e2fa42c627f0db4ab854a1923d871ab7ce4e4229f4fb24",
98
+ "skills/README.md": "f794b2dd93314f75364db70bb29bca1fa3ebd524f119a300bb57d6a32a9edb69",
99
+ "skills/accessibility-reviewer/SKILL.md": "932bc345f6685279df3018bcef7f3f93f4432306201848cacdc020829d2cf102",
100
+ "skills/agent-context/SKILL.md": "03b3907e304a2185658fb44717cd2da2541f00a16df347cb6151401752ee9526",
101
+ "skills/agent-context/agents/openai.yaml": "d53d8ef922440d20d8db4c4fe381fb09c4c6af2802bc0064925ffed9bd95777d",
102
+ "skills/design-evidence-researcher/SKILL.md": "b44ac7515cbbd2877eeb87e3c01dd6f0ff2ac7dbe7a5b4b696f5fcf9eb29fed1",
103
+ "skills/design-evidence-researcher/agents/openai.yaml": "6c66a1e980f5e2dd070d942d63ab6f9bd5d5adc4fa1ac73dbd55ff9d7165cd3a",
104
+ "skills/design-reviewer/SKILL.md": "39547dea0a147a055b48d727b147e6824adbac599e4ef930f28ce2228eb6aad8",
105
+ "skills/design-system-architect/SKILL.md": "b2ce95811bf9b46f92b5073b5ea2a23ceac7c9685735fe6cbceb9baf32b064d8",
106
+ "skills/information-architect/SKILL.md": "7300766b280ba1eaa4343b29ccaecdaa7e3ee8a61d7c5b7818fad02f09bd0c06",
107
+ "skills/interaction-designer/SKILL.md": "dcec2ac442e9490cdd63763867dcd0e2efd4ed4aa0c6fe1a09ded622f2a86879",
108
+ "skills/knowledge-graph-architect/SKILL.md": "43c121717245ab2bb54b7dc45e6d75ca9d56f4a6911131932d2fb84ad890f5a5",
109
+ "skills/mobile-ux-expert/SKILL.md": "be455d431633a846930f6589ad11e9aa7856925107ffe0b650e2ced87861c1c7",
110
+ "skills/motion-designer/SKILL.md": "85e010a2acb5fc399729054e8df893d9829e7fe9e9699bc116ece2056625b03a",
111
+ "skills/performance-reviewer/SKILL.md": "c584cefa62196be1d9a2193e41913011bd6dd375e84a1c14af16627cd8ec050f",
112
+ "skills/product-designer/SKILL.md": "afcc27b3b650ee79aaa31ccfc07f8c37f81d7dc76945e0bb107a9e227f6b75fe",
113
+ "skills/prompt-architect/SKILL.md": "c880d83fa0c52200a7de811a9d7996ac77e02d771e5405d585642be16447c87b",
114
+ "skills/reference-driven-design/SKILL.md": "051c117ff6d9dd75be7e3897f67c35e22489b54ad1d46ff3f3a37b9626bf385e",
115
+ "skills/ux-reviewer/SKILL.md": "0ca04011d3bc2e662373857ce7dc32a472696901384f69131f6b74ca9e8d0297",
116
+ "skills/visual-designer/SKILL.md": "4befabcc96247db70edbaa1bc90145b31aec3310a2ecf2e8c695d923c552757e",
117
+ "tools/context.mjs": "e5504d74f8b09ab38e519596ad58b12640822607234e002fe2262b8faab03c4a",
118
+ "tools/context.test.mjs": "dcb8ae44c62b689d102d58128be153b363ebcddb9b2920b1a686e3144aa26280",
119
+ "tools/designlint.mjs": "6843485874c2d04186e4972141e39f41a5cf58495567954a0be659b046191604",
120
+ "tools/designlint.test.mjs": "7da3f29b973ba0385605ef77ee5180f2fa0021ef1aa7146a6761c990355ffb2d",
121
+ "tools/generate-indexes.mjs": "7bb2cc556e844d366388fff77c3176172044610b9be1c1d4a5319c20e062b403",
122
+ "tools/todo-reference.test.mjs": "46ee8fa24597f3999f7b291ac4a1fdd4860ea033981a91fb86c3d73b39ff695b",
123
+ "tools/validate-benchmark-evidence.mjs": "97d9727a59c21b6cfb82bc8941e77cee80680739b094b230c8210a04bbb88241",
124
+ "tools/validate-benchmark-evidence.test.mjs": "ac1533f1091272d6375f5a0b42fd26d255602c0c5f21868870b9d98b78071dca",
125
+ "tools/validate-knowledge.mjs": "65bd48817a6f9ccd398c1896798b07db84865176f61424e1636562fc00c07a25",
126
+ "tools/validate-knowledge.test.mjs": "4c4dec4ee96f739794d9561107a6f20004916c9acc164243a9a81df1848a4333"
127
+ }