chati-dev 1.2.1 → 1.3.2
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/assets/logo.svg +42 -0
- package/assets/logo.txt +3 -3
- package/bin/chati.js +148 -8
- package/framework/constitution.md +77 -7
- package/framework/data/entity-registry.yaml +399 -0
- package/framework/i18n/en.yaml +9 -4
- package/framework/i18n/es.yaml +9 -4
- package/framework/i18n/fr.yaml +9 -4
- package/framework/i18n/pt.yaml +9 -4
- package/framework/intelligence/context-engine.md +163 -0
- package/framework/intelligence/decision-engine.md +134 -0
- package/framework/intelligence/memory-layer.md +187 -0
- package/framework/migrations/v1.1-to-v1.2.yaml +145 -0
- package/framework/orchestrator/chati.md +3 -3
- package/framework/schemas/config.schema.json +1 -1
- package/framework/schemas/context.schema.json +98 -0
- package/framework/schemas/memory.schema.json +79 -0
- package/package.json +14 -7
- package/scripts/bundle-framework.js +1 -1
- package/src/dashboard/data-reader.js +27 -2
- package/src/dashboard/layout.js +21 -0
- package/src/dashboard/renderer.js +11 -8
- package/src/installer/core.js +33 -6
- package/src/installer/validator.js +44 -5
- package/src/intelligence/context-status.js +80 -0
- package/src/intelligence/memory-manager.js +188 -0
- package/src/intelligence/registry-manager.js +202 -0
- package/src/upgrade/backup.js +2 -0
- package/src/upgrade/migrator.js +1 -1
- package/src/utils/logger.js +1 -1
- package/src/wizard/i18n.js +9 -4
- package/src/wizard/index.js +5 -0
- package/framework/agents/build/dev.md +0 -342
package/assets/logo.svg
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 200">
|
|
2
|
+
<defs>
|
|
3
|
+
<clipPath id="c">
|
|
4
|
+
<path d="M100,8 C155,8 190,40 190,90 C190,140 155,172 100,172 C82,172 66,167 52,159 L22,192 L34,155 C18,140 10,118 10,90 C10,40 45,8 100,8 Z"/>
|
|
5
|
+
</clipPath>
|
|
6
|
+
<radialGradient id="g" cx="38%" cy="30%" r="68%">
|
|
7
|
+
<stop offset="0%" stop-color="#8EC5F5"/>
|
|
8
|
+
<stop offset="40%" stop-color="#5DA2E2"/>
|
|
9
|
+
<stop offset="75%" stop-color="#4A90D9"/>
|
|
10
|
+
<stop offset="100%" stop-color="#2D6BAF"/>
|
|
11
|
+
</radialGradient>
|
|
12
|
+
<linearGradient id="r" x1="0" y1="0" x2="0" y2="1">
|
|
13
|
+
<stop offset="0%" stop-color="rgba(255,255,255,0.5)"/>
|
|
14
|
+
<stop offset="30%" stop-color="rgba(255,255,255,0.15)"/>
|
|
15
|
+
<stop offset="100%" stop-color="rgba(0,0,0,0)"/>
|
|
16
|
+
</linearGradient>
|
|
17
|
+
<linearGradient id="bs" x1="0" y1="0" x2="0" y2="1">
|
|
18
|
+
<stop offset="0%" stop-color="rgba(0,0,0,0)"/>
|
|
19
|
+
<stop offset="65%" stop-color="rgba(0,0,0,0)"/>
|
|
20
|
+
<stop offset="100%" stop-color="rgba(15,30,60,0.25)"/>
|
|
21
|
+
</linearGradient>
|
|
22
|
+
</defs>
|
|
23
|
+
|
|
24
|
+
<!-- Chat bubble -->
|
|
25
|
+
<path d="M100,8 C155,8 190,40 190,90 C190,140 155,172 100,172 C82,172 66,167 52,159 L22,192 L34,155 C18,140 10,118 10,90 C10,40 45,8 100,8 Z" fill="url(#g)"/>
|
|
26
|
+
<ellipse cx="82" cy="38" rx="52" ry="25" fill="rgba(255,255,255,0.18)" clip-path="url(#c)"/>
|
|
27
|
+
<path d="M100,8 C155,8 190,40 190,90 C190,140 155,172 100,172 C82,172 66,167 52,159 L22,192 L34,155 C18,140 10,118 10,90 C10,40 45,8 100,8 Z" fill="url(#bs)" clip-path="url(#c)"/>
|
|
28
|
+
<path d="M100,8 C155,8 190,40 190,90 C190,140 155,172 100,172 C82,172 66,167 52,159 L22,192 L34,155 C18,140 10,118 10,90 C10,40 45,8 100,8 Z" fill="none" stroke="url(#r)" stroke-width="1.5"/>
|
|
29
|
+
|
|
30
|
+
<!-- Eyes -->
|
|
31
|
+
<ellipse cx="72" cy="95" rx="18" ry="20" fill="#1a1a2e"/>
|
|
32
|
+
<ellipse cx="128" cy="95" rx="18" ry="20" fill="#1a1a2e"/>
|
|
33
|
+
<ellipse cx="65" cy="86" rx="7" ry="5" fill="rgba(255,255,255,0.55)"/>
|
|
34
|
+
<ellipse cx="121" cy="86" rx="7" ry="5" fill="rgba(255,255,255,0.55)"/>
|
|
35
|
+
<ellipse cx="77" cy="100" rx="3.5" ry="2.5" fill="rgba(255,255,255,0.3)"/>
|
|
36
|
+
<ellipse cx="133" cy="100" rx="3.5" ry="2.5" fill="rgba(255,255,255,0.3)"/>
|
|
37
|
+
|
|
38
|
+
<!-- "chati.dev" text inline -->
|
|
39
|
+
<text x="210" y="122" font-family="ui-monospace,'SF Mono','Menlo','Consolas','Liberation Mono',monospace" font-weight="700" font-size="68" letter-spacing="-1">
|
|
40
|
+
<tspan fill="#e6edf3">chati</tspan><tspan fill="#4A90D9">.</tspan><tspan fill="#e6edf3">dev</tspan>
|
|
41
|
+
</text>
|
|
42
|
+
</svg>
|
package/assets/logo.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
██████╗ ██╗ ██╗ █████╗ ████████╗██╗ ██████╗ ███████╗██╗ ██╗
|
|
2
|
-
|
|
2
|
+
██╔═══╝ ██║ ██║██╔══██╗╚══██╔══╝██║ ██╔══██╗██╔════╝██║ ██║
|
|
3
3
|
██║ ███████║███████║ ██║ ██║ ██║ ██║█████╗ ██║ ██║
|
|
4
4
|
██║ ██╔══██║██╔══██║ ██║ ██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
██████╗ ██║ ██║██║ ██║ ██║ ██║██╗██████╔╝███████╗ ╚████╔╝
|
|
6
|
+
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═════╝ ╚══════╝ ╚═══╝
|
package/bin/chati.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { resolve
|
|
3
|
+
import { resolve } from 'path';
|
|
4
4
|
import { readFileSync } from 'fs';
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
6
|
import { dirname, join } from 'path';
|
|
@@ -8,6 +8,18 @@ import { dirname, join } from 'path';
|
|
|
8
8
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
10
10
|
|
|
11
|
+
import { logBanner } from '../src/utils/logger.js';
|
|
12
|
+
|
|
13
|
+
function showBanner() {
|
|
14
|
+
let logoText;
|
|
15
|
+
try {
|
|
16
|
+
logoText = readFileSync(join(__dirname, '..', 'assets', 'logo.txt'), 'utf-8');
|
|
17
|
+
} catch {
|
|
18
|
+
logoText = 'chati.dev';
|
|
19
|
+
}
|
|
20
|
+
logBanner(logoText, pkg.version);
|
|
21
|
+
}
|
|
22
|
+
|
|
11
23
|
const args = process.argv.slice(2);
|
|
12
24
|
const command = args[0] || 'init';
|
|
13
25
|
const targetDir = resolve(args.find(a => !a.startsWith('-') && a !== command) || process.cwd());
|
|
@@ -26,9 +38,9 @@ async function main() {
|
|
|
26
38
|
const { renderDashboard, renderDashboardWatch } = await import('../src/dashboard/renderer.js');
|
|
27
39
|
|
|
28
40
|
if (watchFlag) {
|
|
29
|
-
renderDashboardWatch(targetDir);
|
|
41
|
+
await renderDashboardWatch(targetDir);
|
|
30
42
|
} else {
|
|
31
|
-
renderDashboard(targetDir);
|
|
43
|
+
await renderDashboard(targetDir);
|
|
32
44
|
}
|
|
33
45
|
break;
|
|
34
46
|
}
|
|
@@ -110,6 +122,131 @@ async function main() {
|
|
|
110
122
|
break;
|
|
111
123
|
}
|
|
112
124
|
|
|
125
|
+
case 'memory': {
|
|
126
|
+
const { listMemories, searchMemories, cleanMemories, getMemoryStats } = await import('../src/intelligence/memory-manager.js');
|
|
127
|
+
const memSubCmd = args[1] || 'stats';
|
|
128
|
+
|
|
129
|
+
if (memSubCmd === 'list') {
|
|
130
|
+
const agentIdx = args.indexOf('--agent');
|
|
131
|
+
const sectorIdx = args.indexOf('--sector');
|
|
132
|
+
const tierIdx = args.indexOf('--tier');
|
|
133
|
+
const opts = {};
|
|
134
|
+
if (agentIdx !== -1) opts.agent = args[agentIdx + 1];
|
|
135
|
+
if (sectorIdx !== -1) opts.sector = args[sectorIdx + 1];
|
|
136
|
+
if (tierIdx !== -1) opts.tier = args[tierIdx + 1];
|
|
137
|
+
|
|
138
|
+
const memories = listMemories(targetDir, opts);
|
|
139
|
+
if (memories.length === 0) {
|
|
140
|
+
console.log('No memories found.');
|
|
141
|
+
} else {
|
|
142
|
+
console.log(`Found ${memories.length} memories:\n`);
|
|
143
|
+
for (const m of memories) {
|
|
144
|
+
console.log(` ${m.id || m.path} [${m.tier || '?'}] ${m.sector || '?'} ${m.agent || 'shared'}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
} else if (memSubCmd === 'search') {
|
|
148
|
+
const query = args[2];
|
|
149
|
+
if (!query) { console.error('Usage: npx chati-dev memory search <query>'); process.exit(1); }
|
|
150
|
+
const results = searchMemories(targetDir, query);
|
|
151
|
+
if (results.length === 0) {
|
|
152
|
+
console.log(`No memories matching "${query}".`);
|
|
153
|
+
} else {
|
|
154
|
+
console.log(`Found ${results.length} memories matching "${query}":\n`);
|
|
155
|
+
for (const r of results) {
|
|
156
|
+
console.log(` ${r.id || r.path} [${r.matchType}] ${r.agent || 'shared'}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
} else if (memSubCmd === 'clean') {
|
|
160
|
+
const dryRun = args.includes('--dry-run');
|
|
161
|
+
const result = cleanMemories(targetDir, { dryRun });
|
|
162
|
+
console.log(`Cleaned: ${result.cleaned}, Skipped: ${result.skipped}${result.dryRun ? ' (dry run)' : ''}`);
|
|
163
|
+
} else {
|
|
164
|
+
const stats = getMemoryStats(targetDir);
|
|
165
|
+
console.log('Memory Statistics');
|
|
166
|
+
console.log('='.repeat(30));
|
|
167
|
+
console.log(` Total: ${stats.total}`);
|
|
168
|
+
console.log(` HOT: ${stats.byTier.hot}`);
|
|
169
|
+
console.log(` WARM: ${stats.byTier.warm}`);
|
|
170
|
+
console.log(` COLD: ${stats.byTier.cold}`);
|
|
171
|
+
console.log(` Disk Usage: ${(stats.diskUsage / 1024).toFixed(1)} KB`);
|
|
172
|
+
if (Object.keys(stats.byAgent).length > 0) {
|
|
173
|
+
console.log('\n By Agent:');
|
|
174
|
+
for (const [agent, count] of Object.entries(stats.byAgent)) {
|
|
175
|
+
console.log(` ${agent}: ${count}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
case 'context': {
|
|
183
|
+
const { getContextStatus } = await import('../src/intelligence/context-status.js');
|
|
184
|
+
const status = getContextStatus(targetDir);
|
|
185
|
+
|
|
186
|
+
console.log('Context Status (Advisory)');
|
|
187
|
+
console.log('='.repeat(30));
|
|
188
|
+
console.log(` Bracket: ${status.bracket}`);
|
|
189
|
+
console.log(` Layers: ${status.activeLayers.join(', ')}`);
|
|
190
|
+
console.log(` Budget: ${status.tokenBudget} tokens`);
|
|
191
|
+
console.log(` Memory: ${status.memoryLevel}`);
|
|
192
|
+
console.log(` Agent: ${status.currentAgent}`);
|
|
193
|
+
console.log(` Pipeline: ${status.pipelineState}`);
|
|
194
|
+
console.log(` Completed: ${status.completedAgents} agents`);
|
|
195
|
+
console.log(`\n ${status.advisory}`);
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
case 'registry': {
|
|
200
|
+
const { checkRegistry, getRegistryStats } = await import('../src/intelligence/registry-manager.js');
|
|
201
|
+
const regSubCmd = args[1] || 'stats';
|
|
202
|
+
|
|
203
|
+
if (regSubCmd === 'check') {
|
|
204
|
+
const result = checkRegistry(targetDir);
|
|
205
|
+
if (result.valid) {
|
|
206
|
+
console.log(`Registry: ${result.totalEntities}/${result.totalEntities} entities present`);
|
|
207
|
+
console.log('Status: VALID');
|
|
208
|
+
} else {
|
|
209
|
+
console.log(`Registry: ${result.found}/${result.totalEntities} entities present`);
|
|
210
|
+
console.log('Missing:');
|
|
211
|
+
for (const m of result.missing) {
|
|
212
|
+
console.log(` - ${m.path}`);
|
|
213
|
+
}
|
|
214
|
+
console.log('Status: INVALID');
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
const stats = getRegistryStats(targetDir);
|
|
218
|
+
console.log('Registry Statistics');
|
|
219
|
+
console.log('='.repeat(30));
|
|
220
|
+
console.log(` Version: ${stats.version || 'N/A'}`);
|
|
221
|
+
console.log(` Entities: ${stats.totalEntities}`);
|
|
222
|
+
console.log(` Declared: ${stats.declaredCount}`);
|
|
223
|
+
console.log(` Count Match: ${stats.countMatch ? 'Yes' : 'No'}`);
|
|
224
|
+
if (Object.keys(stats.byType).length > 0) {
|
|
225
|
+
console.log('\n By Type:');
|
|
226
|
+
for (const [type, count] of Object.entries(stats.byType)) {
|
|
227
|
+
console.log(` ${type}: ${count}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
case 'health': {
|
|
235
|
+
const { runHealthCheck } = await import('../src/intelligence/registry-manager.js');
|
|
236
|
+
const checks = runHealthCheck(targetDir);
|
|
237
|
+
|
|
238
|
+
console.log('chati.dev Health Check');
|
|
239
|
+
console.log('='.repeat(30));
|
|
240
|
+
console.log(` Registry: ${checks.registry.pass ? 'PASS' : 'FAIL'} ${checks.registry.details}`);
|
|
241
|
+
console.log(` Schemas: ${checks.schemas.pass ? 'PASS' : 'FAIL'} ${checks.schemas.details}`);
|
|
242
|
+
console.log(` Constitution: ${checks.constitution.pass ? 'PASS' : 'FAIL'} ${checks.constitution.details}`);
|
|
243
|
+
console.log(` Agents: ${checks.agents.pass ? 'PASS' : 'FAIL'} ${checks.agents.details}`);
|
|
244
|
+
console.log(` Entities: ${checks.entities.pass ? 'PASS' : 'FAIL'} ${checks.entities.details}`);
|
|
245
|
+
console.log();
|
|
246
|
+
console.log(` Status: ${checks.overall} (${checks.passCount}/${checks.totalChecks})`);
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
|
|
113
250
|
case 'changelog': {
|
|
114
251
|
console.log(`chati.dev v${pkg.version} Changelog`);
|
|
115
252
|
console.log('═'.repeat(40));
|
|
@@ -141,11 +278,8 @@ async function main() {
|
|
|
141
278
|
case '--help':
|
|
142
279
|
case '-h':
|
|
143
280
|
case 'help': {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
AI-Powered Multi-Agent Development Framework
|
|
147
|
-
|
|
148
|
-
Usage:
|
|
281
|
+
showBanner();
|
|
282
|
+
console.log(`Usage:
|
|
149
283
|
npx chati-dev init [project-name] Initialize new project
|
|
150
284
|
npx chati-dev install Install into existing project
|
|
151
285
|
npx chati-dev status Show dashboard
|
|
@@ -157,6 +291,12 @@ Usage:
|
|
|
157
291
|
npx chati-dev --reconfigure Reconfigure installation
|
|
158
292
|
npx chati-dev --version Show version
|
|
159
293
|
npx chati-dev --help Show this help
|
|
294
|
+
|
|
295
|
+
Intelligence:
|
|
296
|
+
npx chati-dev memory [stats|list|search|clean] Memory management
|
|
297
|
+
npx chati-dev context Context bracket status
|
|
298
|
+
npx chati-dev registry [stats|check] Entity registry
|
|
299
|
+
npx chati-dev health System health check
|
|
160
300
|
`);
|
|
161
301
|
break;
|
|
162
302
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Preamble
|
|
4
4
|
|
|
5
|
-
chati.dev is a planning-first AI-assisted
|
|
5
|
+
chati.dev is a planning-first AI-assisted orchestration system that coordinates 13 specialized agents to guide software projects from initial discovery through deployment. This Constitution defines the governance rules, quality standards, and behavioral protocols that all agents must follow.
|
|
6
6
|
|
|
7
7
|
### 4 Core Principles
|
|
8
8
|
|
|
@@ -76,7 +76,7 @@ Every agent in chati.dev:
|
|
|
76
76
|
## Article III: Memory & Context
|
|
77
77
|
|
|
78
78
|
1. Session state is persisted in `.chati/session.yaml` (IDE-agnostic)
|
|
79
|
-
2.
|
|
79
|
+
2. System state is persisted in `chati.dev/config.yaml`
|
|
80
80
|
3. Project context is maintained in `CLAUDE.md` (auto-updated by each agent)
|
|
81
81
|
4. Handoffs between agents use the Two-Layer Protocol (Article VIII)
|
|
82
82
|
5. Decisions are recorded in `chati.dev/artifacts/decisions/`
|
|
@@ -90,7 +90,7 @@ Every agent in chati.dev:
|
|
|
90
90
|
## Article IV: Security & Permissions
|
|
91
91
|
|
|
92
92
|
1. No agent may execute destructive operations without explicit user confirmation
|
|
93
|
-
2. Credentials, API keys, and secrets are never stored in
|
|
93
|
+
2. Credentials, API keys, and secrets are never stored in system files
|
|
94
94
|
3. Environment variables are referenced by name only (e.g., `${EXA_API_KEY}`)
|
|
95
95
|
4. SAST scanning is mandatory before deployment (QA-Implementation)
|
|
96
96
|
5. Security vulnerabilities classified as critical or high block deployment
|
|
@@ -129,7 +129,7 @@ Every agent in chati.dev:
|
|
|
129
129
|
|
|
130
130
|
## Article VII: English-Only Documentation
|
|
131
131
|
|
|
132
|
-
All
|
|
132
|
+
All system documentation, agent definitions, templates, artifacts, handoffs, and generated content MUST be written in English. No exceptions.
|
|
133
133
|
|
|
134
134
|
This applies to:
|
|
135
135
|
- Agent command files (`chati.dev/agents/`)
|
|
@@ -259,21 +259,91 @@ The pipeline operates in three execution modes that control agent permissions. M
|
|
|
259
259
|
|
|
260
260
|
---
|
|
261
261
|
|
|
262
|
+
## Article XII: Context Bracket Governance
|
|
263
|
+
|
|
264
|
+
1. The orchestrator SHALL calculate the context bracket (FRESH, MODERATE, DEPLETED, CRITICAL) before every agent interaction.
|
|
265
|
+
|
|
266
|
+
2. Context injection layers SHALL be reduced according to bracket level:
|
|
267
|
+
- FRESH/MODERATE: All 5 layers (L0-L4)
|
|
268
|
+
- DEPLETED: L0 (Constitution) + L1 (Mode) + L2 (Agent) only
|
|
269
|
+
- CRITICAL: L0 (Constitution) + L1 (Mode) only
|
|
270
|
+
|
|
271
|
+
3. Context recovery uses a two-level autonomous strategy:
|
|
272
|
+
a. Level 1 (Smart Continuation): When context is compacted, the orchestrator SHALL automatically capture a digest, persist memories, and rebuild context post-compact. The user experiences zero interruption.
|
|
273
|
+
b. Level 2 (Autonomous Spawn): When Smart Continuation is insufficient (3+ compactions, quality degradation >15%, or persistent CRITICAL bracket), the orchestrator SHALL spawn a new session autonomously with full context from memories and continuation state.
|
|
274
|
+
|
|
275
|
+
4. The Constitution (L0) and Mode governance (L1) are NON-NEGOTIABLE and SHALL be injected in ALL brackets, including CRITICAL.
|
|
276
|
+
|
|
277
|
+
5. Token budgets per bracket:
|
|
278
|
+
- FRESH: 2500 tokens maximum
|
|
279
|
+
- MODERATE: 2000 tokens maximum
|
|
280
|
+
- DEPLETED: 1500 tokens maximum
|
|
281
|
+
- CRITICAL: 800 tokens maximum
|
|
282
|
+
|
|
283
|
+
6. Autonomous spawn capability varies by IDE:
|
|
284
|
+
- Full autonomy: Claude Code, AntiGravity, Gemini CLI
|
|
285
|
+
- Continuation file: Cursor, VS Code, GitHub Copilot (user loads with /chati resume)
|
|
286
|
+
|
|
287
|
+
**Enforcement: BLOCK** — Bracket violations (injecting L3/L4 in CRITICAL) degrade agent quality.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Article XIII: Memory Governance
|
|
292
|
+
|
|
293
|
+
1. The Memory Layer SHALL capture session knowledge automatically before context compaction (PreCompact event).
|
|
294
|
+
|
|
295
|
+
2. Memories are classified into 4 cognitive sectors: Episodic (what happened), Semantic (what we know), Procedural (how to do it), Reflective (what we learned).
|
|
296
|
+
|
|
297
|
+
3. Each agent SHALL have private memory scope plus access to shared memories. Agents SHALL NOT access other agents' private memories.
|
|
298
|
+
|
|
299
|
+
4. The system SHALL NEVER auto-modify user files (code, configurations, documentation). All file modifications require explicit user action.
|
|
300
|
+
|
|
301
|
+
5. Heuristic proposals (new rules derived from learned patterns) SHALL only be generated when:
|
|
302
|
+
a. Confidence score exceeds 0.9
|
|
303
|
+
b. Evidence count is 5 or greater
|
|
304
|
+
c. The proposal is presented for explicit user approval
|
|
305
|
+
|
|
306
|
+
6. Users MAY review, edit, or delete any memory at any time. The system SHALL respect user decisions without question.
|
|
307
|
+
|
|
308
|
+
7. Memory attention scoring SHALL use natural decay — memories not accessed lose relevance organically. No memory is permanent unless explicitly marked as durable by the user.
|
|
309
|
+
|
|
310
|
+
**Enforcement: BLOCK** — Auto-modification of user files is a critical violation.
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Article XIV: Framework Registry Governance
|
|
315
|
+
|
|
316
|
+
1. The entity registry (`chati.dev/data/entity-registry.yaml`) is the single source of truth for all system artifacts.
|
|
317
|
+
|
|
318
|
+
2. The health check command (`npx chati-dev health`) performs advisory validation. It SHALL NEVER block development or prevent agent execution.
|
|
319
|
+
|
|
320
|
+
3. The Decision Engine follows the preference order: REUSE > ADAPT > CREATE. Agents SHALL prefer reusing existing artifacts over creating new ones.
|
|
321
|
+
|
|
322
|
+
4. Adaptability constraints SHALL be respected — entities with adaptability < 0.3 require impact analysis before modification.
|
|
323
|
+
|
|
324
|
+
5. The registry SHALL be updated when artifacts are added, modified, or removed. Stale entries degrade system intelligence.
|
|
325
|
+
|
|
326
|
+
6. Checksum validation ensures file integrity. Mismatches indicate unauthorized or untracked modifications.
|
|
327
|
+
|
|
328
|
+
**Enforcement: GUIDE** — Registry issues are advisory; they never block operations.
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
262
332
|
## Article XV: Session Lock Governance
|
|
263
333
|
|
|
264
334
|
Once the orchestrator is activated via `/chati`, a session lock engages. All agents and the orchestrator itself are bound by these rules:
|
|
265
335
|
|
|
266
336
|
1. **Lock is mandatory**: When a session is active (session.yaml has project.name and current_agent), the session lock MUST be ACTIVE. CLAUDE.md MUST contain the Session Lock block.
|
|
267
|
-
2. **All messages routed**: Every user message MUST be routed through the orchestrator and then to the active agent. No message may be answered outside of the chati.dev
|
|
337
|
+
2. **All messages routed**: Every user message MUST be routed through the orchestrator and then to the active agent. No message may be answered outside of the chati.dev system while the lock is active.
|
|
268
338
|
3. **No generic responses**: The AI MUST NOT respond as a generic assistant while the lock is active. It IS the chati.dev orchestrator. Off-topic requests are handled via the Deviation Protocol (5.7), not by dropping out of the system.
|
|
269
339
|
4. **Explicit exit only**: The session lock is released ONLY by explicit user intent via recognized exit commands (`/chati exit`, `/chati stop`, `/chati quit`) or clear natural language exit requests in the user's language.
|
|
270
340
|
5. **Exit preserves state**: On exit, all session state, progress, and partial work MUST be persisted. The session lock status in CLAUDE.md is set to INACTIVE. The user can resume anytime with `/chati`.
|
|
271
341
|
6. **Resume re-locks**: When `/chati` is invoked after a previous exit, the session lock is immediately re-activated and CLAUDE.md is updated with the active lock block.
|
|
272
342
|
7. **IDE restart resilience**: If the IDE is closed/restarted, the session lock status in CLAUDE.md persists. On the next `/chati` invocation, the orchestrator detects the existing session and re-engages the lock.
|
|
273
343
|
|
|
274
|
-
**Enforcement: BLOCK** — Responses outside the chati.dev
|
|
344
|
+
**Enforcement: BLOCK** — Responses outside the chati.dev system while session lock is active are violations.
|
|
275
345
|
|
|
276
346
|
---
|
|
277
347
|
|
|
278
|
-
*chati.dev Constitution v1.2
|
|
348
|
+
*chati.dev Constitution v1.3.2 — 15 Articles + Preamble*
|
|
279
349
|
*All agents are bound by this Constitution. Violations are enforced per article.*
|