atris 3.15.44 → 3.15.46
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/commands/computer.js +1 -1
- package/commands/xp.js +84 -9
- package/lib/runtime-bootstrap.js +17 -5
- package/package.json +2 -1
- package/templates/business-starter/CLAUDE.md +62 -0
- package/templates/business-starter/MAP.md +80 -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 +17 -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/computer.js
CHANGED
|
@@ -1289,7 +1289,7 @@ async function bootstrapBusinessComputerRuntime(token, ctx, boundary = 'computer
|
|
|
1289
1289
|
const result = await runBusinessTerminalCommand(token, ctx, command, 120);
|
|
1290
1290
|
if (!result.ok) {
|
|
1291
1291
|
console.log(' Runtime: bootstrap could not run.');
|
|
1292
|
-
console.log(` Recovery: atris computer run "npm install -
|
|
1292
|
+
console.log(` Recovery: atris computer run "npm install --prefix /workspace/.atris-npm atris@latest && /workspace/.atris-npm/node_modules/.bin/atris update" --business ${ctx.slug || ctx.businessId} --workspace ${ctx.workspaceId}`);
|
|
1293
1293
|
return { ok: false, result };
|
|
1294
1294
|
}
|
|
1295
1295
|
|
package/commands/xp.js
CHANGED
|
@@ -10,6 +10,7 @@ const DEFAULT_GRAPH_DAYS = 365;
|
|
|
10
10
|
const INTENSITY_CHARS = [' ', '.', ':', '*', '#'];
|
|
11
11
|
const ROW_LABELS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
|
12
12
|
const TASK_EPISODES_FILE = path.join('.atris', 'state', 'task_episodes.jsonl');
|
|
13
|
+
const BUSINESS_BINDING_FILE = path.join('.atris', 'business.json');
|
|
13
14
|
const CAREER_XP_RECEIPTS_FILE = path.join('.atris', 'state', 'career_xp_receipts.jsonl');
|
|
14
15
|
const CAREER_XP_PROJECTION_FILE = path.join('.atris', 'state', 'career_xp.projection.json');
|
|
15
16
|
const CAREER_XP_CURSOR_FILE = path.join('.atris', 'state', 'career_xp.cursor.json');
|
|
@@ -1122,6 +1123,24 @@ function workspaceName(workspace) {
|
|
|
1122
1123
|
return path.basename(workspace) || workspace;
|
|
1123
1124
|
}
|
|
1124
1125
|
|
|
1126
|
+
function publicWorkspaceBinding(workspace) {
|
|
1127
|
+
const binding = readJsonFile(path.join(workspace, BUSINESS_BINDING_FILE), null);
|
|
1128
|
+
if (!binding || typeof binding !== 'object') return null;
|
|
1129
|
+
const businessId = String(binding.business_id || binding.id || '').trim();
|
|
1130
|
+
const workspaceId = String(binding.workspace_id || '').trim();
|
|
1131
|
+
const businessSlug = slugify(binding.slug || binding.business_slug || binding.name);
|
|
1132
|
+
const workspaceTemplate = slugify(binding.workspace_template || binding.organization_type || binding.computer_type);
|
|
1133
|
+
if (!businessId && !workspaceId && !businessSlug) return null;
|
|
1134
|
+
return {
|
|
1135
|
+
business_id: businessId || null,
|
|
1136
|
+
workspace_id: workspaceId || null,
|
|
1137
|
+
business_slug: businessSlug || null,
|
|
1138
|
+
workspace_template: workspaceTemplate || null,
|
|
1139
|
+
computer: businessSlug || workspaceName(workspace),
|
|
1140
|
+
computer_slug: businessSlug || slugify(workspaceName(workspace)),
|
|
1141
|
+
};
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1125
1144
|
function isVerifiedProjection(projection) {
|
|
1126
1145
|
return projection?.schema === 'atris.career_xp_projection.v1'
|
|
1127
1146
|
&& projection.integrity_status === 'verified'
|
|
@@ -1719,14 +1738,18 @@ function verifiedProjection(projection) {
|
|
|
1719
1738
|
|
|
1720
1739
|
function projectionWorkspaceSummaries(projection) {
|
|
1721
1740
|
if (Array.isArray(projection?.workspaces)) {
|
|
1722
|
-
return projection.workspaces.map(workspace =>
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1741
|
+
return projection.workspaces.map((workspace) => {
|
|
1742
|
+
const workspaceRoot = workspace.workspace_root || '';
|
|
1743
|
+
return {
|
|
1744
|
+
name: workspace.name || workspaceName(workspaceRoot || 'workspace'),
|
|
1745
|
+
workspace_root_hash: workspaceRoot ? sha256(path.resolve(workspaceRoot)) : null,
|
|
1746
|
+
included: Boolean(workspace.included),
|
|
1747
|
+
agent_xp: asNumber(workspace.total_xp),
|
|
1748
|
+
receipts_count: asNumber(workspace.receipts_count),
|
|
1749
|
+
integrity_status: workspace.integrity_status || 'unknown',
|
|
1750
|
+
...(workspaceRoot ? publicWorkspaceBinding(workspaceRoot) : null),
|
|
1751
|
+
};
|
|
1752
|
+
});
|
|
1730
1753
|
}
|
|
1731
1754
|
|
|
1732
1755
|
const workspaceRoot = projection?.workspace_root || path.resolve(process.cwd());
|
|
@@ -1737,9 +1760,43 @@ function projectionWorkspaceSummaries(projection) {
|
|
|
1737
1760
|
agent_xp: asNumber(projection?.total_agent_xp ?? projection?.total_xp),
|
|
1738
1761
|
receipts_count: asNumber(projection?.receipts_count),
|
|
1739
1762
|
integrity_status: projection?.integrity_status || projection?.integrity?.status || 'unknown',
|
|
1763
|
+
...publicWorkspaceBinding(workspaceRoot),
|
|
1740
1764
|
}];
|
|
1741
1765
|
}
|
|
1742
1766
|
|
|
1767
|
+
function uniqueTruthy(values) {
|
|
1768
|
+
return Array.from(new Set(values.map(value => String(value || '').trim()).filter(Boolean))).sort();
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
function syncAttribution(workspaces) {
|
|
1772
|
+
const included = workspaces.filter(workspace => workspace.included !== false);
|
|
1773
|
+
const scoped = included.length ? included : workspaces;
|
|
1774
|
+
const businessIds = uniqueTruthy(scoped.map(workspace => workspace.business_id));
|
|
1775
|
+
const workspaceIds = uniqueTruthy(scoped.map(workspace => workspace.workspace_id));
|
|
1776
|
+
const businessSlugs = uniqueTruthy(scoped.map(workspace => workspace.business_slug || workspace.computer_slug));
|
|
1777
|
+
const templates = uniqueTruthy(scoped.map(workspace => workspace.workspace_template));
|
|
1778
|
+
|
|
1779
|
+
if (businessIds.length > 1) {
|
|
1780
|
+
return { attribution_scope: 'multi_business', computer: 'multiple-workspaces' };
|
|
1781
|
+
}
|
|
1782
|
+
if (businessIds.length === 0 && scoped.length > 1 && businessSlugs.length > 1) {
|
|
1783
|
+
return { attribution_scope: 'multi_workspace', computer: 'multiple-workspaces' };
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
const businessId = businessIds[0] || null;
|
|
1787
|
+
const workspaceId = workspaceIds.length === 1 ? workspaceIds[0] : null;
|
|
1788
|
+
const businessSlug = businessSlugs.length === 1 ? businessSlugs[0] : null;
|
|
1789
|
+
const workspaceTemplate = templates.length === 1 ? templates[0] : null;
|
|
1790
|
+
return {
|
|
1791
|
+
attribution_scope: businessId || businessSlug ? 'business_bound' : 'workspace_only',
|
|
1792
|
+
business_id: businessId,
|
|
1793
|
+
workspace_id: workspaceId,
|
|
1794
|
+
business_slug: businessSlug,
|
|
1795
|
+
workspace_template: workspaceTemplate,
|
|
1796
|
+
computer: businessSlug || scoped[0]?.computer || scoped[0]?.name || 'local',
|
|
1797
|
+
};
|
|
1798
|
+
}
|
|
1799
|
+
|
|
1743
1800
|
function credentialHandle(credentials) {
|
|
1744
1801
|
return slugify(
|
|
1745
1802
|
credentials?.username
|
|
@@ -1798,6 +1855,7 @@ function buildAgentXpSyncPacket(args = []) {
|
|
|
1798
1855
|
: collectLocalXpProjection(projectionArgs);
|
|
1799
1856
|
const player = syncPlayer(args, projection);
|
|
1800
1857
|
const workspaces = projectionWorkspaceSummaries(projection);
|
|
1858
|
+
const attribution = syncAttribution(workspaces);
|
|
1801
1859
|
const totalXp = asNumber(projection.total_agent_xp ?? projection.agent_xp ?? projection.total_xp ?? projection.career_xp);
|
|
1802
1860
|
const receiptsCount = asNumber(projection.receipts_count);
|
|
1803
1861
|
const eligible = verifiedProjection(projection) && receiptsCount > 0 && totalXp > 0;
|
|
@@ -1825,7 +1883,12 @@ function buildAgentXpSyncPacket(args = []) {
|
|
|
1825
1883
|
schema: 'atris.agentxp_sync_packet.v1',
|
|
1826
1884
|
generated_at: new Date().toISOString(),
|
|
1827
1885
|
workspace_root_hash: workspaceRootHash,
|
|
1828
|
-
|
|
1886
|
+
attribution_scope: attribution.attribution_scope,
|
|
1887
|
+
business_id: attribution.business_id || null,
|
|
1888
|
+
workspace_id: attribution.workspace_id || null,
|
|
1889
|
+
business_slug: attribution.business_slug || null,
|
|
1890
|
+
workspace_template: attribution.workspace_template || null,
|
|
1891
|
+
computer: attribution.computer || projection.workspace_name || workspaces[0]?.name || 'local',
|
|
1829
1892
|
operator: player,
|
|
1830
1893
|
privacy: {
|
|
1831
1894
|
raw_proofs_included: false,
|
|
@@ -1840,6 +1903,12 @@ function buildAgentXpSyncPacket(args = []) {
|
|
|
1840
1903
|
local_evidence: {
|
|
1841
1904
|
schema: 'atris.agentxp_local_evidence.v1',
|
|
1842
1905
|
workspace_root_hash: workspaceRootHash,
|
|
1906
|
+
attribution_scope: attribution.attribution_scope,
|
|
1907
|
+
business_id: attribution.business_id || null,
|
|
1908
|
+
workspace_id: attribution.workspace_id || null,
|
|
1909
|
+
business_slug: attribution.business_slug || null,
|
|
1910
|
+
workspace_template: attribution.workspace_template || null,
|
|
1911
|
+
computer: attribution.computer || null,
|
|
1843
1912
|
workspaces,
|
|
1844
1913
|
verified_workspace_count: asNumber(projection.verified_workspace_count, verifiedProjection(projection) ? 1 : 0),
|
|
1845
1914
|
receipts_count: receiptsCount,
|
|
@@ -1864,6 +1933,12 @@ function buildAgentXpSyncPacket(args = []) {
|
|
|
1864
1933
|
gm_projection: {
|
|
1865
1934
|
schema: 'atris.gm_xp_projection.v1',
|
|
1866
1935
|
workspace_root_hash: workspaceRootHash,
|
|
1936
|
+
attribution_scope: attribution.attribution_scope,
|
|
1937
|
+
business_id: attribution.business_id || null,
|
|
1938
|
+
workspace_id: attribution.workspace_id || null,
|
|
1939
|
+
business_slug: attribution.business_slug || null,
|
|
1940
|
+
workspace_template: attribution.workspace_template || null,
|
|
1941
|
+
computer: attribution.computer || null,
|
|
1867
1942
|
operator: player,
|
|
1868
1943
|
player_score: {
|
|
1869
1944
|
agent_xp: totalXp,
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atris",
|
|
3
|
-
"version": "3.15.
|
|
3
|
+
"version": "3.15.46",
|
|
4
4
|
"main": "bin/atris.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"atris": "bin/atris.js",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"atris/team/_template/MEMBER.md",
|
|
47
47
|
"atris/features/_templates/",
|
|
48
48
|
"atris/features/company-brain-sync/",
|
|
49
|
+
"templates/",
|
|
49
50
|
"atris/wiki/index.md",
|
|
50
51
|
"atris/wiki/concepts/agent-activation-contract.md",
|
|
51
52
|
"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,80 @@
|
|
|
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/_template/MEMBER.md` | Starter member template for real humans or new lanes |
|
|
60
|
+
| `atris/team/ops/MEMBER.md` | Default operating lane |
|
|
61
|
+
| `atris/team/operator/MEMBER.md` | Default owner for the business computer |
|
|
62
|
+
| `atris/team/validator/MEMBER.md` | Proof and cost-safety checker |
|
|
63
|
+
| `atris/team/comms/MEMBER.md` | Default communication lane |
|
|
64
|
+
| `atris/team/research/MEMBER.md` | Default research lane |
|
|
65
|
+
| `atris/team/README.md` | Team folder rules |
|
|
66
|
+
|
|
67
|
+
## Reports
|
|
68
|
+
|
|
69
|
+
| Path | What |
|
|
70
|
+
|------|------|
|
|
71
|
+
| `atris/reports/operating-recap-template.md` | Default artifact for the first real loop |
|
|
72
|
+
| `atris/reports/` | Past artifacts |
|
|
73
|
+
| `.atris/state/_sync.json` | Workspace sync receipt |
|
|
74
|
+
| `.atris/state/events.jsonl` | Raw event stream |
|
|
75
|
+
| `.atris/state/episodes.jsonl` | Episode log |
|
|
76
|
+
| `.atris/state/scorecards.jsonl` | Run summaries |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
*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.*
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# {{name}} — Instructions
|
|
2
|
+
|
|
3
|
+
Standard processes and workflows.
|
|
4
|
+
|
|
5
|
+
## Default Cadence
|
|
6
|
+
|
|
7
|
+
1. Read MAP.md
|
|
8
|
+
2. Check today's journal
|
|
9
|
+
3. Plan → Do → Review
|
|
10
|
+
4. Update artifacts as you go
|
|
11
|
+
5. Keep all durable context under `atris/`; anything outside is boot glue or raw output
|
|
12
|
+
|
|
13
|
+
## Content Generation
|
|
14
|
+
|
|
15
|
+
1. Understand the goal
|
|
16
|
+
2. Check `atris/PERSONA.md` and recent journals
|
|
17
|
+
3. Generate draft
|
|
18
|
+
4. Refine: cut fluff, strengthen hooks
|
|
19
|
+
5. Cite sources from `atris/wiki/`
|
|
20
|
+
|
|
21
|
+
## Reporting
|
|
22
|
+
|
|
23
|
+
1. Check `atris/wiki/STATUS.md` for recent context
|
|
24
|
+
2. Synthesize from `atris/context/` sources
|
|
25
|
+
3. Highlight decisions and next steps
|
|
26
|
+
4. Save to `atris/reports/YYYY-MM-DD-topic.md`
|
|
27
|
+
|
|
28
|
+
## Domain Questions
|
|
29
|
+
|
|
30
|
+
When asked anything specific to {{name}}:
|
|
31
|
+
1. Read the relevant `atris/wiki/` page first
|
|
32
|
+
2. If the wiki is missing the answer, say so and propose what to ingest from `atris/context/`
|
|
33
|
+
3. Never answer from generic knowledge alone
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## First Loop
|
|
38
|
+
|
|
39
|
+
Start with one measurable business loop.
|
|
40
|
+
Define the state, the action, the reward, and the next check window before adding more tooling.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# {{name}} — Memory
|
|
2
|
+
|
|
3
|
+
Persistent learned context. Read before significant work.
|
|
4
|
+
|
|
5
|
+
## Tripwires
|
|
6
|
+
|
|
7
|
+
Things that look obvious but break unexpectedly.
|
|
8
|
+
|
|
9
|
+
*(none yet — add when you discover surprising failures)*
|
|
10
|
+
|
|
11
|
+
## Preferences
|
|
12
|
+
|
|
13
|
+
Patterns this business prefers.
|
|
14
|
+
|
|
15
|
+
*(none yet — document as you observe them)*
|
|
16
|
+
|
|
17
|
+
## Dead Ends
|
|
18
|
+
|
|
19
|
+
Approaches tried and abandoned, and why.
|
|
20
|
+
|
|
21
|
+
*(none yet — log failed approaches)*
|
|
22
|
+
|
|
23
|
+
## Domain Quirks
|
|
24
|
+
|
|
25
|
+
Business-specific facts that aren't obvious from the code.
|
|
26
|
+
|
|
27
|
+
*(none yet)*
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
*Update this file after significant discoveries. This is the long-term memory; LESSONS.md is the short-term log.*
|