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