atris 3.68.1 → 3.68.3

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 (41) hide show
  1. package/atris/skills/engines/SKILL.md +1 -1
  2. package/atris/team/customer-lead/MEMBER.md +1 -1
  3. package/atris/team/executor/MEMBER.md +19 -18
  4. package/atris/team/executor/skills/isolated-slice-builder/SKILL.md +21 -0
  5. package/atris/team/navigator/MEMBER.md +3 -1
  6. package/atris/team/navigator/skills/loophole-proof-planner/SKILL.md +20 -0
  7. package/atris/team/researcher/MEMBER.md +2 -1
  8. package/atris/team/researcher/skills/grounded-evidence-brief/SKILL.md +19 -0
  9. package/atris/team/validator/MEMBER.md +2 -7
  10. package/atris/team/validator/skills/cross-model-referee/SKILL.md +20 -0
  11. package/bin/atris.js +40 -1
  12. package/commands/autoland.js +2 -1
  13. package/commands/done.js +374 -0
  14. package/commands/engine.js +2 -2
  15. package/commands/goal.js +61 -2
  16. package/commands/land.js +34 -7
  17. package/commands/member.js +1542 -41
  18. package/commands/mission.js +506 -18
  19. package/commands/task.js +26 -3
  20. package/commands/workflow.js +1 -1
  21. package/commands/worktree.js +144 -34
  22. package/lib/auto-accept-certified.js +7 -6
  23. package/lib/codex-flight.js +6 -12
  24. package/lib/conductor-artifacts.js +3 -1
  25. package/lib/default-runner.js +42 -7
  26. package/lib/engine-ask.js +8 -1
  27. package/lib/engine-registry.js +17 -0
  28. package/lib/falsifier-probe.js +6 -0
  29. package/lib/first-minute.js +257 -6
  30. package/lib/fleet.js +163 -88
  31. package/lib/known-commands.js +1 -1
  32. package/lib/member-alive.js +1 -1
  33. package/lib/member-approval.js +153 -0
  34. package/lib/mission-task-gate.js +170 -0
  35. package/lib/one-lap-validator.js +2 -1
  36. package/lib/roster-runs.js +28 -0
  37. package/lib/runner-command.js +32 -8
  38. package/lib/task-db.js +25 -1
  39. package/package.json +9 -2
  40. package/scripts/det/ytnotes +49 -10
  41. package/utils/backend-root.js +4 -0
@@ -93,7 +93,7 @@ Smoke: `reply with the word OK`, run from `$HOME`, 120s cap, one at a time on a
93
93
  | Claude | `claude -p "<prompt>" --model claude-opus-5-5 --output-format json --no-session-persistence` | `claude-opus-5-5` | 2026-09-23 | 20.3 | `--model opus` also resolves to `claude-opus-5-5` today; pin the id for reproducibility. |
94
94
  | Codex | `codex exec --dangerously-bypass-approvals-and-sandbox --ephemeral -m gpt-6-sol -c model_reasoning_effort=high -o <result-file> "<prompt>" </dev/null` (run from the target repo/worktree; read-only: swap the bypass flag for `--sandbox read-only`) | `gpt-6-sol`, high | 2026-09-23 | 13.8 | Keep the `</dev/null`: with stdin open codex prints "Reading additional input from stdin..." and waits forever (observed 2026-09-23). Outside a git repo add `--skip-git-repo-check` or it exits 1 (re-checked 2026-09-23). Final answer lands in the `-o` file. Run as a tracked background Bash task; in one-shot `claude -p` workers run it in the FOREGROUND, a one-shot session never wakes again (2026-08-11). `codex-companion.mjs task --background` is deprecated: its job store never notifies the session (2026-08-10). |
95
95
  | Cursor | `cursor-agent --trust --model composer-2.5 -p "<prompt>"` (run from the target repo) | `composer-2.5` | 2026-09-23 | 37.5 | `--trust` required for non-interactive. |
96
- | Fable | `atris engine fable --timeout 120 --json "<question>"` | `claude-fable-5` | 2026-09-23 | 21.4 | Canonical read-only FABLE ask with receipt; scale `--timeout` to the work. |
96
+ | Fable | `atris engine fable --timeout 120 --json "<question>"` | `claude-fable-5-1` | not re-run on 5.1 (2026-09-23 on `claude-fable-5`) | 21.4 | Canonical read-only FABLE ask with receipt; scale `--timeout` to the work. |
97
97
  | Composer | `cursor-agent --trust --model composer-2.5 -p "<prompt>"` | `composer-2.5` via Cursor | 2026-09-23 | 37.5 | Same binary as Cursor. |
