atris 3.15.45 → 3.15.48
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/AGENTS.md +2 -2
- package/atris/skills/atris/SKILL.md +1 -1
- package/bin/atris.js +10 -4
- package/commands/business.js +574 -21
- package/commands/computer.js +1 -1
- package/commands/mission.js +16 -1
- package/commands/radar.js +546 -0
- package/commands/sync.js +101 -1
- package/lib/runtime-bootstrap.js +17 -5
- package/lib/task-db.js +29 -3
- package/package.json +3 -1
- package/templates/business-starter/CLAUDE.md +62 -0
- package/templates/business-starter/MAP.md +81 -0
- package/templates/business-starter/MEMBER.md +46 -0
- package/templates/business-starter/TODO.md +28 -0
- package/templates/business-starter/atris.md +61 -0
- package/templates/business-starter/context/README.md +19 -0
- package/templates/business-starter/context/live-workspace.md +36 -0
- package/templates/business-starter/goals.md +33 -0
- package/templates/business-starter/instructions.md +40 -0
- package/templates/business-starter/memory.md +31 -0
- package/templates/business-starter/persona.md +26 -0
- package/templates/business-starter/policies/LESSONS.md +5 -0
- package/templates/business-starter/policies/REWARD.md +24 -0
- package/templates/business-starter/reports/README.md +17 -0
- package/templates/business-starter/reports/operating-recap-template.md +44 -0
- package/templates/business-starter/skills/README.md +21 -0
- package/templates/business-starter/team/README.md +20 -0
- package/templates/business-starter/team/START_HERE.md +45 -0
- package/templates/business-starter/team/_template/MEMBER.md +32 -0
- package/templates/business-starter/team/_template/SOUL.md +40 -0
- package/templates/business-starter/team/comms/MEMBER.md +34 -0
- package/templates/business-starter/team/comms/SOUL.md +32 -0
- package/templates/business-starter/team/operator/MEMBER.md +34 -0
- package/templates/business-starter/team/ops/MEMBER.md +34 -0
- package/templates/business-starter/team/ops/SOUL.md +32 -0
- package/templates/business-starter/team/research/MEMBER.md +34 -0
- package/templates/business-starter/team/research/SOUL.md +32 -0
- package/templates/business-starter/team/validator/MEMBER.md +34 -0
- package/templates/business-starter/wiki/STATUS.md +7 -0
- package/templates/business-starter/wiki/concepts/first-loop-template.md +34 -0
- package/templates/business-starter/wiki/index.md +30 -0
- package/templates/business-starter/wiki/log.md +11 -0
- package/templates/business-starter/wiki/wiki.md +26 -0
- package/templates/research-canonical/CLAUDE.md +70 -0
- package/templates/research-canonical/MAP.md +68 -0
- package/templates/research-canonical/MEMBER.md +46 -0
- package/templates/research-canonical/TODO.md +28 -0
- package/templates/research-canonical/atris.md +62 -0
- package/templates/research-canonical/context/README.md +21 -0
- package/templates/research-canonical/context/live-workspace.md +24 -0
- package/templates/research-canonical/goals.md +23 -0
- package/templates/research-canonical/instructions.md +40 -0
- package/templates/research-canonical/memory.md +31 -0
- package/templates/research-canonical/persona.md +26 -0
- package/templates/research-canonical/policies/LESSONS.md +5 -0
- package/templates/research-canonical/policies/REWARD.md +21 -0
- package/templates/research-canonical/reports/README.md +17 -0
- package/templates/research-canonical/skills/README.md +21 -0
- package/templates/research-canonical/team/README.md +11 -0
- package/templates/research-canonical/team/eval/MEMBER.md +16 -0
- package/templates/research-canonical/team/eval/SOUL.md +32 -0
- package/templates/research-canonical/team/experiment/MEMBER.md +16 -0
- package/templates/research-canonical/team/experiment/SOUL.md +32 -0
- package/templates/research-canonical/team/hypothesis/MEMBER.md +16 -0
- package/templates/research-canonical/team/hypothesis/SOUL.md +32 -0
- package/templates/research-canonical/team/literature/MEMBER.md +16 -0
- package/templates/research-canonical/team/literature/SOUL.md +32 -0
- package/templates/research-canonical/wiki/STATUS.md +7 -0
- package/templates/research-canonical/wiki/briefs/research-program.md +19 -0
- package/templates/research-canonical/wiki/concepts/research-loop.md +14 -0
- package/templates/research-canonical/wiki/index.md +25 -0
- package/templates/research-canonical/wiki/log.md +10 -0
- package/templates/research-canonical/wiki/wiki.md +26 -0
package/commands/sync.js
CHANGED
|
@@ -172,6 +172,85 @@ function ensureWorkspaceStateFiles(targetRoot, params, options = {}) {
|
|
|
172
172
|
return created;
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
+
function renderBusinessAgentAdapter(bizMeta = {}, targetRoot = '.') {
|
|
176
|
+
const name = bizMeta.name || bizMeta.slug || 'this business';
|
|
177
|
+
const slug = bizMeta.slug || 'business';
|
|
178
|
+
const rootHint = targetRoot || '.';
|
|
179
|
+
return [
|
|
180
|
+
`# AGENTS.md - ${name} Atris Workspace`,
|
|
181
|
+
'',
|
|
182
|
+
`You are operating inside the shared Atris workspace for ${name} (${slug}).`,
|
|
183
|
+
'',
|
|
184
|
+
'## Start Here',
|
|
185
|
+
'',
|
|
186
|
+
'Run these first from the workspace root:',
|
|
187
|
+
'',
|
|
188
|
+
'```bash',
|
|
189
|
+
'atris',
|
|
190
|
+
'atris business start',
|
|
191
|
+
'atris radar',
|
|
192
|
+
'atris task next',
|
|
193
|
+
'atris member activate operator',
|
|
194
|
+
'```',
|
|
195
|
+
'',
|
|
196
|
+
'If no active mission exists, start the first bounded business loop:',
|
|
197
|
+
'',
|
|
198
|
+
'```bash',
|
|
199
|
+
'atris mission status --status active --json',
|
|
200
|
+
`atris mission start "Run the first useful loop for ${name}" --owner operator --runner codex_goal --lane business --verify "atris business check" --stop "first proof recap recorded"`,
|
|
201
|
+
'atris member goal-from-mission operator',
|
|
202
|
+
'atris do',
|
|
203
|
+
'```',
|
|
204
|
+
'',
|
|
205
|
+
'## Core Files',
|
|
206
|
+
'',
|
|
207
|
+
'| File | Purpose |',
|
|
208
|
+
'|------|---------|',
|
|
209
|
+
'| `atris/atris.md` | Workspace boot protocol |',
|
|
210
|
+
'| `atris/MAP.md` | Navigation and where-is-X index |',
|
|
211
|
+
'| `.atris/state/tasks.projection.json` | Current task projection |',
|
|
212
|
+
'| `atris/TODO.md` | Rendered task fallback only |',
|
|
213
|
+
'| `atris/team/START_HERE.md` | Team lanes and first-run flow |',
|
|
214
|
+
'| `atris/wiki/` | Business context and source-backed briefs |',
|
|
215
|
+
'| `atris/reports/` | Proof recaps and share handoffs |',
|
|
216
|
+
'',
|
|
217
|
+
'## Rules',
|
|
218
|
+
'',
|
|
219
|
+
'- Check `atris/MAP.md` before broad code or file search.',
|
|
220
|
+
'- Use `atris task` for ownership, notes, proof, and review state.',
|
|
221
|
+
'- Use `atris mission` when work should survive the current chat.',
|
|
222
|
+
'- Put completed agent work in Review with `atris task ready <id> --proof "<receipt>".`',
|
|
223
|
+
'- Do not run `atris task accept` or claim XP unless a human approved the proof.',
|
|
224
|
+
'- Do not mix another business into this workspace.',
|
|
225
|
+
'- No external sends, spend, or launches without operator approval.',
|
|
226
|
+
'',
|
|
227
|
+
'## Proof Loop',
|
|
228
|
+
'',
|
|
229
|
+
'```bash',
|
|
230
|
+
'atris business check',
|
|
231
|
+
'atris business record atris/reports/<recap>.md --outcome mixed --metric "operator speed"',
|
|
232
|
+
'atris business share --write',
|
|
233
|
+
'```',
|
|
234
|
+
'',
|
|
235
|
+
`Workspace root at creation: ${rootHint}`,
|
|
236
|
+
'',
|
|
237
|
+
].join('\n');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function ensureBusinessRootAgentAdapters(targetRoot, bizMeta = {}, options = {}) {
|
|
241
|
+
const dryRun = options.dryRun === true;
|
|
242
|
+
const written = [];
|
|
243
|
+
const adapter = renderBusinessAgentAdapter(bizMeta, targetRoot);
|
|
244
|
+
const files = ['AGENTS.md', 'CLAUDE.md', 'GEMINI.md'];
|
|
245
|
+
for (const file of files) {
|
|
246
|
+
const fullPath = path.join(targetRoot, file);
|
|
247
|
+
if (fs.existsSync(fullPath)) continue;
|
|
248
|
+
written.push(file);
|
|
249
|
+
if (!dryRun) fs.writeFileSync(fullPath, adapter, 'utf8');
|
|
250
|
+
}
|
|
251
|
+
return written;
|
|
252
|
+
}
|
|
253
|
+
|
|
175
254
|
/**
|
|
176
255
|
* Sync canonical business template files into a business workspace.
|
|
177
256
|
* Used when .atris/business.json is present (business mode).
|
|
@@ -243,6 +322,7 @@ function syncWorkspaceTemplate(targetRoot, bizMeta, options = {}) {
|
|
|
243
322
|
}
|
|
244
323
|
|
|
245
324
|
const stateAddedList = ensureWorkspaceStateFiles(targetRoot, params, { dryRun });
|
|
325
|
+
const agentAdapterList = ensureBusinessRootAgentAdapters(targetRoot, params, { dryRun });
|
|
246
326
|
|
|
247
327
|
// Skills: sync the canonical skill set from atris-cli package into the
|
|
248
328
|
// customer workspace. Business-starter template ships skill infra (README,
|
|
@@ -277,16 +357,34 @@ function syncWorkspaceTemplate(targetRoot, bizMeta, options = {}) {
|
|
|
277
357
|
stateAddedList.forEach(p => console.log(` + ${p}`));
|
|
278
358
|
console.log('');
|
|
279
359
|
}
|
|
360
|
+
if (agentAdapterList.length > 0) {
|
|
361
|
+
console.log(' Root agent adapters:');
|
|
362
|
+
agentAdapterList.forEach(p => console.log(` + ${p}`));
|
|
363
|
+
console.log('');
|
|
364
|
+
}
|
|
280
365
|
|
|
281
366
|
if (dryRun) {
|
|
282
367
|
console.log(' (--dry-run, no changes made)');
|
|
283
|
-
} else if (added === 0 && updated === 0 && stateAddedList.length === 0) {
|
|
368
|
+
} else if (added === 0 && updated === 0 && stateAddedList.length === 0 && agentAdapterList.length === 0) {
|
|
284
369
|
ensureWikiScaffold(targetRoot);
|
|
285
370
|
console.log(' ✓ Already up to date');
|
|
286
371
|
} else {
|
|
287
372
|
ensureWikiScaffold(targetRoot);
|
|
288
373
|
console.log(` ✓ Local workspace updated. Run \`atris align ${params.slug} --fix\` to push to EC2.`);
|
|
289
374
|
}
|
|
375
|
+
|
|
376
|
+
return {
|
|
377
|
+
added,
|
|
378
|
+
updated,
|
|
379
|
+
preserved,
|
|
380
|
+
skipped,
|
|
381
|
+
skillsUpdated,
|
|
382
|
+
addedList,
|
|
383
|
+
updatedList,
|
|
384
|
+
preservedList,
|
|
385
|
+
stateAddedList,
|
|
386
|
+
agentAdapterList,
|
|
387
|
+
};
|
|
290
388
|
}
|
|
291
389
|
|
|
292
390
|
function syncBusinessCanonical(targetRoot, bizMeta, options = {}) {
|
|
@@ -862,4 +960,6 @@ module.exports = {
|
|
|
862
960
|
syncWorkspaceTemplate,
|
|
863
961
|
resolveWorkspaceTemplate,
|
|
864
962
|
ensureWorkspaceStateFiles,
|
|
963
|
+
renderBusinessAgentAdapter,
|
|
964
|
+
ensureBusinessRootAgentAdapters,
|
|
865
965
|
};
|
package/lib/runtime-bootstrap.js
CHANGED
|
@@ -45,7 +45,10 @@ function buildRemoteAtrisBootstrapCommand(options = {}) {
|
|
|
45
45
|
'mkdir -p "$STATE_DIR"',
|
|
46
46
|
'RUNTIME_FILE="$STATE_DIR/runtime.json"',
|
|
47
47
|
'sanitize() { printf "%s" "$1" | tr "\\n\\r" " " | sed "s/[\\\\\\\"]/ /g" | cut -c1-160; }',
|
|
48
|
-
'
|
|
48
|
+
'LOCAL_NPM_PREFIX="$WORKSPACE/.atris-npm"',
|
|
49
|
+
'LOCAL_ATRIS_BIN="$LOCAL_NPM_PREFIX/node_modules/.bin/atris"',
|
|
50
|
+
'export PATH="$LOCAL_NPM_PREFIX/node_modules/.bin:/home/atris/bin:$PATH"',
|
|
51
|
+
'version_text() { if [ -x "$LOCAL_ATRIS_BIN" ]; then "$LOCAL_ATRIS_BIN" version 2>/dev/null || "$LOCAL_ATRIS_BIN" --version 2>/dev/null || true; elif command -v atris >/dev/null 2>&1; then atris version 2>/dev/null || atris --version 2>/dev/null || true; fi; }',
|
|
49
52
|
'BEFORE="$(sanitize "$(version_text)")"',
|
|
50
53
|
'[ -n "$BEFORE" ] || BEFORE="missing"',
|
|
51
54
|
'INSTALL_STATUS="skipped"',
|
|
@@ -54,19 +57,28 @@ function buildRemoteAtrisBootstrapCommand(options = {}) {
|
|
|
54
57
|
'if [ "${ATRIS_SKIP_RUNTIME_BOOTSTRAP:-}" = "1" ]; then',
|
|
55
58
|
' INSTALL_STATUS="skipped_env"',
|
|
56
59
|
'elif command -v npm >/dev/null 2>&1; then',
|
|
57
|
-
'
|
|
60
|
+
' mkdir -p "$LOCAL_NPM_PREFIX"',
|
|
61
|
+
' if npm install --prefix "$LOCAL_NPM_PREFIX" atris@latest >/tmp/atris-runtime-bootstrap-npm.log 2>&1; then',
|
|
58
62
|
' INSTALL_STATUS="installed_latest"',
|
|
63
|
+
' mkdir -p /home/atris/bin 2>/dev/null || true',
|
|
64
|
+
' ln -sf "$LOCAL_ATRIS_BIN" /home/atris/bin/atris 2>/dev/null || true',
|
|
59
65
|
' else',
|
|
60
66
|
' INSTALL_STATUS="failed"',
|
|
61
|
-
' RECOVERY_COMMAND="npm install -
|
|
67
|
+
' RECOVERY_COMMAND="npm install --prefix /workspace/.atris-npm atris@latest && /workspace/.atris-npm/node_modules/.bin/atris update"',
|
|
62
68
|
' fi',
|
|
63
69
|
'else',
|
|
64
70
|
' INSTALL_STATUS="failed_no_npm"',
|
|
65
|
-
' RECOVERY_COMMAND="install node/npm, then npm install -
|
|
71
|
+
' RECOVERY_COMMAND="install node/npm, then npm install --prefix /workspace/.atris-npm atris@latest"',
|
|
66
72
|
'fi',
|
|
67
73
|
'AFTER="$(sanitize "$(version_text)")"',
|
|
68
74
|
'[ -n "$AFTER" ] || AFTER="missing"',
|
|
69
|
-
'if
|
|
75
|
+
'if [ -x "$LOCAL_ATRIS_BIN" ] && [ -d "$WORKSPACE/atris" ]; then',
|
|
76
|
+
' if (cd "$WORKSPACE" && ATRIS_SKIP_UPDATE_CHECK=1 "$LOCAL_ATRIS_BIN" update >/tmp/atris-runtime-bootstrap-sync.log 2>&1); then',
|
|
77
|
+
' SYNC_STATUS="synced"',
|
|
78
|
+
' else',
|
|
79
|
+
' SYNC_STATUS="failed"',
|
|
80
|
+
' fi',
|
|
81
|
+
'elif command -v atris >/dev/null 2>&1 && [ -d "$WORKSPACE/atris" ]; then',
|
|
70
82
|
' if (cd "$WORKSPACE" && ATRIS_SKIP_UPDATE_CHECK=1 atris update >/tmp/atris-runtime-bootstrap-sync.log 2>&1); then',
|
|
71
83
|
' SYNC_STATUS="synced"',
|
|
72
84
|
' else',
|
package/lib/task-db.js
CHANGED
|
@@ -567,17 +567,38 @@ function reviewTask(db, { id, actor, reward, lesson, nextTask, proof, careerXpEl
|
|
|
567
567
|
const row = getTask(db, id);
|
|
568
568
|
if (!row) return { reviewed: false, reason: 'not_found' };
|
|
569
569
|
const numericReward = Number.isFinite(Number(reward)) ? Number(reward) : 0;
|
|
570
|
+
const now = Date.now();
|
|
571
|
+
const reviewer = actor || process.env.ATRIS_AGENT_ID || process.env.USER || null;
|
|
570
572
|
const metadata = row.metadata && typeof row.metadata === 'object' ? { ...row.metadata } : {};
|
|
573
|
+
const reviewingPendingProof = row.status === 'review'
|
|
574
|
+
&& metadata.approval_status === 'pending'
|
|
575
|
+
&& numericReward <= 0
|
|
576
|
+
&& metadata.agent_certified !== true;
|
|
577
|
+
let reviewPassCount = Number(metadata.agent_review_pass_count || 0);
|
|
578
|
+
if (reviewingPendingProof) {
|
|
579
|
+
reviewPassCount += 1;
|
|
580
|
+
metadata.agent_review_pass_count = reviewPassCount;
|
|
581
|
+
metadata.agent_reviewed_at = new Date(now).toISOString();
|
|
582
|
+
metadata.agent_reviewed_by = reviewer;
|
|
583
|
+
if (reviewPassCount >= AGENT_CERTIFICATION_REVIEW_PASSES) {
|
|
584
|
+
metadata.agent_certified = true;
|
|
585
|
+
metadata.agent_certified_at = new Date(now).toISOString();
|
|
586
|
+
metadata.agent_certified_by = reviewer;
|
|
587
|
+
metadata.agent_certification_policy = `${AGENT_CERTIFICATION_REVIEW_PASSES}_agent_review_passes`;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
571
590
|
if (numericReward > 0 && row.status === 'done') {
|
|
572
591
|
metadata.approval_status = 'accepted';
|
|
573
592
|
metadata.accepted_at = new Date().toISOString();
|
|
574
|
-
metadata.accepted_by =
|
|
593
|
+
metadata.accepted_by = reviewer;
|
|
594
|
+
}
|
|
595
|
+
if (reviewingPendingProof || (numericReward > 0 && row.status === 'done')) {
|
|
575
596
|
withBusyRetry(() => db.prepare(`
|
|
576
597
|
UPDATE tasks
|
|
577
598
|
SET metadata = ?,
|
|
578
599
|
updated_at = ?
|
|
579
600
|
WHERE id = ?
|
|
580
|
-
`).run(JSON.stringify(metadata),
|
|
601
|
+
`).run(JSON.stringify(metadata), now, id));
|
|
581
602
|
}
|
|
582
603
|
const payload = {
|
|
583
604
|
reward: numericReward,
|
|
@@ -586,6 +607,11 @@ function reviewTask(db, { id, actor, reward, lesson, nextTask, proof, careerXpEl
|
|
|
586
607
|
proof: String(proof || '').trim() || null,
|
|
587
608
|
career_xp_eligible: Boolean(careerXpEligible),
|
|
588
609
|
};
|
|
610
|
+
if (reviewingPendingProof) {
|
|
611
|
+
payload.review_pass_count = reviewPassCount;
|
|
612
|
+
payload.agent_certified = metadata.agent_certified === true;
|
|
613
|
+
payload.agent_certification_policy = metadata.agent_certification_policy || null;
|
|
614
|
+
}
|
|
589
615
|
const clearedReviewFields = Array.isArray(clearedFields)
|
|
590
616
|
? Array.from(new Set(clearedFields.filter(field => field === 'lesson' || field === 'next_task')))
|
|
591
617
|
: [];
|
|
@@ -593,7 +619,7 @@ function reviewTask(db, { id, actor, reward, lesson, nextTask, proof, careerXpEl
|
|
|
593
619
|
const event = appendTaskEvent(db, {
|
|
594
620
|
taskId: id,
|
|
595
621
|
workspaceRoot: row.workspace_root,
|
|
596
|
-
actor:
|
|
622
|
+
actor: reviewer,
|
|
597
623
|
eventType: 'reviewed',
|
|
598
624
|
payload,
|
|
599
625
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atris",
|
|
3
|
-
"version": "3.15.
|
|
3
|
+
"version": "3.15.48",
|
|
4
4
|
"main": "bin/atris.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"atris": "bin/atris.js",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"commands/",
|
|
14
14
|
"utils/",
|
|
15
15
|
"lib/",
|
|
16
|
+
"templates/",
|
|
16
17
|
"README.md",
|
|
17
18
|
"AGENTS.md",
|
|
18
19
|
"atris.md",
|
|
@@ -46,6 +47,7 @@
|
|
|
46
47
|
"atris/team/_template/MEMBER.md",
|
|
47
48
|
"atris/features/_templates/",
|
|
48
49
|
"atris/features/company-brain-sync/",
|
|
50
|
+
"templates/",
|
|
49
51
|
"atris/wiki/index.md",
|
|
50
52
|
"atris/wiki/concepts/agent-activation-contract.md",
|
|
51
53
|
"atris/wiki/concepts/workspace-initialization-contract.md",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# {{name}} — Atris Workspace
|
|
2
|
+
|
|
3
|
+
You are the AI operating partner for **{{name}}**.
|
|
4
|
+
|
|
5
|
+
## FIRST MESSAGE — MANDATORY
|
|
6
|
+
|
|
7
|
+
Before responding to the user's first message:
|
|
8
|
+
1. Read `atris/atris.md` (boot protocol)
|
|
9
|
+
2. Read `atris/MAP.md` (navigation)
|
|
10
|
+
3. Read `.atris/state/tasks.projection.json` if present; otherwise read `atris/TODO.md`
|
|
11
|
+
4. Read today's journal at `atris/logs/YYYY/YYYY-MM-DD.md`
|
|
12
|
+
5. Acknowledge what you've loaded in 1–2 lines, then respond
|
|
13
|
+
|
|
14
|
+
## MAPFIRST (Enforced)
|
|
15
|
+
|
|
16
|
+
Before ANY file search:
|
|
17
|
+
1. Read `atris/MAP.md`
|
|
18
|
+
2. Search for your keyword in MAP
|
|
19
|
+
3. If found → go directly to file:line
|
|
20
|
+
4. If not found → grep ONCE, then UPDATE MAP.md
|
|
21
|
+
|
|
22
|
+
**Never grep without checking MAP first.**
|
|
23
|
+
|
|
24
|
+
## Persona
|
|
25
|
+
|
|
26
|
+
See `atris/PERSONA.md` for voice, tone, and style.
|
|
27
|
+
|
|
28
|
+
## Core Loop
|
|
29
|
+
|
|
30
|
+
`atris plan` → `atris do` → `atris review`
|
|
31
|
+
|
|
32
|
+
## Mission Autonomy
|
|
33
|
+
|
|
34
|
+
Use `atris mission` when work should survive this chat or run as an autonomous loop.
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
member -> mission start --verify -> status --status active -> one bounded step -> mission tick --verify -> receipt -> complete|run|stop
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- Start current-agent work: `atris mission start "<objective>" --owner <member> --runner codex_goal --lane business --verify "<cmd>" --stop "<condition>"`
|
|
41
|
+
- Start headless Claude work: add `--runner claude --cadence "15m" --always-on`, then use `atris mission run <id> --max-ticks 4 --complete-on-pass`.
|
|
42
|
+
- Resume: `atris mission status --status active --json`, then pick the mission matching your owner/member.
|
|
43
|
+
- Prove: after one bounded step, run `atris mission tick <id> --verify --summary "<what changed>"`.
|
|
44
|
+
- Close: if the verifier passes, run `atris mission complete <id> --proof "<receipt_path>"`; if current-agent work should keep going, repeat status -> step -> tick.
|
|
45
|
+
|
|
46
|
+
## Wiki Reads — REQUIRED for domain questions
|
|
47
|
+
|
|
48
|
+
You have a compiled wiki at `atris/wiki/`:
|
|
49
|
+
- `atris/wiki/people/` — humans (employees, contacts, stakeholders)
|
|
50
|
+
- `atris/wiki/systems/` — tools, tables, dashboards, services, products
|
|
51
|
+
- `atris/wiki/concepts/` — patterns, frameworks, recurring ideas
|
|
52
|
+
- `atris/wiki/briefs/` — multi-page briefs and cross-cutting analyses
|
|
53
|
+
|
|
54
|
+
When asked anything domain-specific, **READ THE RELEVANT WIKI PAGE FIRST**. Cite the page in your answer. Do not answer from generic knowledge.
|
|
55
|
+
|
|
56
|
+
## Rules (Non-Negotiable)
|
|
57
|
+
|
|
58
|
+
- Plan = ASCII visualization + approval gate. Do not execute during planning.
|
|
59
|
+
- Execute step-by-step. Verify as you go.
|
|
60
|
+
- Update artifacts (`atris task`, MAP.md) when reality changes.
|
|
61
|
+
- Finish/review completed tasks (target state: task projection/TODO fallback = 0 active).
|
|
62
|
+
- Append to `atris/policies/LESSONS.md` after every significant discovery.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# {{name}} — Workspace Map
|
|
2
|
+
|
|
3
|
+
> Navigation index. Source of truth for where things live.
|
|
4
|
+
> Update this file when you discover or move things.
|
|
5
|
+
|
|
6
|
+
## Atris System
|
|
7
|
+
|
|
8
|
+
This folder is the default computer for the `{{name}}` business owner.
|
|
9
|
+
Keep owner metadata in `.atris/business.json`; keep computer memory, files, tools, and validation state in this workspace.
|
|
10
|
+
|
|
11
|
+
| Path | What |
|
|
12
|
+
|------|------|
|
|
13
|
+
| `atris/atris.md` | Boot protocol |
|
|
14
|
+
| `atris/MAP.md` | This file |
|
|
15
|
+
| `atris/TODO.md` | Active task queue |
|
|
16
|
+
| `atris/CLAUDE.md` | Claude Code persona |
|
|
17
|
+
| `atris/MEMBER.md` | Agent role definition |
|
|
18
|
+
| `atris/PERSONA.md` | Canonical voice and tone entrypoint |
|
|
19
|
+
| `atris/persona.md` | Compatibility mirror |
|
|
20
|
+
| `atris/instructions.md` | Workflows |
|
|
21
|
+
| `atris/goals.md` | Strategic direction |
|
|
22
|
+
| `atris/memory.md` | Learned context |
|
|
23
|
+
| `atris/logs/YYYY/` | Daily journals |
|
|
24
|
+
| `atris/policies/REWARD.md` | Local reward rubric for the first measurable loop |
|
|
25
|
+
| `atris/policies/LESSONS.md` | Append-only lessons |
|
|
26
|
+
|
|
27
|
+
## Wiki (Compiled Knowledge)
|
|
28
|
+
|
|
29
|
+
| Path | What |
|
|
30
|
+
|------|------|
|
|
31
|
+
| `atris/wiki/wiki.md` | Wiki protocol |
|
|
32
|
+
| `atris/wiki/index.md` | Catalog by page type |
|
|
33
|
+
| `atris/wiki/STATUS.md` | Wiki health snapshot |
|
|
34
|
+
| `atris/wiki/log.md` | Ingest history |
|
|
35
|
+
| `atris/wiki/people/` | Human profiles |
|
|
36
|
+
| `atris/wiki/systems/` | Tools, tables, services |
|
|
37
|
+
| `atris/wiki/concepts/` | Patterns and frameworks |
|
|
38
|
+
| `atris/wiki/concepts/first-loop-template.md` | Starter template for the first measurable loop |
|
|
39
|
+
| `atris/wiki/briefs/` | Cross-cutting briefs |
|
|
40
|
+
|
|
41
|
+
## Context (Raw Sources)
|
|
42
|
+
|
|
43
|
+
| Path | What |
|
|
44
|
+
|------|------|
|
|
45
|
+
| `atris/context/live-workspace.md` | Live ids, owner/computer model, and workspace separation rule |
|
|
46
|
+
| `atris/context/README.md` | Raw-source rules |
|
|
47
|
+
|
|
48
|
+
## Skills
|
|
49
|
+
|
|
50
|
+
| Path | What |
|
|
51
|
+
|------|------|
|
|
52
|
+
| `atris/skills/` | Custom callable skills |
|
|
53
|
+
|
|
54
|
+
## Team
|
|
55
|
+
|
|
56
|
+
| Path | What |
|
|
57
|
+
|------|------|
|
|
58
|
+
| `atris/team/` | Role lenses inside the shared business environment |
|
|
59
|
+
| `atris/team/START_HERE.md` | Collaborator guide for which member lane to wake first |
|
|
60
|
+
| `atris/team/_template/MEMBER.md` | Starter member template for real humans or new lanes |
|
|
61
|
+
| `atris/team/ops/MEMBER.md` | Default operating lane |
|
|
62
|
+
| `atris/team/operator/MEMBER.md` | Default owner for the business computer |
|
|
63
|
+
| `atris/team/validator/MEMBER.md` | Proof and cost-safety checker |
|
|
64
|
+
| `atris/team/comms/MEMBER.md` | Default communication lane |
|
|
65
|
+
| `atris/team/research/MEMBER.md` | Default research lane |
|
|
66
|
+
| `atris/team/README.md` | Team folder rules |
|
|
67
|
+
|
|
68
|
+
## Reports
|
|
69
|
+
|
|
70
|
+
| Path | What |
|
|
71
|
+
|------|------|
|
|
72
|
+
| `atris/reports/operating-recap-template.md` | Default artifact for the first real loop |
|
|
73
|
+
| `atris/reports/` | Past artifacts |
|
|
74
|
+
| `.atris/state/_sync.json` | Workspace sync receipt |
|
|
75
|
+
| `.atris/state/events.jsonl` | Raw event stream |
|
|
76
|
+
| `.atris/state/episodes.jsonl` | Episode log |
|
|
77
|
+
| `.atris/state/scorecards.jsonl` | Run summaries |
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
*This is a starter map. Add file:line references as you discover them.*
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: {{slug}}-agent
|
|
3
|
+
role: {{name}} Operating Partner
|
|
4
|
+
description: AI agent for the {{name}} business computer
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
can-read: true
|
|
9
|
+
can-execute: true
|
|
10
|
+
can-plan: true
|
|
11
|
+
can-delete: false
|
|
12
|
+
|
|
13
|
+
skills: []
|
|
14
|
+
tools: []
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# {{name}} Agent
|
|
18
|
+
|
|
19
|
+
You are the AI operating partner for **{{name}}**.
|
|
20
|
+
Treat this as the default computer for the **{{name}}** business owner.
|
|
21
|
+
The computer is the persistent environment: workspace + files + tools + secrets + memory + agents + validation loop.
|
|
22
|
+
Use the files under `atris/team/` as role lenses, not as separate fictional workers, unless the human explicitly asks for that framing.
|
|
23
|
+
|
|
24
|
+
## Activation
|
|
25
|
+
|
|
26
|
+
On activation:
|
|
27
|
+
1. Load `atris/MAP.md`, `atris/goals.md`, today's journal
|
|
28
|
+
2. Display the boot acknowledgment (see `atris/atris.md`)
|
|
29
|
+
3. Read the wiki index at `atris/wiki/index.md`
|
|
30
|
+
4. Ask: "What would you like to work on?"
|
|
31
|
+
|
|
32
|
+
## Workflow
|
|
33
|
+
|
|
34
|
+
Follow `atris plan → atris do → atris review`. Always:
|
|
35
|
+
1. **SCOUT:** Read relevant files first. Report findings.
|
|
36
|
+
2. **PLAN:** ASCII visualization, get approval, NO code yet.
|
|
37
|
+
3. **DO:** Execute step-by-step. Update journal.
|
|
38
|
+
4. **REVIEW:** Test, validate, clean up active task state. Completed rows are history.
|
|
39
|
+
|
|
40
|
+
## Persona
|
|
41
|
+
|
|
42
|
+
See `atris/PERSONA.md` for voice, tone, and style.
|
|
43
|
+
|
|
44
|
+
## Domain Knowledge
|
|
45
|
+
|
|
46
|
+
Always read the relevant `atris/wiki/` page before answering domain questions about {{name}}.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# {{name}} — Active Tasks
|
|
2
|
+
|
|
3
|
+
> Working task queue. Target state = 0.
|
|
4
|
+
> Daily tasks live in `atris/logs/YYYY/YYYY-MM-DD.md`.
|
|
5
|
+
|
|
6
|
+
## Endgame
|
|
7
|
+
|
|
8
|
+
**Slug:** first-business-loop
|
|
9
|
+
**Picked:** {{today}}
|
|
10
|
+
**Horizon:** Turn the starter into one real business loop with a measurable concept page, one named human, and one recap that writes structured state.
|
|
11
|
+
**Source:** workspace bootstrap
|
|
12
|
+
|
|
13
|
+
## Backlog
|
|
14
|
+
|
|
15
|
+
- **B1:** Create the first measurable loop page in `atris/wiki/concepts/` using `first-loop-template.md` [endgame]
|
|
16
|
+
**Verify:** test -n "$(find atris/wiki/concepts -maxdepth 1 -type f -name '*.md' ! -name 'first-loop-template.md' -print -quit)"
|
|
17
|
+
- **B2:** Add the first named human to both `atris/team/` and `atris/wiki/people/` [endgame]
|
|
18
|
+
**Verify:** test -n "$(find atris/team -mindepth 1 -maxdepth 1 -type d ! -name '_template' ! -name 'ops' ! -name 'comms' ! -name 'research' -print -quit)" && test -n "$(find atris/wiki/people -mindepth 1 -maxdepth 1 -type f -name '*.md' -print -quit)"
|
|
19
|
+
- **B3:** Write the first dated recap, then run `atris business record <report-path>` to append structured state entries [endgame]
|
|
20
|
+
**Verify:** test -n "$(find atris/reports -maxdepth 1 -type f -name '*.md' ! -name 'README.md' ! -name 'operating-recap-template.md' -print -quit)" && test -s .atris/state/events.jsonl && test -s .atris/state/episodes.jsonl && test -s .atris/state/scorecards.jsonl
|
|
21
|
+
|
|
22
|
+
## In Progress
|
|
23
|
+
|
|
24
|
+
(none)
|
|
25
|
+
|
|
26
|
+
## Completed
|
|
27
|
+
|
|
28
|
+
(clear)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Atris Boot Protocol — {{name}}
|
|
2
|
+
|
|
3
|
+
You are operating in the **{{name}}** Atris workspace.
|
|
4
|
+
|
|
5
|
+
## ON SESSION START
|
|
6
|
+
|
|
7
|
+
1. Read `atris/MAP.md` for navigation
|
|
8
|
+
2. Read `.atris/state/tasks.projection.json` if present; otherwise read `atris/TODO.md`
|
|
9
|
+
3. Read today's journal at `atris/logs/YYYY/YYYY-MM-DD.md`
|
|
10
|
+
4. Acknowledge what you have loaded, ask what to work on
|
|
11
|
+
|
|
12
|
+
## WORKFLOW
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
PLAN → DO → REVIEW
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- **PLAN:** Read context, propose approach as ASCII visualization. Stop. Wait for approval.
|
|
19
|
+
- **DO:** Execute step-by-step. Update artifacts (`atris task`, MAP.md) as reality changes.
|
|
20
|
+
- **REVIEW:** Verify, test, clean up. Finish/review the task. Append lessons to `atris/policies/LESSONS.md`.
|
|
21
|
+
|
|
22
|
+
## TASK SOURCE OF TRUTH
|
|
23
|
+
|
|
24
|
+
Use `atris task` when available. It stores durable local SQLite task state,
|
|
25
|
+
append-only task events, and refreshes `.atris/state/tasks.projection.json` for
|
|
26
|
+
desktop/web/agent views.
|
|
27
|
+
|
|
28
|
+
`atris/TODO.md` is the readable fallback/projection. It can be rebuilt with
|
|
29
|
+
`atris task render --out atris/TODO.md`; do not rely on manual TODO.md edits for
|
|
30
|
+
ownership. In cloud business workspaces, Supabase `tasks` is the source of truth
|
|
31
|
+
and Swarlo is the live claim/report layer.
|
|
32
|
+
|
|
33
|
+
## RULES
|
|
34
|
+
|
|
35
|
+
- **MAPFIRST.** Read `atris/MAP.md` before grepping. It's the index.
|
|
36
|
+
- **Plan before code.** No code during planning.
|
|
37
|
+
- **One step at a time.** Verify before continuing.
|
|
38
|
+
- **Finish completed tasks.** Target state: task projection/TODO fallback = 0 active items.
|
|
39
|
+
- **Append lessons, don't rewrite.** History is sacred.
|
|
40
|
+
- **Read atris/wiki/ pages before answering domain questions.** Cite the page in your answer.
|
|
41
|
+
|
|
42
|
+
## CORE FILES
|
|
43
|
+
|
|
44
|
+
| File | Purpose |
|
|
45
|
+
|------|---------|
|
|
46
|
+
| `atris/atris.md` | This file — boot protocol |
|
|
47
|
+
| `atris/MAP.md` | Navigation index |
|
|
48
|
+
| `.atris/state/tasks.projection.json` | Current task projection |
|
|
49
|
+
| `atris/TODO.md` | Rendered/legacy task fallback |
|
|
50
|
+
| `atris/MEMBER.md` | Agent role + permissions |
|
|
51
|
+
| `atris/persona.md` | Voice, tone, style |
|
|
52
|
+
| `atris/goals.md` | Strategic direction |
|
|
53
|
+
| `atris/memory.md` | Persistent learned context |
|
|
54
|
+
| `atris/instructions.md` | Workflows and processes |
|
|
55
|
+
| `atris/wiki/` | Compiled knowledge base |
|
|
56
|
+
| `atris/context/` | Raw source materials |
|
|
57
|
+
| `atris/skills/` | Custom callable skills |
|
|
58
|
+
| `atris/team/` | Team member profiles |
|
|
59
|
+
| `atris/reports/` | Past artifacts |
|
|
60
|
+
| `atris/policies/LESSONS.md` | Append-only lessons |
|
|
61
|
+
| `atris/logs/YYYY/YYYY-MM-DD.md` | Daily journal |
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Context — {{name}}
|
|
2
|
+
|
|
3
|
+
Raw source material for {{name}}.
|
|
4
|
+
`atris/` is the context graph, so structured source material belongs here, not in the workspace root.
|
|
5
|
+
|
|
6
|
+
## How to use
|
|
7
|
+
|
|
8
|
+
- Drop new sources here as files (`.md`, `.sql`, `.json`, etc.)
|
|
9
|
+
- Run `atris ingest <path>` to compile into the wiki
|
|
10
|
+
- Sources are **immutable** — never edit them after ingest. If a source changes, create a new dated copy.
|
|
11
|
+
- Files outside `atris/` should stay as boot shims, exports, or random scratch output only
|
|
12
|
+
|
|
13
|
+
## Suggested layout
|
|
14
|
+
|
|
15
|
+
- `company-overview.md` — mission, team, stage
|
|
16
|
+
- `people/` — one file per key stakeholder
|
|
17
|
+
- `sql/` — database queries (if applicable)
|
|
18
|
+
- `briefs/` — meeting notes, deal briefs
|
|
19
|
+
- Anything else relevant
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# {{name}} — Live Workspace
|
|
2
|
+
|
|
3
|
+
## Business
|
|
4
|
+
|
|
5
|
+
- ID: `{{business_id}}`
|
|
6
|
+
- Slug: `{{slug}}`
|
|
7
|
+
|
|
8
|
+
## Product Model
|
|
9
|
+
|
|
10
|
+
- Owner type: `Business`
|
|
11
|
+
- Entity type: `business`
|
|
12
|
+
- Computer type: `business_ops` by default
|
|
13
|
+
- Computer shape: workspace + files + tools + secrets + memory + agents + validation loop
|
|
14
|
+
- Group role: people, chat, membership, approvals, and visibility live in groups, not in the computer memory
|
|
15
|
+
|
|
16
|
+
## Workspace
|
|
17
|
+
|
|
18
|
+
- ID: `{{workspace_id}}`
|
|
19
|
+
|
|
20
|
+
## Separation Rule
|
|
21
|
+
|
|
22
|
+
This workspace should know {{name}}, not any other business.
|
|
23
|
+
Do not mix context across workspaces.
|
|
24
|
+
|
|
25
|
+
## Current Loop
|
|
26
|
+
|
|
27
|
+
- primary workflow: define the first measurable loop here
|
|
28
|
+
- primary operator: add the human approval surface here
|
|
29
|
+
- next artifact: add the first report, note, or recap artifact here
|
|
30
|
+
|
|
31
|
+
## Structured State
|
|
32
|
+
|
|
33
|
+
- `.atris/state/_sync.json` - workspace sync receipt
|
|
34
|
+
- `.atris/state/events.jsonl` - raw events
|
|
35
|
+
- `.atris/state/episodes.jsonl` - episodes
|
|
36
|
+
- `.atris/state/scorecards.jsonl` - scorecards
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# {{name}} — Goals
|
|
2
|
+
|
|
3
|
+
Strategic direction. Weeks-to-months scale (TODO.md is days, this is weeks).
|
|
4
|
+
|
|
5
|
+
## Active Goals
|
|
6
|
+
|
|
7
|
+
### Define the first measurable loop
|
|
8
|
+
- **Status:** Active
|
|
9
|
+
- **Why:** a business workspace gets useful when one workflow has clear state, action, and reward
|
|
10
|
+
- **Next step:** pick the first operator workflow and the artifact it should produce
|
|
11
|
+
- **Started:** YYYY-MM-DD
|
|
12
|
+
|
|
13
|
+
### Make the next operator decision faster
|
|
14
|
+
- **Status:** Active
|
|
15
|
+
- **Why:** the first win is decision quality, not folder size
|
|
16
|
+
- **Next step:** compile the shortest brief that supports the next real action
|
|
17
|
+
- **Started:** YYYY-MM-DD
|
|
18
|
+
|
|
19
|
+
<!-- Example:
|
|
20
|
+
### Increase advertiser retention to 95%
|
|
21
|
+
- **Status:** In progress (current: 87%)
|
|
22
|
+
- **Why:** Retention = revenue predictability
|
|
23
|
+
- **Next step:** Analyze churn patterns in Q1 data
|
|
24
|
+
- **Started:** 2026-04-08
|
|
25
|
+
-->
|
|
26
|
+
|
|
27
|
+
## Completed Goals
|
|
28
|
+
|
|
29
|
+
*(None yet)*
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
*Autonomous mode reads this file every cycle. Goals here drive prioritization.*
|