chati-dev 4.3.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -13
- package/bin/chati.js +32 -4
- package/framework/agents/build/dev.md +9 -5
- package/framework/agents/discover/brief.md +2 -0
- package/framework/agents/discover/brownfield-wu.md +2 -0
- package/framework/agents/discover/greenfield-wu.md +18 -1
- package/framework/agents/plan/detail.md +2 -0
- package/framework/agents/plan/tasks.md +31 -0
- package/framework/agents/plan/ux-brand-architect.md +21 -2
- package/framework/agents/plan/ux-component-engineer.md +10 -0
- package/framework/agents/quality/qa-implementation.md +1 -1
- package/framework/agents/quality/qa-planning.md +1 -1
- package/framework/agents/quality/qa-visual.md +33 -21
- package/framework/config.yaml +5 -4
- package/framework/constitution.md +58 -11
- package/framework/context/governance.md +12 -10
- package/framework/context/root.md +2 -2
- package/framework/data/entity-registry.yaml +12 -4
- package/framework/data/qa-rubrics.yaml +335 -0
- package/framework/domains/constitution.yaml +3 -3
- package/framework/executors/json-validate.js +80 -0
- package/framework/executors/npm-script.js +72 -0
- package/framework/executors/path-check.js +67 -0
- package/framework/executors/registry.yaml +36 -0
- package/framework/hooks/advance-trigger.js +47 -3
- package/framework/hooks/constitution-guard.js +9 -4
- package/framework/hooks/git-push-authority.js +113 -0
- package/framework/hooks/license-guard.js +59 -9
- package/framework/hooks/model-governance.js +40 -17
- package/framework/hooks/prism-engine.js +78 -11
- package/framework/hooks/session-digest.js +12 -3
- package/framework/hooks/settings.json +7 -3
- package/framework/hooks/style-guard.js +52 -3
- package/framework/hooks/team-quality-gate.js +43 -5
- package/framework/i18n/en.yaml +3 -3
- package/framework/i18n/es.yaml +3 -3
- package/framework/i18n/fr.yaml +3 -3
- package/framework/i18n/pt.yaml +3 -3
- package/framework/intelligence/confidence.yaml +85 -6
- package/framework/intelligence/context-engine.md +9 -5
- package/framework/intelligence/decision-engine.md +1 -1
- package/framework/orchestrator/chati-router.js +59 -5
- package/framework/orchestrator/chati-update.md +19 -3
- package/framework/orchestrator/chati.md +20 -1
- package/framework/quality-gates/planning-gate.md +2 -0
- package/framework/rules/human-writing-style.md +47 -0
- package/framework/scaffold/motion-premium/README.md +12 -2
- package/framework/scaffold/motion-premium/lib/animations/tokens.ts.template +1 -1
- package/framework/scaffold/motion-premium/scaffold.yaml +6 -1
- package/framework/scaffold/motion-premium-3d/README.md +10 -0
- package/framework/scaffold/motion-premium-3d/components/webgl/WebGLContext.tsx.template +1 -1
- package/framework/scaffold/motion-premium-3d/scaffold.yaml +3 -0
- package/framework/scaffold/saas-dashboard/README.md +58 -0
- package/framework/scaffold/saas-dashboard/app/dashboard/page.tsx.template +546 -0
- package/framework/scaffold/saas-dashboard/app/globals.css.template +746 -0
- package/framework/scaffold/saas-dashboard/app/layout.tsx.template +192 -0
- package/framework/scaffold/saas-dashboard/app/shell.css.template +1070 -0
- package/framework/scaffold/saas-dashboard/components/data/Chart.tsx.template +725 -0
- package/framework/scaffold/saas-dashboard/components/data/DataTable.tsx.template +623 -0
- package/framework/scaffold/saas-dashboard/components/data/DataTable.types.ts.template +104 -0
- package/framework/scaffold/saas-dashboard/components/data/DataTablePagination.tsx.template +234 -0
- package/framework/scaffold/saas-dashboard/components/data/SkeletonBlock.tsx.template +111 -0
- package/framework/scaffold/saas-dashboard/components/data/StatCard.tsx.template +393 -0
- package/framework/scaffold/saas-dashboard/components/data/StatCardGrid.tsx.template +121 -0
- package/framework/scaffold/saas-dashboard/components/feedback/EmptyState.tsx.template +281 -0
- package/framework/scaffold/saas-dashboard/components/interaction/CommandPalette.tsx.template +767 -0
- package/framework/scaffold/saas-dashboard/components/interaction/Field.tsx.template +351 -0
- package/framework/scaffold/saas-dashboard/components/interaction/Form.tsx.template +424 -0
- package/framework/scaffold/saas-dashboard/components/primitives/Badge.tsx.template +193 -0
- package/framework/scaffold/saas-dashboard/components/primitives/Button.tsx.template +261 -0
- package/framework/scaffold/saas-dashboard/components/primitives/Card.tsx.template +287 -0
- package/framework/scaffold/saas-dashboard/components/primitives/Input.tsx.template +310 -0
- package/framework/scaffold/saas-dashboard/components/primitives/Spinner.tsx.template +135 -0
- package/framework/scaffold/saas-dashboard/components/primitives/index.ts.template +60 -0
- package/framework/scaffold/saas-dashboard/components/shell/AppShell.tsx.template +174 -0
- package/framework/scaffold/saas-dashboard/components/shell/Breadcrumb.tsx.template +186 -0
- package/framework/scaffold/saas-dashboard/components/shell/Container.tsx.template +86 -0
- package/framework/scaffold/saas-dashboard/components/shell/NavItem.tsx.template +147 -0
- package/framework/scaffold/saas-dashboard/components/shell/Sidebar.tsx.template +378 -0
- package/framework/scaffold/saas-dashboard/components/shell/SidebarContext.tsx.template +169 -0
- package/framework/scaffold/saas-dashboard/components/shell/ThemeToggle.tsx.template +128 -0
- package/framework/scaffold/saas-dashboard/components/shell/Topbar.tsx.template +301 -0
- package/framework/scaffold/saas-dashboard/lib/brand.ts.template +324 -0
- package/framework/scaffold/saas-dashboard/scaffold.yaml +225 -0
- package/framework/schemas/session.schema.json +5 -0
- package/framework/schemas/task.schema.json +9 -0
- package/framework/scripts/visual-qa.js +101 -3
- package/framework/tasks/orchestrator-health.md +4 -4
- package/framework/tasks/qa-impl-verdict.md +11 -5
- package/framework/templates/brandbook-html-tmpl.md +1 -1
- package/framework/templates/qa-gate-tmpl.yaml +24 -11
- package/package.json +4 -3
- package/src/config/context-file-generator.js +0 -6
- package/src/dashboard/renderer.js +0 -36
- package/src/executors/runner.js +204 -0
- package/src/installer/core.js +13 -3
- package/src/installer/templates.js +5 -6
- package/src/intelligence/registry-manager.js +1 -1
- package/src/license/client.js +9 -3
- package/src/license/commands.js +12 -2
- package/src/license/machine-id.js +42 -1
- package/src/memory/gotchas.js +58 -40
- package/src/memory/magic-docs.js +1 -1
- package/src/memory/session-digest.js +9 -4
- package/src/orchestrator/cli.js +186 -15
- package/src/orchestrator/doctor.js +98 -16
- package/src/orchestrator/pipeline-manager.js +44 -22
- package/src/orchestrator/session-manager.js +64 -8
- package/src/telemetry/sender.js +7 -19
- package/src/terminal/run-team.js +3 -3
- package/src/upgrade/tracked-files-detector.js +34 -16
- package/src/utils/feature-flags.js +1 -1
- package/src/utils/flatten-entities.js +4 -40
- package/src/utils/schema-validator.js +0 -14
- package/src/wizard/i18n.js +3 -3
- package/src/api/index.js +0 -120
- package/src/autonomy/autonomous-gate.js +0 -294
- package/src/autonomy/build-loop.js +0 -281
- package/src/autonomy/build-state.js +0 -286
- package/src/autonomy/cause-analyzer.js +0 -177
- package/src/autonomy/escalation.js +0 -214
- package/src/autonomy/index.js +0 -51
- package/src/autonomy/mode-manager.js +0 -225
- package/src/autonomy/mode-suggester.js +0 -283
- package/src/autonomy/progress-reporter.js +0 -275
- package/src/autonomy/safety-net.js +0 -370
- package/src/config/agent-customizer.js +0 -231
- package/src/decision/analyzer.js +0 -291
- package/src/decision/engine.js +0 -250
- package/src/decision/index.js +0 -38
- package/src/decision/registry-healer.js +0 -468
- package/src/decision/registry-updater.js +0 -339
- package/src/extensions/loader.js +0 -145
- package/src/extensions/registry.js +0 -134
- package/src/gates/circuit-breaker.js +0 -151
- package/src/gates/g1-planning-complete.js +0 -154
- package/src/gates/g2-qa-planning.js +0 -156
- package/src/gates/g3-implementation.js +0 -215
- package/src/gates/g4-qa-implementation.js +0 -240
- package/src/gates/g5-deploy-ready.js +0 -181
- package/src/gates/gate-base.js +0 -185
- package/src/gates/index.js +0 -46
- package/src/health/auto-fix.js +0 -216
- package/src/health/engine.js +0 -246
- package/src/merger/semantic-merger.js +0 -292
- package/src/preview/detector.js +0 -238
- package/src/preview/index.js +0 -20
- package/src/preview/launcher.js +0 -235
- package/src/preview/log-buffer.js +0 -103
- package/src/quality/metrics-collector.js +0 -281
- package/src/quality/test-runner.js +0 -366
- package/src/tasks/executor.js +0 -195
- package/src/tasks/index.js +0 -4
- package/src/tasks/loader.js +0 -210
- package/src/tasks/router.js +0 -182
- package/src/utils/event-bus.js +0 -126
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
# Intelligence Layer — Agent Confidence Calibration
|
|
2
|
-
# Tracks agent performance across technologies and patterns
|
|
3
|
-
# Updated after each execution
|
|
4
|
-
# NEVER overwritten during upgrades
|
|
2
|
+
# Tracks agent performance across technologies and patterns.
|
|
3
|
+
# Updated after each execution (the agent appends real results here).
|
|
4
|
+
# NEVER overwritten during upgrades.
|
|
5
|
+
#
|
|
6
|
+
# calibration_status:
|
|
7
|
+
# seed — initial estimate, NOT measured from real runs. Treat as a
|
|
8
|
+
# prior, not evidence. Replaced by measured values after runs.
|
|
9
|
+
# uncalibrated — no data yet. overall is null until the agent has run enough
|
|
10
|
+
# times to calibrate. Do not treat the absence of a number as
|
|
11
|
+
# low confidence; it means unknown.
|
|
12
|
+
# calibrated — overall and breakdowns reflect measured results across runs.
|
|
13
|
+
#
|
|
14
|
+
# Every pipeline agent has an entry so it has a place to accrue calibration.
|
|
5
15
|
|
|
6
16
|
confidence:
|
|
7
17
|
dev:
|
|
8
18
|
overall: 0.90
|
|
19
|
+
calibration_status: seed
|
|
9
20
|
by_technology:
|
|
10
21
|
react: 0.92
|
|
11
22
|
nextjs: 0.88
|
|
@@ -17,10 +28,11 @@ confidence:
|
|
|
17
28
|
crud_operations: 0.95
|
|
18
29
|
form_handling: 0.92
|
|
19
30
|
api_design: 0.88
|
|
20
|
-
last_calibrated:
|
|
31
|
+
last_calibrated: null
|
|
21
32
|
|
|
22
33
|
architect:
|
|
23
34
|
overall: 0.88
|
|
35
|
+
calibration_status: seed
|
|
24
36
|
by_technology:
|
|
25
37
|
react: 0.90
|
|
26
38
|
nextjs: 0.87
|
|
@@ -30,13 +42,80 @@ confidence:
|
|
|
30
42
|
monolith: 0.92
|
|
31
43
|
microservices: 0.80
|
|
32
44
|
serverless: 0.78
|
|
33
|
-
last_calibrated:
|
|
45
|
+
last_calibrated: null
|
|
34
46
|
|
|
35
47
|
qa-implementation:
|
|
36
48
|
overall: 0.92
|
|
49
|
+
calibration_status: seed
|
|
37
50
|
by_category:
|
|
38
51
|
test_execution: 0.95
|
|
39
52
|
security_scan: 0.90
|
|
40
53
|
code_review: 0.88
|
|
41
54
|
acceptance_verification: 0.93
|
|
42
|
-
last_calibrated:
|
|
55
|
+
last_calibrated: null
|
|
56
|
+
|
|
57
|
+
# Uncalibrated: every other pipeline agent. overall stays null until measured.
|
|
58
|
+
greenfield-wu:
|
|
59
|
+
overall: null
|
|
60
|
+
calibration_status: uncalibrated
|
|
61
|
+
last_calibrated: null
|
|
62
|
+
brownfield-wu:
|
|
63
|
+
overall: null
|
|
64
|
+
calibration_status: uncalibrated
|
|
65
|
+
last_calibrated: null
|
|
66
|
+
brief:
|
|
67
|
+
overall: null
|
|
68
|
+
calibration_status: uncalibrated
|
|
69
|
+
last_calibrated: null
|
|
70
|
+
detail:
|
|
71
|
+
overall: null
|
|
72
|
+
calibration_status: uncalibrated
|
|
73
|
+
last_calibrated: null
|
|
74
|
+
architect-system:
|
|
75
|
+
overall: null
|
|
76
|
+
calibration_status: uncalibrated
|
|
77
|
+
last_calibrated: null
|
|
78
|
+
architect-data-engineer:
|
|
79
|
+
overall: null
|
|
80
|
+
calibration_status: uncalibrated
|
|
81
|
+
last_calibrated: null
|
|
82
|
+
ux:
|
|
83
|
+
overall: null
|
|
84
|
+
calibration_status: uncalibrated
|
|
85
|
+
last_calibrated: null
|
|
86
|
+
ux-brand-architect:
|
|
87
|
+
overall: null
|
|
88
|
+
calibration_status: uncalibrated
|
|
89
|
+
last_calibrated: null
|
|
90
|
+
ux-component-engineer:
|
|
91
|
+
overall: null
|
|
92
|
+
calibration_status: uncalibrated
|
|
93
|
+
last_calibrated: null
|
|
94
|
+
ux-researcher:
|
|
95
|
+
overall: null
|
|
96
|
+
calibration_status: uncalibrated
|
|
97
|
+
last_calibrated: null
|
|
98
|
+
phases:
|
|
99
|
+
overall: null
|
|
100
|
+
calibration_status: uncalibrated
|
|
101
|
+
last_calibrated: null
|
|
102
|
+
tasks:
|
|
103
|
+
overall: null
|
|
104
|
+
calibration_status: uncalibrated
|
|
105
|
+
last_calibrated: null
|
|
106
|
+
qa-planning:
|
|
107
|
+
overall: null
|
|
108
|
+
calibration_status: uncalibrated
|
|
109
|
+
last_calibrated: null
|
|
110
|
+
qa-visual:
|
|
111
|
+
overall: null
|
|
112
|
+
calibration_status: uncalibrated
|
|
113
|
+
last_calibrated: null
|
|
114
|
+
visualizer:
|
|
115
|
+
overall: null
|
|
116
|
+
calibration_status: uncalibrated
|
|
117
|
+
last_calibrated: null
|
|
118
|
+
devops:
|
|
119
|
+
overall: null
|
|
120
|
+
calibration_status: uncalibrated
|
|
121
|
+
last_calibrated: null
|
|
@@ -33,7 +33,7 @@ The orchestrator injects context through 6 hierarchical layers:
|
|
|
33
33
|
|
|
34
34
|
| Layer | Name | Source | When Active |
|
|
35
35
|
|-------|------|--------|-------------|
|
|
36
|
-
| **L0** | Constitution | `chati.dev/constitution.md` (Articles I-
|
|
36
|
+
| **L0** | Constitution | `chati.dev/constitution.md` (Articles I-XXV) | ALWAYS (non-negotiable) |
|
|
37
37
|
| **L1** | Mode + Global | `config.yaml` + mode governance (planning/build/deploy) | ALWAYS |
|
|
38
38
|
| **L2** | Agent Scope | `chati.dev/agents/{agent}/` — mission, inputs, outputs, criteria | When agent is active |
|
|
39
39
|
| **L3** | Pipeline State | `.chati/session.yaml` — pipeline position, scores, backlog | When session is active |
|
|
@@ -42,7 +42,7 @@ The orchestrator injects context through 6 hierarchical layers:
|
|
|
42
42
|
|
|
43
43
|
### Layer Activation by Bracket
|
|
44
44
|
|
|
45
|
-
| Bracket | Active Layers | Budget Ratio | Claude (
|
|
45
|
+
| Bracket | Active Layers | Budget Ratio | Claude (1M) | Gemini (1M) | Codex (128K) |
|
|
46
46
|
|---------|--------------|-------------|---------------|-------------|--------------|
|
|
47
47
|
| FRESH | L0, L1 | 1.5% | 3,000 | 15,000 | 1,920 |
|
|
48
48
|
| MODERATE | L0, L1, L2, L3 | 2.5% | 5,000 | 25,000 | 3,200 |
|
|
@@ -60,7 +60,7 @@ The orchestrator produces a structured XML block injected into agent prompts:
|
|
|
60
60
|
```xml
|
|
61
61
|
<chati-context bracket="MODERATE">
|
|
62
62
|
<constitution>
|
|
63
|
-
Articles I-
|
|
63
|
+
Articles I-XXV governing agent behavior.
|
|
64
64
|
Key: Self-validation required. Loop until quality threshold.
|
|
65
65
|
Guided options (1,2,3). Persistent session state.
|
|
66
66
|
Two-layer handoff. Language protocol. Deviation protocol.
|
|
@@ -116,7 +116,7 @@ estimatedTokens = promptText.length / 4
|
|
|
116
116
|
remainingPercent = (1 - estimatedTokens / providerLimit) * 100
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
This replaces the legacy heuristic (`turnCount / maxTurns`) which was inaccurate for sessions with large tool results or long agent outputs. The token-based approach scales correctly across providers (Claude
|
|
119
|
+
This replaces the legacy heuristic (`turnCount / maxTurns`) which was inaccurate for sessions with large tool results or long agent outputs. The token-based approach scales correctly across providers (Claude 1M, Gemini 1M, Codex 128K).
|
|
120
120
|
|
|
121
121
|
Fallback: If prompt text is unavailable, the turn-count heuristic is used.
|
|
122
122
|
|
|
@@ -150,11 +150,15 @@ If Smart Continuation is insufficient, the orchestrator spawns a new session:
|
|
|
150
150
|
|
|
151
151
|
| Condition | Threshold | Rationale |
|
|
152
152
|
|-----------|-----------|-----------|
|
|
153
|
+
| BUILD phase + DEPLETED/CRITICAL | Immediate (default to Level 2) | During code generation a depleted window produces regressions faster than a reset costs; a clean slate beats in-place compaction |
|
|
153
154
|
| Multiple compactions | 3+ in single session | Context is churning too fast |
|
|
154
155
|
| Post-compact quality | Agent score drops >15% | Compaction lost critical context |
|
|
155
156
|
| Critical bracket persists | CRITICAL for 3+ consecutive interactions | Recovery not working |
|
|
157
|
+
| Echo loop detected | 2+ echo entries in the current phase (session.yaml decision_trail) | The model is looping; a fresh session breaks the cycle |
|
|
156
158
|
| Agent handoff pending | Current agent done, next agent needs fresh context | Clean start is better |
|
|
157
159
|
|
|
160
|
+
**BUILD-phase reset preference:** During the BUILD phase, when the active agent reaches DEPLETED or CRITICAL, the orchestrator defaults to Level 2 (Autonomous Session Spawn, a clean reset) rather than Level 1 (Smart Continuation, in-place compaction). Compaction preserves continuity but not a clean slate, so the model can keep wrapping up work prematurely while code is being written; a reset carrying a full handoff is safer there. Level 1 stays the default for the MODERATE bracket and for the DISCOVER and PLAN phases.
|
|
161
|
+
|
|
158
162
|
### IDE-Specific Behavior
|
|
159
163
|
|
|
160
164
|
| IDE | Level 1 | Level 2 |
|
|
@@ -185,7 +189,7 @@ Memory injection follows the same progressive reinforcement principle: as contex
|
|
|
185
189
|
|
|
186
190
|
---
|
|
187
191
|
|
|
188
|
-
*Context Engine v4.
|
|
192
|
+
*Context Engine v4.4.0 — Chati.dev Intelligence Layer (Progressive Reinforcement Model)*
|
|
189
193
|
|
|
190
194
|
---
|
|
191
195
|
|
|
@@ -96,7 +96,7 @@ npx chati-dev health
|
|
|
96
96
|
Checks:
|
|
97
97
|
1. All registered entities exist on disk
|
|
98
98
|
2. Schema files are valid JSON
|
|
99
|
-
3. Constitution has >=
|
|
99
|
+
3. Constitution has >= 25 articles
|
|
100
100
|
4. Agents contain required protocol references
|
|
101
101
|
5. Entity count matches actual file count
|
|
102
102
|
6. Checksums match (if calculated)
|
|
@@ -28,6 +28,51 @@ const ROUTER_ARGS = process.argv.slice(2);
|
|
|
28
28
|
async function findCliModule(projectDir) {
|
|
29
29
|
// Resolve framework dir (.chati.dev/ or chati.dev/ for legacy)
|
|
30
30
|
const fwDir = existsSync(join(projectDir, '.chati.dev')) ? '.chati.dev' : 'chati.dev';
|
|
31
|
+
|
|
32
|
+
// --- VERSION MISMATCH DETECTION (v4.3.1+) ---
|
|
33
|
+
// G8: reset stale state from previous invocations within same process.
|
|
34
|
+
findCliModule._mismatch = null;
|
|
35
|
+
|
|
36
|
+
// Compare canonical version (chati.dev/config.yaml.installer_version) against
|
|
37
|
+
// installed bundle (.chati.dev/_cli/version.json). Pre-v4.3.1 installs lack
|
|
38
|
+
// version.json — silent skip (graceful degradation).
|
|
39
|
+
let installedVersion = null;
|
|
40
|
+
let bundledVersion = null;
|
|
41
|
+
try {
|
|
42
|
+
const configPath = join(projectDir, fwDir, 'config.yaml');
|
|
43
|
+
if (existsSync(configPath)) {
|
|
44
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
45
|
+
const m = raw.match(/^installer_version:\s*['"]?([^\s'"]+)/m);
|
|
46
|
+
installedVersion = m ? m[1] : null;
|
|
47
|
+
}
|
|
48
|
+
const versionStampPath = join(projectDir, fwDir, '_cli', 'version.json');
|
|
49
|
+
if (existsSync(versionStampPath)) {
|
|
50
|
+
bundledVersion = JSON.parse(readFileSync(versionStampPath, 'utf-8')).version;
|
|
51
|
+
}
|
|
52
|
+
if (installedVersion && bundledVersion && installedVersion !== bundledVersion) {
|
|
53
|
+
// G6: severity-aware warning. Major diff signals breaking schema/behavior changes.
|
|
54
|
+
const installedMajor = parseInt(String(installedVersion).split('.')[0], 10);
|
|
55
|
+
const bundledMajor = parseInt(String(bundledVersion).split('.')[0], 10);
|
|
56
|
+
const majorDiff =
|
|
57
|
+
!Number.isNaN(installedMajor) &&
|
|
58
|
+
!Number.isNaN(bundledMajor) &&
|
|
59
|
+
installedMajor !== bundledMajor;
|
|
60
|
+
const severityNote = majorDiff
|
|
61
|
+
? ' Major version change — review CHANGELOG before upgrading.'
|
|
62
|
+
: '';
|
|
63
|
+
process.stderr.write(
|
|
64
|
+
`[chati] WARNING: CLI bundle version (${bundledVersion}) ` +
|
|
65
|
+
`does not match installed framework (${installedVersion}).${severityNote} ` +
|
|
66
|
+
`Run: npx chati-dev upgrade\n`
|
|
67
|
+
);
|
|
68
|
+
findCliModule._mismatch = {
|
|
69
|
+
bundle: bundledVersion,
|
|
70
|
+
installed: installedVersion,
|
|
71
|
+
major_diff: majorDiff,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
} catch { /* non-critical — proceed to candidates loop */ }
|
|
75
|
+
|
|
31
76
|
const candidates = [
|
|
32
77
|
// PRIMARY: bundled CLI inside framework dir (self-contained install — no npx needed)
|
|
33
78
|
join(projectDir, fwDir, '_cli', 'orchestrator', 'cli.js'),
|
|
@@ -90,9 +135,11 @@ async function routeAdvance(agentName, score) {
|
|
|
90
135
|
|
|
91
136
|
try {
|
|
92
137
|
const cliMod = await findCliModule(PROJECT_DIR);
|
|
138
|
+
if (findCliModule._mismatch) result.version_mismatch = findCliModule._mismatch;
|
|
93
139
|
if (!cliMod) {
|
|
94
140
|
result.ok = false;
|
|
95
141
|
result.error = 'cli_module_not_found';
|
|
142
|
+
result.reason = 'Bundled CLI not found in .chati.dev/_cli/. Reinstall with: npx chati-dev upgrade';
|
|
96
143
|
return result;
|
|
97
144
|
}
|
|
98
145
|
|
|
@@ -145,7 +192,7 @@ const VALID_ORCHESTRATE_SUBS = new Set([
|
|
|
145
192
|
'qa-plan-score', 'qa-impl-score', 'qa-visual-score', 'scan',
|
|
146
193
|
'spawn-team', 'team-status', 'team-dissolve',
|
|
147
194
|
'wait-for-capture', 'wave-status', 'assess-coverage',
|
|
148
|
-
'wait-for-license', 'doctor',
|
|
195
|
+
'wait-for-license', 'doctor', 'run-script-task',
|
|
149
196
|
]);
|
|
150
197
|
|
|
151
198
|
/**
|
|
@@ -174,16 +221,21 @@ function parseFlagArgs(argv) {
|
|
|
174
221
|
*/
|
|
175
222
|
async function dispatchOrchestrate(subCommand, argv) {
|
|
176
223
|
const cliMod = await findCliModule(PROJECT_DIR);
|
|
224
|
+
const mismatch = findCliModule._mismatch;
|
|
177
225
|
if (!cliMod) {
|
|
178
|
-
|
|
226
|
+
const out = {
|
|
179
227
|
ok: false,
|
|
180
228
|
action: 'error',
|
|
181
229
|
error: 'cli_module_not_found',
|
|
182
|
-
reason: 'Bundled CLI not found in .chati.dev/_cli/. Reinstall with: npx chati-dev
|
|
230
|
+
reason: 'Bundled CLI not found in .chati.dev/_cli/. Reinstall with: npx chati-dev upgrade',
|
|
183
231
|
};
|
|
232
|
+
if (mismatch) out.version_mismatch = mismatch;
|
|
233
|
+
return out;
|
|
184
234
|
}
|
|
185
235
|
try {
|
|
186
|
-
|
|
236
|
+
const result = await captureOrchestrate(cliMod, subCommand, argv, PROJECT_DIR);
|
|
237
|
+
if (mismatch && result && typeof result === 'object') result.version_mismatch = mismatch;
|
|
238
|
+
return result;
|
|
187
239
|
} catch (err) {
|
|
188
240
|
return {
|
|
189
241
|
ok: false,
|
|
@@ -327,9 +379,11 @@ async function main() {
|
|
|
327
379
|
// -----------------------------------------------------------------------
|
|
328
380
|
try {
|
|
329
381
|
const cliMod = await findCliModule(PROJECT_DIR);
|
|
382
|
+
if (findCliModule._mismatch) result.version_mismatch = findCliModule._mismatch;
|
|
330
383
|
if (!cliMod) {
|
|
331
384
|
result.action = 'error';
|
|
332
|
-
result.error = 'cli_module_not_found
|
|
385
|
+
result.error = 'cli_module_not_found';
|
|
386
|
+
result.reason = 'Bundled CLI missing in .chati.dev/_cli/. Reinstall with: npx chati-dev upgrade';
|
|
333
387
|
} else {
|
|
334
388
|
result.pipeline = await captureOrchestrate(cliMod, 'next', [], PROJECT_DIR);
|
|
335
389
|
result.action = result.pipeline.action;
|
|
@@ -10,7 +10,7 @@ You are the **Chati Update Agent**, a specialized evolution advisor for the chat
|
|
|
10
10
|
|
|
11
11
|
1. **NEVER copy blindly** - Adapt concepts to chati.dev's identity and patterns
|
|
12
12
|
2. **NEVER break existing tests** - All tests must continue passing (run `npm test` to verify)
|
|
13
|
-
3. **NEVER violate the constitution** -
|
|
13
|
+
3. **NEVER violate the constitution** - 25 articles are sacred
|
|
14
14
|
4. **NEVER skip comparison** - Every finding MUST be validated against current state
|
|
15
15
|
5. **ALWAYS present options** - Numbered 1, 2, 3 format before any implementation
|
|
16
16
|
6. **ALWAYS use sub-agents** - Parallelize SCAN and COMPARE for throughput
|
|
@@ -102,7 +102,7 @@ Launch **in parallel** with Phase 1 a **Task agent (subagent_type=Explore, thoro
|
|
|
102
102
|
Map the COMPLETE current state of chati.dev. Analyze:
|
|
103
103
|
|
|
104
104
|
1. **CONSTITUTION** - Read chati.dev/constitution.md fully. Extract:
|
|
105
|
-
- All
|
|
105
|
+
- All 25 articles with key rules
|
|
106
106
|
- Quality thresholds
|
|
107
107
|
- Governance patterns
|
|
108
108
|
|
|
@@ -247,7 +247,7 @@ Use `/ralph-loop` with the following prompt structure:
|
|
|
247
247
|
|
|
248
248
|
REQUIREMENTS:
|
|
249
249
|
1. Implement each change following chati.dev patterns and conventions
|
|
250
|
-
2. Respect the constitution (
|
|
250
|
+
2. Respect the constitution (25 articles) - especially originality
|
|
251
251
|
3. Update relevant tests for each change
|
|
252
252
|
4. Run full test suite after each change - ALL must pass
|
|
253
253
|
5. Run lint after each change - must be clean
|
|
@@ -300,6 +300,22 @@ After ralph-wiggum completes, generate final report:
|
|
|
300
300
|
|
|
301
301
|
---
|
|
302
302
|
|
|
303
|
+
## Phase 7: MODEL-HARNESS PARITY (Article XXIV)
|
|
304
|
+
|
|
305
|
+
This step runs whether the update was triggered by a reference comparison or by a model change.
|
|
306
|
+
|
|
307
|
+
1. **Re-baseline the model.** Record the current model as the audited one so the parity advisory clears:
|
|
308
|
+
- set `session.model_at_last_audit = session.active_model`
|
|
309
|
+
Write this through the session manager (the CLI-managed path), never by editing `.chati/session.yaml` directly.
|
|
310
|
+
|
|
311
|
+
2. **Model-change audit checklist.** When the model family changed, re-check the parts of the harness whose calibration is model-dependent, and keep the model-agnostic parts:
|
|
312
|
+
- Context bracket token budgets (Article XII, `context-engine.md`): are the FRESH/MODERATE/DEPLETED/CRITICAL boundaries still right for the new window size?
|
|
313
|
+
- Agent confidence calibration (`intelligence/confidence.yaml`): re-calibrate after a few real runs on the new model.
|
|
314
|
+
- Load-bearing agents: is any scaffolding agent now redundant because the new model does that step natively? Is any new capability worth a new agent?
|
|
315
|
+
- Keep unchanged: the Articles, the quality gates and thresholds, the registry. These are model-agnostic.
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
303
319
|
## Error Handling
|
|
304
320
|
|
|
305
321
|
- **Clone fails**: Ask user for correct URL/path, suggest alternatives
|
|
@@ -104,6 +104,7 @@ Parse the JSON output. The `action` field tells you what to do:
|
|
|
104
104
|
| `user_preview` | Action: User Preview |
|
|
105
105
|
| `complete` | Action: Complete |
|
|
106
106
|
| `error` | Display error, suggest `/chati status` |
|
|
107
|
+
| `version_mismatch` (in any response) | "Your CLI bundle is out of date. Run `npx chati-dev upgrade` to fix." Display once per session, then continue. |
|
|
107
108
|
|
|
108
109
|
**Internal: track context bracket from JSON `context_bracket` but DO NOT display it to the user.** The bracket is internal telemetry - users should never see "Context: FRESH (90%)" or framework jargon like "Initiating handoff protocol". Speak in natural language about what you are doing, not the internal state.
|
|
109
110
|
|
|
@@ -228,6 +229,24 @@ Quality gate passed: {score}%.
|
|
|
228
229
|
|
|
229
230
|
---
|
|
230
231
|
|
|
232
|
+
## Action: Script Task (Execution Kinds)
|
|
233
|
+
|
|
234
|
+
When the `execution_kinds` feature is on and the next task's `execution_kind` is
|
|
235
|
+
not `agent`, route it here instead of spawning an agent. When the feature is off
|
|
236
|
+
or the kind is `agent`, skip this entirely and use the normal agent path. This
|
|
237
|
+
is purely a dispatch optimization: it never changes WHAT a task must achieve,
|
|
238
|
+
only what executes it, and it is invisible when the feature is off.
|
|
239
|
+
|
|
240
|
+
- **script**: run it deterministically with no LLM. Via Bash:
|
|
241
|
+
`node .chati.dev/orchestrator/chati-router.js run-script-task --ref "{execution_ref}" --id "{task_id}" --title "{task_title}"`
|
|
242
|
+
Handle the JSON `status`:
|
|
243
|
+
- `passed` → the task is done. Advance: `node .chati.dev/orchestrator/chati-router.js advance --agent {current_agent} --score 100`
|
|
244
|
+
- `failed` → the deterministic check is negative. Route to dev (Fault Vector Protocol: CODE) to fix, then re-run the script task.
|
|
245
|
+
- `error` → the executor could not run. Surface the summary to the user and check the execution_ref against the executor registry.
|
|
246
|
+
- `ran: false` → the feature is off or the kind is not script; fall back to the agent path silently.
|
|
247
|
+
- **human**: present the decision in the user's language as a Guided Option and wait for their choice. Record it, then advance. Never decide for them.
|
|
248
|
+
- **specialist**: reserved; today, run it through the normal agent path.
|
|
249
|
+
|
|
231
250
|
## Action: Autonomous Agent
|
|
232
251
|
|
|
233
252
|
These agents run in separate Claude Code processes.
|
|
@@ -789,7 +808,7 @@ interactive (default):
|
|
|
789
808
|
→ All 8 universal protocols apply.
|
|
790
809
|
|
|
791
810
|
autonomous (Ralph Wiggum mode):
|
|
792
|
-
→ Requires: most recent QA gate score >= 95% (Article
|
|
811
|
+
→ Requires: most recent QA gate score >= 95% (Article XVII prerequisite).
|
|
793
812
|
→ If quality gate not met, inform user and suggest guided mode instead.
|
|
794
813
|
→ Agent executes without asking unless blocker encountered.
|
|
795
814
|
→ Primarily for Dev agent during BUILD phase.
|
|
@@ -34,6 +34,8 @@ QA-Planning
|
|
|
34
34
|
| Agent defined weak criteria | -10 |
|
|
35
35
|
|
|
36
36
|
## Decision
|
|
37
|
+
Thresholds are canonical in `chati.dev/data/qa-rubrics.yaml` (thresholds.qa-planning); the values below must match that file.
|
|
38
|
+
|
|
37
39
|
- **Score >= 95**: APPROVED -> proceed to BUILD
|
|
38
40
|
- **Score < 95**: Silent correction loop (max 3 per agent)
|
|
39
41
|
- **Still < 95 after loops**: ESCALATE to user
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Human Writing Style — Anti-AI Guidelines
|
|
2
|
+
|
|
3
|
+
**Scope**: Apply to all human-facing outputs: WU reports, Briefs, PRDs, handoff Layer 1 summaries, conversation turns with the user.
|
|
4
|
+
**Exemption**: Tasks lists, JSON, YAML, code blocks, qa-*.md structured tables, Given-When-Then criteria — do NOT apply.
|
|
5
|
+
|
|
6
|
+
## Rules
|
|
7
|
+
|
|
8
|
+
### 1. No generic opening phrases
|
|
9
|
+
Do not open with "In today's fast-paced world", "In the ever-evolving landscape", "As we navigate", or any variant. Start with the subject matter directly.
|
|
10
|
+
|
|
11
|
+
### 2. No AI-favored filler verbs
|
|
12
|
+
Avoid: delve, leverage, facilitate, utilize, empower, harness. Use: use, help, run, build, drive, enable — only when the simpler word fits.
|
|
13
|
+
|
|
14
|
+
### 3. No rhetorical tricolons
|
|
15
|
+
Avoid: "not only X, but also Y, and Z", "robust, scalable, and maintainable". State the one thing that matters. Cut the rest.
|
|
16
|
+
|
|
17
|
+
### 4. No unnecessary hedging
|
|
18
|
+
Remove: "it's worth noting", "it's important to mention", "it should be noted", "one could argue", "arguably". If it is worth saying, say it directly.
|
|
19
|
+
|
|
20
|
+
### 5. No meta-closings
|
|
21
|
+
Remove: "In conclusion", "To summarize", "Overall", "Ultimately", "In summary". End on the last substantive point.
|
|
22
|
+
|
|
23
|
+
### 6. No sycophancy
|
|
24
|
+
Never open a response with "Great question!", "Excellent point!", "Absolutely!", or any approval of the user's input.
|
|
25
|
+
|
|
26
|
+
### 7. No performative bold
|
|
27
|
+
Do not bold words that carry no additional weight in context. Bold only genuine warnings, field labels, or terms the reader must not miss.
|
|
28
|
+
|
|
29
|
+
### 8. No robotic bullet parallelism
|
|
30
|
+
Bullet lists must not read as machine-generated triplets of the same syntactic form. Vary sentence length and structure. Mix noun phrases with full sentences where it reads better.
|
|
31
|
+
|
|
32
|
+
### 9. No negation-revelation pattern
|
|
33
|
+
Avoid: "This isn't just a dashboard — it's a command center." State what it is. Do not theatricalize via contrast.
|
|
34
|
+
|
|
35
|
+
### 10. No stacked generic adjectives
|
|
36
|
+
Avoid: "comprehensive, robust, scalable solution". Use the adjective only if it is specific and load-bearing. Remove the rest.
|
|
37
|
+
|
|
38
|
+
## Multilingual application
|
|
39
|
+
|
|
40
|
+
Framework supports en/pt/es/fr (Article VII). The English patterns above are EXEMPLARS, not exhaustive enumeration. When producing output in pt-BR / es / fr, apply the SAME PRINCIPLES to language-equivalent forms:
|
|
41
|
+
|
|
42
|
+
- Filler verbs: pt "elucidar / alavancar / facilitar"; es "profundizar / aprovechar / facilitar"; fr "approfondir / exploiter / faciliter"
|
|
43
|
+
- Generic openings: pt "No mundo atual em constante mudança"; es "En el mundo actual"; fr "Dans le monde d'aujourd'hui"
|
|
44
|
+
- Meta-closings: pt "Em conclusão / Em resumo"; es "En conclusión"; fr "En conclusion / Pour conclure"
|
|
45
|
+
- Sycophancy: pt "Ótima pergunta!"; es "¡Excelente pregunta!"; fr "Excellente question !"
|
|
46
|
+
|
|
47
|
+
Agent applies the principle to the target language; do not require literal translation of English examples.
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
# Motion Premium Scaffold — v1.0.0
|
|
2
2
|
|
|
3
|
-
Opinionated premium animation infrastructure for Next.js / React 18+ / Tailwind v4 projects. Ships the 13 non-negotiable sauce patterns + 12 responsive principles proven on reference implementations (
|
|
3
|
+
Opinionated premium animation infrastructure for Next.js / React 18+ / Tailwind v4 projects. Ships the 13 non-negotiable sauce patterns + 12 responsive principles proven on reference implementations (reference-website).
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
After `npm install`, run once to download the chromium browser binary used by QA-Visual screenshots:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx playwright install chromium
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Without this step, QA-Visual falls back to source-code analysis (gateway: WEAK) and skips screenshot-based gates.
|
|
4
14
|
|
|
5
15
|
## What this scaffold gives you
|
|
6
16
|
|
|
@@ -74,7 +84,7 @@ All 15 files listed above match `scaffold.yaml` `files[]` exactly.
|
|
|
74
84
|
- **Scaffold**: `motion-premium@1.0.0`
|
|
75
85
|
- **Requires framework**: chati.dev >= 4.3.0
|
|
76
86
|
- **Requires stack**: Next.js OR React Vite, Tailwind v4+, TypeScript 5+, React 18+, Node 18+
|
|
77
|
-
- **Reference implementation**: `
|
|
87
|
+
- **Reference implementation**: `reference-website` (all 13 sauce patterns verified in production)
|
|
78
88
|
|
|
79
89
|
## Upgrading
|
|
80
90
|
|
|
@@ -102,7 +102,7 @@ export type StaggerKey = keyof typeof STAGGERS;
|
|
|
102
102
|
// SCROLL_TRIGGER_DEFAULTS — common trigger start/end strings
|
|
103
103
|
// The GSAP "top 80%" syntax means: "fire when element's top is at 80% down
|
|
104
104
|
// the viewport". Defaults here encode the weight/timing recommendations
|
|
105
|
-
// from the reference implementation (
|
|
105
|
+
// from the reference implementation (reference-website) — they produce the
|
|
106
106
|
// signature feel of the premium pattern set.
|
|
107
107
|
// -----------------------------------------------------------------------
|
|
108
108
|
export const SCROLL_TRIGGER_DEFAULTS = {
|
|
@@ -15,11 +15,12 @@ framework:
|
|
|
15
15
|
chati_dev: ">=4.3.0"
|
|
16
16
|
|
|
17
17
|
stack:
|
|
18
|
-
build_tools: ["nextjs"
|
|
18
|
+
build_tools: ["nextjs"]
|
|
19
19
|
tailwind: ">=4.0.0"
|
|
20
20
|
typescript: ">=5.0.0"
|
|
21
21
|
node: ">=18.0.0"
|
|
22
22
|
react: ">=18.0.0"
|
|
23
|
+
next: ">=13.0.0"
|
|
23
24
|
# Runtime peer deps imported directly by templates. Bumping policy: every two
|
|
24
25
|
# minor bumps, re-validate templates. GSAP 3.12 is the stable line post-3.11;
|
|
25
26
|
# framer-motion 11 is the React 19 support line; lenis 1.1 introduced the
|
|
@@ -27,6 +28,10 @@ stack:
|
|
|
27
28
|
gsap: "^3.12.5"
|
|
28
29
|
"framer-motion": "^11.0.0"
|
|
29
30
|
lenis: "^1.1.0"
|
|
31
|
+
# v4.3.1+: Playwright required for QA-Visual screenshot-based gate.
|
|
32
|
+
# Without it, visual-qa.js falls back to source-code analysis (gateway: WEAK).
|
|
33
|
+
# Run `npx playwright install chromium` once after npm install for the binary.
|
|
34
|
+
playwright: "^1.44.0"
|
|
30
35
|
|
|
31
36
|
# Placeholder resolution — keys reference brand source fields.
|
|
32
37
|
# Resolved once at scaffold apply time (Decision 3: install-time, one-shot).
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
React Three Fiber + Three.js scroll-driven 3D layer for premium sites. Extends `motion-premium` — apply that one FIRST (the 2D base), then this one on top.
|
|
4
4
|
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
After `npm install`, run once to download the chromium browser binary used by QA-Visual screenshots:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx playwright install chromium
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
QA-Visual Phase 3c uses real browser screenshots to count `canvas_hosts` and `scene_fallbacks` in the rendered DOM. Without chromium, R3F visual QA is blind.
|
|
14
|
+
|
|
5
15
|
## When to apply
|
|
6
16
|
|
|
7
17
|
Apply when the project brief or Animation Inventory cites **explicit 3D intent**:
|
|
@@ -24,7 +24,7 @@ import { detectWebGL, type WebGLAvailability } from '@/lib/webgl/detect';
|
|
|
24
24
|
|
|
25
25
|
export interface WebGLContextValue {
|
|
26
26
|
status: 'pending' | 'available' | 'unavailable';
|
|
27
|
-
reason: WebGLAvailability
|
|
27
|
+
reason: Extract<WebGLAvailability, { available: false }>['reason'] | null;
|
|
28
28
|
webglVersion: 1 | 2 | null;
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -33,6 +33,9 @@ stack:
|
|
|
33
33
|
# but also declares the dep so a standalone apply (no motion-premium first)
|
|
34
34
|
# still has an accurate peer-dep surface.
|
|
35
35
|
gsap: "^3.12.5"
|
|
36
|
+
# v4.3.1+: Playwright required for QA-Visual canvas_hosts + scene_fallbacks
|
|
37
|
+
# checks (Phase 3c). Without it, R3F visual QA is blind (canvas not screenshotted).
|
|
38
|
+
playwright: "^1.44.0"
|
|
36
39
|
|
|
37
40
|
# Inherits motion-premium's brand placeholders — at apply time the loader
|
|
38
41
|
# resolves identically (brand.ts > brandbook.md > interactive). SceneFallback
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# saas-dashboard scaffold preset
|
|
2
|
+
|
|
3
|
+
A premium SaaS dashboard and app-shell starting point. Where the motion-premium
|
|
4
|
+
presets target animated showcase sites, this preset targets the build-me-a-tool
|
|
5
|
+
category: a data-dense application shell that looks designed, not generated.
|
|
6
|
+
|
|
7
|
+
## What it ships
|
|
8
|
+
|
|
9
|
+
29 templates across foundation, primitives, shell, data, interaction, and a
|
|
10
|
+
composed sample page:
|
|
11
|
+
|
|
12
|
+
- **Foundation**: `app/globals.css` (the full token system, fluid type scale,
|
|
13
|
+
reduced-motion handling, the `xl` breakpoint override), `lib/brand.ts` (typed
|
|
14
|
+
tokens), and the single `Container` authority for max-width and padding.
|
|
15
|
+
- **Primitives**: `Button`, `Card`, `Input`, `Badge`, `Spinner`, each with full
|
|
16
|
+
resting, hover, active, disabled, and focus states.
|
|
17
|
+
- **Shell**: `AppShell`, `Sidebar` (collapsible, keyboard-accessible, responsive
|
|
18
|
+
drawer), `Topbar` (search trigger, breadcrumb, user menu), `NavItem`,
|
|
19
|
+
`ThemeToggle`, `Breadcrumb`.
|
|
20
|
+
- **Data**: `DataTable` (typed, sortable, sticky header, selection, empty and
|
|
21
|
+
loading states), `StatCard` and `StatCardGrid` (KPI with delta semantics and a
|
|
22
|
+
sparkline), `Chart` (a self-contained SVG area chart, no chart dependency).
|
|
23
|
+
- **Interaction**: `CommandPalette` (Cmd+K, fuzzy filter, keyboard nav, hand
|
|
24
|
+
rolled, no extra dependency), `Field` and `Form` (labeled inputs, validation
|
|
25
|
+
states, never placeholder-only labels).
|
|
26
|
+
- **Feedback**: `EmptyState`.
|
|
27
|
+
- **Sample**: `app/dashboard/page.tsx` composes the shell, stat cards, a chart,
|
|
28
|
+
and a data table to demonstrate the preset.
|
|
29
|
+
|
|
30
|
+
## Design system
|
|
31
|
+
|
|
32
|
+
- **Color**: a calibrated dark palette built from a single neutral hue with even
|
|
33
|
+
perceptual luminance steps, a 6-color data-viz series, and a designed light
|
|
34
|
+
theme via `[data-theme="light"]` (never `filter: invert`). Every color is a
|
|
35
|
+
CSS custom property; components never carry a raw hex.
|
|
36
|
+
- **Type**: a 1.25 modular scale with fluid `clamp()` values, role-differentiated
|
|
37
|
+
line-heights, and optical tracking.
|
|
38
|
+
- **Space**: a 4px base unit tuned for data density.
|
|
39
|
+
- **Motion**: cubic-bezier easing matched to the metaphor, a duration scale, and
|
|
40
|
+
full reduced-motion support. No linear easing, no `transition: all`.
|
|
41
|
+
|
|
42
|
+
## Quality contract
|
|
43
|
+
|
|
44
|
+
This preset is built to clear the QA-Visual rubric
|
|
45
|
+
(`chati.dev/data/qa-rubrics.yaml`) on every dimension: layout, typography, color,
|
|
46
|
+
spacing, interaction, motion, accessibility (WCAG 2.1 AA), and performance
|
|
47
|
+
(animate only `transform` and `opacity`).
|
|
48
|
+
|
|
49
|
+
## Dependencies
|
|
50
|
+
|
|
51
|
+
`lucide-react` (icons) and `framer-motion` (micro-interactions). The chart and
|
|
52
|
+
the command palette are hand-rolled, so there is no chart library and no command
|
|
53
|
+
menu dependency.
|
|
54
|
+
|
|
55
|
+
## Brandable
|
|
56
|
+
|
|
57
|
+
The accent color (`ACCENT_HEX`, `ACCENT_HOVER_HEX`) is resolved at apply time
|
|
58
|
+
from your brand source. The neutral and semantic scales are the designed system.
|