98
98
  | Haiku | `claude -p "<prompt>" --model claude-haiku-5-5 --output-format json --no-session-persistence` | `claude-haiku-5-5` | 2026-10-07 | 9.5 | Fast validation and bounded read-only checks. |
99
99
  | Devin (build) | `devin -p --permission-mode dangerous --model swe-2-max --prompt-file <brief>` (run from an isolated worktree) | `swe-2-max` (Free tag in `devin models list`, 2026-09-23) | 2026-09-23 | 14.0 | In `-p` mode the default permission mode rejects shell commands too, so even a read-only audit dies after one step (2026-09-23). Keep the brief outside the worktree. Long runs (5+ min) can print nothing even on success: judge by the worktree diff. `devin cloud` outlives this machine. |
@@ -2,7 +2,7 @@
2
2
  name: customer-lead
3
3
  role: Customer Lead
4
4
  description: Keeps customer commitments visible, spots retention risk, and turns evidence into the next useful follow-up.
5
- version: 1.0.0
5
+ version: 2.0.0
6
6
 
7
7
  skills:
8
8
  - customer-commitments
@@ -2,9 +2,10 @@
2
2
  name: executor
3
3
  role: Builder
4
4
  description: Execute from build specs, one step at a time
5
- version: 1.0.0
5
+ version: 2.0.0
6
6
 
7
7
  skills:
8
+ - isolated-slice-builder
8
9
  - code-writer
9
10
  - test-runner
10
11
 
@@ -40,16 +41,16 @@ tools: []
40
41
 
41
42
  ## Your Job
42
43
 
43
- When navigator hands you build.md:
44
+ When navigator or the orchestrator hands you a build spec or idea:
44
45
 
45
- 1. **Read build.md** — Exact files, steps, error cases
46
- 2. **Execute one step at a time** — Never batch multiple steps
47
- 3. **Show ASCII progress** — After each step, show what happened
48
- 4. **Wait for confirmation** — Human approves before next step
49
- 5. **Final summary** — When done, show ASCII completion status
50
- 6. **Keep wiki memory honest** — If the task changes durable project knowledge, update the relevant `atris/wiki/` page or note the source for immediate ingest
46
+ 1. **Read the spec and MAP.md**: Exact files, steps, and edge cases
47
+ 2. **Execute one bounded slice per loop**: Stay in the declared file scope
48
+ 3. **Prove with bare checks**: Run the real test command (`node --test ...`) and `git diff --check` before finishing
49
+ 4. **Pass cross-model review**: Fix any referee feedback before marking work ready for human review
50
+ 5. **Final summary**: Report exact files changed, check command run, and plain-language outcome
51
+ 6. **Keep wiki and member memory honest**: Append the lesson to `logs/<today>.md` and update `atris/MAP.md` when routes change
51
52
 
52
- **DO NOT skip steps. DO NOT batch. One shot at a time.**
53
+ **Never claim progress without a passing check. Stop for human approval only before destructive actions or out-of-scope refactors.**
53
54
 
54
55
  ---
55
56
 
@@ -114,15 +115,15 @@ If new evidence changes the task, stop and add a task note instead of forcing co
114
115
 
115
116
  ## Rules
116
117
 
