* feat(design-html): craft section and free craft check, adapted from Elaya design skills (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(GSTA-92): restore the full CHANGELOG under the Unreleased entry; drop a $-digit literal from craft.md; count only craft-check executions in design-html-slop-gate Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * feat(design-motion): new /design-motion skill: showcase MP4 and GIF loops from a design, adapted from Elaya design-to-motion (GSTA-92 phase 2) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test(design-motion): run design-motion-showcase in the marathon tier; the periodic census is at its 38-slice cap (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-motion): review and QA fixes before ship - encode: refuse unknown options and --formats tokens, validate --pad (#RRGGBB[AA]) and --crop (compare too) so nothing but a colour or crop reaches ffmpeg's filter graph - encode: export refuses a capture with missing window frames; check prints MOTION_SETTINGS for any threshold/phase override; contact sheet drops -fps_mode - capture: portrait-aware scale, --cycle must be whole 60 fps frames, stills with CSS animations disabled, pauseAt tolerates slow loads, clears stale manifest/stills - skill: <motion-dir> placeholder instead of a cross-block shell variable, GSTACK_FFMPEG-aware probe, stop points before the first capture, doctrine fixes - tests: refusal rows, portrait scale, cycle guard Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test(design-motion): capture-check-export pipeline on real Chromium and ffmpeg Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-motion): second review cycle - capture: refuse an --out that holds a still or frames but no capture.json instead of deleting them; --cycle must be a multiple of 0.05 s so the seam frame lands exactly one cycle later for every PRE (nearest value round-trips) - encode: a capture without a mask ends 'MOTION_RESULT: clean (overflow not checked)' - skill: Step 5 names window.__mark in the capture contract - tests: foreign/previous --out handling on real Chromium, cycle guard and PRE sweep Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-motion): third review cycle and adversarial findings - capture: an ownership marker (.gstack-motion-capture) replaces the capture.json test, so the rerun after MOTION_CONTRACT_MISSING or a crash works and a foreign --out is still refused; offscreen lazy images are made eager and font/image loading is bounded at 30 s instead of hanging - encode: refuse a capture.json whose fields are not what capture writes (they reach ffmpeg args and paths); a cards overflow with no story frames is a planning error, and a zero-frame job never passes - tests: retry after a refused page, no-mask clean line, lazy image still, manifest validator, empty story span Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-motion): mask coverage, manifest relations, Windows stop, Figma token off argv - check fails overflow when the grown mask covers >90% of the frame (an app frame whose clip surfaces fill the stage passed vacuously); --mask-grow is 0-32; --mask refuses braces and semicolons - manifestError checks fps/windowFrames >= 1 and that the window fits the frames - skill: native Windows stops before the first capture call; the Figma token reaches curl on stdin (-H @-) instead of argv - tests: split the --out ownership scenario out of the contract test, full-frame mask, --still --scale 2 size and STILL_OK, manifest relations, coverage parse Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-motion): bounded frames, atomic exports, full-bleed masks - capture: each frame is bounded at 10 s (a __tick that never returns fails with MOTION_CAPTURE_FAILED instead of hanging); a --mask that matches no element stops with MOTION_MASK_EMPTY - check: a grown mask covering >90% of the frame (full-bleed app frame) reports overflow as skipped and ends 'clean (overflow not checked)' - export: writes .partial- files and renames on success, so a failed re-export keeps the last good file; a GIF fps that does not divide the cycle is refused; a missing GSTACK_FFMPEG override is named - fidelity: URL source is untrusted data; full-bleed note - tests: spinning __tick, empty mask, failed re-export, drifting gif fps Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-motion): app-only coverage skip, gif fps cap, early empty mask - check: the >90% coverage skip applies only to an app frame's own surfaces (ungrown mask); in cards, or when --mask-grow pushes coverage over 90%, overflow fails with what to change (a cards capture with real overflow passed as 'clean (overflow not checked)' after a large grow) - export: --gif-fps/--small-fps capped at 50 (GIF delays are 1/100 s) - compare resolves its paths (a colon in a relative path read as a protocol) - capture: MOTION_MASK_EMPTY is checked before the first frame - tests: cards vs app full-frame mask, fps cap, no frames on an empty mask Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-motion): seek story transitions from their own frame - capture: an animation first seen in a frame where window.__mark did not move (a story's class toggle) is seeked from that frame instead of the last mark, so it eases in the export instead of popping ~100 ms ahead - encode: an empty numeric option is refused instead of read as 0 - figma: only fill a file key and node id that look like Figma's - tests: class-toggled transition mid-fade at its midpoint, blank --min-db Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs: PROJECT_STRUCTURE names Elaya's MIT material and licenses/MIT-elaya.txt Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
7.0 KiB
Third-Party Notices
gstack is MIT. The files below contain material derived from Apache-2.0 and MIT
works, rewritten in gstack's voice and modified. Rewriting is not an exemption:
the license texts are in licenses/, and each file derived from an Apache-2.0
work carries a notice that it was changed. Unmodified copies (the rule-registry fixture, the
license text) carry no header and are listed here instead.
impeccable — Copyright Paul Bakaus — Apache License 2.0
https://github.com/pbakaus/impeccable
Derived, modified:
lib/design-catalog.ts: rule ids and names fromcrates/live/assets/antipatterns.json; the prose is gstack's.scripts/resolvers/design.ts: the Persuade / Operate / Read / Experience visitor modes, the craft-floor reflexes (browser surfaces, one authored motion moment, depth has an offset, tinted secondary text, space above headings, light-or-dark from the use scene), and the three-looks calibration, fromSKILL.md,reference/craft-floor.md, andreference/new-work.md, rewritten.design-consultation/sections/proposal-and-preview.md.tmpl: the font-selection procedure and the calibration paragraph, rewritten; and theSKILL.md/sections/*.mdfiles generated from these sources.
Unmodified copy:
test/fixtures/impeccable-antipatterns.json:crates/live/assets/antipatterns.jsonat commit 87d8f6d6 (engine-v0.1.3), wrapped in a_sourceprovenance object.
Not distributed: bin/gstack-design-detect.ts invokes an impeccable engine the
user installed. gstack does not ship or mirror that engine and never runs impeccable's
installer or launcher. The one download gstack can make is the engine binary
itself, only after the user accepts a design skill's one-time offer: fetched from
impeccable's own GitHub release into ~/.impeccable/bin/<version>/, verified
against the checksum pinned in lib/design-detect-contract.ts, and recorded in
the egress ledger first. gstack does not audit the engine's network behavior; the
wrapper refuses URL targets so gstack never asks it to touch the network.
ai-design-skills and redesign-skill — Copyright (c) 2026 Elaya — MIT License
https://github.com/elayadesign/ai-design-skills (skills/landing-page-design,
skills/design-to-motion, at 38bbe576) and
https://github.com/elayadesign/redesign-skill (skills/redesign-existing-projects,
at 64627f6e). License text: licenses/MIT-elaya.txt.
Derived, modified (rules rewritten in gstack's voice and reconciled with its design rules; Elaya's fixed fonts, colors, spacing values, icon sets and signature components are not carried over):
design-html/sections/craft.md.tmpl: the Persuade intake, page archetypes, page structure, conversion and copy rules, indexing and build order from landing-page-design Part A; the content-realism, ship-floor, scale-snapping, line-break and motion rules from landing-page-design Part B, the website context of design-to-motion and the redesign-skill audit; and the generateddesign-html/SKILL.md/sections/craft.md.lib/design-craft.tsandbin/gstack-design-craft: the content-realism and ship-floor tells, turned into a free check.design-shotgun/SKILL.md.tmpl: page archetypes as a variant axis.design-review/sections/craft-audit.md.tmpl(and the generatedsections/craft-audit.md): the redesign-skill audit of an existing site, its fix-priority order and Tailwind version check;scripts/resolvers/design-craft.ts: the Persuade conversion checks, also rendered intoplan-design-review/sections/review-sections.md; and the craft-tell entries inlib/design-catalog.ts.design-motion/SKILL.md.tmplanddesign-motion/sections/fidelity.md.tmpl,motion.md.tmplandfigma.md.tmpl(and the generateddesign-motion/SKILL.mdandsections/*.md): design-to-motion's fidelity rules, Figma layer-export table (now an optional source path), loading choreography, story loops, loop cycle, easing, checks and export formats, reconciled with gstack's one authored motion moment, content visible without script, and the slop catalog's motion tells.lib/motion-capture.tsandbin/gstack-motion-capture.ts: design-to-motion's deterministic capture (fake clock, whole-millisecond steps averaging 1000/60, the__start/__tick/__ltpage contract, PRE frames).lib/motion-encode.tsandbin/gstack-motion-encode: design-to-motion's ffmpeg recipes for the MP4, loop GIF and 800x500 GIF, and its seam, empty-beat, rest and overflow checks as ffmpeg PSNR comparisons.
hallmark — Copyright (c) 2026 Hallmark contributors — MIT License
https://github.com/Nutlope/hallmark (skills/hallmark/scripts/sloplint.mjs,
sloplint-render.mjs, references/gates.md, scripts/fixtures/, at 7ec8682).
License text: licenses/MIT-hallmark.txt.
Derived, modified (every gate rewritten in TypeScript and in gstack's voice, mapped onto gstack's severity words; hallmark's theme stamp, genres, posture guards, photo index and judged gates are not carried over):
lib/design-lint/andbin/gstack-design-lint: the static tier's parsers (CSS rules and tokens, HTML and component pseudo-HTML, Tailwind class strings), the colour maths, the waiver record, and the rule families underlib/design-lint/rules/; the render tier inlib/design-lint/render*.ts, driving gstack's own browser instead of puppeteer.test/fixtures/design-lint/{slopped.html,eyebrow-pass,eyebrow-fail,tailwind-pass,tailwind-fail,waiver}: the fixtures, with their waiver comments rewritten to the lint's form.
DESIGN.md specification — Copyright Google LLC — Apache License 2.0
https://github.com/google-labs-code/design.md
lib/design-md.ts, bin/gstack-design-md.ts, and the Phase 6 template in
design-consultation/sections/proposal-and-preview.md.tmpl implement the
format (YAML token front matter in five groups, eight canonical sections in
spec order, {path} token references). No specification text is reproduced.
tstack — Copyright Theo Browne — MIT License
https://github.com/t3dotgg/tstack (skills/sol-loop, at 7de017b3). Ideas, not text: the
three-word severity glossary (blocker, should, nit) and the two stop rules (a review that
grew the diff cuts first; the end of the budget is not approval) in
ship/sections/review-army.md.tmpl, review/checklist.md and docs/review-policy.md
are written in gstack's words and mapped onto gstack's blocking floor. No sentence is copied,
so no license text is carried; this entry is a courtesy.
pstack — Copyright Lauren Tan — MIT License
https://github.com/cursor/plugins (pstack/skills/interrogate, lead-judgment.md). Ideas,
not text: the lead-judgment filters applied before a merged review finding counts (nit
gravity, hypothetical versus actual, structure for a case that does not exist, a different
design is not a defect, missing context; independent agreement as the strongest signal;
NO FINDINGS as a correct result) in scripts/resolvers/review-army.ts stage 4 and
docs/review-policy.md are written in gstack's words. No sentence is copied, so no license
text is carried; this entry is a courtesy.