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.
Files changed (156) hide show
  1. package/README.md +18 -13
  2. package/bin/chati.js +32 -4
  3. package/framework/agents/build/dev.md +9 -5
  4. package/framework/agents/discover/brief.md +2 -0
  5. package/framework/agents/discover/brownfield-wu.md +2 -0
  6. package/framework/agents/discover/greenfield-wu.md +18 -1
  7. package/framework/agents/plan/detail.md +2 -0
  8. package/framework/agents/plan/tasks.md +31 -0
  9. package/framework/agents/plan/ux-brand-architect.md +21 -2
  10. package/framework/agents/plan/ux-component-engineer.md +10 -0
  11. package/framework/agents/quality/qa-implementation.md +1 -1
  12. package/framework/agents/quality/qa-planning.md +1 -1
  13. package/framework/agents/quality/qa-visual.md +33 -21
  14. package/framework/config.yaml +5 -4
  15. package/framework/constitution.md +58 -11
  16. package/framework/context/governance.md +12 -10
  17. package/framework/context/root.md +2 -2
  18. package/framework/data/entity-registry.yaml +12 -4
  19. package/framework/data/qa-rubrics.yaml +335 -0
  20. package/framework/domains/constitution.yaml +3 -3
  21. package/framework/executors/json-validate.js +80 -0
  22. package/framework/executors/npm-script.js +72 -0
  23. package/framework/executors/path-check.js +67 -0
  24. package/framework/executors/registry.yaml +36 -0
  25. package/framework/hooks/advance-trigger.js +47 -3
  26. package/framework/hooks/constitution-guard.js +9 -4
  27. package/framework/hooks/git-push-authority.js +113 -0
  28. package/framework/hooks/license-guard.js +59 -9
  29. package/framework/hooks/model-governance.js +40 -17
  30. package/framework/hooks/prism-engine.js +78 -11
  31. package/framework/hooks/session-digest.js +12 -3
  32. package/framework/hooks/settings.json +7 -3
  33. package/framework/hooks/style-guard.js +52 -3
  34. package/framework/hooks/team-quality-gate.js +43 -5
  35. package/framework/i18n/en.yaml +3 -3
  36. package/framework/i18n/es.yaml +3 -3
  37. package/framework/i18n/fr.yaml +3 -3
  38. package/framework/i18n/pt.yaml +3 -3
  39. package/framework/intelligence/confidence.yaml +85 -6
  40. package/framework/intelligence/context-engine.md +9 -5
  41. package/framework/intelligence/decision-engine.md +1 -1
  42. package/framework/orchestrator/chati-router.js +59 -5
  43. package/framework/orchestrator/chati-update.md +19 -3
  44. package/framework/orchestrator/chati.md +20 -1
  45. package/framework/quality-gates/planning-gate.md +2 -0
  46. package/framework/rules/human-writing-style.md +47 -0
  47. package/framework/scaffold/motion-premium/README.md +12 -2
  48. package/framework/scaffold/motion-premium/lib/animations/tokens.ts.template +1 -1
  49. package/framework/scaffold/motion-premium/scaffold.yaml +6 -1
  50. package/framework/scaffold/motion-premium-3d/README.md +10 -0
  51. package/framework/scaffold/motion-premium-3d/components/webgl/WebGLContext.tsx.template +1 -1
  52. package/framework/scaffold/motion-premium-3d/scaffold.yaml +3 -0
  53. package/framework/scaffold/saas-dashboard/README.md +58 -0
  54. package/framework/scaffold/saas-dashboard/app/dashboard/page.tsx.template +546 -0
  55. package/framework/scaffold/saas-dashboard/app/globals.css.template +746 -0
  56. package/framework/scaffold/saas-dashboard/app/layout.tsx.template +192 -0
  57. package/framework/scaffold/saas-dashboard/app/shell.css.template +1070 -0
  58. package/framework/scaffold/saas-dashboard/components/data/Chart.tsx.template +725 -0
  59. package/framework/scaffold/saas-dashboard/components/data/DataTable.tsx.template +623 -0
  60. package/framework/scaffold/saas-dashboard/components/data/DataTable.types.ts.template +104 -0
  61. package/framework/scaffold/saas-dashboard/components/data/DataTablePagination.tsx.template +234 -0
  62. package/framework/scaffold/saas-dashboard/components/data/SkeletonBlock.tsx.template +111 -0
  63. package/framework/scaffold/saas-dashboard/components/data/StatCard.tsx.template +393 -0
  64. package/framework/scaffold/saas-dashboard/components/data/StatCardGrid.tsx.template +121 -0
  65. package/framework/scaffold/saas-dashboard/components/feedback/EmptyState.tsx.template +281 -0
  66. package/framework/scaffold/saas-dashboard/components/interaction/CommandPalette.tsx.template +767 -0
  67. package/framework/scaffold/saas-dashboard/components/interaction/Field.tsx.template +351 -0
  68. package/framework/scaffold/saas-dashboard/components/interaction/Form.tsx.template +424 -0
  69. package/framework/scaffold/saas-dashboard/components/primitives/Badge.tsx.template +193 -0
  70. package/framework/scaffold/saas-dashboard/components/primitives/Button.tsx.template +261 -0
  71. package/framework/scaffold/saas-dashboard/components/primitives/Card.tsx.template +287 -0
  72. package/framework/scaffold/saas-dashboard/components/primitives/Input.tsx.template +310 -0
  73. package/framework/scaffold/saas-dashboard/components/primitives/Spinner.tsx.template +135 -0
  74. package/framework/scaffold/saas-dashboard/components/primitives/index.ts.template +60 -0
  75. package/framework/scaffold/saas-dashboard/components/shell/AppShell.tsx.template +174 -0
  76. package/framework/scaffold/saas-dashboard/components/shell/Breadcrumb.tsx.template +186 -0
  77. package/framework/scaffold/saas-dashboard/components/shell/Container.tsx.template +86 -0
  78. package/framework/scaffold/saas-dashboard/components/shell/NavItem.tsx.template +147 -0
  79. package/framework/scaffold/saas-dashboard/components/shell/Sidebar.tsx.template +378 -0
  80. package/framework/scaffold/saas-dashboard/components/shell/SidebarContext.tsx.template +169 -0
  81. package/framework/scaffold/saas-dashboard/components/shell/ThemeToggle.tsx.template +128 -0
  82. package/framework/scaffold/saas-dashboard/components/shell/Topbar.tsx.template +301 -0
  83. package/framework/scaffold/saas-dashboard/lib/brand.ts.template +324 -0
  84. package/framework/scaffold/saas-dashboard/scaffold.yaml +225 -0
  85. package/framework/schemas/session.schema.json +5 -0
  86. package/framework/schemas/task.schema.json +9 -0
  87. package/framework/scripts/visual-qa.js +101 -3
  88. package/framework/tasks/orchestrator-health.md +4 -4
  89. package/framework/tasks/qa-impl-verdict.md +11 -5
  90. package/framework/templates/brandbook-html-tmpl.md +1 -1
  91. package/framework/templates/qa-gate-tmpl.yaml +24 -11
  92. package/package.json +4 -3
  93. package/src/config/context-file-generator.js +0 -6
  94. package/src/dashboard/renderer.js +0 -36
  95. package/src/executors/runner.js +204 -0
  96. package/src/installer/core.js +13 -3
  97. package/src/installer/templates.js +5 -6
  98. package/src/intelligence/registry-manager.js +1 -1
  99. package/src/license/client.js +9 -3
  100. package/src/license/commands.js +12 -2
  101. package/src/license/machine-id.js +42 -1
  102. package/src/memory/gotchas.js +58 -40
  103. package/src/memory/magic-docs.js +1 -1
  104. package/src/memory/session-digest.js +9 -4
  105. package/src/orchestrator/cli.js +186 -15
  106. package/src/orchestrator/doctor.js +98 -16
  107. package/src/orchestrator/pipeline-manager.js +44 -22
  108. package/src/orchestrator/session-manager.js +64 -8
  109. package/src/telemetry/sender.js +7 -19
  110. package/src/terminal/run-team.js +3 -3
  111. package/src/upgrade/tracked-files-detector.js +34 -16
  112. package/src/utils/feature-flags.js +1 -1
  113. package/src/utils/flatten-entities.js +4 -40
  114. package/src/utils/schema-validator.js +0 -14
  115. package/src/wizard/i18n.js +3 -3
  116. package/src/api/index.js +0 -120
  117. package/src/autonomy/autonomous-gate.js +0 -294
  118. package/src/autonomy/build-loop.js +0 -281
  119. package/src/autonomy/build-state.js +0 -286
  120. package/src/autonomy/cause-analyzer.js +0 -177
  121. package/src/autonomy/escalation.js +0 -214
  122. package/src/autonomy/index.js +0 -51
  123. package/src/autonomy/mode-manager.js +0 -225
  124. package/src/autonomy/mode-suggester.js +0 -283
  125. package/src/autonomy/progress-reporter.js +0 -275
  126. package/src/autonomy/safety-net.js +0 -370
  127. package/src/config/agent-customizer.js +0 -231
  128. package/src/decision/analyzer.js +0 -291
  129. package/src/decision/engine.js +0 -250
  130. package/src/decision/index.js +0 -38
  131. package/src/decision/registry-healer.js +0 -468
  132. package/src/decision/registry-updater.js +0 -339
  133. package/src/extensions/loader.js +0 -145
  134. package/src/extensions/registry.js +0 -134
  135. package/src/gates/circuit-breaker.js +0 -151
  136. package/src/gates/g1-planning-complete.js +0 -154
  137. package/src/gates/g2-qa-planning.js +0 -156
  138. package/src/gates/g3-implementation.js +0 -215
  139. package/src/gates/g4-qa-implementation.js +0 -240
  140. package/src/gates/g5-deploy-ready.js +0 -181
  141. package/src/gates/gate-base.js +0 -185
  142. package/src/gates/index.js +0 -46
  143. package/src/health/auto-fix.js +0 -216
  144. package/src/health/engine.js +0 -246
  145. package/src/merger/semantic-merger.js +0 -292
  146. package/src/preview/detector.js +0 -238
  147. package/src/preview/index.js +0 -20
  148. package/src/preview/launcher.js +0 -235
  149. package/src/preview/log-buffer.js +0 -103
  150. package/src/quality/metrics-collector.js +0 -281
  151. package/src/quality/test-runner.js +0 -366
  152. package/src/tasks/executor.js +0 -195
  153. package/src/tasks/index.js +0 -4
  154. package/src/tasks/loader.js +0 -210
  155. package/src/tasks/router.js +0 -182
  156. 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 agent validates the visual experience: screenshots at 5 scroll positions, hover states, GSAP/Lenis verification, brandbook compliance. Powered by Playwright. |