117
- 1. **Read build.md first** — Never guess, always follow the spec
118
- 2. **One step at a time** — Show ASCII after each, wait for confirmation
119
- 3. **Check MAP.md** — Verify file paths exist, update if structure changed
120
- 4. **Run tests after changes** — Catch issues immediately
121
- 5. **Check wiki context** — Read `atris/wiki/STATUS.md` if present before executing in a known area
122
- 6. **No shortcuts** — Follow the build.md steps exactly
123
- 7. **Anti-slop aware** — Read `atris/policies/ANTISLOP.md` before writing. No sparkles, no filler, no purple prose.
124
- 8. **Stay in scope** — Only touch files listed in the task. If you need to change something outside scope, stop and flag it. That's a new task.
125
- 9. **If no exit condition, stop** — A task without a clear "done" definition is not ready for execution. Send it back to navigator.
118
+ 1. **Read build.md first**: Never guess, always follow the spec
119
+ 2. **One step at a time**: Show ASCII after each, wait for confirmation
120
+ 3. **Check MAP.md**: Verify file paths exist, update if structure changed
121
+ 4. **Run tests after changes**: Catch issues immediately
122
+ 5. **Check wiki context**: Read `atris/wiki/STATUS.md` if present before executing in a known area
123
+ 6. **No shortcuts**: Follow the build.md steps exactly
124
+ 7. **Anti-slop aware**: Read `atris/policies/ANTISLOP.md` before writing. No sparkles, no filler, no purple prose.
125
+ 8. **Stay in scope**: Only touch files listed in the task. If you need to change something outside scope, stop and flag it. That's a new task.
126
+ 9. **If no exit condition, stop**: A task without a clear "done" definition is not ready for execution. Send it back to navigator.
126
127
 
127
128
  ---
128
129
 
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: isolated-slice-builder
3
+ description: Build one bounded code slice in an isolated checkout, prove it with a bare test command and git diff --check, and update MAP.md before review.
4
+ version: 1.0.0
5
+ tags:
6
+ - build
7
+ - verification
8
+ - worktree
9
+ ---
10
+
11
+ # Isolated Slice Builder
12
+
13
+ Use this skill when building a feature slice or dispatched task in an isolated checkout.
14
+
15
+ ## Workflow
16
+
17
+ 1. Read `atris/MAP.md` to jump directly to the target `file:line` locations.
18
+ 2. Edit only the files required for the current slice, using Node built-ins only.
19
+ 3. Add or update a regression test that exercises the real runtime behavior.
20
+ 4. Run the bare test command (`node --test <file>`) and `git diff --check`.
21
+ 5. Update `atris/MAP.md` if any exported function or command route changed.
@@ -2,8 +2,10 @@
2
2
  name: navigator
3
3
  role: System Navigator
4
4
  description: Transform messy human intent into precise execution plans
5
- version: 1.0.0
5
+ version: 2.0.0
6
6
  agent-id: navigator-3
7
+ skills:
8
+ - loophole-proof-planner
7
9
  permissions:
8
10
  can-read: true
9
11
  can-plan: true
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: loophole-proof-planner
3
+ description: Turn messy operator intent into single-slice tasks with exact file:line pointers, falsifiable bare test commands, and explicit rollback plans.
4
+ version: 1.0.0
5
+ tags:
6
+ - planning
7
+ - navigation
8
+ - confidence-gate
9
+ ---
10
+
11
+ # Loophole Proof Planner
12
+
13
+ Use this skill when turning a broad idea or goal into an executable roadmap.
14
+
15
+ ## Workflow
16
+
17
+ 1. Read `atris/MAP.md` first to locate exact `file:line` references without blind searching.
18
+ 2. Split work touching 4 or more files into ordered single-slice tasks.
19
+ 3. Attach a bare runnable check command (`node --test <file>`) and a rollback step to every task.
20
+ 4. Close every loophole (missing owner, vague exit condition, unrunnable check) before handing off to `executor`.
@@ -2,9 +2,10 @@
2
2
  name: researcher
3
3
  role: Deep Researcher
4
4
  description: Find ground truth on any topic — competitors, standards, technologies, markets
5
- version: 1.0.0
5
+ version: 2.0.0
6
6
 
7
7
  skills:
8
+ - grounded-evidence-brief
8
9
  - deep-search
9
10
  - source-verification
10
11
 
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: grounded-evidence-brief
3
+ description: Answer open technical or product questions using primary sources, exact file:line citations, and one actionable recommendation.
4
+ version: 1.0.0
5
+ tags:
6
+ - research
7
+ - evidence
8
+ - decision
9
+ ---
10
+
11
+ # Grounded Evidence Brief
12
+
13
+ Use this skill when investigating an unknown, comparing approaches, or benchmarking options before building.
14
+
15
+ ## Workflow
16
+
17
+ 1. Check local repo code and receipts first before external sources.
18
+ 2. Cite exact `file:line` paths or primary URLs for every factual claim.
19
+ 3. End with one concrete recommendation and the member that should execute it.
@@ -2,9 +2,10 @@
2
2
  name: validator
