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.
Files changed (66) hide show
  1. package/commands/computer.js +1 -1
  2. package/commands/xp.js +84 -9
  3. package/lib/runtime-bootstrap.js +17 -5
  4. package/package.json +2 -1
  5. package/templates/business-starter/CLAUDE.md +62 -0
  6. package/templates/business-starter/MAP.md +80 -0
  7. package/templates/business-starter/MEMBER.md +46 -0
  8. package/templates/business-starter/TODO.md +28 -0
  9. package/templates/business-starter/atris.md +61 -0
  10. package/templates/business-starter/context/README.md +19 -0
  11. package/templates/business-starter/context/live-workspace.md +36 -0
  12. package/templates/business-starter/goals.md +33 -0
  13. package/templates/business-starter/instructions.md +40 -0
  14. package/templates/business-starter/memory.md +31 -0
  15. package/templates/business-starter/persona.md +26 -0
  16. package/templates/business-starter/policies/LESSONS.md +5 -0
  17. package/templates/business-starter/policies/REWARD.md +24 -0
  18. package/templates/business-starter/reports/README.md +17 -0
  19. package/templates/business-starter/reports/operating-recap-template.md +44 -0
  20. package/templates/business-starter/skills/README.md +21 -0
  21. package/templates/business-starter/team/README.md +17 -0
  22. package/templates/business-starter/team/_template/MEMBER.md +32 -0
  23. package/templates/business-starter/team/_template/SOUL.md +40 -0
  24. package/templates/business-starter/team/comms/MEMBER.md +34 -0
  25. package/templates/business-starter/team/comms/SOUL.md +32 -0
  26. package/templates/business-starter/team/operator/MEMBER.md +34 -0
  27. package/templates/business-starter/team/ops/MEMBER.md +34 -0
  28. package/templates/business-starter/team/ops/SOUL.md +32 -0
  29. package/templates/business-starter/team/research/MEMBER.md +34 -0
  30. package/templates/business-starter/team/research/SOUL.md +32 -0
  31. package/templates/business-starter/team/validator/MEMBER.md +34 -0
  32. package/templates/business-starter/wiki/STATUS.md +7 -0
  33. package/templates/business-starter/wiki/concepts/first-loop-template.md +34 -0
  34. package/templates/business-starter/wiki/index.md +30 -0
  35. package/templates/business-starter/wiki/log.md +11 -0
  36. package/templates/business-starter/wiki/wiki.md +26 -0
  37. package/templates/research-canonical/CLAUDE.md +70 -0
  38. package/templates/research-canonical/MAP.md +68 -0
  39. package/templates/research-canonical/MEMBER.md +46 -0
  40. package/templates/research-canonical/TODO.md +28 -0
  41. package/templates/research-canonical/atris.md +62 -0
  42. package/templates/research-canonical/context/README.md +21 -0
  43. package/templates/research-canonical/context/live-workspace.md +24 -0
  44. package/templates/research-canonical/goals.md +23 -0
  45. package/templates/research-canonical/instructions.md +40 -0
  46. package/templates/research-canonical/memory.md +31 -0
  47. package/templates/research-canonical/persona.md +26 -0
  48. package/templates/research-canonical/policies/LESSONS.md +5 -0
  49. package/templates/research-canonical/policies/REWARD.md +21 -0
  50. package/templates/research-canonical/reports/README.md +17 -0
  51. package/templates/research-canonical/skills/README.md +21 -0
  52. package/templates/research-canonical/team/README.md +11 -0
  53. package/templates/research-canonical/team/eval/MEMBER.md +16 -0
  54. package/templates/research-canonical/team/eval/SOUL.md +32 -0
  55. package/templates/research-canonical/team/experiment/MEMBER.md +16 -0
  56. package/templates/research-canonical/team/experiment/SOUL.md +32 -0
  57. package/templates/research-canonical/team/hypothesis/MEMBER.md +16 -0
  58. package/templates/research-canonical/team/hypothesis/SOUL.md +32 -0
  59. package/templates/research-canonical/team/literature/MEMBER.md +16 -0
  60. package/templates/research-canonical/team/literature/SOUL.md +32 -0
  61. package/templates/research-canonical/wiki/STATUS.md +7 -0
  62. package/templates/research-canonical/wiki/briefs/research-program.md +19 -0
  63. package/templates/research-canonical/wiki/concepts/research-loop.md +14 -0
  64. package/templates/research-canonical/wiki/index.md +25 -0
  65. package/templates/research-canonical/wiki/log.md +10 -0
  66. package/templates/research-canonical/wiki/wiki.md +26 -0
@@ -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 -g atris@latest" --business ${ctx.slug || ctx.businessId} --workspace ${ctx.workspaceId}`);
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
- name: workspace.name || workspaceName(workspace.workspace_root || 'workspace'),
1724
- workspace_root_hash: workspace.workspace_root ? sha256(path.resolve(workspace.workspace_root)) : null,
1725
- included: Boolean(workspace.included),
1726
- agent_xp: asNumber(workspace.total_xp),
1727
- receipts_count: asNumber(workspace.receipts_count),
1728
- integrity_status: workspace.integrity_status || 'unknown',
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
- computer: projection.workspace_name || workspaces[0]?.name || 'local',
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,
@@ -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
- 'version_text() { if command -v atris >/dev/null 2>&1; then atris version 2>/dev/null || atris --version 2>/dev/null || true; fi; }',
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
- ' if npm install -g atris@latest >/tmp/atris-runtime-bootstrap-npm.log 2>&1; then',
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 -g atris@latest"',
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 -g atris@latest"',
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 command -v atris >/dev/null 2>&1 && [ -d "$WORKSPACE/atris" ]; then',
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.44",
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.*