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.
- package/atris/skills/engines/SKILL.md +1 -1
- package/atris/team/customer-lead/MEMBER.md +1 -1
- package/atris/team/executor/MEMBER.md +19 -18
- package/atris/team/executor/skills/isolated-slice-builder/SKILL.md +21 -0
- package/atris/team/navigator/MEMBER.md +3 -1
- package/atris/team/navigator/skills/loophole-proof-planner/SKILL.md +20 -0
- package/atris/team/researcher/MEMBER.md +2 -1
- package/atris/team/researcher/skills/grounded-evidence-brief/SKILL.md +19 -0
- package/atris/team/validator/MEMBER.md +2 -7
- package/atris/team/validator/skills/cross-model-referee/SKILL.md +20 -0
- package/bin/atris.js +40 -1
- package/commands/autoland.js +2 -1
- package/commands/done.js +374 -0
- package/commands/engine.js +2 -2
- package/commands/goal.js +61 -2
- package/commands/land.js +34 -7
- package/commands/member.js +1542 -41
- package/commands/mission.js +506 -18
- package/commands/task.js +26 -3
- package/commands/workflow.js +1 -1
- package/commands/worktree.js +144 -34
- package/lib/auto-accept-certified.js +7 -6
- package/lib/codex-flight.js +6 -12
- package/lib/conductor-artifacts.js +3 -1
- package/lib/default-runner.js +42 -7
- package/lib/engine-ask.js +8 -1
- package/lib/engine-registry.js +17 -0
- package/lib/falsifier-probe.js +6 -0
- package/lib/first-minute.js +257 -6
- package/lib/fleet.js +163 -88
- package/lib/known-commands.js +1 -1
- package/lib/member-alive.js +1 -1
- package/lib/member-approval.js +153 -0
- package/lib/mission-task-gate.js +170 -0
- package/lib/one-lap-validator.js +2 -1
- package/lib/roster-runs.js +28 -0
- package/lib/runner-command.js +32 -8
- package/lib/task-db.js +25 -1
- package/package.json +9 -2
- package/scripts/det/ytnotes +49 -10
- 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,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:
|
|
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
|
|
44
|
+
When navigator or the orchestrator hands you a build spec or idea:
|
|
44
45
|
|
|
45
|
-
1. **Read
|
|
46
|
-
2. **Execute one
|
|
47
|
-
3. **
|
|
48
|
-
4. **
|
|
49
|
-
5. **Final summary
|
|
50
|
-
6. **Keep wiki memory honest
|
|
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
|
-
**
|
|
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
|
|
118
|
-
2. **One step at a time
|
|
119
|
-
3. **Check MAP.md
|
|
120
|
-
4. **Run tests after changes
|
|
121
|
-
5. **Check wiki context
|
|
122
|
-
6. **No shortcuts
|
|
123
|
-
7. **Anti-slop aware
|
|
124
|
-
8. **Stay in scope
|
|
125
|
-
9. **If no exit condition, stop
|
|
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:
|
|
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`.
|
|
@@ -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:
|
|
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') {
|
package/commands/autoland.js
CHANGED
|
@@ -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) {
|