3
3
  role: Reviewer
4
4
  description: Validate execution, run tests, ensure quality before shipping
5
- version: 1.0.0
5
+ version: 2.0.0
6
6
 
7
7
  skills:
8
+ - cross-model-referee
8
9
  - test-runner
9
10
  - doc-updater
10
11
 
@@ -30,12 +31,6 @@ tools: []
30
31
 
31
32
  **Validation:** Run `npm test` to verify changes work correctly.
32
33
 
33
- ## Project Context
34
-
35
- **Project Type:** nodejs (nodejs)
36
-
37
- **Validation:** Run `npm test` to verify changes work correctly.
38
-
39
34
  ---
40
35
 
41
36
  ## MAPFIRST (Before ANY Validation)
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: cross-model-referee
3
+ description: Audit worker diffs from an independent model perspective, run bare test commands, block slop or unverified claims, and emit actionable fix instructions.
4
+ version: 1.0.0
5
+ tags:
6
+ - review
7
+ - verification
8
+ - referee
9
+ ---
10
+
11
+ # Cross Model Referee
12
+
13
+ Use this skill when validating a plan before execution or auditing a worker diff before merge.
14
+
15
+ ## Workflow
16
+
17
+ 1. Inspect `git status` and `git diff` directly rather than trusting the worker's summary.
18
+ 2. Run the declared test check bare (`node --test <file>`) and verify zero new dependencies in `package.json`.
19
+ 3. Check that `atris/MAP.md` was updated if any file or command route changed.
20
+ 4. Emit a concrete pass verdict or bounce with the exact line and failure that must be fixed.
package/bin/atris.js CHANGED
@@ -6,6 +6,17 @@ process.on('unhandledRejection', (err) => {
6
6
  process.exit(1);
7
7
  });
8
8
 
9
+ // node:sqlite (task state) ships unflagged in Node 22.13. On older Node the
10
+ // first require crashes with ERR_UNKNOWN_BUILTIN_MODULE before any help prints.
11
+ {
12
+ const [major, minor] = process.versions.node.split('.').map(Number);
13
+ if (major < 22 || (major === 22 && minor < 13)) {
14
+ console.error(`atris needs Node 22.13 or newer. this is Node ${process.versions.node}.`);
15
+ console.error('upgrade from https://nodejs.org, then run atris again.');
16
+ process.exit(1);
17
+ }
18
+ }
19
+
9
20
  const fs = require('fs');
10
21
  const path = require('path');
11
22
  const { exec, spawnSync } = require('child_process');
@@ -67,9 +78,14 @@ const {
67
78
  isBareAtrisFlag,
68
79
  isFirstTalkLine,
69
80
  isLeftoverVerbLook,
81
+ isWhatsNextLine,
70
82
  listUserVisibleWork,
83
+ loadLocalTasks,
71
84
  personName,
72
85
  renderFirstTalk,
86
+ renderWhatsNextAsk,
87
+ firstTalkBuilder,
88
+ shippedHumanStarter,
73
89
  shouldAutoInitFresh,
74
90
  } = require('../lib/first-minute');
75
91
 
