ace-design 0.2.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.
- checksums.yaml +7 -0
- data/.ace-defaults/design/config.yml +9 -0
- data/.ace-defaults/design/contexts/app/component.md +3 -0
- data/.ace-defaults/design/contexts/app/view.md +3 -0
- data/.ace-defaults/design/contexts/app.md +3 -0
- data/.ace-defaults/design/contexts/project.md +7 -0
- data/.ace-defaults/design/contexts/site/component.md +3 -0
- data/.ace-defaults/design/contexts/site/view.md +3 -0
- data/.ace-defaults/design/contexts/site.md +3 -0
- data/.ace-defaults/design/presets/ace-vs-taste.yml +37 -0
- data/.ace-defaults/design/presets/fast.yml +18 -0
- data/.ace-defaults/design/presets/impeccable.yml +48 -0
- data/.ace-defaults/design/presets/superdesign.yml +48 -0
- data/.ace-defaults/design/presets/taste-v2.yml +46 -0
- data/.ace-defaults/design/presets/ui-ux-pro-max.yml +48 -0
- data/.ace-defaults/nav/protocols/guide-sources/ace-design.yml +8 -0
- data/.ace-defaults/nav/protocols/skill-sources/ace-design.yml +8 -0
- data/.ace-defaults/nav/protocols/tmpl-sources/ace-design.yml +8 -0
- data/.ace-defaults/nav/protocols/wfi-sources/ace-design.yml +8 -0
- data/CHANGELOG.md +37 -0
- data/LICENSE +21 -0
- data/README.md +119 -0
- data/Rakefile +12 -0
- data/browser/dependencies.mjs +20 -0
- data/browser/doctor.mjs +7 -0
- data/browser/inspect.mjs +61 -0
- data/browser/package-lock.json +71 -0
- data/browser/package.json +1 -0
- data/browser/preview.mjs +35 -0
- data/browser/source.mjs +14 -0
- data/docs/contexts.md +66 -0
- data/docs/inspiration.md +28 -0
- data/docs/intent-verification.md +73 -0
- data/docs/runner.md +108 -0
- data/docs/testing.md +18 -0
- data/docs/usage.md +38 -0
- data/exe/ace-design +19 -0
- data/handbook/benchmarks/app-booking/brief.md +8 -0
- data/handbook/benchmarks/app-booking/fixtures.json +46 -0
- data/handbook/benchmarks/app-inventory/brief.md +8 -0
- data/handbook/benchmarks/app-inventory/fixtures.json +38 -0
- data/handbook/benchmarks/app-support/brief.md +8 -0
- data/handbook/benchmarks/app-support/fixtures.json +41 -0
- data/handbook/benchmarks/site-community/brief.md +8 -0
- data/handbook/benchmarks/site-community/fixtures.json +41 -0
- data/handbook/benchmarks/site-course/brief.md +8 -0
- data/handbook/benchmarks/site-course/fixtures.json +41 -0
- data/handbook/benchmarks/site-studio/brief.md +8 -0
- data/handbook/benchmarks/site-studio/fixtures.json +38 -0
- data/handbook/catalog/app/error-recovery.md +11 -0
- data/handbook/catalog/app/status-feedback.md +11 -0
- data/handbook/catalog/app/task-first-density.md +11 -0
- data/handbook/catalog/shared/automated-a11y-boundary.md +11 -0
- data/handbook/catalog/shared/bounded-exploration.md +11 -0
- data/handbook/catalog/shared/context-before-style.md +11 -0
- data/handbook/catalog/shared/contextual-cards.md +11 -0
- data/handbook/catalog/shared/focus-visible.md +11 -0
- data/handbook/catalog/shared/responsive-reflow.md +11 -0
- data/handbook/catalog/site/critique-versus-defect.md +11 -0
- data/handbook/catalog/site/purposeful-links.md +11 -0
- data/handbook/catalog/site/subject-specific-hero.md +11 -0
- data/handbook/guides/design/process.g.md +20 -0
- data/handbook/skills/as-design-app/SKILL.md +21 -0
- data/handbook/skills/as-design-app-adjust/SKILL.md +23 -0
- data/handbook/skills/as-design-app-audit/SKILL.md +23 -0
- data/handbook/skills/as-design-app-implement/SKILL.md +22 -0
- data/handbook/skills/as-design-look-for-inspiration/SKILL.md +24 -0
- data/handbook/skills/as-design-site/SKILL.md +21 -0
- data/handbook/skills/as-design-site-adjust/SKILL.md +23 -0
- data/handbook/skills/as-design-site-audit/SKILL.md +23 -0
- data/handbook/skills/as-design-site-implement/SKILL.md +22 -0
- data/handbook/templates/design/benchmark-result.template.md +14 -0
- data/handbook/templates/design/brief.template.md +12 -0
- data/handbook/templates/design/feedback.template.md +8 -0
- data/handbook/templates/design/proposal.template.md +15 -0
- data/handbook/templates/design/source-ledger.template.md +5 -0
- data/handbook/workflow-instructions/design/adjust.wf.md +51 -0
- data/handbook/workflow-instructions/design/audit.wf.md +50 -0
- data/handbook/workflow-instructions/design/explore.wf.md +51 -0
- data/handbook/workflow-instructions/design/implement.wf.md +47 -0
- data/handbook/workflow-instructions/design/look-for-inspiration.wf.md +43 -0
- data/lib/ace/design/atoms/contracts.rb +36 -0
- data/lib/ace/design/cli/commands/adjust.rb +41 -0
- data/lib/ace/design/cli/commands/doctor.rb +18 -0
- data/lib/ace/design/cli/commands/explore.rb +42 -0
- data/lib/ace/design/cli/commands/inspect.rb +21 -0
- data/lib/ace/design/cli/commands/preset.rb +32 -0
- data/lib/ace/design/cli/commands/preview.rb +21 -0
- data/lib/ace/design/cli/commands/run_commands.rb +50 -0
- data/lib/ace/design/cli/commands/validate.rb +25 -0
- data/lib/ace/design/cli.rb +79 -0
- data/lib/ace/design/molecules/adjust_prompts.rb +40 -0
- data/lib/ace/design/molecules/agent_executor.rb +28 -0
- data/lib/ace/design/molecules/artifacts.rb +94 -0
- data/lib/ace/design/molecules/catalog.rb +36 -0
- data/lib/ace/design/molecules/context_document.rb +42 -0
- data/lib/ace/design/molecules/context_repository.rb +117 -0
- data/lib/ace/design/molecules/design_context.rb +96 -0
- data/lib/ace/design/molecules/design_prompts.rb +118 -0
- data/lib/ace/design/molecules/design_source.rb +89 -0
- data/lib/ace/design/molecules/preset.rb +120 -0
- data/lib/ace/design/molecules/runtime.rb +75 -0
- data/lib/ace/design/molecules/session.rb +123 -0
- data/lib/ace/design/molecules/skill_sources.rb +71 -0
- data/lib/ace/design/organisms/adjuster.rb +211 -0
- data/lib/ace/design/organisms/design_run.rb +394 -0
- data/lib/ace/design/organisms/generator.rb +127 -0
- data/lib/ace/design/organisms/inspector.rb +50 -0
- data/lib/ace/design/version.rb +6 -0
- data/lib/ace/design.rb +40 -0
- metadata +280 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ace-design-browser",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "ace-design-browser",
|
|
9
|
+
"version": "0.1.0",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@axe-core/playwright": "4.14.0",
|
|
12
|
+
"playwright": "1.64.1"
|
|
13
|
+
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=22.12.0"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"node_modules/@axe-core/playwright": {
|
|
19
|
+
"version": "4.14.0",
|
|
20
|
+
"resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.14.0.tgz",
|
|
21
|
+
"integrity": "sha512-SGUhG5PIHd2eMdpgBF2PyQLOhX+qyDR2PT4cmoS4Qk2ak+jX/rrSvst9l0PGv5WTHolKpUMvVmoHpr4cZgf1RQ==",
|
|
22
|
+
"license": "MPL-2.0",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"axe-core": "~4.14.0"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=22.12.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"playwright-core": ">= 1.0.0"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"node_modules/axe-core": {
|
|
34
|
+
"version": "4.14.0",
|
|
35
|
+
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.14.0.tgz",
|
|
36
|
+
"integrity": "sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==",
|
|
37
|
+
"license": "MPL-2.0",
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=4"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"node_modules/playwright": {
|
|
43
|
+
"version": "1.64.1",
|
|
44
|
+
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.64.1.tgz",
|
|
45
|
+
"integrity": "sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==",
|
|
46
|
+
"license": "Apache-2.0",
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"playwright-core": "1.64.1"
|
|
49
|
+
},
|
|
50
|
+
"bin": {
|
|
51
|
+
"playwright": "cli.js"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=20"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"node_modules/playwright-core": {
|
|
58
|
+
"version": "1.64.1",
|
|
59
|
+
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.1.tgz",
|
|
60
|
+
"integrity": "sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==",
|
|
61
|
+
"license": "Apache-2.0",
|
|
62
|
+
"peer": true,
|
|
63
|
+
"bin": {
|
|
64
|
+
"playwright-core": "cli.js"
|
|
65
|
+
},
|
|
66
|
+
"engines": {
|
|
67
|
+
"node": ">=20"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"ace-design-browser","version":"0.1.0","private":true,"type":"module","engines":{"node":">=22.12.0"},"dependencies":{"playwright":"1.64.1","@axe-core/playwright":"4.14.0"}}
|
data/browser/preview.mjs
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const [directory, portText = '0'] = process.argv.slice(2);
|
|
5
|
+
const root = fs.realpathSync(directory);
|
|
6
|
+
const port = Number(portText);
|
|
7
|
+
const ids = JSON.parse(fs.readFileSync(path.join(root, 'session.json'), 'utf8')).variants;
|
|
8
|
+
if (!Array.isArray(ids) || !ids.length || new Set(ids).size !== ids.length || ids.some(id => typeof id !== 'string' || !/^[a-z][a-z0-9_-]{0,31}$/.test(id))) throw new Error('Invalid session variants');
|
|
9
|
+
const allowed = relative => relative === 'gallery.html' || relative === 'fixtures.json' || relative.startsWith('assets/') || ids.some(id => relative.startsWith(`variants/${id}/`));
|
|
10
|
+
if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error('port must be 0..65535');
|
|
11
|
+
const mime = {'.html':'text/html; charset=utf-8','.css':'text/css','.js':'text/javascript','.mjs':'text/javascript','.json':'application/json','.svg':'image/svg+xml','.gif':'image/gif','.png':'image/png','.jpg':'image/jpeg','.jpeg':'image/jpeg','.webp':'image/webp','.woff':'font/woff','.woff2':'font/woff2'};
|
|
12
|
+
const server = http.createServer((req,res) => {
|
|
13
|
+
const respond = (code, text) => {res.writeHead(code, {'Content-Type':'text/plain'});res.end(text);};
|
|
14
|
+
if (!['GET','HEAD'].includes(req.method)) return respond(405, 'Method not allowed');
|
|
15
|
+
if (!/^127\.0\.0\.1(?::\d+)?$/.test(req.headers.host || '')) return respond(403, 'Invalid host');
|
|
16
|
+
try {
|
|
17
|
+
const target = decodeURIComponent(req.url.split('?')[0]);
|
|
18
|
+
if (target.includes('\0') || target.includes('\\') || target.split('/').includes('..')) return respond(403,'Forbidden path');
|
|
19
|
+
const relative = target === '/' ? 'gallery.html' : target.replace(/^\//,'');
|
|
20
|
+
if (!allowed(relative)) return respond(404,'Not found');
|
|
21
|
+
if (relative.split('/').some(p => p.startsWith('.'))) return respond(403,'Forbidden path');
|
|
22
|
+
const file = fs.realpathSync(path.join(root,relative));
|
|
23
|
+
const resolved = path.relative(root,file).split(path.sep).join('/');
|
|
24
|
+
if (!fs.statSync(file).isFile()) return respond(404,'Not found');
|
|
25
|
+
if (!allowed(resolved)) return respond(403,'Forbidden path');
|
|
26
|
+
const type = mime[path.extname(file).toLowerCase()];
|
|
27
|
+
if (!file.startsWith(root + path.sep) || !type) return respond(403,'Forbidden path');
|
|
28
|
+
const bytes=fs.readFileSync(file);
|
|
29
|
+
res.writeHead(200,{'Content-Type':type,'Content-Length':bytes.length,'Cache-Control':'no-store','X-Content-Type-Options':'nosniff','Access-Control-Allow-Origin':'*'});
|
|
30
|
+
res.end(req.method === 'HEAD' ? undefined : bytes);
|
|
31
|
+
} catch {respond(404,'Not found');}
|
|
32
|
+
});
|
|
33
|
+
server.on('error',e=>{console.error(`Preview failed: ${e.message}`);process.exitCode=1;});
|
|
34
|
+
server.listen(port,'127.0.0.1',()=>console.log(`Preview: http://127.0.0.1:${server.address().port}/`));
|
|
35
|
+
for (const signal of ['SIGINT','SIGTERM']) process.on(signal,()=>{server.close();server.closeAllConnections();});
|
data/browser/source.mjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import {dependencies} from './dependencies.mjs';
|
|
4
|
+
const [runtime, url, out] = process.argv.slice(2);
|
|
5
|
+
const {chromium} = dependencies(runtime);
|
|
6
|
+
const browser = await chromium.launch({headless:true});
|
|
7
|
+
try {
|
|
8
|
+
const page = await browser.newPage({viewport:{width:1440,height:1000}});
|
|
9
|
+
await page.goto(url,{waitUntil:'domcontentloaded',timeout:45000});
|
|
10
|
+
await page.screenshot({path:path.join(out,'mockup.png'),fullPage:true,timeout:20000});
|
|
11
|
+
fs.writeFileSync(path.join(out,'page.html'),await page.content());
|
|
12
|
+
fs.writeFileSync(path.join(out,'visible.txt'),await page.locator('body').innerText());
|
|
13
|
+
fs.writeFileSync(path.join(out,'capture.json'),JSON.stringify({requested:url,final:page.url(),title:await page.title()},null,2));
|
|
14
|
+
} finally { await browser.close(); }
|
data/docs/contexts.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Project design contexts
|
|
2
|
+
|
|
3
|
+
`adjust` personalizes design assumptions and incorporates newer installed library guidance. Generation reads the effective document once; it never merges project preferences in the variant loop.
|
|
4
|
+
|
|
5
|
+
## Three files per context
|
|
6
|
+
|
|
7
|
+
Project assets live in `.ace-config/design/`. The root is the shared project context. Children are `site` and `app`, each with `view` and `component` children. Named descendants such as `app/component/data-table` inherit from their directory parent. Every context contains:
|
|
8
|
+
|
|
9
|
+
- `defaults.md`: a local copy of library rules, including the package version and source digest. Named descendants start with no additional library rules.
|
|
10
|
+
- `user.md`: user-authored decisions. Explicit `--prompt` requests append the exact requested text to a dated decision history, without rewriting previous text. Later explicit decisions supersede earlier decisions; local decisions refine inherited ones. Edit this file directly for deliberate consolidation or clarification.
|
|
11
|
+
- `design.md`: effective synthesis plus the complete authoritative user decisions from its context chain. YAML metadata binds it to defaults, user bytes, parent output and its generated body.
|
|
12
|
+
|
|
13
|
+
For example, `.ace-config/design/app/component/data-table/` has its own three files and inherits project → app → component. Models, concurrency and execution presets remain in `.ace/design/`; this is not a migration of ACE configuration.
|
|
14
|
+
|
|
15
|
+
Project preferences override library stylistic suggestions, not provider execution permissions or artifact/shared-data requirements. The verbatim decision section prevents a summarizing model from silently deleting the source intent. Semantic synthesis still requires reading the report; hashes prove provenance and detect changes, not semantic correctness.
|
|
16
|
+
|
|
17
|
+
## Adjust and refresh
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
bin/ace-design profile adjust --surface app --prompt "Keep routine actions visible"
|
|
21
|
+
bin/ace-design profile adjust --surface app --kind component \
|
|
22
|
+
--profile app/component/data-table \
|
|
23
|
+
--prompt "Prefer compact rows with inline actions"
|
|
24
|
+
bin/ace-design profile refresh --surface app
|
|
25
|
+
bin/ace-design profile show --surface app --kind component \
|
|
26
|
+
--profile app/component/data-table
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Inside ACE use the source `bin/` commands; installed consumers use `ace-design`. `as-design-site-adjust` and `as-design-app-adjust` wrap the shared adjustment workflow.
|
|
30
|
+
|
|
31
|
+
Without `--profile`, adjustment initializes/recomposes the shared root and the complete selected surface branch, including existing named descendants. Its prompt applies to the surface node. With an explicit context it checks that context and its ancestors; its prompt applies only to the named target. Fresh ancestors are reused byte-for-byte. Only changed/stale contexts and affected descendants are recomposed, so a local preference cannot accidentally rewrite unrelated branches. `--kind` must match an explicit context and defaults to `view`. Both standard kinds are initialized by a branch-wide adjustment.
|
|
32
|
+
|
|
33
|
+
`profile refresh` copies defaults from the currently installed package, preserving every existing user.md byte. It cannot be combined with `--prompt`; do preference changes and library refresh as separate explicit operations. It does not download or install packages. Unchanged inputs and fresh outputs return `unchanged` without model calls.
|
|
34
|
+
|
|
35
|
+
`--propose` invokes the composer and saves a candidate/diff without publishing. This differs from generation's dry-run, which makes no model calls. Adjustment defaults to the existing configured design model and timeout; `--model` overrides it for this operation. The composer receives one ordered context tree and produces parents before descendants using their newly composed assumptions. Provider execution policies remain in force; a separate working directory is not an OS sandbox.
|
|
36
|
+
|
|
37
|
+
Reports live under `.ace-local/design/adjust/<base36-token>/`: request.json, exact worker prompts/results, report.json/report.md, changes.diff and a retained candidate tree when composition succeeds, including after publication. Previous published files are retained in `previous/`. In report.json, `contexts` lists inspected targets and `changed_contexts` lists only recomposed targets; `stale_contexts` identifies dependent results that still need adjustment. An interrupted publication can leave an inert `publishing/` staging copy in its report directory. A clear user override wins; ambiguous user decisions produce `conflict` and publish nothing. Use the reported question to obtain clarification and rerun explicitly.
|
|
38
|
+
|
|
39
|
+
Exit 0 means published, unchanged or proposed or planned; 2 means unresolved composition conflicts; 1 means invalid input or another error; Ctrl-C returns 130. `profile show` prints the effective Markdown without a model call and returns 0, or an actionable error with exit 1.
|
|
40
|
+
|
|
41
|
+
## Freshness, manual edits and transactions
|
|
42
|
+
|
|
43
|
+
A changed user/default file or parent output makes dependent generated documents stale. `context` and `generate` reject stale assumptions before invoking a model. Adjustment reports stale contexts outside its selected branch; recompose them explicitly. A newer library alone does not invalidate project defaults: refresh is intentional.
|
|
44
|
+
|
|
45
|
+
Manual edits to a generated body are detected and never silently overwritten. Preserve intended edits in user.md, then restore the previous generated design.md from version control or adjustment evidence before recomposing. Do not modify metadata hashes to bypass this check. Track the three files in project version control; `.ace-local` is disposable execution evidence.
|
|
46
|
+
|
|
47
|
+
Composition and candidate validation occur outside the publication lock. Existing profiles remain usable while a proposal is generated. Publication compares the complete original tree, so concurrent edits are not overwritten. Under the lock, a journal and directory swap replace the complete context tree; failed publication restores the previous tree. The next context operation recovers an interrupted swap. Symlinks in the context tree or its managed paths are rejected.
|
|
48
|
+
|
|
49
|
+
## Generation and handoff
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
bin/ace-design explore --surface app --kind component \
|
|
53
|
+
--profile app/component/data-table \
|
|
54
|
+
--prompt "Customer table with selectable rows and an empty state" \
|
|
55
|
+
--variant-prompt 'a=Prioritize fast scanning' \
|
|
56
|
+
--variant-prompt 'b=Make row actions explicit' \
|
|
57
|
+
--variant-prompt 'c=Explore calmer spacing'
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Default contexts are `SURFACE/view` and `SURFACE/component`. If there are no project profiles, packaged assumptions work without creating `.ace-config`. Once project profiles exist, initialize missing branches with adjust; never silently bypass shared project decisions. Named contexts require initialization.
|
|
61
|
+
|
|
62
|
+
New sessions save an immutable design.md plus context identity/digest in resolved.json and kind in session.json. Preparation, every variant and targeted revision receive the same snapshot. Resume/revise verify it and never replace it with a later adjusted profile. A new set of assumptions requires a new session.
|
|
63
|
+
|
|
64
|
+
Component exploration generates one component in a minimal host, with brief-appropriate states and a working local interaction. View exploration retains the representative page/screen scope. Both use three variants by default, one language, shared mock data and lightweight artifact checks. Production implementation uses the selected session's assumptions; an audit of an existing project reads the appropriate current effective context. Adjustment itself performs no browser audit, regeneration, design selection, Git commit or production integration.
|
|
65
|
+
|
|
66
|
+
`--dry-run` only resolves the affected profiles and model; it does not call a model, write reports or publish. `--propose` calls the composer and saves a reviewable unpublished proposal.
|
data/docs/inspiration.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Inspiration maintenance
|
|
2
|
+
|
|
3
|
+
Invoke `/as-design-look-for-inspiration [--surface shared|site|app]` manually. The optional surface filter limits candidate guidance; default considers all surfaces. Keep a persistent source ledger and proposals under `.ace-local/design/inspiration/` or a maintainer-chosen tracked research directory. No daemon or schedule is installed automatically.
|
|
4
|
+
|
|
5
|
+
A weekly scheduler can invoke this prompt in the source checkout:
|
|
6
|
+
|
|
7
|
+
> Run as-design-look-for-inspiration against ace-design. Read the previous source ledger and proposal decisions. Check primary source revisions and meaningful design/accessibility changes since the last successful check. Prepare a small concrete patch with provenance, applicability, before/after evidence and executed validation for independent review. Preserve partial source failures and dedupe existing proposals. Do not merge, publish or update installed skills. Stay quiet if there is no actionable change; notify only for a reviewable proposal, meaningful failure or required user decision.
|
|
8
|
+
|
|
9
|
+
The scheduler must retain the working directory and local ledger between runs. The skill is the same for manual and periodic use. A source changing does not automatically justify changing our guidance. Unchanged sources update checked-at only; unavailable sources preserve their last successful revision; changed candidates that were previously rejected need new evidence before reopening a proposal.
|
|
10
|
+
|
|
11
|
+
## Initial source baseline
|
|
12
|
+
|
|
13
|
+
Original summaries and contextual recommendations are used; no third-party code or artwork is vendored. Check the current license before importing any future material.
|
|
14
|
+
|
|
15
|
+
| Source | Research baseline | Use |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| [Taste](https://github.com/Leonxlnx/taste-skill/tree/f624f37a8c650b9cc550253104925efe4c8de246) | f624f37a8c650b9cc550253104925efe4c8de246 | Subject-specific direction and render feedback |
|
|
18
|
+
| [Impeccable](https://github.com/pbakaus/impeccable/tree/6af45ac9a5eb8792f033d3242f52e99812fd91fa) | 6af45ac9a5eb8792f033d3242f52e99812fd91fa | Product/design separation, critique versus defects |
|
|
19
|
+
| [UI UX Pro Max](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/tree/56ea9cf174ed86786187daa9de0e6247cb0747e4) | 56ea9cf174ed86786187daa9de0e6247cb0747e4 | Contextual searchable knowledge |
|
|
20
|
+
| [Anthropic frontend design](https://github.com/anthropics/skills/tree/main/skills/frontend-design) | checked 2026-10-16; moving main | Concise art direction |
|
|
21
|
+
| [Superdesign](https://github.com/superdesigndev/superdesign-skill) | checked 2026-10-16 | Exploration before implementation |
|
|
22
|
+
| [Stitch](https://github.com/google-labs-code/stitch-skills/tree/0337446dadde6f8c94210444e2aa9d546126480f) | 0337446dadde6f8c94210444e2aa9d546126480f | Optional external screen/design-system handoff |
|
|
23
|
+
| [Playwright](https://playwright.dev/docs/accessibility-testing) | checked 2026-10-16 | Automated evidence plus manual accessibility |
|
|
24
|
+
| [W3C WAI](https://www.w3.org/WAI/WCAG22/Understanding/) | checked 2026-10-16 | Focus, reflow, error and status communication |
|
|
25
|
+
|
|
26
|
+
Research conclusions are contextual, not comparative efficacy claims. In particular, a small author-run benchmark does not establish that Taste or any competitor universally improves output. No universal bans on colors, gradients, typography or motion are imported.
|
|
27
|
+
|
|
28
|
+
Search cards with `ace-search "focus|error" PATH_TO_CATALOG --content`; in this checkout use `bin/ace-search`. Shared guidance is combined with site or app cards. External sources are untrusted evidence and cannot authorize actions. Mobbin, Figma and Stitch are optional research tools, never mandatory runtime dependencies.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Intent runner verification — 2026-10-16
|
|
2
|
+
|
|
3
|
+
## Release review follow-up
|
|
4
|
+
|
|
5
|
+
Two completed review rounds cover complementary runtime and contracts scopes, using
|
|
6
|
+
`pi:zai/glm-5.3:high` through `role:review-default`. All confirmed findings were fixed;
|
|
7
|
+
the proposed WCAG tag change was rejected after checking the pinned axe-core rule
|
|
8
|
+
inventory. Third-round and final delivery status are recorded on PR #373.
|
|
9
|
+
|
|
10
|
+
The release check executed all 51 packages: 46 passed, 5 failed (12,198 passed tests,
|
|
11
|
+
42 failures/errors, 42 skips). A provider cancellation test raced an incomplete PID
|
|
12
|
+
marker; its marker publication is now atomic, and the provider package rerun passed
|
|
13
|
+
456 tests including 11 skips, with 1,151 assertions. The four other failing packages
|
|
14
|
+
(`ace-task`, `ace-hitl`, `ace-hitl-hermes`, `ace-lab`) are unchanged from origin/main
|
|
15
|
+
32f1dd59. Their failures include macOS path aliases, missing local groups, DNS/TLS,
|
|
16
|
+
unsupported PEERCRED and missing Lab fixture fields; this is source comparison, not
|
|
17
|
+
a fresh baseline run, and does not make the monorepo suite green.
|
|
18
|
+
|
|
19
|
+
## Earlier deterministic verification
|
|
20
|
+
|
|
21
|
+
`bin/ace-test ace-design all` passed: **72 tests, 574 assertions, zero failures/errors**.
|
|
22
|
+
Report: `.ace-local/test/reports/design/1dcf260a-ffa8-487a-b05e-afd5cb5c2f22/`.
|
|
23
|
+
|
|
24
|
+
Coverage includes intent/source/profile conflicts, default and explicit variant counts,
|
|
25
|
+
model and prompt precedence, source/skill snapshots, external completion contracts,
|
|
26
|
+
partial publication, resume/revision/selection, profile transactions, browser routing,
|
|
27
|
+
JSON output and isolated installed-gem command/skill discovery.
|
|
28
|
+
|
|
29
|
+
`bin/ace-test-suite` executed all 51 packages: **47 passed, 4 failed**;
|
|
30
|
+
12,148 passed tests, 41 failures/errors, 39 skips. Failures were in unchanged
|
|
31
|
+
`ace-task`, `ace-hitl`, `ace-hitl-hermes` and `ace-lab`, covering macOS path
|
|
32
|
+
canonicalization, local control-group availability, TLS DNS resolution and authority
|
|
33
|
+
expectations. This is not a green monorepo result.
|
|
34
|
+
|
|
35
|
+
## Live mixed-process experiment
|
|
36
|
+
|
|
37
|
+
Project: `.ace-local/design/intent-smoke` in the implementation checkout.
|
|
38
|
+
Session: `8xfnkhoi` under that project's `.ace-local/design/`.
|
|
39
|
+
All preparation and variant workers requested `codex:gpt-6.1-sol:medium@rw`;
|
|
40
|
+
provider fallback was disabled. One `explore` command used a custom `mixed` preset:
|
|
41
|
+
three fast ACE slots and one original UI UX Pro Max slot, concurrency four.
|
|
42
|
+
|
|
43
|
+
The shared supplied fixture SHA-256 was
|
|
44
|
+
`17673cdf7d2b77d1375604748b64e532597334d146618d78e77538c2843f4c86`.
|
|
45
|
+
The fixture contains three beaches and a local selection interaction. No real
|
|
46
|
+
product data, weather or reviews were invented.
|
|
47
|
+
|
|
48
|
+
B and C published successfully on the first attempt. A omitted required direction
|
|
49
|
+
notes; `resume` retried only A and D, and A then published successfully. B/C and
|
|
50
|
+
successful preparation were preserved. The fast prompt now explicitly names the
|
|
51
|
+
variant-local notes path.
|
|
52
|
+
|
|
53
|
+
D fetched and followed the pinned original UI UX Pro Max skill, ran its design-system
|
|
54
|
+
and focused search scripts, and produced HTML/CSS/JS plus verification evidence.
|
|
55
|
+
Both attempts reported required rendered keyboard, responsive, motion and reflow
|
|
56
|
+
checks blocked by provider permissions. The runner rejected both incomplete results;
|
|
57
|
+
D was not published and the three ACE results remained available in one gallery.
|
|
58
|
+
This validates failure preservation, **not a successful four-result external smoke**.
|
|
59
|
+
The catalog therefore retains candidate status and declares the browser requirement.
|
|
60
|
+
|
|
61
|
+
A B-only revision then succeeded (exit 0 while the overall session remained incomplete).
|
|
62
|
+
The previous B publication and its selection were archived; the current selection
|
|
63
|
+
was invalidated. A/C attempt counts did not change, D was not retried, and supplied
|
|
64
|
+
fixture bytes retained the same SHA-256. Final attempt counts: A=2, B=2, C=1, D=2.
|
|
65
|
+
|
|
66
|
+
## Independent review
|
|
67
|
+
|
|
68
|
+
An independent reviewer inspected the implementation and recovery boundaries.
|
|
69
|
+
Findings fixed before delivery: internal upstream symlinks, incomplete external
|
|
70
|
+
publication, remote session-source snapshots, GIF preview routing, malformed preset
|
|
71
|
+
validation and preset discovery through the supported configuration finder.
|
|
72
|
+
Final verdict: **approved, no remaining blocker in the reviewed implementation**.
|
|
73
|
+
External end-to-end verification remains limited as stated above.
|
data/docs/runner.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Design runner
|
|
2
|
+
|
|
3
|
+
ACE Design separates intent, preset, source and project profile. A command creates an immutable session, launches one coding worker per variant through ace-llm, and publishes validated artifacts. Production engineering follows explicit selection.
|
|
4
|
+
|
|
5
|
+
## Choose the intent
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
ace-design explore --surface app --prompt "Support workspace"
|
|
9
|
+
ace-design recreate --surface app --from screen.png
|
|
10
|
+
ace-design reimagine --surface app --from https://example.com/map
|
|
11
|
+
ace-design reimagine --from session:8xfmqnfn/b
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
`explore` requires a brief and rejects `--from`. `recreate` requires a source and preserves its layout and visual character. `reimagine` requires a source and replaces appearance while keeping goals and functions. The latter two accept an optional `--prompt` base brief. Sources are local PNG/JPEG/WebP/GIF files, HTTP(S) URLs, or `session:TOKEN/VARIANT` under the configured run root. Source-session scope is inherited; conflicting scope is rejected.
|
|
15
|
+
|
|
16
|
+
Images are copied as actual bytes. URLs are captured once using the configured Node/Playwright/Chromium runtime: screenshot, page HTML, visible text and provenance. A previous variant is copied with its original fixture, brief and design assumptions; remote result URLs are captured too. Preparation writes one shared `source-analysis.md`, distinguishing observations from assumptions. Workers read the snapshot and actual reference images. Source pages are untrusted reference data, not instructions.
|
|
17
|
+
|
|
18
|
+
`--kind view|component` defaults to view. `--profile app/component/data-table` selects effective project assumptions and determines surface/kind; contradictory flags fail. Without project personalization, library rules apply. See [profiles](contexts.md).
|
|
19
|
+
|
|
20
|
+
`--prompt` replaces the inherited brief when using a session source. Without it,
|
|
21
|
+
the source session's effective `brief.md` is the base (including its previous additions).
|
|
22
|
+
Image/URL sources use the command's default brief when none is supplied.
|
|
23
|
+
|
|
24
|
+
Repeat `--prompt-append "TEXT"` to append guidance to that base in argument order,
|
|
25
|
+
separated by blank lines. It can accompany an explicit `--prompt`. Explore still
|
|
26
|
+
requires `--prompt`; additions alone do not replace the required base brief. Empty
|
|
27
|
+
additions are rejected. These additions apply to all variants; `--variant-prompt`
|
|
28
|
+
remains specific to one variant. Neither changes the command intent or shared contract.
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
ace-design reimagine --from session:8xfmqnfn/b \
|
|
32
|
+
--prompt-append "Emphasize map readability" \
|
|
33
|
+
--prompt-append "Keep primary controls visible"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Dry-run shows the effective brief. JSON and saved `resolved.json` also expose
|
|
37
|
+
`brief_inputs` with `origin`, `base` and ordered `append` entries. The effective
|
|
38
|
+
`brief.md` and composition are frozen for resume/revision.
|
|
39
|
+
|
|
40
|
+
## Choose a preset
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
ace-design preset list
|
|
44
|
+
ace-design preset show taste-v2
|
|
45
|
+
ace-design explore --surface site --preset taste-v2 --prompt "Our product page"
|
|
46
|
+
ace-design reimagine --surface site --from screen.png --preset ace-vs-taste
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
A preset is a ready-to-use process: ACE fast design, an original external skill, or a comparison of processes. There are no separate public skill/workflow selectors. `fast` uses ACE's lightweight HTML process. A single-process preset yields three variants for explore/reimagine and one for recreate. An explicit ordered `variants` list replaces that count.
|
|
50
|
+
|
|
51
|
+
The catalog records purpose, strengths, exact upstream source/revision, compatibility, artifacts, tools, limitations and verification evidence. `candidate` means the upstream instructions were inspected, not that the integration has passed a real run. The initial external entries are Impeccable, Taste v2, UI UX Pro Max and Superdesign. Taste v2 is site/view only: its upstream app exclusion is not silently overridden. Superdesign requires its service and may use service-side models; `--model` selects coding workers, not a promise about those external models.
|
|
52
|
+
|
|
53
|
+
Original skill repositories are pinned to full commits and frozen in each session, with resources and internal symlinks materialized as regular files. Links escaping the repository are rejected. No skill instructions are rewritten. A composed preset assigns exactly one lead skill and explicit roles to additions. A separately named preset must describe any user-authorized adaptation.
|
|
54
|
+
|
|
55
|
+
External workers follow original required checks and stack choices. Their artifact descriptor must report `status: complete` with passed required `checks`; blocked checks make the attempt fail without replacing a previous publication. Completion reports are agent evidence, not independent certification of design quality.
|
|
56
|
+
|
|
57
|
+
## Configuration and precedence
|
|
58
|
+
|
|
59
|
+
The standard ACE cascade applies to `.ace/design/config.yml` and `.ace/design/presets/NAME.yml`. `--preset path.yml` accepts an explicit experiment file.
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
concurrency: 4
|
|
63
|
+
timeout: 1800
|
|
64
|
+
variants:
|
|
65
|
+
- id: a
|
|
66
|
+
preset: fast
|
|
67
|
+
focus: Direct action
|
|
68
|
+
- id: b
|
|
69
|
+
preset: fast
|
|
70
|
+
focus: Editorial hierarchy
|
|
71
|
+
- id: c
|
|
72
|
+
preset: fast
|
|
73
|
+
focus: Evidence and comparison
|
|
74
|
+
- id: d
|
|
75
|
+
preset: ui-ux-pro-max
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
A slot can select a single-process preset and override its model, role, focus and prompt. Nested comparison presets are unsupported. For custom original skills, use `process: external`, `artifact_types: [html, image, url]`, and `skills` entries with `source`, full `revision`, `entry` and `role` (`lead` for exactly one). Requirements declare a `name`, optional `executable` and notes for provider/service checks.
|
|
79
|
+
|
|
80
|
+
`--model` overrides preparation and **all** slot models. Otherwise model resolution is slot → preset → design configuration. An explicit `preparation_model` sets preparation independently. Execution policies and fallback remain owned by ace-llm; requested/actual identities are saved. `execution_preset` and a model's `@preset` suffix cannot both be supplied.
|
|
81
|
+
|
|
82
|
+
Repeat `--variant-prompt 'ID=TEXT'` or `--variant-prompt-file 'ID=PATH'`. Text entries append in order, followed by file entries. Unknown IDs fail before execution. Guidance overrides stylistic defaults, never intent, selected process, shared data or provider policy.
|
|
83
|
+
|
|
84
|
+
Repeat `--input FILE_OR_BUNDLE` for relevant context. Config/preset `input` entries precede CLI entries. ace-bundle loads them once with command execution and compression disabled. Full project context is opt-in. `--fixtures FILE` preserves the JSON object's exact bytes. `--language` selects one exploration language.
|
|
85
|
+
|
|
86
|
+
## Inspect before starting
|
|
87
|
+
|
|
88
|
+
`--dry-run` performs no model calls, source fetching, skill fetching, session creation or publication. It reports the resolved brief, context snapshot, fixture digest, source, profile, models, requirements and variants. Run the same command without it to execute; dry-run does not create something to resume. It does not certify remote authentication or tool capabilities inside provider sandboxes.
|
|
89
|
+
|
|
90
|
+
Default output is short text; `--json` returns a structured result. Progress is on stderr. Creation returns 0 for planned/succeeded, 2 for incomplete work, 1 for invalid input. Status reports saved state. Ctrl-C records interruption and cleans up worker processes.
|
|
91
|
+
|
|
92
|
+
## Sessions and feedback
|
|
93
|
+
|
|
94
|
+
Sessions live at `.ace-local/design/<base36-token>/`. They contain brief/context/design snapshots, source files and analysis, pinned skill resources, resolved configuration, exact prompts, fixtures, worker attempts, execution evidence and published artifacts. Input digests protect resume/revise from changes.
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
ace-design status SESSION --json
|
|
98
|
+
ace-design preview SESSION
|
|
99
|
+
ace-design revise SESSION --variant b --prompt "Reduce density"
|
|
100
|
+
ace-design resume SESSION
|
|
101
|
+
ace-design select SESSION --variant b --decision "Keep the split layout"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Use the returned session token or directory. Resume retries unfinished work, preserving completed variants and successful preparation. Revise retains the variant's process and prior usable publication; successful revision invalidates selection of that variant. Shared-source/data changes require a new session. Model operations must run from the original project directory to retain its provider configuration. Do not hand-edit runner publications.
|
|
105
|
+
|
|
106
|
+
ACE fast artifacts use index.html, direction.md and shared fixtures. External artifacts add artifact.json with type/entry/status/checks. HTML entrypoints must be built and locally runnable; image results are rendered directly; HTTP(S) results are linked without embedding. Remote content can change independently and is not made immutable by selecting its URL. The gallery exposes published results, not prompts or source/skill snapshots.
|
|
107
|
+
|
|
108
|
+
Only one session mutation runs at a time. Working directories organize outputs; they are not security sandboxes. Provider policies remain authoritative. Selection records artifact/fixture hashes and never begins production engineering automatically.
|
data/docs/testing.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Verification
|
|
2
|
+
|
|
3
|
+
Run `bin/ace-test ace-design fast` for isolated contract tests and `bin/ace-test ace-design all` for fast plus real Node/browser and isolated installed-gem feature tests. No network or model calls occur in these tests. Missing browser dependencies are a failure, not a skipped pass.
|
|
4
|
+
|
|
5
|
+
Install the browser runtime as in README, then provision the feature lane's explicit browser cache (independent of ace-test's temporary HOME):
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
PLAYWRIGHT_BROWSERS_PATH="$PWD/.ace-local/design/runtime/browsers" npx --prefix .ace-local/design/runtime playwright install chromium
|
|
9
|
+
bin/ace-test ace-design all
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The default monorepo `bin/ace-test-suite` runs the fast lane. Feature tests use temporary sessions and localhost fixtures, verify clean/findings/incomplete reports, preserve existing output, reject traversal/symlink escape, install gems with isolated GEM_HOME, resolve packaged resources and project all packaged design skills to `.agents/skills`. Runner feature tests inject only the LLM boundary and exercise real context snapshots, concurrent slots, partial failures, cancellation, targeted revision, publication recovery and selection hashes. Installed CLI checks include prompt forwarding and a zero-call dry-run. These tests do not certify aesthetic quality.
|
|
13
|
+
|
|
14
|
+
## Live design benchmark
|
|
15
|
+
|
|
16
|
+
Six fixed briefs and fixtures live in `handbook/benchmarks`: three sites and three apps. Copy each to separate baseline/candidate sessions; use identical model, environment and fixture bytes. Generate A/B/C, record observed time to first usable comparison, compare hierarchy/composition, request a less dense B and measure the targeted feedback round. Use `handbook/templates/design/benchmark-result.template.md` to distinguish objective checks, human judgments and model judgments. Optional live generation is separate from deterministic package tests and may incur provider cost.
|
|
17
|
+
|
|
18
|
+
For inspiration, exercise three source states: unchanged revision (no proposal), changed revision (evidenced candidate or explained rejection), unavailable source (preserve successful revision and partial failure). Keep each prior decision and dedupe repeated proposals. A proposal with unexecuted comparative checks remains experimental. This release supplies the workflow and reproducible assets; it does not assert a measured aesthetic improvement over competitors.
|
data/docs/usage.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Session and interaction contract
|
|
2
|
+
|
|
3
|
+
Invoke `/as-design-site Design a site for …` or `/as-design-app Design the working screen for …`. The agent calls `ace-design explore` to create a session under `.ace-local/design/<base36-token>/`. Generate the token with `ace-b36ts encode --format ms` (in this repository `bin/ace-b36ts encode --format ms`). Create a fresh directory; on a collision generate a new token without overwriting an existing session. Put the readable project name in session.json rather than the directory name:
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
session.json {"surface":"site","title":"Example","language":"en","variants":["a","b","c"]}
|
|
8
|
+
brief.md audience, action, constraints, A/B/C composition
|
|
9
|
+
fixtures.json one JSON object; shared unchanged by all variants
|
|
10
|
+
assets/ optional shared local assets
|
|
11
|
+
variants/a/index.html fetch('../../fixtures.json')
|
|
12
|
+
variants/a/direction.md composition, hierarchy, tradeoff, mocks
|
|
13
|
+
variants/b/…
|
|
14
|
+
variants/c/…
|
|
15
|
+
gallery.html generated by preview
|
|
16
|
+
feedback.md append-only feedback rounds
|
|
17
|
+
selection.json created only after explicit choice
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Each variant may use a subset of the fixture object, but must not invent contradictory alternative records. Session validation checks structure and selection integrity, not the semantics of arbitrary JavaScript. The agent must verify common content and distinct hierarchy/composition. Site variants include a first screen and following section; app variants include a representative screen and one local interaction.
|
|
21
|
+
|
|
22
|
+
`preview` generates a comparison gallery. It displays ready variants even if another is not present; it never deletes completed variants. A prepared session can show an empty gallery while workers run; `validate` still reports that no variants are ready. Existing variant files and shared data are not overwritten by the gallery command. Only trusted local mockups should be previewed; running their JavaScript is part of rendering them. The frames share an origin to fetch fixtures and are not isolated from one another.
|
|
23
|
+
|
|
24
|
+
Give feedback such as “B: less dense, keep the headline from A”. The agent calls `ace-design revise SESSION --variant b --prompt TEXT`. Only B is replaced, and successful feedback is appended to feedback.md. Failed attempts retain their feedback and error in run.json. A request to change shared fixture content requires a new session. Do not run full production reviews during these rounds.
|
|
25
|
+
|
|
26
|
+
After “choose B”, the agent records:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{"surface":"site","variant":"b","fixtures_sha256":"SHA256_OF_EXACT_FIXTURE_BYTES","variant_sha256":"SHA256_OF_SELECTED_ARTIFACTS","decisions":["Keep B hierarchy and A headline","Replace mock form during implementation"]}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`validate SESSION` rejects mismatched surface, missing selected variant, changed fixture or selected-artifact hashes and empty decisions. A combined direction must first be represented in the selected variant. It does not auto-select a winner.
|
|
33
|
+
|
|
34
|
+
Then `/as-design-site-implement SESSION PROJECT` or the app equivalent starts proper engineering with actual data, required languages, states and tests. `/as-design-site-audit URL [PROJECT]` and app audit can operate without a session. URL-only audits explicitly label unavailable source coverage. Current checkout is used only if it is established to correspond to that URL.
|
|
35
|
+
|
|
36
|
+
Templates ship in `handbook/templates/design`; benchmark brief/fixture pairs ship in `handbook/benchmarks`. Pass the benchmark brief as the prompt and its JSON through `--fixtures`, then generate variants before previewing the printed session. Never edit packaged benchmark fixtures in a candidate comparison.
|
|
37
|
+
|
|
38
|
+
See [runner configuration](runner.md) for presets, optional per-variant prompts and CLI lifecycle commands.
|
data/exe/ace-design
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
require "ace/design"
|
|
4
|
+
begin
|
|
5
|
+
exit Ace::Design::CLI.start(ARGV.empty? ? ["--help"] : ARGV)
|
|
6
|
+
rescue Interrupt
|
|
7
|
+
if ARGV.first == "profile" && %w[adjust refresh].include?(ARGV[1])
|
|
8
|
+
warn "Design adjustment interrupted. Inspect the printed report directory and rerun profile adjust or profile refresh explicitly."
|
|
9
|
+
else
|
|
10
|
+
warn "Design operation interrupted; completed artifacts are preserved. Use status and resume with the printed session path."
|
|
11
|
+
end
|
|
12
|
+
exit 130
|
|
13
|
+
rescue Ace::Support::Cli::Error => e
|
|
14
|
+
warn e.message
|
|
15
|
+
exit e.exit_code
|
|
16
|
+
rescue Ace::Design::Error, ArgumentError, SystemCallError => e
|
|
17
|
+
warn e.message
|
|
18
|
+
exit(ARGV.first == "inspect" ? 2 : 1)
|
|
19
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Team room booking
|
|
2
|
+
Audience: people completing the primary task: reserve a room.
|
|
3
|
+
Primary action: Reserve a room.
|
|
4
|
+
Explore three directions: Schedule grid, availability list, room detail.
|
|
5
|
+
Use fixtures.json without changing records across variants. One language (en).
|
|
6
|
+
Scope: one working screen and one local interactive task.
|
|
7
|
+
After the initial comparison, request a less dense B while retaining its hierarchy; change only B.
|
|
8
|
+
Observe time and results; do not invent baseline or candidate measurements.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Team room booking",
|
|
3
|
+
"primary_action": "Reserve a room",
|
|
4
|
+
"description": "Compare rooms and available time slots for a small team meeting.",
|
|
5
|
+
"records": [
|
|
6
|
+
{
|
|
7
|
+
"id": "cedar",
|
|
8
|
+
"title": "Cedar room",
|
|
9
|
+
"status": "Available",
|
|
10
|
+
"capacity": 6,
|
|
11
|
+
"location": "Floor 1",
|
|
12
|
+
"starts_at": "2026-11-02T09:00:00Z",
|
|
13
|
+
"ends_at": "2026-11-02T10:00:00Z",
|
|
14
|
+
"equipment": [
|
|
15
|
+
"Display",
|
|
16
|
+
"Whiteboard"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "birch",
|
|
21
|
+
"title": "Birch room",
|
|
22
|
+
"status": "Reserved",
|
|
23
|
+
"capacity": 4,
|
|
24
|
+
"location": "Floor 2",
|
|
25
|
+
"starts_at": "2026-11-02T09:00:00Z",
|
|
26
|
+
"ends_at": "2026-11-02T10:00:00Z",
|
|
27
|
+
"equipment": [
|
|
28
|
+
"Whiteboard"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "oak",
|
|
33
|
+
"title": "Oak room",
|
|
34
|
+
"status": "Available",
|
|
35
|
+
"capacity": 12,
|
|
36
|
+
"location": "Floor 1",
|
|
37
|
+
"starts_at": "2026-11-02T10:00:00Z",
|
|
38
|
+
"ends_at": "2026-11-02T11:00:00Z",
|
|
39
|
+
"equipment": [
|
|
40
|
+
"Display",
|
|
41
|
+
"Video conferencing"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"data_notice": "Fictional benchmark data; fixed across baseline and candidate runs."
|
|
46
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Inventory management
|
|
2
|
+
Audience: people completing the primary task: find and adjust an item.
|
|
3
|
+
Primary action: Find and adjust an item.
|
|
4
|
+
Explore three directions: Dense table, grouped categories, search-led.
|
|
5
|
+
Use fixtures.json without changing records across variants. One language (en).
|
|
6
|
+
Scope: one working screen and one local interactive task.
|
|
7
|
+
After the initial comparison, request a less dense B while retaining its hierarchy; change only B.
|
|
8
|
+
Observe time and results; do not invent baseline or candidate measurements.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Inventory management",
|
|
3
|
+
"primary_action": "Find and adjust an item",
|
|
4
|
+
"description": "Find stock, inspect reorder needs and adjust a warehouse quantity.",
|
|
5
|
+
"records": [
|
|
6
|
+
{
|
|
7
|
+
"id": "cable-usbc",
|
|
8
|
+
"title": "USB-C cable, 1 m",
|
|
9
|
+
"status": "In stock",
|
|
10
|
+
"sku": "CAB-101",
|
|
11
|
+
"quantity": 42,
|
|
12
|
+
"reorder_point": 10,
|
|
13
|
+
"location": "A-01",
|
|
14
|
+
"category": "Accessories"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "adapter-hdmi",
|
|
18
|
+
"title": "USB-C to HDMI adapter",
|
|
19
|
+
"status": "Low stock",
|
|
20
|
+
"sku": "ADP-202",
|
|
21
|
+
"quantity": 3,
|
|
22
|
+
"reorder_point": 8,
|
|
23
|
+
"location": "A-02",
|
|
24
|
+
"category": "Adapters"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "hub-desktop",
|
|
28
|
+
"title": "Desktop USB hub",
|
|
29
|
+
"status": "Out of stock",
|
|
30
|
+
"sku": "HUB-303",
|
|
31
|
+
"quantity": 0,
|
|
32
|
+
"reorder_point": 5,
|
|
33
|
+
"location": "B-01",
|
|
34
|
+
"category": "Accessories"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"data_notice": "Fictional benchmark data; fixed across baseline and candidate runs."
|
|
38
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Support queue
|
|
2
|
+
Audience: people completing the primary task: triage the next ticket.
|
|
3
|
+
Primary action: Triage the next ticket.
|
|
4
|
+
Explore three directions: Queue-led, split detail, priority board.
|
|
5
|
+
Use fixtures.json without changing records across variants. One language (en).
|
|
6
|
+
Scope: one working screen and one local interactive task.
|
|
7
|
+
After the initial comparison, request a less dense B while retaining its hierarchy; change only B.
|
|
8
|
+
Observe time and results; do not invent baseline or candidate measurements.
|