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
package/README.md
CHANGED
|
@@ -128,8 +128,10 @@ The system saves your full session state (pipeline position, current agent, deci
|
|
|
128
128
|
|---------|--------------|
|
|
129
129
|
| **Specialized Agents** | Each agent has a defined mission, success criteria, and handoff protocol. Not one AI trying to do everything |
|
|
130
130
|
| **Agent Teams** | Planning Team (Detail + Architect + UX + QA-Planning) and Build Team (Dev + QA-Implementation) with Wave-Based Pipeline. Teams work in parallel with peer-to-peer communication, cross-review, and intra-team quality assurance. No single agent bottleneck |
|
|
131
|
-
| **Visual QA** | QA-Visual
|
|
132
|
-
| **Premium
|
|
131
|
+
| **Visual QA** | QA-Visual scores the rendered UI against an 8-dimension rubric (layout, typography, motion, interaction, color, spacing, accessibility, performance) with an anti-slop catalog and a spring-motion veto (linear easing and `transition: all` are rejected). Screenshots at multiple scroll positions, hover states, and brandbook compliance, powered by Playwright. |
|
|
132
|
+
| **Premium Motion** | Premium motion is required for UI projects, with cubic-bezier easing and full reduced-motion support. The visual gate is animation-stack aware: the motion-premium presets use GSAP + Lenis, the saas-dashboard preset uses framer-motion. |
|
|
133
|
+
| **Scaffold Presets** | Premium starting points applied at build time: motion-premium and motion-premium-3d for animated showcase sites, saas-dashboard for a token-driven app shell (sidebar, sortable data table, KPI cards, a Cmd+K command palette). |
|
|
134
|
+
| **Execution Kinds** | A task declares how it executes. Deterministic dev tasks (lint, tests, file and schema checks) run as zero-LLM scripts through whitelisted executors instead of spending an agent turn. Feature-flagged, off by default, fully back-compatible. |
|
|
133
135
|
| **Multi-CLI Architecture** | Choose your AI provider at install time: Claude, Gemini, or Codex. Each agent gets the optimal model for that provider |
|
|
134
136
|
| **Quality Gates** | Every phase is validated before moving forward, including QA-Visual for visual quality. 3-tier verdicts: APPROVED, NEEDS_REVISION, or BLOCKED |
|
|
135
137
|
| **Fault Vector Protocol** | Root Layer Routing classifies bugs by origin (INTENT/SPEC/CODE/DEFER). Evidence-Bound Verdicts, Decision Trail, and Echo Detection prevent cyclical rework |
|
|
@@ -137,7 +139,7 @@ The system saves your full session state (pipeline position, current agent, deci
|
|
|
137
139
|
| **Session Lock** | Once activated, you stay inside the system. No accidentally "falling out" into generic AI mode |
|
|
138
140
|
| **Multi-Terminal** | Autonomous agents run in parallel. Planning Team (Detail + Architect + UX + QA-Planning) and Build Team (Dev + QA-Implementation) coordinate via peer-to-peer mailbox |
|
|
139
141
|
| **Memory System** | The system learns from mistakes. Gotchas are captured automatically and recalled when relevant |
|
|
140
|
-
| **Execution
|
|
142
|
+
| **Execution Mode** | Two modes: interactive (default) and autonomous (gate >= 95%). Safety reversion to interactive on stuck loop, quality drop, scope creep, error cascade, or user override (Article XVII) |
|
|
141
143
|
| **IDE-Agnostic** | Works with Claude Code, VS Code, Cursor, Gemini CLI, Codex CLI, and AntiGravity |
|
|
142
144
|
| **4 Languages** | Interface supports English, Portuguese, Spanish, and French. Artifacts are always generated in English |
|
|
143
145
|
| **Supply Chain Security** | Every file is cryptographically signed (Ed25519). Tampered packages are blocked on install |
|
|
@@ -190,17 +192,16 @@ Prompts are piped via stdin for all providers. You can override individual agent
|
|
|
190
192
|
|
|
191
193
|
---
|
|
192
194
|
|
|
193
|
-
## Execution
|
|
195
|
+
## Execution Mode
|
|
194
196
|
|
|
195
|
-
|
|
197
|
+
Two modes control how much autonomy agents have:
|
|
196
198
|
|
|
197
|
-
|
|
|
198
|
-
|
|
199
|
-
| **
|
|
200
|
-
| **guided** | Default. Agents propose changes, you approve | Normal development workflow |
|
|
199
|
+
| Mode | Behavior | When to use |
|
|
200
|
+
|------|----------|-------------|
|
|
201
|
+
| **interactive** | Default. Agents propose changes, you approve | Normal development workflow |
|
|
201
202
|
| **autonomous** | Agents execute without confirmation (quality gates >= 95%) | Trusted pipelines with high quality scores |
|
|
202
203
|
|
|
203
|
-
The system starts in `
|
|
204
|
+
The system starts in `interactive` mode. Transition to `autonomous` requires both QA gates scoring >= 95%. Safety reversion takes the pipeline back to interactive on a stuck loop, quality drop, scope creep, error cascade, or user override (Article XVII).
|
|
204
205
|
|
|
205
206
|
---
|
|
206
207
|
|
|
@@ -274,13 +275,13 @@ Three systems operate transparently behind the pipeline:
|
|
|
274
275
|
|
|
275
276
|
| System | What it does |
|
|
276
277
|
|--------|-------------|
|
|
277
|
-
| **Context Engine (PRISM)** | Injects the right context at the right time. 6 layers of context (from constitution rules down to keyword-matched domain rules). Uses Progressive Reinforcement: as context degrades, injection budgets INCREASE (1.5% to 5.0% of provider context window). Provider-aware for Claude (
|
|
278
|
+
| **Context Engine (PRISM)** | Injects the right context at the right time. 6 layers of context (from constitution rules down to keyword-matched domain rules). Uses Progressive Reinforcement: as context degrades, injection budgets INCREASE (1.5% to 5.0% of provider context window). Provider-aware for Claude (1M), Gemini (1M), and Codex (128K). |
|
|
278
279
|
| **Memory System (RECALL)** | Remembers decisions, gotchas, and lessons across sessions. Organized into 4 sectors: what happened (episodic), what we know (semantic), how we do things (procedural), and what we learned (reflective). |
|
|
279
280
|
| **Decision Engine (COMPASS)** | Before creating something new, checks if a similar component already exists. Decides whether to reuse, adapt, or create from scratch. Keeps a registry of all project entities. |
|
|
280
281
|
|
|
281
282
|
### Constitution
|
|
282
283
|
|
|
283
|
-
The system is governed by a **
|
|
284
|
+
The system is governed by a **25-article Constitution** that enforces agent behavior, quality standards, security, and system integrity:
|
|
284
285
|
|
|
285
286
|
- **Agent Governance** - Every agent has a defined mission, scope, and success criteria
|
|
286
287
|
- **Quality Standards** - Minimum 95% score on quality gates. 3-tier verdicts (APPROVED / NEEDS_REVISION / BLOCKED)
|
|
@@ -288,10 +289,14 @@ The system is governed by a **23-article Constitution** that enforces agent beha
|
|
|
288
289
|
- **Mode Governance** - Planning mode can't modify project code. Build mode has full access
|
|
289
290
|
- **Session Lock** - Once activated, all messages route through the orchestrator
|
|
290
291
|
- **Model Governance** - Each agent runs on its designated model, enforced by the CLI adapter
|
|
291
|
-
- **Execution
|
|
292
|
+
- **Execution Mode** - Interactive (default) and autonomous modes, with safety reversion to interactive (Article XVII)
|
|
292
293
|
- **Multi-CLI** - Provider-agnostic architecture with adapter pattern and automatic model mapping
|
|
293
294
|
- **Agent Teams** - Real-time peer communication between agents with cross-review, per-task QA, and sealed-bid quality assurance
|
|
294
295
|
- **Fault Vector Protocol** - Root Layer Routing, Evidence-Bound Verdicts, Decision Trail, and Echo Detection for adversarial quality
|
|
296
|
+
- **Anti-Loop Protocol** - the 3-Strike Rule and mandatory diagnosis mode stop an agent from editing the same file in circles
|
|
297
|
+
- **Reasoning Tier** - per-task cognitive depth (standard / deep / deliberate) with deterministic escalation
|
|
298
|
+
- **Model-Harness Parity** - a re-audit advisory when the active model family changes, so calibration does not drift silently
|
|
299
|
+
- **Execution Kinds** - a task declares how it runs (agent, deterministic script, specialist, or human gate); deterministic dev work can run with no model call (feature-flagged, off by default)
|
|
295
300
|
|
|
296
301
|
---
|
|
297
302
|
|
package/bin/chati.js
CHANGED
|
@@ -141,6 +141,26 @@ async function main() {
|
|
|
141
141
|
console.log(` Framework sync skipped: ${err.message}`);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
// 2.6. Re-bundle CLI (Bug 4 part 3, v4.3.1+) — refreshes .chati.dev/_cli/
|
|
145
|
+
// and writes version.json so chati-router.js mismatch detection clears
|
|
146
|
+
// on the next invocation.
|
|
147
|
+
console.log(' Re-bundling CLI...');
|
|
148
|
+
try {
|
|
149
|
+
const { copyCliSource, copyCliDependencies } = await import('../src/installer/core.js');
|
|
150
|
+
const { writeFileSync } = await import('fs');
|
|
151
|
+
const fwDir = resolveFrameworkDir(targetDir);
|
|
152
|
+
const frameworkDir = join(targetDir, fwDir);
|
|
153
|
+
copyCliSource(join(__dirname, '..', 'src'), join(frameworkDir, '_cli'));
|
|
154
|
+
copyCliDependencies(join(__dirname, '..'), join(frameworkDir, '_cli', 'node_modules'));
|
|
155
|
+
writeFileSync(
|
|
156
|
+
join(frameworkDir, '_cli', 'version.json'),
|
|
157
|
+
JSON.stringify({ version: pkg.version, bundled_at: new Date().toISOString() }, null, 2),
|
|
158
|
+
);
|
|
159
|
+
console.log(' CLI re-bundled.');
|
|
160
|
+
} catch (err) {
|
|
161
|
+
console.log(` CLI rebundle skipped: ${err.message}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
144
164
|
// 2.6. Detect tracked framework files and warn user (non-blocking)
|
|
145
165
|
try {
|
|
146
166
|
const { detectTrackedFrameworkFiles } = await import('../src/upgrade/tracked-files-detector.js');
|
|
@@ -343,7 +363,7 @@ async function main() {
|
|
|
343
363
|
console.log(' - Specialized agents across DISCOVER, PLAN, BUILD, DEPLOY phases');
|
|
344
364
|
console.log(' - 6 workflow blueprints');
|
|
345
365
|
console.log(' - 6 templates');
|
|
346
|
-
console.log(' - Constitution (
|
|
366
|
+
console.log(' - Constitution (25 Articles + Preamble)');
|
|
347
367
|
console.log(' - Dashboard TUI');
|
|
348
368
|
console.log(' - Upgrade system with migrations');
|
|
349
369
|
console.log(' - 6 IDE support');
|
|
@@ -419,7 +439,13 @@ Telemetry:
|
|
|
419
439
|
const keyFlag = args.find(a => a.startsWith('--key='));
|
|
420
440
|
const keyArg = keyFlag ? keyFlag.replace('--key=', '') : null;
|
|
421
441
|
const { runActivate } = await import('../src/license/commands.js');
|
|
422
|
-
await runActivate(targetDir, keyArg);
|
|
442
|
+
const result = await runActivate(targetDir, keyArg);
|
|
443
|
+
// runActivate returns { ok, cancelled?, error? } and never exits the
|
|
444
|
+
// process itself (keeps it unit-testable). Translate to an exit code
|
|
445
|
+
// here at the CLI boundary: failures other than user-cancel exit 1.
|
|
446
|
+
if (result && result.ok === false && !result.cancelled) {
|
|
447
|
+
process.exit(1);
|
|
448
|
+
}
|
|
423
449
|
break;
|
|
424
450
|
}
|
|
425
451
|
|
|
@@ -454,7 +480,7 @@ Telemetry:
|
|
|
454
480
|
|
|
455
481
|
const scaffoldSrc = (() => {
|
|
456
482
|
try { return resolveScaffoldSource(targetDir); }
|
|
457
|
-
catch (e) { console.error(`Error: ${e.message}`); process.exit(1); }
|
|
483
|
+
catch (e) { console.error(`Error: ${e.message}`); process.exit(1); return undefined; }
|
|
458
484
|
})();
|
|
459
485
|
|
|
460
486
|
if (!sub || sub === 'list') {
|
|
@@ -525,8 +551,10 @@ Telemetry:
|
|
|
525
551
|
const VALID_ORCHESTRATE_SUBS = new Set([
|
|
526
552
|
'next', 'advance', 'init', 'status', 'validate-handoff',
|
|
527
553
|
'deviation', 'exit', 'providers', 'detect-flow', 'backlog',
|
|
528
|
-
'qa-plan-score', 'qa-impl-score', 'scan',
|
|
554
|
+
'qa-plan-score', 'qa-impl-score', 'qa-visual-score', 'scan',
|
|
529
555
|
'spawn-team', 'team-status', 'team-dissolve',
|
|
556
|
+
'wait-for-capture', 'wave-status', 'assess-coverage',
|
|
557
|
+
'wait-for-license', 'doctor', 'run-script-task',
|
|
530
558
|
]);
|
|
531
559
|
if (!VALID_ORCHESTRATE_SUBS.has(subCommand)) {
|
|
532
560
|
console.error(`Error: Unknown orchestrate subcommand "${subCommand}".`);
|
|
@@ -105,7 +105,7 @@ The `motion-premium` scaffold preset (`scaffold/motion-premium/`) ships referenc
|
|
|
105
105
|
|
|
106
106
|
**Context**
|
|
107
107
|
|
|
108
|
-
Tailwind v4 is a major shift: the `@theme` block, CSS-first token declaration, Cascade Layers compilation, and arbitrary-value type inference all changed. The change introduced three silent-failure modes that pass `pnpm lint`, `pnpm typecheck`, and `pnpm build` with zero errors. One was caught by QA-Visual pixel inspection; two slipped past it and bit production in
|
|
108
|
+
Tailwind v4 is a major shift: the `@theme` block, CSS-first token declaration, Cascade Layers compilation, and arbitrary-value type inference all changed. The change introduced three silent-failure modes that pass `pnpm lint`, `pnpm typecheck`, and `pnpm build` with zero errors. One was caught by QA-Visual pixel inspection; two slipped past it and bit production in a reference-website case study. All three now have deterministic gates in qa-visual, but dev must avoid them at build time — fixing in code is cheaper than fixing under a correction loop.
|
|
109
109
|
|
|
110
110
|
**Decision**
|
|
111
111
|
|
|
@@ -142,7 +142,7 @@ Prefer the promoted Tailwind utilities (`text-xs..text-hero`, `bg-primary`, etc.
|
|
|
142
142
|
|
|
143
143
|
*Pitfall 2 — Unlayered global CSS defeats every utility.*
|
|
144
144
|
|
|
145
|
-
Tailwind v4 places utilities inside `@layer utilities`. Per CSS Cascade Layers (Cascade Level 5), *unlayered* CSS always wins over any named layer — regardless of selector specificity. A single global reset outside `@layer` silently overrides `mx-auto`, `px-*`, `flex`, everything. This broke container centering for a full day on
|
|
145
|
+
Tailwind v4 places utilities inside `@layer utilities`. Per CSS Cascade Layers (Cascade Level 5), *unlayered* CSS always wins over any named layer — regardless of selector specificity. A single global reset outside `@layer` silently overrides `mx-auto`, `px-*`, `flex`, everything. This broke container centering for a full day on a reference-website (a Tailwind v4 incident encountered in production) and was invisible at 1280px viewport — the x=0 container alignment only became visible at 1920px where lg:px-12 should have added padding but unlayered `* { margin: 0 }` outranked it.
|
|
146
146
|
|
|
147
147
|
WRONG — kills every Tailwind margin/padding utility:
|
|
148
148
|
```css
|
|
@@ -298,7 +298,7 @@ React 19 (stable since late 2024) introduced four patterns that improve ergonomi
|
|
|
298
298
|
|
|
299
299
|
**Context**
|
|
300
300
|
|
|
301
|
-
Lenis (virtualized smooth scroll) + GSAP + ScrollTrigger form the premium animation stack. Initialization order is load-bearing: wrong order produces silent bugs (tab-restore snap, ScrollTrigger positions measured against the native scrollbar instead of Lenis, drifting RAF clocks). The `motion-premium` scaffold encodes all 13 "sauce patterns" learned from
|
|
301
|
+
Lenis (virtualized smooth scroll) + GSAP + ScrollTrigger form the premium animation stack. Initialization order is load-bearing: wrong order produces silent bugs (tab-restore snap, ScrollTrigger positions measured against the native scrollbar instead of Lenis, drifting RAF clocks). The `motion-premium` scaffold encodes all 13 "sauce patterns" learned from a reference-website case study; this ADR names the canonical init sequence dev must preserve.
|
|
302
302
|
|
|
303
303
|
**Decision**
|
|
304
304
|
|
|
@@ -361,7 +361,7 @@ export async function initLenis() {
|
|
|
361
361
|
|
|
362
362
|
**Context**
|
|
363
363
|
|
|
364
|
-
Responsive design done wrong introduces a class of silent bugs that are invisible at 1280px and lethal at 1920px or 1200px. This ADR encodes the 12 principles learned from
|
|
364
|
+
Responsive design done wrong introduces a class of silent bugs that are invisible at 1280px and lethal at 1920px or 1200px. This ADR encodes the 12 principles learned from a reference-website case study. They are non-negotiable for premium UI tasks. Principles 1, 2, 3, 7, 10, and 12 are enforced structurally by the `motion-premium` scaffold; the remaining six are dev discipline that visual-qa validates.
|
|
365
365
|
|
|
366
366
|
**Decision**
|
|
367
367
|
|
|
@@ -806,6 +806,8 @@ Score = criteria met / total criteria
|
|
|
806
806
|
Threshold: >= 95% per task (minimum 9/10)
|
|
807
807
|
```
|
|
808
808
|
|
|
809
|
+
This self-validation score is the Dev agent's own per-task done-check (it decides when a task is finished and ready to hand off). It is NOT the phase gate. The BUILD phase only advances when the separate QA-Implementation agent's verdict clears its threshold (enforced in the orchestrator pipeline manager). Never wire this self-score into a phase-transition decision; the separated QA verdict is always the gate.
|
|
810
|
+
|
|
809
811
|
---
|
|
810
812
|
|
|
811
813
|
## Intelligence Integration
|
|
@@ -822,7 +824,9 @@ Before implementing each task:
|
|
|
822
824
|
After completing each task:
|
|
823
825
|
1. If a new gotcha was discovered -> append to gotchas.yaml
|
|
824
826
|
2. If a successful pattern was used -> append to patterns.yaml
|
|
825
|
-
3. Update confidence.yaml with execution results
|
|
827
|
+
3. Update confidence.yaml with execution results. When you write measured
|
|
828
|
+
values, set that agent's `calibration_status: calibrated` and
|
|
829
|
+
`last_calibrated` to today; never leave a measured number as `seed`.
|
|
826
830
|
```
|
|
827
831
|
|
|
828
832
|
---
|
|
@@ -559,6 +559,7 @@ domains:
|
|
|
559
559
|
required:
|
|
560
560
|
- constitution.yaml
|
|
561
561
|
- global.yaml
|
|
562
|
+
- rules/human-writing-style.md
|
|
562
563
|
- agents/brief.yaml
|
|
563
564
|
- artifacts/handoffs/greenfield-wu-handoff.md # or brownfield-wu-handoff.md
|
|
564
565
|
```
|
|
@@ -661,6 +662,7 @@ On failure:
|
|
|
661
662
|
6. Negative scope is mandatory - explicitly document what will NOT be built
|
|
662
663
|
7. Adapt question depth to user level (vibecoder = guided, power user = direct)
|
|
663
664
|
8. Maximum 5 interaction rounds before compiling brief draft
|
|
665
|
+
9. Apply `rules/human-writing-style.md` to brief-report.md prose, handoff Layer 1, conversation turns. Exempt: visual_references YAML, brief.yaml frontmatter, brief criteria tables.
|
|
664
666
|
|
|
665
667
|
---
|
|
666
668
|
|
|
@@ -377,6 +377,7 @@ domains:
|
|
|
377
377
|
required:
|
|
378
378
|
- constitution.yaml
|
|
379
379
|
- global.yaml
|
|
380
|
+
- rules/human-writing-style.md
|
|
380
381
|
- agents/brownfield-wu.yaml
|
|
381
382
|
```
|
|
382
383
|
|
|
@@ -474,6 +475,7 @@ On failure:
|
|
|
474
475
|
6. Treat all scout call findings as preliminary (agents will re-run in full mode later)
|
|
475
476
|
7. Preserve the user's terminology when documenting operational context
|
|
476
477
|
8. Flag security-sensitive patterns (hardcoded secrets, exposed endpoints) as CRITICAL
|
|
478
|
+
9. Apply `rules/human-writing-style.md` for all human-facing output (WU report prose, handoff Layer 1, user-facing conversation turns). Exempt: YAML blocks, tables, code, debt registry tables.
|
|
477
479
|
|
|
478
480
|
---
|
|
479
481
|
|
|
@@ -291,6 +291,7 @@ domains:
|
|
|
291
291
|
required:
|
|
292
292
|
- constitution.yaml
|
|
293
293
|
- global.yaml
|
|
294
|
+
- rules/human-writing-style.md
|
|
294
295
|
- agents/greenfield-wu.yaml
|
|
295
296
|
```
|
|
296
297
|
|
|
@@ -307,13 +308,28 @@ post-qa-planning gate fires when both align.
|
|
|
307
308
|
|
|
308
309
|
### motion-premium triggers (2D premium)
|
|
309
310
|
Record `motion-premium` as a candidate when ALL of the following are true:
|
|
310
|
-
- The stack includes **Next.js** (any version)
|
|
311
|
+
- The stack includes **Next.js** (any version). These presets ship Next.js templates, so a plain React or React+Vite stack is not a match.
|
|
311
312
|
- The stack includes **Tailwind CSS** (any version — v3 or v4).
|
|
312
313
|
- The stack includes at least one premium animation library: **GSAP**,
|
|
313
314
|
**Lenis**, or **Framer Motion**. A user-described intent that clearly
|
|
314
315
|
implies these (e.g. "smooth scroll pinning", "scroll-reveal storytelling",
|
|
315
316
|
"page-scroll narrative") also counts — document the phrase as evidence.
|
|
316
317
|
|
|
318
|
+
### saas-dashboard triggers (app-shell / data-dense)
|
|
319
|
+
Record `saas-dashboard` as a candidate when ALL of the following are true:
|
|
320
|
+
- The stack includes **Next.js** (any version). These presets ship Next.js templates, so a plain React or React+Vite stack is not a match.
|
|
321
|
+
- The stack includes **Tailwind CSS** (any version).
|
|
322
|
+
- The project is an **application or internal tool**, not a marketing or
|
|
323
|
+
showcase site. Any of these signals counts (document the phrase as evidence):
|
|
324
|
+
dashboard, admin panel, SaaS app, internal tool, analytics, data table,
|
|
325
|
+
KPI or metrics view, sidebar navigation, app shell, settings pages, command
|
|
326
|
+
palette (Cmd+K), CRUD over records, back office.
|
|
327
|
+
|
|
328
|
+
saas-dashboard is the app-shell counterpart to the motion-premium presets. In
|
|
329
|
+
practice it is mutually exclusive with them (an animated marketing site is not
|
|
330
|
+
a data dashboard), but recording both is harmless: the auto-gate fires the
|
|
331
|
+
highest-confidence candidate first and the user chooses.
|
|
332
|
+
|
|
317
333
|
### motion-premium-3d triggers (R3F + Three.js, workstream 3)
|
|
318
334
|
Record `motion-premium-3d` as a candidate when ALL of the following are true:
|
|
319
335
|
- The stack includes **Next.js** (any version).
|
|
@@ -443,6 +459,7 @@ On failure:
|
|
|
443
459
|
3. Keep questions focused and progressive (don't ask everything at once)
|
|
444
460
|
4. Adapt question depth to user level (vibecoder = simpler, power user = technical)
|
|
445
461
|
5. Maximum 4 interaction rounds before generating report
|
|
462
|
+
6. Apply `rules/human-writing-style.md` for all human-facing output (WU report prose, handoff Layer 1, user-facing conversation turns). Exempt: YAML blocks, tables, scaffold_signals.
|
|
446
463
|
|
|
447
464
|
---
|
|
448
465
|
|
|
@@ -325,6 +325,7 @@ Rules:
|
|
|
325
325
|
|-------|--------|---------|
|
|
326
326
|
| L0 | `.chati/session.yaml` | Project type, current pipeline position, mode, agent statuses |
|
|
327
327
|
| L1 | `chati.dev/constitution.md` | Protocols, validation thresholds, handoff rules |
|
|
328
|
+
| L1.5 | `chati.dev/rules/human-writing-style.md` | Anti-AI prose rules for human-facing PRD sections |
|
|
328
329
|
| L2 | `artifacts/1-Brief/brief-report.md` | Problems, desired outcomes, constraints, target users |
|
|
329
330
|
| L3 | `artifacts/handoffs/brief-handoff.md` | Brief agent handoff with decisions and open questions |
|
|
330
331
|
|
|
@@ -388,6 +389,7 @@ Beyond self-validation (Protocol 5.1), the Detail agent enforces:
|
|
|
388
389
|
4. **NFR measurability**: Every non-functional requirement must include a measurable threshold (e.g., "response time < 200ms" not "fast response")
|
|
389
390
|
5. **Scope boundaries are bilateral**: Both in-scope AND out-of-scope must be explicitly defined - omitting out-of-scope is a validation failure
|
|
390
391
|
6. **Traceability is bidirectional**: Brief-to-PRD and PRD-to-Brief mappings must both exist with zero orphans in either direction
|
|
392
|
+
7. **Human writing style**: Apply `rules/human-writing-style.md` to Executive Summary, Goals, Target Users, and Scope narrative prose. Exempt: FR/NFR/BR tables, Given-When-Then criteria, Traceability Matrix.
|
|
391
393
|
|
|
392
394
|
---
|
|
393
395
|
|
|
@@ -85,12 +85,43 @@ Task Definition:
|
|
|
85
85
|
- Priority: critical | high | medium | low
|
|
86
86
|
- Size: XS (<1h) | S (1-2h) | M (2-4h) | L (4-8h) | XL (8h+ -> split!)
|
|
87
87
|
- Dependencies: [T{x}.{y}, ...]
|
|
88
|
+
- Execution Kind: agent (default) | script | specialist | human (see Step 2c)
|
|
88
89
|
- Acceptance Criteria (Given-When-Then):
|
|
89
90
|
- Given {initial context/state}
|
|
90
91
|
- When {action is performed}
|
|
91
92
|
- Then {expected outcome, verifiable}
|
|
92
93
|
```
|
|
93
94
|
|
|
95
|
+
### Step 2c: Execution Kind (deterministic tasks run as scripts)
|
|
96
|
+
|
|
97
|
+
Most tasks are `agent`: an LLM implements them. Some, though, are fully
|
|
98
|
+
deterministic and waste an agent turn. When the `execution_kinds` feature is on,
|
|
99
|
+
assign the right kind so the orchestrator can run deterministic work as a
|
|
100
|
+
zero-LLM script. When the feature is off, every task runs as `agent` and this
|
|
101
|
+
step is a no-op, so it is always safe to record the kind.
|
|
102
|
+
|
|
103
|
+
Decision tree (top to bottom, first match wins):
|
|
104
|
+
|
|
105
|
+
1. **human** - a critical, irreversible, legal, financial, or product-judgment
|
|
106
|
+
decision a person must own (for example "confirm the production migration",
|
|
107
|
+
"approve the pricing copy"). Set `execution_ref` to a one-line description of
|
|
108
|
+
the decision. A person decides; no automation.
|
|
109
|
+
2. **script** - a deterministic dev operation with a single correct outcome and
|
|
110
|
+
no design judgment: run the linter or the test suite, verify build output
|
|
111
|
+
exists, validate a JSON file. Set `execution_ref` to an executor from
|
|
112
|
+
`chati.dev/executors/registry.yaml` with its argument, for example
|
|
113
|
+
`npm-script:test`, `npm-script:lint`, `path-check:dist,build`, or
|
|
114
|
+
`json-validate:package.json`. The acceptance criterion is the executor's pass
|
|
115
|
+
condition (exit 0, paths present, valid JSON). If no executor fits, it is not
|
|
116
|
+
a script task.
|
|
117
|
+
3. **specialist** - creative work that carries a fixed methodology the agent must
|
|
118
|
+
follow exactly (reserved; today this resolves to `agent`).
|
|
119
|
+
4. **agent** (default) - anything that needs implementation, design, or judgment.
|
|
120
|
+
|
|
121
|
+
Be conservative: when in doubt between script and agent, choose agent. A script
|
|
122
|
+
task that needs any interpretation is a defect. Only the registered executors
|
|
123
|
+
are valid `script` refs; never invent an executor id.
|
|
124
|
+
|
|
94
125
|
### Step 2b: Animation Inventory → Tasks (1:1 mapping, REQUIRED when inventory exists)
|
|
95
126
|
|
|
96
127
|
Before producing the final task list, check for `artifacts/4-UX/animation-inventory.md`. If it exists, it is the SOURCE OF TRUTH for every animation-related task in the build. The brand-architect locked this artifact at the `advance ux` gate; your job is to convert it into tasks faithfully.
|
|
@@ -157,6 +157,8 @@ Premium means:
|
|
|
157
157
|
- Stagger animations on any repeated elements (cards, list items, grid children)
|
|
158
158
|
- Page load MUST have an entrance animation sequence (not just content appearing)
|
|
159
159
|
|
|
160
|
+
**Design toward the QA-Visual rubric.** The canonical quality bar is the 8-dimension rubric in `chati.dev/data/qa-rubrics.yaml` under `visual_rubric`. Its per-dimension premium markers are your targets; its slop markers are forbidden. The tokens, modular type scale, semantic color system, spacing scale, and motion language you define here are exactly what QA-Visual scores against, so set them to clear the premium band on every dimension. Layout, typography, color, and motion carry the highest weights. Concrete musts the rubric enforces: a base-unit spacing system (4px or 8px, no off-scale values), a modular type scale (a consistent ratio, not round-number sizes), a documented semantic color layer (no raw hex literals, accent restraint), cubic-bezier easing tied to each transition's physical metaphor (never `linear` or bare `ease`, never `transition: all`), and full interactive-state coverage. Avoid the anti-slop catalog tells (generic saturated-blue primary, metronomic identical section padding, the symmetric centered hero with no compositional interest).
|
|
161
|
+
|
|
160
162
|
The 5 benchmark sites (landonorris.com, iertqa.com, toptier.relats.com, refractweb.com, magic5.ro) are the FLOOR, not the ceiling.
|
|
161
163
|
|
|
162
164
|
If `visual_quality: functional` → reduce to CSS transitions only, no GSAP requirement.
|
|
@@ -379,10 +381,27 @@ Append a `## Scaffold Signals` section to your handoff file
|
|
|
379
381
|
evidence:
|
|
380
382
|
- "Named 3D reference site"
|
|
381
383
|
- "Inventory row mapping to scaffold/motion-premium-3d/*"
|
|
384
|
+
|
|
385
|
+
- preset: saas-dashboard
|
|
386
|
+
candidate: true
|
|
387
|
+
confidence: 0.0 to 1.0
|
|
388
|
+
evidence:
|
|
389
|
+
- "App-shell intent (dashboard, admin panel, SaaS app, internal tool)"
|
|
390
|
+
- "Brief names data tables, KPIs, sidebar navigation, or a command palette"
|
|
382
391
|
```
|
|
383
392
|
|
|
384
|
-
Emit
|
|
385
|
-
|
|
393
|
+
Emit each applicable entry. saas-dashboard is the app-shell counterpart and is
|
|
394
|
+
mutually exclusive with the motion presets in practice (a data dashboard is not
|
|
395
|
+
an animated marketing site); emit it instead of the motion presets when the
|
|
396
|
+
brief describes an application rather than a showcase. The post-qa-planning gate
|
|
397
|
+
fires the candidates in sequence after the user applies or skips the first.
|
|
398
|
+
|
|
399
|
+
`confidence` scoring for `saas-dashboard` (gate threshold 0.7):
|
|
400
|
+
- 1.0 — the brief explicitly calls the product a dashboard, admin panel, or
|
|
401
|
+
SaaS app AND names at least two app-shell elements (data tables, KPIs,
|
|
402
|
+
sidebar nav, command palette, settings).
|
|
403
|
+
- 0.7 to 0.9 — clear application intent with one or two app-shell elements.
|
|
404
|
+
- below 0.7 — ambiguous; a content or marketing site. Do NOT emit.
|
|
386
405
|
|
|
387
406
|
`confidence` scoring for `motion-premium` (gate threshold 0.7):
|
|
388
407
|
- 1.0 — multiple named premium refs (Oryzo + Norris + Relats, etc.) AND
|
|
@@ -17,6 +17,8 @@ You are the **Component Engineer**, a specialist sub-agent of the UX Manager. Yo
|
|
|
17
17
|
|
|
18
18
|
Define HOW components behave, move, and comply with accessibility standards. Build the component hierarchy (Atomic Design), discover reusable components from 21st.dev, validate WCAG 2.2 + APCA compliance, and define the Motion System. Every component must have full state coverage and every animation must be GPU-accelerated with reduced-motion alternatives.
|
|
19
19
|
|
|
20
|
+
**Design toward the QA-Visual rubric.** Your work is scored against the `motion`, `interaction`, and `accessibility` dimensions of `chati.dev/data/qa-rubrics.yaml` (`visual_rubric`). Targets the rubric enforces: every transition uses a cubic-bezier curve matched to its physical metaphor (deceleration for entering, acceleration for leaving), with a duration scale tied to element size (micro-interactions 80-150ms, component state 200-350ms, page-level <= 500ms); never `linear`, never bare `ease`, never `transition: all`. Every interactive element has four visually distinct states (resting, hover, active, disabled) and a high-contrast focus ring (>= 2px width, >= 2px offset). Accessibility is a hard gate: text meets WCAG 2.1 AA contrast at rendered size, focus order matches visual order, headings form a strict hierarchy with no skipped levels, and inputs never use placeholder as the sole label. A failing accessibility dimension caps the whole visual score at 70.
|
|
21
|
+
|
|
20
22
|
---
|
|
21
23
|
|
|
22
24
|
## On Activation
|
|
@@ -74,6 +76,14 @@ Use the BEST patterns found as the BASIS for this project's animation specs.
|
|
|
74
76
|
Do NOT invent animation patterns from scratch - ALWAYS reference proven, production implementations.
|
|
75
77
|
Adapt patterns to the project's design tokens (colors, fonts, spacing from Brand Architect).
|
|
76
78
|
|
|
79
|
+
> Governance scope: the sites above (and shadcn/ui below) are external DISCOVERY
|
|
80
|
+
> sources this agent reads at design time to ground specs in proven patterns.
|
|
81
|
+
> They are tools, like any component library or icon set, not a lineage. The
|
|
82
|
+
> authorship rule governs the SHIPPED output: it must be original work in the
|
|
83
|
+
> project's own tokens and voice. When adapting a fetched component, reimplement
|
|
84
|
+
> it against the project tokens and never carry over its branding, attribution,
|
|
85
|
+
> or source-comment headers.
|
|
86
|
+
|
|
77
87
|
**Component Library Strategy** (verified, scrapable sources):
|
|
78
88
|
|
|
79
89
|
Primary: Shadcn/ui (MIT license, React + Radix UI + Tailwind + cva)
|
|
@@ -697,7 +697,7 @@ Criteria (binary pass/fail):
|
|
|
697
697
|
16. Decision Trail checked pre-flight and updated post-correction (Article XXII)
|
|
698
698
|
|
|
699
699
|
Score = criteria met / total criteria
|
|
700
|
-
Threshold: >= 95% (15/16 minimum)
|
|
700
|
+
Threshold: >= 95% (15/16 minimum). Canonical value: chati.dev/data/qa-rubrics.yaml (thresholds.qa-implementation); this number must match that file.
|
|
701
701
|
```
|
|
702
702
|
|
|
703
703
|
---
|
|
@@ -373,7 +373,7 @@ Criteria (binary pass/fail):
|
|
|
373
373
|
10. Correction loops executed for all issues (or escalated with justification)
|
|
374
374
|
|
|
375
375
|
Score = criteria met / total criteria
|
|
376
|
-
Threshold: >= 95% (10/10 minimum, no criteria may fail)
|
|
376
|
+
Threshold: >= 95% (10/10 minimum, no criteria may fail). Canonical value: chati.dev/data/qa-rubrics.yaml (thresholds.qa-planning); this number must match that file.
|
|
377
377
|
```
|
|
378
378
|
|
|
379
379
|
---
|
|
@@ -26,6 +26,15 @@ You are the **QA-Visual Agent**, a specialized quality gate focused exclusively
|
|
|
26
26
|
## Required MCPs
|
|
27
27
|
- browser (Playwright MCP - mandatory, not optional)
|
|
28
28
|
|
|
29
|
+
## Gateway weight (v4.3.1+)
|
|
30
|
+
|
|
31
|
+
QA-Visual operates with two execution paths:
|
|
32
|
+
|
|
33
|
+
- **Strong gateway (default):** real Playwright screenshots. Required for full verdict authority — score reflects what users actually see.
|
|
34
|
+
- **Weak gateway (`gateway: WEAK`):** source-code analysis fallback when Playwright is unavailable (npm package missing OR chromium binary not installed). Score is capped below 90% to prevent fallback-only verdicts from clearing the threshold autonomously. The fallback exists as a backstop, not a primary path. When triggered, the report MUST surface `gateway: WEAK` so the human-in-the-loop knows the verdict is text-based and warrants extra scrutiny before advancing.
|
|
35
|
+
|
|
36
|
+
Action when fallback triggers: emit a recovery instruction in the QA report — `Run: npx playwright install chromium` (binary missing) or `Run: npm install playwright` (package missing). See visual-qa.js error disambiguation (lines ~373-385).
|
|
37
|
+
|
|
29
38
|
---
|
|
30
39
|
|
|
31
40
|
## Mission
|
|
@@ -34,6 +43,12 @@ Validate that the implemented UI meets visual quality standards: animations are
|
|
|
34
43
|
|
|
35
44
|
---
|
|
36
45
|
|
|
46
|
+
## Scoring rubric (canonical)
|
|
47
|
+
|
|
48
|
+
The visual score is computed against the 8-dimension rubric in `chati.dev/data/qa-rubrics.yaml` under `visual_rubric`. That file is the single source of truth: the dimensions (layout, typography, motion, interaction, color, spacing_composition, accessibility, performance), their weights, the premium and slop markers, the measurable and judged signals, the `weak_dimension_cap`, the `anti_slop_catalog`, and the `scoring_protocol` all live there. Do NOT invent ad-hoc criteria. Score every dimension against the rubric and follow its `scoring_protocol`: scoring order (accessibility first, it carries the hardest cap), evidence standard, anti-slop catalog penalties, the weak-gateway cap (84 when Playwright is unavailable), the weighted-total formula, and correction-loop routing. Apply `weak_dimension_cap` before the weighted total. A measurable-signal finding MUST cite the computed value; a judged-signal finding MUST cite a screenshot filename (Article XXII evidence standard). The em-dash penalty and `visual-qa.js` `motion_errors` (the spring-motion veto) feed the motion and typography dimensions.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
37
52
|
## What This Agent Validates
|
|
38
53
|
|
|
39
54
|
| Check | Tool |
|
|
@@ -295,33 +310,30 @@ If no reference data exists: skip this step, do not penalize score.
|
|
|
295
310
|
|
|
296
311
|
---
|
|
297
312
|
|
|
298
|
-
## Scoring
|
|
313
|
+
## Scoring
|
|
314
|
+
|
|
315
|
+
The verdict has two layers and there is no contradiction between them: the CLI gives the measured objective floor plus a hard-block veto; you give the 8-dimension rubric score.
|
|
299
316
|
|
|
300
|
-
|
|
317
|
+
### 1. Measured floor (CLI)
|
|
318
|
+
|
|
319
|
+
Run the scoring CLI for the objective signals and the hard-block veto. Resolve `--animation-library` from architecture.md (the project's chosen motion stack):
|
|
301
320
|
|
|
302
321
|
```bash
|
|
303
|
-
node .chati.dev/orchestrator/chati-router.js qa-visual-score --report /tmp/visual-qa/report.json --has-refs {true|false}
|
|
322
|
+
node .chati.dev/orchestrator/chati-router.js qa-visual-score --report /tmp/visual-qa/report.json --animation-library {gsap-lenis|framer-motion|css|none} --has-refs {true|false}
|
|
304
323
|
```
|
|
305
324
|
|
|
306
|
-
The CLI returns:
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
"errors": ["Lenis not active on all pages"],
|
|
314
|
-
"warnings": ["3 console error(s)"],
|
|
315
|
-
"dimensions": { "animScore": 50, "scrollScore": 80, ... }
|
|
316
|
-
}
|
|
317
|
-
```
|
|
325
|
+
The GSAP/Lenis presence check applies ONLY to the `gsap-lenis` stack, so a framer-motion project (for example a saas-dashboard build) is never blocked for libraries it does not use. The CLI returns `hardBlocked: true` when there is a MEASURED failure: amateur-motion errors (the spring-motion veto: linear easing or transition:all), objective layout errors, reduced-motion violations, em-dashes, or missing GSAP/Lenis on a `gsap-lenis` project. It also returns `measured_signals` and a per-dimension breakdown.
|
|
326
|
+
|
|
327
|
+
### 2. Quality score (you)
|
|
328
|
+
|
|
329
|
+
Compute the 8-dimension score against `visual_rubric` in `chati.dev/data/qa-rubrics.yaml` per the Scoring rubric section above: the judged dimensions from the screenshots, the measurable signals, the weak-dimension cap, and the anti-slop catalog. Fold the CLI's measured signals into the matching dimensions (motion errors into motion, layout errors into layout, em-dashes into typography).
|
|
330
|
+
|
|
331
|
+
### Verdict
|
|
318
332
|
|
|
319
|
-
|
|
320
|
-
-
|
|
321
|
-
- `NEEDS_CORRECTION` → spawn Dev to fix, re-run
|
|
322
|
-
- `BLOCKED` → hard block (GSAP/Lenis missing or em-dashes found)
|
|
333
|
+
- If the CLI reports `hardBlocked: true` -> **BLOCKED**. Do NOT issue APPROVED while a measured failure stands, whatever the rubric score. Route to dev (Fault Vector Protocol: CODE).
|
|
334
|
+
- Otherwise the verdict is your 8-dimension rubric score: **APPROVED** at >= 90 after the weak-dimension cap, else **NEEDS_CORRECTION** and route to dev.
|
|
323
335
|
|
|
324
|
-
|
|
336
|
+
Never approve over a hard block, and never let a clean CLI floor stand in for the rubric: a project with zero measured errors can still score below 90 on the judged dimensions and need correction.
|
|
325
337
|
|
|
326
338
|
---
|
|
327
339
|
|
|
@@ -419,7 +431,7 @@ Criteria (binary pass/fail):
|
|
|
419
431
|
8. Score calculated and above threshold OR escalation issued
|
|
420
432
|
|
|
421
433
|
Score = criteria met / total criteria
|
|
422
|
-
Threshold: >= 90
|
|
434
|
+
Threshold: >= 90%. Canonical value: chati.dev/data/qa-rubrics.yaml (thresholds.qa-visual); this number must match that file.
|
|
423
435
|
```
|
|
424
436
|
|
|
425
437
|
---
|
package/framework/config.yaml
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# chati.dev Configuration
|
|
2
|
-
version: "4.
|
|
2
|
+
version: "4.4.0"
|
|
3
3
|
installed_at: "2026-02-07T10:00:00Z"
|
|
4
|
-
updated_at: "2026-
|
|
5
|
-
installer_version: "4.
|
|
4
|
+
updated_at: "2026-06-08T00:00:00Z"
|
|
5
|
+
installer_version: "4.4.0"
|
|
6
6
|
project_type: greenfield
|
|
7
7
|
language: en
|
|
8
8
|
ides: [claude-code]
|
|
@@ -35,7 +35,6 @@ features:
|
|
|
35
35
|
rate_limiter_integration: true
|
|
36
36
|
l5_keywords: true
|
|
37
37
|
prompt_size_guard: true
|
|
38
|
-
ids_decision_engine: true
|
|
39
38
|
surface_criteria: true
|
|
40
39
|
parallel_fallback: true
|
|
41
40
|
tool_mesh: true
|
|
@@ -53,6 +52,8 @@ features:
|
|
|
53
52
|
model_fallback: true # Automatic opus→sonnet fallback on overload
|
|
54
53
|
frustration_detection: true # Detect user frustration and adapt response style
|
|
55
54
|
bash_security_checks: true # 21-point shell injection defense system
|
|
55
|
+
# Execution Kinds — deterministic zero-LLM script executors for dev tasks
|
|
56
|
+
execution_kinds: false # OFF by default (opt-in). Default task kind stays 'agent', so the pipeline is unchanged while off.
|
|
56
57
|
# Agent Teams (v4.2.0 — Article XXI)
|
|
57
58
|
agent_teams: true # Enable Claude Code native Agent Teams. Gated to claude provider; Gemini/Codex fall back silently.
|
|
58
59
|
team_planning_size: 4 # Planning Team max teammates: detail + architect + ux + qa-planning
|