@@ -501,6 +517,7 @@ function showHelpShort() {
501
517
  console.log(' atris later "..." remember without a room');
502
518
  console.log(' atris guide "..." translate your words');
503
519
  console.log(' atris do work already here');
520
+ console.log(' atris done land what your agent built');
504
521
  console.log(' atris spaceship Keep working for a few hours');
505
522
  console.log(' atris autopilot Keep working until you stop');
506
523
  console.log(' atris mission the one goal');
@@ -512,6 +529,7 @@ function helpCatalog() {
512
529
  return [
513
530
  { name: 'init', summary: 'scaffold atris/ in this project', json: false, interactive_risk: 'medium' },
514
531
  { name: 'guide', summary: 'translate plain english into the right atris move', json: true, interactive_risk: 'none' },
532
+ { name: 'done', summary: 'land what your coding agent built: check, accept, sign', json: true, interactive_risk: 'low' },
515
533
  { name: 'task', summary: 'local task plane: new, claim, ready, accept', json: true, interactive_risk: 'low' },
516
534
  { name: 'review', summary: 'validate work and capture learnings', json: false, interactive_risk: 'low' },
517
535
  { name: 'recap', summary: 'spoken recap of what your team did', json: true, interactive_risk: 'low' },
@@ -532,6 +550,7 @@ function showHelpAll() {
532
550
  console.log(' atris later "..." remember without a room');
533
551
  console.log(' atris guide "..." translate your words');
534
552
  console.log(' atris do work already here');
553
+ console.log(' atris done land what your agent built');
535
554
  console.log(' atris spaceship Keep working for a few hours');
536
555
  console.log(' atris autopilot Keep working until you stop');
537
556
  console.log(' atris mission the one goal');
@@ -1430,7 +1449,7 @@ async function interactiveEntry(userInput, options = {}) {
1430
1449
  return 0;
1431
1450
  }
1432
1451
  console.log('');
1433
- console.log(renderFirstTalk({ person: who, folder: room, starter }));
1452
+ console.log(renderFirstTalk({ person: who, folder: room, starter, builder: firstTalkBuilder() }));
1434
1453
  return 0;
1435
1454
  }
1436
1455
 
@@ -1519,6 +1538,23 @@ async function interactiveEntry(userInput, options = {}) {
1519
1538
  // Placeholder or missing MAP is already a first-minute job. Do not send the
1520
1539
  // operator to a rewrite lobby, and do not treat `test` as a new first task.
1521
1540
  if (mapStatus !== 'ready') {
1541
+ // A person who already shipped their first want here can say the next one.
1542
+ // It becomes their new task, the same way the first one did.
1543
+ const nextWant = String(userInput || '').trim();
1544
+ const shipped = nextWant && !options.asJson ? shippedHumanStarter(loadLocalTasks(workspaceDir)) : null;
1545
+ if (shipped && !isLeftoverVerbLook(nextWant) && !isFlagLikeAnswer(nextWant) && !isAtrisMetaQuestion(nextWant)) {
1546
+ const who = personName();
1547
+ const room = folderName(workspaceDir);
1548
+ console.log('');
1549
+ if (isWhatsNextLine(nextWant) || isFirstTalkLine(nextWant)) {
1550
+ console.log(renderWhatsNextAsk({ person: who, task: shipped, folder: room }));
1551
+ return 0;
1552
+ }
1553
+ saveContextProfile(workspaceDir, nextWant, { source: 'next_talk' });
1554
+ const starter = createStarterTask(workspaceDir, nextWant);
1555
+ console.log(renderFirstTalk({ person: who, folder: room, starter, builder: firstTalkBuilder() }));
1556
+ return 0;
1557
+ }
1522
1558
  const screenOptions = {
1523
1559
  root: workspaceDir,
1524
1560
  context,
@@ -2229,6 +2265,9 @@ if (command === 'guide') {
2229
2265
  } else if (command === 'later') {
2230
2266
  const laterCode = require('../commands/later').laterAtris(process.argv.slice(3));
2231
2267
  process.exit(Number.isInteger(laterCode) ? laterCode : 0);
2268
+ } else if (command === 'done') {
2269
+ const doneCode = require('../commands/done').doneAtris(process.argv.slice(3));
2270
+ process.exit(Number.isInteger(doneCode) ? doneCode : 0);
2232
2271
  } else if (command === 'activate') {
2233
2272
  const args = process.argv.slice(3);
2234
2273
  if (args.includes('--help') || args.includes('-h') || args[0] === 'help') {
@@ -379,6 +379,7 @@ function sweepLanding(root, { ttlDays, staleHours, now = Date.now() } = {}) {
379
379
  remote: false,
380
380
  includeDetached: false,
381
381
  now,
382
+ by: 'atris autoland',
382
383
  });
383
384
  const afterBoard = collectBoard(root, { ttlDays, staleHours, now, light: true });
384
385
  const human = [];
@@ -926,7 +927,7 @@ async function runTickBody(root, { json, policy, receipt, engineValidationDeps =
926
927
  }
927
928
  try {
928
929
  const { cleanupWorktrees } = require('./worktree');
929
- const cleaned = cleanupWorktrees({ root, apply: true });
930
+ const cleaned = cleanupWorktrees({ root, apply: true, by: 'atris autoland' });
930
931
  receipt.worktrees_reaped = cleaned.removed.length;
931
932
  if (cleaned.removed.length > 0) receipt.worktrees_reaped_paths = cleaned.removed.map((w) => w.path);
932
933
  } catch (err) {