opencode-skills-collection 4.1.10 → 4.1.12

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 (28) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +11 -1
  2. package/bundled-skills/agent-reels/SKILL.md +15 -4
  3. package/bundled-skills/ask-human-expert/SKILL.md +141 -0
  4. package/bundled-skills/datacircle/SKILL.md +128 -0
  5. package/bundled-skills/equibles/SKILL.md +185 -0
  6. package/bundled-skills/jet-browser/SKILL.md +155 -0
  7. package/bundled-skills/qrx/SKILL.md +131 -0
  8. package/bundled-skills/qrx/references/prompt-guide.md +30 -0
  9. package/bundled-skills/qrx/references/rest-api.md +40 -0
  10. package/bundled-skills/reverse-engineer-anything/SKILL.md +239 -0
  11. package/bundled-skills/reverse-engineer-anything/references/android-applications.md +34 -0
  12. package/bundled-skills/reverse-engineer-anything/references/evidence-workflows.md +40 -0
  13. package/bundled-skills/reverse-engineer-anything/references/javascript-applications.md +70 -0
  14. package/bundled-skills/reverse-engineer-anything/references/native-and-artifacts.md +146 -0
  15. package/bundled-skills/reverse-engineer-anything/references/runtime-observation.md +28 -0
  16. package/bundled-skills/tastegate/SKILL.md +129 -0
  17. package/bundled-skills/tastegate/references/THIRD_PARTY_NOTICES.md +25 -0
  18. package/bundled-skills/tastegate/references/craft-floor.md +53 -0
  19. package/bundled-skills/tastegate/references/direction.md +59 -0
  20. package/bundled-skills/tastegate/references/impeccable-LICENSE-Apache-2.0.txt +191 -0
  21. package/bundled-skills/tastegate/references/taste-skill-LICENSE-MIT.txt +21 -0
  22. package/bundled-skills/tastegate/scripts/gate.py +401 -0
  23. package/bundled-skills/url-to-markdown/SKILL.md +74 -0
  24. package/bundled-skills/uxkin-research/SKILL.md +127 -0
  25. package/bundled-skills/what-could-break/SKILL.md +128 -0
  26. package/bundled-skills/what-could-break/references/LICENSE-pstack.txt +21 -0
  27. package/package.json +1 -1
  28. package/skills_index.json +323 -0