132
- | **Premium Animations** | GSAP + ScrollTrigger + Lenis as mandatory stack for UI projects. Every page has scroll reveals, micro-interactions, and smooth scrolling. |
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 Profiles** | Three profiles: explore (read-only), guided (default), autonomous (gate >= 95%). Includes safety net and circuit breaker |
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 Profiles
195
+ ## Execution Mode
194
196
 
195
- Three profiles control how much autonomy agents have:
197
+ Two modes control how much autonomy agents have:
196
198
 
197
- | Profile | Behavior | When to use |
198
- |---------|----------|-------------|
199
- | **explore** | Read-only. Agents analyze but don't modify files | Understanding a new codebase |
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 `guided` mode. Transition to `autonomous` requires both QA gates scoring >= 95%. A safety net with 5 triggers (stuck loop, quality drop, scope creep, error cascade, user override) automatically reverts to guided mode when needed.
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 (200K), Gemini (1M), and Codex (128K). |
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 **23-article Constitution** that enforces agent behavior, quality standards, security, and system integrity:
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 Profiles** - Explore, guided, and autonomous modes with safety net and circuit breaker
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 (23 Articles + Preamble)');
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 the focus-ai-website saga. 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.
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 focus-ai-website (2026-04-16 incident) 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.
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 the focus-ai-website saga; this ADR names the canonical init sequence dev must preserve.
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 the focus-ai-website saga. 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.
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) OR **React** (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 both entries when both presets apply — the post-qa-planning gate
385
- fires them in sequence after the user applies or skips the first.
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 (DETERMINISTIC — calculated by CLI)
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
- Do NOT calculate the score manually. Run the scoring CLI:
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
- ```json
308
- {
309
- "score": 85,
310
- "threshold": 90,
311
- "verdict": "NEEDS_CORRECTION",
312
- "hardBlocked": false,
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
- Use the returned `verdict` directly:
320
- - `APPROVED` pass
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
- Do NOT override the CLI verdict. Your role is to add qualitative observations from the Visualizer report (subjective quality), but the score and verdict are deterministic.
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
  ---
@@ -1,8 +1,8 @@
1
1
  # chati.dev Configuration
2
- version: "4.3.0"
2
+ version: "4.4.0"
3
3
  installed_at: "2026-02-07T10:00:00Z"
4
- updated_at: "2026-04-18T00:00:00Z"
5
- installer_version: "4.3.0"
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