@@ -0,0 +1,40 @@
1
+ # Evidence, comparison, and verification workflows
2
+
3
+ Evidence-producing tools return the complete Evidence record directly in MCP
4
+ `structuredContent` and CLI JSON. Read `normalized_result` for operation data,
5
+ and cite `evidence_id` when another tool or your explanation needs a stable
6
+ reference. Preserve authority, limitations, coverage, and residual unknowns. If a result
7
+ is incomplete or paginated, continue only when the remaining data matters to
8
+ the task; do not fetch a bundle or resource merely to read a result already
9
+ returned inline. When complete `inspect_binary_layout` or
10
+ `analyze_javascript_application` Evidence is already retained, call
11
+ `inspect_analysis_view` for a summary, one section/symbol/module, or a stable
12
+ page instead of repeating the producer.
13
+
14
+ Use `record_unknown` to track unresolved questions in the user's investigation
15
+ and name the authority or environment still required. Supply supporting and
16
+ contradicting evidence IDs. It updates the session registry directly.
17
+ Use `update_unknown` with the current revision; reread after a stale revision
18
+ instead of retrying blindly. Only qualifying observed evidence can verify a
19
+ resolution.
20
+
21
+ Use comparisons with complete, compatible page sets when claiming equivalence
22
+ or absence:
23
+
24
+ - `compare_artifacts` compares inventory pages by occurrence path, content,
25
+ metadata, and graph relations.
26
+ - `compare_functions` compares explicit function Evidence, not fuzzy
27
+ whole-binary matches.
28
+ - `compare_bundles` compares canonical bundle membership and unknown history.
29
+ - `find_changed_behavior` combines existing comparisons; static differences
30
+ remain candidates, not causal proof.
31
+ - `build_call_path` needs explicit function dossiers from one artifact/provider;
32
+ an incomplete frontier makes absence unknown.
33
+ - `correlate_static_and_runtime` uses explicit mappings; matching patterns are
34
+ hypotheses, not causality.
35
+ - `verify_reconstruction` evaluates a finite typed specification. A pass covers
36
+ only declared comparable claims, not global equivalence.
37
+
38
+ Process captures are opt-in behavioral evidence, not a security sandbox. V3
39
+ captures cannot be upgraded to V4; rerun the original scenario. Distinguish root
40
+ exit from descendant settlement and require freshness when the task needs it.
@@ -0,0 +1,70 @@
1
+ # JavaScript and Electron application artifacts
2
+
3
+ Use `analyze_javascript_application` directly on the operator-supplied ASAR or
4
+ extracted tree. The complete result, graph, and Evidence context are returned
5
+ inline when they fit the MCP frame. Source-map contents are part of the static analysis. Start from its
6
+ findings, coverage, unknowns, and graph context, then make a focused follow-up
7
+ only when a specific question remains unanswered.
8
+
9
+ An oversized response reports `resource_constraint` and
10
+ `details.resource: "transport"`. Reuse
11
+ `details.reported_limits.evidence_reference` with `inspect_analysis_view` for a
12
+ summary, one module, or a stable page of module identities. Use
13
+ `trace_application_feature` once a module, route, or string seed is known.
14
+ `export_evidence_bundle` writes the complete canonical session to a
15
+ caller-selected file. These workflows keep the original Evidence and coverage;
16
+ a broad follow-up can also exceed framing.
17
+
18
+ BrowserWindow preferences, preload and contextBridge surfaces, IPC
19
+ registrations, utility processes, and native binding requests are static syntax
20
+ observations. Only a unique exact literal IPC channel match supports an inferred
21
+ pairing. Dynamic or ambiguous channels remain unresolved. A requested `.node`
22
+ member is not a verified native export. Never claim runtime reachability,
23
+ registration, defaults, or policy enforcement from static analysis.
24
+
25
+ Use `trace_application_feature` on existing application Evidence for one
26
+ literal node ID, route, string, API, IPC channel, module, or native export.
27
+ Choose a direction and reuse the returned application Evidence ID when the
28
+ connected server advertises retained references, or supply complete Evidence
29
+ inline. Include
30
+ Hopper or Ghidra Evidence only when its artifact digest matches exactly.
31
+
32
+ For version comparison, analyze each version once, then call
33
+ `compare_application_versions`. Accept only its digest, source-map, structural
34
+ fingerprint, or non-module semantic matches. Module ordinals and minified names
35
+ are not persistent identity. Report added or removed only with complete
36
+ opposite-side coverage; otherwise report unknown.
37
+
38
+ When the question asks how one exact exported callable's returned object shape
39
+ changed, analyze each version once and then call
40
+ `compare_javascript_export_shapes` with explicit module paths and export names.
41
+ Use the returned IDs on the same connection, or complete inline Evidence
42
+ records, from both analysis calls. Accept variant
43
+ pairing only through the tool's unique exact literal discriminant. Read
44
+ `property_inventories` and each change's `presence` before treating `unknown` as
45
+ "the name was not observed": inventories list observed property names even when
46
+ values stay unknown, with a `source_range` for each paired or unpaired variant.
47
+ Array holes and mutation-invalidated slots are not observed properties.
48
+ Complete parent coverage reports presence-only
49
+ `added`/`removed` independently of unresolved values. Cite the
50
+ comparison Evidence and report JSON Pointer changes; dynamic values, ambiguous
51
+ variants, and incomplete parent-property coverage stay unknown. This is static
52
+ inference, not runtime behavior. When runtime semantics are needed, run
53
+ behavioral probes against the relevant application versions and capture them
54
+ through the available browser, Electron, or process workflows.
55
+
56
+ ## Reusing application Evidence
57
+
58
+ When advertised by the connected server, application trace and compare tools
59
+ accept complete inline Evidence or
60
+ `{"kind":"retained-evidence","evidence_id":"ev_<64 lowercase hex characters>"}`
61
+ for their application input (`application`, or `left`/`right`). `inspect_analysis_view`
62
+ uses the same retained-reference form in `source`, or portable inline Evidence,
63
+ to project a summary, module page, or one module with its recorded observations. This notation is
64
+ a template: replace it with the actual returned ID. Versions before 4.1.0 accept only full
65
+ inline Evidence. Use the exact ID
66
+ returned by the producer on the same MCP connection. Resolution does not run
67
+ analysis or select a provider; findings remain inline. Native observation
68
+ arrays still take full Evidence. `close_binary` clears retained references;
69
+ export a bundle before closing, or supply portable inline Evidence in another
70
+ connection. A missing reference includes its ID and recovery guidance.
@@ -0,0 +1,146 @@
1
+ # Native, managed, and packaged artifacts
2
+
3
+ ## Recorded Linux crashes
4
+
5
+ Use `inspect_recorded_crash` with an explicit Linux x86-64 ELF core path to
6
+ inspect historical thread registers, signals, raw notes and original file
7
+ ranges. It is independent of the active disassembler target. Source-bound
8
+ register values and note bytes are observations; missing notes, signal-thread
9
+ association and current executable/library identity remain unknown. PIDs are
10
+ historical metadata and never authorize live attach or control.
11
+
12
+ The optional `include_debugger_context` facet adds mapping candidates through
13
+ caller-supplied GDB/pwndbg in an owned core-only session. Display names do not
14
+ establish current file identity; zero reported flags leave permissions unknown.
15
+ Requested unavailable context fails with setup guidance. See
16
+ [recorded crashes](https://github.com/morluto/rea/blob/main/docs/recorded-crashes.md)
17
+ for exact upstream profiles, bounds and verification coverage.
18
+
19
+ ## Offline ELF layout
20
+
21
+ Use `inspect_binary_layout` with an explicit local ELF path for file-backed
22
+ sections, symbols, relocations, linkage names, and static mitigation inferences
23
+ without opening a disassembler target. When that complete record is already
24
+ retained, call `inspect_analysis_view` for a summary, mitigations or linkage
25
+ facet, one section or symbol, or a stable page. Do not re-run the decoder to
26
+ read a single object.
27
+
28
+ ## Native targets
29
+
30
+ After `open_binary`, use focused search, procedure, or function tools directly.
31
+ Use `binary_overview` when target metadata or inventory context helps answer the
32
+ question. Prefer literal search, names, decompilation, callers, callees, and
33
+ cross-references. Addresses and recovered pseudocode are analysis observations,
34
+ not original source. Provider unavailability and unsupported metadata remain
35
+ unknown rather than false.
36
+
37
+ To see which functions or Objective-C methods a Mach-O actually calls in one
38
+ run, use `observe_native_calls` with explicit breakpoints and a bounded
39
+ `duration_ms`/`max_events`. It launches a new process under LLDB, so the target
40
+ runs and may change files or use the network. Hardened-runtime targets need the
41
+ `get-task-allow` entitlement.
42
+
43
+ Use `binary_session` with no arguments to check the open target, selected
44
+ provider, and alignment. Its default `result.tool_availability` includes the
45
+ complete tool inventory with availability reasons and remediation. When choosing
46
+ a tool, use its entry in that result; `tools/list` retains the complete catalog
47
+ when the target or provider state changes.
48
+
49
+ ## DOS MZ with Ghidra
50
+
51
+ For an admitted DOS MZ target, use `inspect_native_load_image` to check measured
52
+ loaded bytes, file mappings, relocations and the entry against the immutable
53
+ snapshot. Keep `mismatch` and `unsupported` explicit. Verified import covers the
54
+ reported static image, not runtime DOS or PC-98 hardware behavior.
55
+
56
+ Use `read_bytes` for initialized analysis memory and `address_to_file_offset` to
57
+ anchor one observed address to original file bytes. Loader fixups can change a
58
+ word; a source offset does not imply byte equality. Complete function body ranges
59
+ use inclusive ends and can contain gaps. Do not treat the enclosing span as code.
60
+ For packed targets, retain the original and separately derived artifact identities;
61
+ decompiling an unpacking stub does not recover the unpacked program.
62
+
63
+ When reading Objective-C dispatch metadata, distinguish class implementation
64
+ methods from protocol requirements: class methods report null requirement
65
+ flags, while decoded protocol declarations retain required and optional facts.
66
+ Property attributes remain raw name/value tokens; use the property's
67
+ `atomicity` field for the decoded `N` marker or the default atomic behavior.
68
+ Null class/meta flags, ivar counts, atomicity, or read-only values mean the
69
+ selected provider did not establish that fact. Symbol names alone do not prove
70
+ that a class is a root class or has no ivars.
71
+
72
+ ## Managed PE/CLI
73
+
74
+ Start with `inspect_managed_artifact`. REA's canonical managed inspection is
75
+ execution-free: do not claim it loaded, reflected, executed, or resolved the
76
+ assembly. Keep managed/native boundaries and unavailable reconstruction facts
77
+ explicit. A bring-your-own reconstruction oracle is separate from the canonical
78
+ parser and must not become an implicit setup dependency.
79
+
80
+ ### .NET NativeAOT
81
+
82
+ NativeAOT binaries contain native machine code, so ordinary CIL decompilers
83
+ cannot recover the original method bodies. When managed metadata/CIL is absent,
84
+ classify that as a native-analysis route rather than claiming source recovery.
85
+ Open the native image with the selected deep provider and inspect functions,
86
+ strings, calls, and references; describe decompiler output as pseudocode and
87
+ inference.
88
+
89
+ NativeAOT images can be PE/COFF, ELF, or Mach-O executables and shared
90
+ libraries. Use file bytes and loader metadata rather than suffixes to identify
91
+ them. For packaged apps, inventory/extract with REA's artifact tools and retain
92
+ the exact contained image identity. PDB, ELF debug, or dSYM sidecars are
93
+ additional evidence only when the provider accepts and matches them.
94
+
95
+ For deeper type recovery, the optional third-party
96
+ [Ghidra NativeAOT analyzer](https://github.com/Washi1337/ghidra-nativeaot)
97
+ rehydrates ReadyToRun metadata and can recover method tables, type relationships,
98
+ frozen objects, and strings. This is a Ghidra extension with its own install and
99
+ interactive workflow; it is not currently part of REA's managed parser or
100
+ headless Ghidra bridge. Treat its annotations as analysis evidence, retain the
101
+ binary identity, and do not present recovered types as original source. Header
102
+ discovery may require a symbol or analyst identification of the ReadyToRun
103
+ header, depending on the binary and analyzer version.
104
+
105
+ ## Packages and extraction
106
+
107
+ Use `inspect_artifact` for application bundles, archives, ZIP/APK/IPA/MSIX/AppX,
108
+ ASAR, or DMG inputs when the artifact graph and findings help answer the
109
+ question. It returns the complete artifact graph inline. Cite graph manifest
110
+ IDs when using them.
111
+
112
+ For an IPA or a macOS `.app`, ZIP, or DMG, pass the inventory Evidence to
113
+ `project_apple_application_graph`. It reports application roots and nested
114
+ bundles by path convention: app extensions, XPC services, frameworks, login
115
+ items, system and driver extensions, and plug-ins. It also lists privileged
116
+ helpers, launchd plists, symlinks, and each bundle's `info_plist_path` and
117
+ executable candidates. Roles are path conventions, not parsed plists; read the
118
+ listed plists with `inspect_plist`.
119
+
120
+ After `open_binary` on a `.app` or Mach-O, use `trace_dylib_resolution` to see
121
+ which file each `@rpath`, `@loader_path` and `@executable_path` load reaches for
122
+ every executable in the bundle. It also lists missing or weak loads and earlier
123
+ `@rpath` candidates that are absent. Narrow large bundles with `roots` or
124
+ `architecture`. System paths stay undetermined because the dyld shared cache
125
+ provides them.
126
+
127
+ Use `extract_artifact` when materialized files are needed. It takes no arguments
128
+ and materializes all regular files into a fresh temporary directory chosen by
129
+ REA. Symlinks and encrypted entries are inventory facts, not extractable files.
130
+ The result reports the materialized directory; callers do not choose the
131
+ destination. No separate permission grant is needed.
132
+
133
+ Native DMG traversal automatically uses a read-only mount on supported macOS
134
+ hosts, with an owned temporary mount directory and cleanup. It needs no approval
135
+ flag. Unsupported hosts or mount failures remain explicit limitations; do not
136
+ claim child inventory when only root identity is available. Extraction is a
137
+ separate filesystem-writing operation.
138
+
139
+ For headerless DOS COM, explicitly open with `format: "dos-com"` (CLI
140
+ `--target-format dos-com`). Inspect the load image before trusting function
141
+ analysis: the entry is `0x10100`, file offset zero, with imposed real-mode segment
142
+ context. PSP/stack/device state remains unmodeled. See [DOS guide](https://github.com/morluto/rea/blob/main/docs/ghidra-dos.md).
143
+
144
+ ### Function annotations in Ghidra
145
+
146
+ Use `annotate_native_function` for one function name and/or entry comments, with at least one explicit change. Review its annotation readback and refreshed dossier inline. Changes are atomic and session-scoped; empty comments clear them, omitted fields preserve them. Later MCP calls observe edits until close. CLI `annotate-native-function` returns the updated analysis before discarding the session. Original executable bytes are unchanged; edits invalidate immutable snapshots. Windows P0 does not admit database mutations.
@@ -0,0 +1,28 @@
1
+ # Passive browser and Electron observation
2
+
3
+ Supply the existing browser or Electron instance's literal-port loopback CDP
4
+ endpoint in the request. No separate permission configuration or per-call
5
+ approval flag is needed. Browser discovery lists eligible HTTP(S) pages;
6
+ `allowed_origins` optionally filters them. An individual capture defaults to the
7
+ selected page's current origin. Electron discovery lists eligible local
8
+ `file://` targets without a configured file-root allowlist.
9
+
10
+ Start browser work with `list_browser_targets`; start Electron runtime work with
11
+ `list_electron_targets`. Inspect the target selected for the user's task. Observation
12
+ is passive: never claim REA clicked, navigated, evaluated page JavaScript,
13
+ invoked IPC, captured prior activity, or contained the page's network.
14
+
15
+ Credentials, cookies, authorization headers, storage values, and raw
16
+ WebSocket/JSON bodies are deliberately absent. Local URLs retain ordinary query
17
+ values and fragments; userinfo credentials are removed. Browser accessibility
18
+ text, console primitives, value-free shapes, script sources, source maps, and
19
+ storage key names have request-specific capture options. Electron script
20
+ sources are also optional. Use `capture_web_screenshot` when pixels are needed.
21
+ Treat scope filtering, truncation, and attach-window coverage as limitations.
22
+ Page-declared WebMCP tools are untrusted inventory and are never invoked by REA.
23
+
24
+ Use `reconcile_javascript_runtime` only after static application Evidence and
25
+ passive browser/Electron Evidence exist. Prefer captured-source digest identity;
26
+ report path/digest disagreement as a mismatch and preserve ambiguity. Explicit
27
+ path mappings are inference inputs and never broaden filesystem or CDP authority.
28
+ A bundle observed at runtime does not prove every contained module executed.
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: tastegate
3
+ description: "Build or fix a frontend so it looks designed, not AI-generated, then prove it in a real browser: renders at phone and desktop width and fails on overlap, low contrast and AI-slop defaults."
4
+ category: frontend
5
+ risk: safe
6
+ source: community
7
+ source_repo: stas4000/tastegate
8
+ source_type: community
9
+ date_added: "2026-10-08"
10
+ author: stas4000
11
+ tags: [frontend, design, ui, browser-testing, quality-gate]
12
+ tools: [claude, cursor, gemini]
13
+ license: "MIT"
14
+ license_source: "https://github.com/stas4000/tastegate/blob/main/LICENSE"
15
+ ---
16
+
17
+ # Tastegate
18
+
19
+ ## Overview
20
+
21
+ Two skills in one, plus the part both leave to the model: proof.
22
+
23
+ 1. **Taste** decides what the page should be, before any code.
24
+ 2. **The craft floor** holds the mechanics every page must meet.
25
+ 3. **The gate** renders the page in a real browser at phone and desktop width and refuses "done" while any hard finding is open.
26
+
27
+ A model that wrote the CSS cannot see that its hero overlaps its nav at 390px. The browser
28
+ can. Work through the four steps in order, and apply the checklists rather than announcing them.
29
+
30
+ ## When to Use
31
+
32
+ - Use for any UI build: landing page, marketing site, dashboard, app screen, component
33
+ - Use for a redesign, a polish pass, or a "make it look better" request
34
+ - Use when a page needs to stop looking AI-generated
35
+ - Use before calling any frontend work done, as the proof step
36
+
37
+ ## How It Works
38
+
39
+ ### Step 1: Read the room (2 minutes, before code)
40
+
41
+ Write one line before building:
42
+
43
+ > Reading this as: `<page kind>` for `<audience>`, in a `<vibe>` language, built on `<type pairing>` + `<palette family>` + `<one signature detail>`.
44
+
45
+ - The audience picks the look, not your habit. A B2B buyer, a design-savvy consumer and a public-sector visitor need three different pages.
46
+ - Set three dials from that read (1 to 10): **variance** (symmetry to art), **motion** (still to cinematic), **density** (gallery to cockpit). Default landing page: 7 / 6 / 4. Trust-first or regulated: 3 / 2 / 5.
47
+ - Name one **signature detail** the page will be remembered by: a type treatment, a material, an interaction, a way the product is shown. One, done well.
48
+ - If the brief pins fonts, colors or an era, the brief wins over every rule here.
49
+
50
+ ### Step 2: Build on the craft floor
51
+
52
+ - **Type:** a real display face with character, paired with a readable text face. Not Inter, Roboto, Arial or the system stack as the display voice unless the brief asks for neutral. Body 16px or more, 60 to 75 characters a line, clear size and weight steps.
53
+ - **Color:** one neutral family, one accent, locked across the page. No purple-to-blue "AI glow" gradients, no gradient text, no colored glow halos. Secondary text tinted from its surface, never plain gray on color. Body contrast 4.5:1 or better.
54
+ - **Layout:** the hero fits the first screen with its call to action visible. No small uppercase eyebrow label over every heading. No row of three same-size cards as the page's structure. Each section uses a different layout family. Spacing tighter inside a group than between groups.
55
+ - **Icons and copy:** real SVG icons in one stroke weight, never emoji. The product's own words: no lorem ipsum, no "Acme", no "John Doe", no "Unlock the power of".
56
+ - **States:** hover, focus-visible, active, disabled, loading, empty and error exist for every control that has them. Style the browser parts too: selection color, focus ring, scrollbar, caret.
57
+ - **Motion:** one authored moment, eased out, from an already-visible default. Respect `prefers-reduced-motion`.
58
+ - **Phone first:** every multi-column block declares what it becomes under 768px. Tap targets at least 44px. Nothing scrolls sideways.
59
+
60
+ ### Step 3: Run the gate
61
+
62
+ ```bash
63
+ python3 skills/tastegate/scripts/gate.py <path/to/index.html or http://localhost:3000> --out .tastegate
64
+ ```
65
+
66
+ (Run it from the repo root, or use the path to wherever this skill is installed.)
67
+
68
+ It renders the page in headless Chromium at 390x844 and 1440x900, prints every finding with
69
+ its rule, viewport and element, saves full-page screenshots, and exits 1 while any **fail**
70
+ finding is open. First run only: `pip install playwright && python3 -m playwright install chromium`.
71
+
72
+ Fix every fail finding in one batch, then run the gate again. Warnings are judgment calls:
73
+ fix them unless the brief asked for that thing.
74
+
75
+ ### Step 4: Look at it yourself
76
+
77
+ Open both screenshots the gate saved (`.tastegate/desktop.png`, `.tastegate/mobile.png`). The
78
+ gate catches mechanics; it cannot tell you the page is boring. Ask: would a designer at a good
79
+ studio ship this? Does the signature detail land in the first viewport? Is anything still a
80
+ default you did not choose? Fix what you see, rerun the gate, then stop.
81
+
82
+ ## Examples
83
+
84
+ ### Example 1: A landing page that passes review but fails the gate
85
+
86
+ The copy and sections are right, so the work reads as done. The gate at 390px reports the
87
+ hero heading overlapping the nav, a 3.1:1 contrast ratio on secondary text, and sideways
88
+ scroll from an un-wrapped feature row. Three real defects, none visible in the markup.
89
+
90
+ ### Example 2: "Make it look less AI"
91
+
92
+ The gate names what "AI slop" actually is on this page: a purple-to-blue gradient hero,
93
+ gradient heading text, emoji feature icons, an uppercase eyebrow over every section, the
94
+ system font stack as the display voice, and three equal cards carrying the structure. Each
95
+ is a line item to fix, not a matter of opinion.
96
+
97
+ ## Best Practices
98
+
99
+ - ✅ Write the direction line before the first line of CSS
100
+ - ✅ Fix all fail findings in one batch, then rerun the gate
101
+ - ✅ Open both screenshots yourself after the last change
102
+ - ✅ Report the gate's last line and the screenshot paths with the result
103
+ - ❌ Don't call a page done on a passing build or a glance at the markup
104
+ - ❌ Don't let a default font, palette or card grid decide the page
105
+
106
+ ## Limitations
107
+
108
+ - The gate checks mechanics. It cannot tell you the page is boring, off-brand or wrong for the audience: step 4 is not optional.
109
+ - It needs Playwright and headless Chromium installed, and a page it can reach (a file path or a local server).
110
+ - A brief that pins fonts, colors or an era overrides the craft floor.
111
+ - Does not replace accessibility auditing by a human or real user testing.
112
+
113
+ ## Security & Safety Notes
114
+
115
+ - `scripts/gate.py` launches headless Chromium and loads the URL or file you give it. Point it at your own page or a local server, in a local or authorized test environment; it will fetch whatever that page fetches.
116
+ - It is read-only against your project: it renders, measures and writes screenshots plus findings into the `--out` directory. It does not edit source files.
117
+
118
+ ## Files
119
+
120
+ - `scripts/gate.py` - the browser gate (needs `playwright` and headless Chromium)
121
+ - `references/direction.md` - the full step 1 direction rules
122
+ - `references/craft-floor.md` - the full step 2 craft floor, read it right before the first UI edit
123
+
124
+ ## Credits
125
+
126
+ Adapted from [stas4000/tastegate](https://github.com/stas4000/tastegate) (MIT). The direction
127
+ rules derive from taste-skill (MIT) and the craft floor from impeccable (Apache-2.0); both
128
+ notices ship here in [references/THIRD_PARTY_NOTICES.md](references/THIRD_PARTY_NOTICES.md) with their
129
+ full licenses under `references/`.
@@ -0,0 +1,25 @@
1
+ # Third-party notices
2
+
3
+ tastegate's own code (scripts/gate.py, tests) and SKILL.md are MIT, Copyright (c) 2026 Bles Software.
4
+ Two reference files are adapted from other open-source skills. Both were rewritten, shortened and
5
+ merged for tastegate; the originals are much larger and worth reading in full.
6
+
7
+ ## impeccable
8
+
9
+ - Source: https://github.com/pbakaus/impeccable (commit 9d715cc4f5564a990ca8345abfdd5df6dc9b41c8)
10
+ - Author: Paul Bakaus
11
+ - License: Apache License 2.0, full text in impeccable-LICENSE-Apache-2.0.txt
12
+ - Used in: references/craft-floor.md, adapted from the "Craft floor" reference (verify list and
13
+ refuse list). Changes: rewritten in our words, merged with taste-skill's layout rules, marked the
14
+ rules gate.py checks, removed references to impeccable's CLI and hooks.
15
+
16
+ ## taste-skill
17
+
18
+ - Source: https://github.com/Leonxlnx/taste-skill (commit ce26fc25c0e5e8cab638f883de62d9a86ee5e45b)
19
+ - Author: Leonxlnx
20
+ - License: MIT, full text in taste-skill-LICENSE-MIT.txt
21
+ - Used in: references/direction.md (brief reading, the three dials, type and palette direction,
22
+ layout families) and parts of references/craft-floor.md (hero, eyebrow, card-grid and CTA
23
+ rules). Changes: rewritten and cut down to about a tenth of the original.
24
+
25
+ tastegate is not affiliated with or endorsed by either project.
@@ -0,0 +1,53 @@
1
+ # Craft floor
2
+
3
+ Adapted from the craft floor in impeccable by Paul Bakaus (Apache-2.0, see THIRD_PARTY_NOTICES.md) and the layout rules in taste-skill (MIT), rewritten and merged. Load it right before the first UI edit. The brief's own words can earn back anything under "Refuse"; your habit cannot.
4
+
5
+ Rules marked **[gate]** are checked by `scripts/gate.py` on the rendered page. The rest are yours to check in the screenshots.
6
+
7
+ ## Verify on the built page
8
+
9
+ - **Contrast [gate]:** body and placeholder text 4.5:1 or better, large text (24px, or 18.7px bold) 3:1. Secondary text on a colored surface is tinted from that surface, not gray.
10
+ - **No sideways scroll [gate]:** at 390px nothing is wider than the screen. Long words, code, tables and images get a wrap or a scroll container.
11
+ - **No text over text [gate]:** no heading under a sticky nav, no badge on a label, no line of copy running into another at any width.
12
+ - **Tap targets [gate]:** buttons and controls at least 44px tall on phones; inline links at least 24px.
13
+ - **Readable size [gate]:** no visible text under 12px on phones.
14
+ - **Hero [gate]:** the H1 and the first call to action are both inside the first desktop screen.
15
+ - **Images [gate]:** every image loads and has alt text (empty alt for decoration).
16
+ - **Type:** body measure 60-75 characters, display no bigger than about 6rem, tracking no tighter than -0.04em, balanced headings (`text-wrap: balance`), obvious steps in size and weight.
17
+ - **Spacing:** tight inside a group, generous between groups, more space above a heading than below it.
18
+ - **Depth:** shadows have an offset and a soft blur and take their tint from the background. A zero-offset colored glow is decoration.
19
+ - **Motion:** one authored moment, eased out, from a visible default state. Scattered fades on every section are not motion design. `prefers-reduced-motion` turns it off.
20
+ - **States:** hover, focus-visible, active, disabled, loading, empty, error. Forms: label above input, error below, no placeholder as label.
21
+ - **Browser surfaces:** text selection, focus ring, caret, scrollbar, link underline offset, tabular numerals in data. Theme them; they are the cheapest sign a page was built rather than assembled.
22
+ - **Copy:** the product's own words. Buttons say what they do. One label per intent on the whole page ("Get started" everywhere, not also "Try free" and "Sign up").
23
+ - **Nav:** one line on desktop, 64-80px tall.
24
+ - **Coverage:** every requirement in the brief is on the page and easy to find.
25
+
26
+ ## Refuse (the defaults that make a page look generated)
27
+
28
+ Page scaffolds:
29
+
30
+ - **[gate] Three or more same-size cards of icon, heading and text** as the page structure. Cards are for real elevation; group with space and dividers otherwise. Never nest cards.
31
+ - **[gate] An eyebrow label** (small uppercase letter-spaced text) above headings. At most one per three sections, and usually none: the heading can speak.
32
+ - The hero-metric template: giant number, small label, three supporting stats.
33
+ - Section numbers (01 / 02 / 03) unless the order carries meaning.
34
+ - A split header (big heading left, small paragraph right) with nothing else in the right column.
35
+ - A logo wall or tagline stuffed inside the hero.
36
+ - A modal for a task that does not need to interrupt.
37
+
38
+ Surface habits:
39
+
40
+ - **[gate] Purple, violet or indigo gradients** as the default accent (the "AI glow").
41
+ - **[gate] Gradient text.** Emphasis comes from weight, size or the accent color.
42
+ - **[gate] Emoji or unicode glyphs as icons.** Use one SVG icon set in one stroke weight.
43
+ - **[gate] The system or a stock font as the display voice** (Inter, Roboto, Arial, Helvetica, system-ui) unless the brief asked for neutral.
44
+ - **[gate] Placeholder copy:** lorem ipsum, Acme, John or Jane Doe, example.com, "Unlock the power of".
45
+ - **[gate] Em dashes in body copy.** Use a comma, a colon or a period.
46
+ - Glass and blur as decoration rather than a specific effect.
47
+ - A thick colored border on one side of cards, callouts or list items.
48
+ - Hard offset block shadows outside a page that is actually neo-brutalist.
49
+ - Monospace as a costume for "technical" rather than for code or data.
50
+ - Geometric masks faking an organic cut-out of a photo.
51
+ - Mixed corner radii with no rule. Pick sharp, soft or pill and keep it.
52
+
53
+ The floor holds the mechanics. It never picks the direction. With every check green, spend the page on the signature detail you chose in step 1.
@@ -0,0 +1,59 @@
1
+ # Direction: decide what the page is before building it
2
+
3
+ Adapted from taste-skill by Leonxlnx (MIT, see THIRD_PARTY_NOTICES.md), rewritten and cut down.
4
+
5
+ Most generated UI looks the same because the model skips this step and reaches for its default: a centered hero on a dark mesh, a purple-to-blue gradient, Inter on slate, three equal feature cards, an eyebrow label on every section. Every one of those is fine when chosen. None of them is fine as a reflex.
6
+
7
+ ## 1. Read the signals
8
+
9
+ 1. **Page kind:** SaaS landing, consumer product, agency, event, portfolio, docs, dashboard, settings, redesign.
10
+ 2. **Vibe words the user used:** minimal, calm, editorial, Linear-like, Apple-like, playful, brutalist, premium, serious B2B, dark tech.
11
+ 3. **References:** URLs, screenshots, named competitors. These beat your taste.
12
+ 4. **Audience:** a procurement panel, a design-conscious consumer, a developer, a recruiter skimming, a patient. The audience picks the look.
13
+ 5. **Assets that already exist:** logo, colors, type, photos. In a redesign they are starting material.
14
+ 6. **Quiet constraints:** accessibility-first, public sector, regulated, kids, trust-first commerce. These override aesthetics.
15
+
16
+ Then write the one-line read from SKILL.md step 1. If two very different reads are plausible, ask one question. If not, proceed.
17
+
18
+ ## 2. Set the dials
19
+
20
+ | Read | Variance | Motion | Density |
21
+ |---|---|---|---|
22
+ | Minimal, calm, editorial | 5-6 | 3-4 | 2-3 |
23
+ | Premium consumer | 7-8 | 5-7 | 3-4 |
24
+ | Playful, experimental, agency | 9-10 | 8-10 | 3-4 |
25
+ | Landing page (default) | 7 | 6 | 4 |
26
+ | Trust-first, regulated, public | 3-4 | 2-3 | 4-5 |
27
+ | Dashboard, admin, tool | 3-4 | 2-3 | 6-8 |
28
+ | Redesign that preserves | match | +1 | match |
29
+
30
+ - **Variance above 4:** avoid the centered hero. Use a split, left copy with a right asset, asymmetric space, or a pinned scroll section. A centered hero is right for a manifesto or launch note where the words are the design.
31
+ - **Motion:** 1-3 means hover and focus only. 4-6 means one entrance moment and scroll-linked reveals. 7+ means a real authored sequence, still with a reduced-motion path.
32
+ - **Density above 7:** no generic cards; numbers breathe in plain layout with dividers.
33
+
34
+ ## 3. Pick the type
35
+
36
+ - Choose the display face for its character, then a text face that reads well at 16px.
37
+ - Sans display by default: Geist, Satoshi, Cabinet Grotesk, General Sans, PP Neue Montreal, Switzer, Space Grotesk, Manrope, Outfit. Rotate; do not reuse the same pairing on consecutive projects.
38
+ - A serif needs a reason you can say in one sentence (editorial, heritage, luxury publication). "It feels premium" is not a reason. The two LLM-favorite display serifs (Fraunces, Instrument Serif) are not defaults.
39
+ - Emphasis inside a headline is italic or bold of the same family, not a random second family.
40
+ - Italic display words with descenders (g, j, p, q, y) need line-height 1.1 or more so they do not clip.
41
+
42
+ ## 4. Pick the palette
43
+
44
+ - One neutral family (zinc, stone, slate, sand, ink), one accent, saturation under 80%. Lock the accent for the whole page: no blue CTA in a warm page's footer.
45
+ - Families that are not the default: pure monochrome with one bright pop, cobalt and cream, forest with an amber accent, terracotta and slate, olive and brick, black and tan, cold silver and smoke.
46
+ - The premium-consumer default (cream background, brass or clay accent, espresso text) is a reflex. Use it only when the brand is really that.
47
+ - Light or dark comes from the use scene: who, where, under what light. Not from the category.
48
+
49
+ ## 5. Pick the layout families
50
+
51
+ List the sections, then give each a different family: split, full-bleed media, bento with real visual variety, marquee, stacked statement, comparison table, timeline, quote, gallery, sticky stack, horizontal pan. The same family at most once. Never three image-and-text zigzags in a row.
52
+
53
+ ## 6. Pick the signature detail
54
+
55
+ One thing a visitor will remember: an oversized numeral treatment, a material (paper grain, frosted glass used on purpose, machined metal), a product demo that actually moves, a cursor interaction, a custom illustration style. Spend the effort there. Everything else stays quiet and precise.
56
+
57
+ ## Redesigns
58
+
59
+ First decide: evolve or replace. Evolve keeps the identity, copy and behavior and fixes the mechanics. Replace treats the old look as an anti-reference and picks a new world with the steps above. Never split the difference by polishing a look you have decided to throw away. Never change factual copy, prices or claims without asking.