atris 3.78.0 → 3.80.0
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/README.md +7 -0
- package/atris/atris.md +66 -167
- package/atris/skills/security-audit/SKILL.md +77 -0
- package/atris/team/brainstormer/MEMBER.md +2 -2
- package/atris.md +66 -167
- package/bin/atris.js +6 -0
- package/commands/brief.js +8 -2
- package/commands/business.js +44 -1984
- package/commands/gm.js +3 -0
- package/commands/member.js +189 -966
- package/commands/mission.js +229 -1409
- package/commands/pack.js +112 -1476
- package/commands/rating.js +2 -0
- package/commands/security-review.js +125 -0
- package/commands/task.js +137 -1359
- package/lib/business-core.js +2022 -0
- package/lib/engine-ask.js +1 -0
- package/lib/fleet.js +10 -0
- package/lib/handoff-wake.js +8 -6
- package/lib/held-autosweep.js +559 -0
- package/lib/held-pull-requests.js +42 -15
- package/lib/known-commands.js +1 -1
- package/lib/member-autoland.js +21 -2
- package/lib/member-board.js +12 -10
- package/lib/member-core.js +1014 -0
- package/lib/member-up.js +46 -3
- package/lib/mission-core.js +1559 -0
- package/lib/pack-core.js +1588 -0
- package/lib/security-audit-classes.js +300 -0
- package/lib/security-audit.js +1519 -0
- package/lib/task-core.js +1412 -0
- package/lib/task-db.js +70 -27
- package/lib/task-decision.js +66 -0
- package/lib/task-explanation.js +20 -0
- package/lib/yes-lock.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,6 +14,12 @@ Computer = workspace + files + tools + secrets + memory + agents + validation lo
|
|
|
14
14
|
|
|
15
15
|
A computer can be personal or shared by a business. It can run a job like code, research, CRM, reporting, event ops, support, or business ops.
|
|
16
16
|
|
|
17
|
+
## Memory for coding agents
|
|
18
|
+
|
|
19
|
+
Atris gives Claude Code, Codex, Cursor and any other agent a memory that lasts across sessions. The memory is plain files in your repo: `atris/MAP.md` (where everything lives, with file and line numbers), `atris/wiki/` (what the team learned, as pages linked with `[[page-name]]`), `atris/logs/` (what was done and checked each day), and `atris task` (open work, who claimed it, and the proof). Every agent reads the same files before it acts, so several agents and people share one memory, reviewed in git like code.
|
|
20
|
+
|
|
21
|
+
Mem0, Zep and Letta remember the users of a chat app. Atris remembers the project. Guide and comparison: https://atris.ai/blog/memory-for-coding-agents
|
|
22
|
+
|
|
17
23
|
## Quick Start
|
|
18
24
|
|
|
19
25
|
```bash
|
|
@@ -475,6 +481,7 @@ atris rating <member> # one member's rating here, next to its engine's
|
|
|
475
481
|
- Engines are rated in the combine: Loop Bench tasks from the atris repos, each graded by the tests that shipped with it. No engine is a 99 yet.
|
|
476
482
|
- Each engine's card also rates its Python tasks, its JavaScript tasks, the tasks the Atris prompt was never tuned on, and how rarely a try broke another test, with its median time and pay-per-use price per finished task.
|
|
477
483
|
- Members are rated on the same scale from the jobs they landed in your workspace over the last 30 days. Landed means accepted or merged; drops and abandons count against them. `atris gm` shows the same numbers.
|
|
484
|
+
- When a person merges a builder's pull request, the builder is usually credited within the hour, by an `atris brief`, `atris rating`, `atris gm` or flight that reaches GitHub; `atris task sweep --held` does it right away. `ATRIS_HELD_SWEEP=off` stops the automatic check.
|
|
478
485
|
- The session boot shows the build engine's rating, for example `build opus 5.5 (86 ovr)`. The combine grades building only, so review and search engines show none.
|
|
479
486
|
|
|
480
487
|
## Benchmark Harness
|
package/atris/atris.md
CHANGED
|
@@ -14,7 +14,7 @@ straight to the work):
|
|
|
14
14
|
1. Read:
|
|
15
15
|
- `atris/logs/YYYY/YYYY-MM-DD.md`: today's journal
|
|
16
16
|
- `atris/MAP.md`: navigation
|
|
17
|
-
- `atris/CLARITY.md` if present: how the operator works (voice, cadence, leash)
|
|
17
|
+
- `atris/CLARITY.md` if present: how the operator works (voice, cadence, leash)
|
|
18
18
|
- `atris/wiki/STATUS.md` if present: current memory snapshot
|
|
19
19
|
|
|
20
20
|
2. Show this box, then ask what to work on if no task was already given.
|
|
@@ -64,16 +64,14 @@ We have done a lot of great work, and because of it we will do even more.
|
|
|
64
64
|
|
|
65
65
|
Acknowledge each validated win, then go for the next one.
|
|
66
66
|
|
|
67
|
-
Scale ceremony to blast radius. Before a nontrivial change (new surface,
|
|
68
|
-
multi-file, migrations, anything hard to roll back), state:
|
|
67
|
+
Scale ceremony to blast radius. Before a nontrivial change (new surface, multi-file, migrations, anything hard to roll back), state:
|
|
69
68
|
- the goal
|
|
70
69
|
- the files or systems in scope
|
|
71
70
|
- what "done" means
|
|
72
71
|
- how it will be checked
|
|
73
72
|
- what happens if it fails
|
|
74
73
|
|
|
75
|
-
For a small bounded fix, the task's Exit and Verify fields carry this
|
|
76
|
-
restate them as ritual.
|
|
74
|
+
For a small bounded fix, the task's Exit and Verify fields carry this.
|
|
77
75
|
|
|
78
76
|
Then:
|
|
79
77
|
- when you begin work in a repo that has no `atris/` folder, run `npx -y atris init` before anything else, then read `atris/atris.md`
|
|
@@ -83,73 +81,57 @@ Then:
|
|
|
83
81
|
- do not take irreversible actions without approval from the human
|
|
84
82
|
- do not hide state outside markdown, logs, diffs, or the journal
|
|
85
83
|
- do not edit the rules that judge you: the reward config, the authority policy, or this file
|
|
86
|
-
- do not judge your own work: certification and acceptance require a review pass from an actor other than the builder; the tick's independent re-run counts, you do not (guarded)
|
|
84
|
+
- do not judge your own work: certification and acceptance require a review pass from an actor other than the builder; the tick's independent re-run counts, you do not (`guarded`)
|
|
87
85
|
|
|
88
86
|
If you cannot honor these rules, stop, write why in the journal, and ask the human before continuing.
|
|
89
87
|
|
|
90
|
-
Labels
|
|
91
|
-
- `guarded`: checked by code or a pre-commit hook; bypassing is a bug
|
|
92
|
-
- `expected`: convention; honor it or stop
|
|
88
|
+
Labels: `guarded` (checked by code or hook; bypassing is a bug) and `expected` (convention; honor it or stop).
|
|
93
89
|
|
|
94
90
|
## taste
|
|
95
91
|
|
|
96
|
-
What you ship should not read as generated.
|
|
92
|
+
What you ship should not read as generated. If someone would believe an AI made it at a glance, that is the bug.
|
|
97
93
|
|
|
98
|
-
- **Gate it.** `atris slop detect <path>` is deterministic:
|
|
99
|
-
- **Name the move.**
|
|
100
|
-
- **Refuse the wells
|
|
101
|
-
- **Commit to constraints.** One distinctive font, one accent hue, a small spacing scale. Taste is subtraction
|
|
102
|
-
- **Generate it right.** `atris deck`
|
|
103
|
-
- **Compound it.** A new tell becomes a typed lesson with a `detector:` regex
|
|
94
|
+
- **Gate it.** `atris slop detect <path>` is deterministic: exit 1 on a tell (file:line + rule), built for CI and review (`guarded`).
|
|
95
|
+
- **Name the move.** Direct with craft words: vertical rhythm, negative space, hierarchy, contrast, restraint.
|
|
96
|
+
- **Refuse the wells:** purple/indigo gradients, gradient-filled text, glassmorphism, Inter/Roboto defaults, claude-beige, neon-on-dark, hero-metric rows, identical card grids, eyebrow/tracked-caps labels, pulsing live-dots, em dashes.
|
|
97
|
+
- **Commit to constraints.** One distinctive font, one accent hue, a small spacing scale. Taste is subtraction.
|
|
98
|
+
- **Generate it right.** `atris deck` and the `design` policy use own backgrounds and fonts, never stock templates.
|
|
99
|
+
- **Compound it.** A new tell becomes a typed lesson with a `detector:` regex so the gate grows.
|
|
104
100
|
|
|
105
101
|
## voice
|
|
106
102
|
|
|
107
|
-
|
|
103
|
+
Output stays sharp no matter how big the context.
|
|
108
104
|
|
|
109
|
-
- **The way of talking.** Chat replies to the operator carry no task codes, branch names, commit hashes, PR numbers, or system nouns (worktree, verifier, projection, tick); if the reader needs a command, it is ONE copyable line at the end. Insider terms get defined in the same breath or cut.
|
|
105
|
+
- **The way of talking.** Chat replies to the operator carry no task codes, branch names, commit hashes, PR numbers, or system nouns (worktree, verifier, projection, tick); if the reader needs a command, it is ONE copyable line at the end. Insider terms get defined in the same breath or cut. Read it fried at 2am; if decoding takes work, rewrite. `AGENTS.md` and other adapters carry a copy of this block.
|
|
110
106
|
|
|
111
107
|
copy these shapes:
|
|
112
108
|
- **Status:** "The reply check is built. I am running the final checks now, so the result is not ready yet."
|
|
113
109
|
- **Landing:** "Replies now get a plain-language check before they reach you. The checks passed, and the change is ready."
|
|
114
110
|
- **Failure:** "The plain-language check could not run because its model was unavailable. Your reply still went through, so no work was blocked."
|
|
115
111
|
|
|
116
|
-
- **Lead with the move.** Answer first, support after. No preamble, no agreement reflex
|
|
117
|
-
- **Specific over buzzy.** Name the exact thing. If you
|
|
118
|
-
- **Cut filler.** Drop "it's worth noting", "in order to", "leverage", "seamless", "robust", "delve", stacked hedges, and em dashes. `atris slop` flags
|
|
119
|
-
- **Bound verbosity by information, not context.** Say the load-bearing thing and stop.
|
|
120
|
-
- **
|
|
121
|
-
- **
|
|
122
|
-
- **
|
|
123
|
-
- **
|
|
124
|
-
- **
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
- "The system reports in plain English: one daily message with what landed, what waits on you, and who should own what's next. One person can supervise many projects."
|
|
128
|
-
- **Fit the screen.** An operator-facing report shows three results, air between them, and holds the rest on ask. No scrolling: reading it is one glance, and the reader asks for more if they want more.
|
|
129
|
-
- **Pace with whitespace.** Words for the operator arrive as complete sentences, one or two per paragraph, blank line between. The whitespace does the pacing, never fragments: fast to scan, still flowing.
|
|
130
|
-
- **Assume attention is scarce and ambition is not.** The reader is at the end of a long day and still moving something big forward. Nothing may require held state (remembering step 2 while reading step 5), every surface ends in one obvious next action that starts in under a minute, and each glance should leave the reader one step closer. Engineers and non-engineers get the same plain sentence; precision stays one ask away, never in the way.
|
|
131
|
-
- **Human surfaces are gated.** Anything rendered for the operator (brief, digest, boot) goes through the operator-voice translator and a deterministic jargon gate; raw ids, commands, paths, and test tallies never reach a page. A gate violation is a build error, not a style note.
|
|
132
|
-
- **Interview the fuzz.** When the operator hands off a fuzzy build ("make me the best X", "yeah ok this is my thought, go make it"), do not ask open questions and do not dispatch as-is. Offer 2-3 named interpretations with a recommendation ("best could mean capture, resurfacing, or closure: I'd bet resurfacing, right?") so the operator confirms or corrects in five words. Repeat until the brief fits one screen (goal, why now, done-looks-like, open risks), show the brief, then dispatch. The interview lends the operator a structure to think in; the sharpened brief is what makes every downstream lap cheap.
|
|
133
|
-
|
|
134
|
-
`expected`: this is how an Atris agent writes and builds. Shipping slop or rambling is a failure smell, same as drift or a stale task.
|
|
112
|
+
- **Lead with the move.** Answer first, support after. No preamble, no agreement reflex.
|
|
113
|
+
- **Specific over buzzy.** Name the exact thing. If you cannot, go look first.
|
|
114
|
+
- **Cut filler.** Drop "it's worth noting", "in order to", "leverage", "seamless", "robust", "delve", stacked hedges, and em dashes. `atris slop` flags prose tells too.
|
|
115
|
+
- **Bound verbosity by information, not context.** Say the load-bearing thing and stop.
|
|
116
|
+
- **Specific AND workable.** Precise enough that another agent can act on it, plain enough that the operator gets it on a phone.
|
|
117
|
+
- **Every queue item earns its surface.** Every task title, mission objective, roadmap item, or tick summary carries its why in the same sentence: what it costs to skip or what it buys.
|
|
118
|
+
- **Day-one PM test.** Every sentence for the operator must make sense to a teammate who joined this morning. Detail stays one ask away.
|
|
119
|
+
- **Results are capabilities, not test counts.** State what someone can do now that they could not before, then what it means. Tests are one word ("verified"). Examples: "`atris autopilot` picks the next mission and keeps going until you say stop." or "Missions survive across engines and sessions."
|
|
120
|
+
- **Fit the screen and pace with whitespace.** Three results max, air between them, rest on ask. Complete sentences, one or two per paragraph, blank line between, ending in one obvious next action.
|
|
121
|
+
- **Human surfaces are gated.** Operator views (brief, digest, boot) go through the voice gate; raw ids, commands, paths, and test tallies are build errors.
|
|
122
|
+
- **Interview the fuzz.** On a fuzzy request ("make me the best X"), offer 2-3 named interpretations with a recommendation so the operator confirms in five words, then show a one-screen brief (goal, why now, done-looks-like, open risks) before dispatching.
|
|
135
123
|
|
|
136
124
|
## the ladder
|
|
137
125
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
- **
|
|
141
|
-
- **
|
|
142
|
-
- **A mission run** (`atris mission`): a goal that signed a contract: objective + owner + verifier + stop condition. Ends in hours or days. Any engine can tick it.
|
|
143
|
-
- **A campaign** (`atris campaign`): a measurable goal with a judge that fails today, worked by many mission runs until it passes. Hours to days.
|
|
126
|
+
- **The Mission** (`MISSION.md`): enduring purpose. Never ends.
|
|
127
|
+
- **Goals**: direction derived from the Mission. Points; does not commit.
|
|
128
|
+
- **A mission run** (`atris mission`): a bounded commitment (objective + owner + verifier + stop condition).
|
|
129
|
+
- **A campaign** (`atris campaign`): a measurable goal with a judge that fails today, worked by mission runs until it passes.
|
|
144
130
|
- **Tasks** (`atris task`): the smallest provable units. Receipts, then human accept.
|
|
145
|
-
- **Members** (`atris member`): the WHO. A role with memory and judgment doing one bounded
|
|
146
|
-
- **Loops** (`atris loops`): the WHEN. Clocks that
|
|
147
|
-
|
|
148
|
-
In one line: the Mission anchors, goals point, a mission run commits, tasks prove, accepts land; loops fire members to tick mission runs.
|
|
131
|
+
- **Members** (`atris member`): the WHO. A role with memory and judgment doing one bounded slice at a time.
|
|
132
|
+
- **Loops** (`atris loops`): the WHEN. Clocks that fire on cadence (exit 0 = healthy) and escalate failures to an owner.
|
|
149
133
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
Drift smells: a member goal tracing to no Mission is freelancing; a goal that never becomes a mission run is a wish; a run with no goal above it is busywork; a loop deciding what "done" means owns the wrong axis. A loop may run without a member, never without a witness: every loop names an owner, and its failure escalates to something with judgment.
|
|
134
|
+
The Mission anchors, goals point, a mission run commits, tasks prove, accepts land; loops fire members to tick mission runs. Never conflate permanent Mission with a bounded mission run.
|
|
153
135
|
|
|
154
136
|
## task source of truth
|
|
155
137
|
|
|
@@ -176,18 +158,11 @@ atris task finish <id> --proof "<tests, screenshot, diff, or receipt>"
|
|
|
176
158
|
atris task review <id> --lesson "<what improved>" --next "<next task>"
|
|
177
159
|
```
|
|
178
160
|
|
|
179
|
-
Headless agents should add `--json` where available and read
|
|
180
|
-
`.atris/state/tasks.projection.json` for a compact board view.
|
|
161
|
+
Headless agents should add `--json` where available and read `.atris/state/tasks.projection.json`.
|
|
181
162
|
|
|
182
|
-
Landing policy: when
|
|
183
|
-
(two independent review passes, real proof, safe verify re-run) lands itself
|
|
184
|
-
with a receipt; agents never run `atris task accept` themselves. Money,
|
|
185
|
-
deploys, security, customer, and outward-facing lanes always wait for the
|
|
186
|
-
human. `atris autoland` shows what lands alone and what waits.
|
|
187
|
-
Swarlo is the live coordination layer for claims, heartbeats, and reports; the
|
|
188
|
-
task row/event stream remains the durable source of truth.
|
|
163
|
+
Landing policy: when `atris autoland on` is set, certified work (two independent review passes, real proof, safe verify re-run) lands itself with a receipt; agents never run `atris task accept` themselves. Money, deploys, security, customer, and outward-facing lanes always wait for the human (`atris autoland` shows status). Swarlo coordinates live claims and heartbeats; the task DB is durable truth.
|
|
189
164
|
|
|
190
|
-
Every task record
|
|
165
|
+
Every task record carries:
|
|
191
166
|
|
|
192
167
|
```
|
|
193
168
|
What changes: <plain sentence a new teammate understands>
|
|
@@ -208,25 +183,9 @@ them unchanged and inspectable. If a creator omits a plain field, the shared
|
|
|
208
183
|
task model derives an honest fallback from the existing task and says when no
|
|
209
184
|
reason was recorded; it never invents a benefit.
|
|
210
185
|
|
|
211
|
-
A planned task
|
|
212
|
-
existing Plan -> Do gate, or ask for a change. Completed work shows approve
|
|
213
|
-
only when the existing proof and human-accept gates allow it, plus revise for
|
|
214
|
-
requested changes. The plain layer never bypasses a verifier or approval rule.
|
|
215
|
-
|
|
216
|
-
Task planning preview and landing:
|
|
217
|
-
|
|
218
|
-
```
|
|
219
|
-
Owner: <functional-member>
|
|
220
|
-
Plan: <one sentence on the intended change>
|
|
221
|
-
Done: <observable result>
|
|
222
|
-
Check: <verifier, receipt, or artifact proof>
|
|
223
|
-
```
|
|
186
|
+
A planned task offers approve (through the Plan -> Do gate) or ask for a change. Completed work offers approve only when proof and human-accept gates allow it, or revise.
|
|
224
187
|
|
|
225
|
-
Owner is accountable
|
|
226
|
-
`validator`, `launcher`, or a feature owner). Coding agent models like Codex and
|
|
227
|
-
Claude are not task owners; put them in the `executed_by` section when useful.
|
|
228
|
-
If no existing member fits, create a member-creation task instead of assigning
|
|
229
|
-
broad work to an engine or generic executor.
|
|
188
|
+
Owner is an accountable role (`task-planner`, `architect`, `mission-lead`, `validator`, `launcher`, or a feature owner); put models like Codex and Claude in `executed_by`.
|
|
230
189
|
|
|
231
190
|
| Field | Meaning | Enforcement |
|
|
232
191
|
|---|---|---|
|
|
@@ -236,45 +195,32 @@ broad work to an engine or generic executor.
|
|
|
236
195
|
| Verify | must exit 0 for the task to be complete | guarded (tick halts if missing) |
|
|
237
196
|
| Rollback | how to undo; `git revert <sha>` for most tasks | expected |
|
|
238
197
|
|
|
239
|
-
Deeper
|
|
240
|
-
|
|
241
|
-
Verify cannot be a raw shell shortcut; it must call a rubric or test that can fail before the work is done. Prefer `atris verify <slug> --section <name>`, which extracts the fenced bash under `## <name>` in `validate.md` and runs it. The rubric is read-only, deterministic, and references only the working tree.
|
|
198
|
+
Deeper feature work uses `atris/features/<slug>/` (`idea.md`, `build.md`, `validate.md`). Verify must call a real check or `atris verify <slug> --section <name>`, never a trivial shortcut.
|
|
242
199
|
|
|
243
200
|
## routing
|
|
244
201
|
|
|
245
|
-
|
|
202
|
+
Decide scope first:
|
|
246
203
|
- single project → route to that project's `atris/team/` and `atris task` queue
|
|
247
|
-
- crosses projects → route to `atris/team/cross-project-architect/` and plan
|
|
248
|
-
|
|
249
|
-
Then size it, before any tool runs. Ask one question: do I already know the steps?
|
|
250
|
-
- **Quick fix** (minutes): you know the file and the fix. Do it, run the tests that cover it, ship. No mission, no judge.
|
|
251
|
-
- **Mission** (an hour or a few): you know what done looks like and roughly how. One mission run, or a few across members (builder builds, validator checks).
|
|
252
|
-
- **Campaign** (hours to days): done is clear and measurable, the path is not, and it takes many tries. `atris campaign` with a judge that fails today; its missions do the work.
|
|
253
|
-
- **Purpose** (months to years): a standing campaign under the Mission. Its judge runs on a schedule, campaigns run under it, and each one's lessons and scored record feed the next. This is the self-improving loop.
|
|
204
|
+
- crosses projects → route to `atris/team/cross-project-architect/` and plan dependency order first
|
|
254
205
|
|
|
255
|
-
|
|
206
|
+
Then size it before running tools (do I already know the steps?):
|
|
207
|
+
- **Quick fix** (minutes): know the file and fix. Do it, run tests, ship.
|
|
208
|
+
- **Mission** (hours): know what done looks like and roughly how. Run `atris mission`.
|
|
209
|
+
- **Campaign** (hours to days): done is measurable, path takes many tries. Run `atris campaign` with a failing judge.
|
|
210
|
+
- **Purpose** (months+): standing campaign under the Mission whose lessons and scores feed the next run.
|
|
256
211
|
|
|
257
|
-
|
|
212
|
+
Never size up a quick fix into a campaign. `atris wish` is for imagining, not sizing.
|
|
258
213
|
|
|
259
214
|
## next
|
|
260
215
|
|
|
261
216
|
Move one task at a time through plan → do → review.
|
|
262
217
|
|
|
263
218
|
- **plan**: read relevant files, produce an ASCII visualization, wait for approval. No code.
|
|
264
|
-
- **plan-review**: the validator
|
|
265
|
-
- **do**: claim
|
|
266
|
-
- **review**: run
|
|
219
|
+
- **plan-review**: the validator signs off with `SIGNOFF:` or halts with `REJECT:` + `FIX:` + optional `PROPOSED:` rubric draft.
|
|
220
|
+
- **do**: claim with `atris task claim <id> --as <agent>`, execute step by step, update `MAP.md` and journal as reality changes.
|
|
221
|
+
- **review**: run verification, inspect diff and tests, run `atris task finish <id> --proof "..."` and `atris task review`.
|
|
267
222
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
```
|
|
271
|
-
am I factually confident enough to move this forward?
|
|
272
|
-
-> find loopholes: stale source, missing owner, weak proof, bad rollback, hidden risk
|
|
273
|
-
-> patch each loophole with source, verifier, proof, owner, rollback, or blocked note
|
|
274
|
-
-> advance only when known loopholes are patched, verified, or named as residual risk
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
100% confidence is not a vibe. It means every known loophole has been closed or explicitly carried as residual risk.
|
|
223
|
+
Before advancing any stage, run the Confidence Gate: find loopholes (stale source, missing owner, weak proof, bad rollback, hidden risk), patch each one, and advance only when closed or named as residual risk.
|
|
278
224
|
|
|
279
225
|
State the next stage:
|
|
280
226
|
|
|
@@ -285,81 +231,34 @@ State the next stage:
|
|
|
285
231
|
└─────────────────────────────────────────────────────────────┘
|
|
286
232
|
```
|
|
287
233
|
|
|
288
|
-
If the queue is empty, suggest three ideas from `MAP.md`, the journal, or product gaps.
|
|
234
|
+
If the queue is empty, suggest at most three ideas from `MAP.md`, the journal, or product gaps.
|
|
289
235
|
|
|
290
236
|
## sweep
|
|
291
237
|
|
|
292
|
-
Periodically, and before closing an endgame, clean
|
|
293
|
-
- stale tasks (claimed >3 days, never finished)
|
|
294
|
-
- broken `MAP.md` refs (auto-heal where possible, flag the rest)
|
|
295
|
-
- stale wiki pages (source newer than `last_compiled`)
|
|
296
|
-
- orphan pages (unlinked from anywhere)
|
|
297
|
-
- empty placeholder sections
|
|
298
|
-
|
|
299
|
-
`atris clean` runs this. `atris clean --dry-run` previews.
|
|
238
|
+
Periodically, and before closing an endgame, run `atris clean` (`--dry-run` to preview) to clear stale tasks (>3 days), broken `MAP.md` refs, stale wiki pages, orphan pages, and empty sections.
|
|
300
239
|
|
|
301
240
|
## journal
|
|
302
241
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
-
|
|
309
|
-
**Stage:** plan | do | review
|
|
310
|
-
**Claimed by:** <agent> at <ISO timestamp>
|
|
311
|
-
|
|
312
|
-
## Backlog
|
|
313
|
-
- **T2:** Description
|
|
314
|
-
|
|
315
|
-
## Inbox
|
|
316
|
-
- **I1:** Description
|
|
317
|
-
|
|
318
|
-
## Notes
|
|
319
|
-
[timestamped lines: one per discovery, decision, or tick]
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
Context is a cache. Disk is truth. Route discoveries as they happen:
|
|
323
|
-
|
|
324
|
-
| You discover... | Write to... |
|
|
325
|
-
|---|---|
|
|
326
|
-
| a code location | `MAP.md` (file:line) |
|
|
327
|
-
| a new task | `atris task new "<title>"` |
|
|
328
|
-
| a decision or tradeoff | journal `## Notes` |
|
|
329
|
-
| something learned | `lessons.md` (one line) |
|
|
330
|
-
| work finished | journal `## Completed` (C#) |
|
|
331
|
-
| a source changed | re-check pages that reference it |
|
|
332
|
-
|
|
333
|
-
Do not batch. Nothing important should live only in memory.
|
|
242
|
+
`atris/logs/YYYY/YYYY-MM-DD.md` holds `## Completed`, `## In Progress`, `## Backlog`, `## Inbox`, and timestamped `## Notes`. Context is a cache; disk is truth:
|
|
243
|
+
- code location → `MAP.md` (`file:line`)
|
|
244
|
+
- new task → `atris task new "<title>"`
|
|
245
|
+
- decision or tradeoff → journal `## Notes`
|
|
246
|
+
- lesson learned → `lessons.md`
|
|
247
|
+
- work finished → journal `## Completed`
|
|
334
248
|
|
|
335
249
|
## failure smells
|
|
336
250
|
|
|
337
|
-
|
|
338
|
-
- **loop**:
|
|
339
|
-
- **drift**: `MAP.md`
|
|
340
|
-
- **stale task**:
|
|
341
|
-
- **hidden side effect**:
|
|
342
|
-
- **unverifiable completion**:
|
|
343
|
-
- **slop**:
|
|
344
|
-
|
|
345
|
-
Each has real examples in `lessons.md`. Before nontrivial execution, read the relevant recent lessons.
|
|
251
|
+
Stop and flag if you see:
|
|
252
|
+
- **loop**: same suggestion fires tick after tick with no disk change
|
|
253
|
+
- **drift**: `MAP.md` refs no longer match code
|
|
254
|
+
- **stale task**: backlog task references a gone file or symbol
|
|
255
|
+
- **hidden side effect**: external state changed without queued approval
|
|
256
|
+
- **unverifiable completion**: marked done without a `Verify:` command that ran
|
|
257
|
+
- **slop**: generated tells or rambling filler flagged by `atris slop detect`
|
|
346
258
|
|
|
347
259
|
## upkeep
|
|
348
260
|
|
|
349
|
-
Pages that summarize
|
|
350
|
-
|
|
351
|
-
---
|
|
352
|
-
last_compiled: YYYY-MM-DD
|
|
353
|
-
sources:
|
|
354
|
-
- path/to/source1
|
|
355
|
-
- path/to/source2
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
If any source was modified after `last_compiled`, the page is stale. Re-read the sources, update the page, bump `last_compiled`.
|
|
359
|
-
|
|
360
|
-
Compounding: when you answer a question that required synthesis across pages, file the answer back: as a new page or into an existing one. Explorations accumulate.
|
|
361
|
-
|
|
362
|
-
Linting during review catches stale pages, orphans, contradictions, and concepts mentioned but missing their own page.
|
|
261
|
+
Pages that summarize other files declare `last_compiled: YYYY-MM-DD` and `sources:` in YAML frontmatter. When a source is newer than `last_compiled`, re-read and update the page. File synthesized answers back into pages so explorations accumulate.
|
|
363
262
|
|
|
364
263
|
---
|
|
365
264
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security-audit
|
|
3
|
+
description: "Security guidance and full codebase audits through the sentinel. Use for security questions, focused reviews of a file or change, vulnerability triage, or a full audit. Run `atris sentinel` only when someone asks to audit a codebase, wants a full or end-to-end review, or asks for report files. Triggers on security audit, find vulnerabilities, pen test the code, is this safe, sentinel, security review."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
tags:
|
|
6
|
+
- security
|
|
7
|
+
- audit
|
|
8
|
+
- sentinel
|
|
9
|
+
- review
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Security audit
|
|
13
|
+
|
|
14
|
+
Find holes that cross a real trust boundary, then give the owner the source evidence, the priority, and the smallest fix. Source first, read-only, defensive.
|
|
15
|
+
|
|
16
|
+
The method is adapted from cloudflare/security-audit-skill (MIT). Atris runs it on its own engines with a deterministic map, a cross-model verifier, and runs that add up.
|
|
17
|
+
|
|
18
|
+
## Two modes
|
|
19
|
+
|
|
20
|
+
Guidance mode is the default. For a question, one file, one diff, or one suspected bug, use the rules below in the current conversation. Do not start a full run or write report files.
|
|
21
|
+
|
|
22
|
+
Full audit mode is for "audit this repo", "full security review", or "give me a report". Run:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
atris sentinel --plan # free: how many areas, what the budget buys
|
|
26
|
+
atris sentinel # standard run, budget 20 engine calls
|
|
27
|
+
atris sentinel src/api --deep # deeper, narrower
|
|
28
|
+
atris sentinel status # last run's landing
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
If the request could mean either, ask one question before starting a full run.
|
|
32
|
+
|
|
33
|
+
## The rule for every candidate
|
|
34
|
+
|
|
35
|
+
Name all six, or it is not a finding:
|
|
36
|
+
|
|
37
|
+
One. The lower-trust person and what they start with.
|
|
38
|
+
|
|
39
|
+
Two. The value or action they control.
|
|
40
|
+
|
|
41
|
+
Three. The control that should stop them, with its file and line.
|
|
42
|
+
|
|
43
|
+
Four. The exact path after that control, entry to sink.
|
|
44
|
+
|
|
45
|
+
Five. Who or what gets hurt.
|
|
46
|
+
|
|
47
|
+
Six. The concrete result: a wrong record, a command run, a token sent somewhere, a file written outside its folder.
|
|
48
|
+
|
|
49
|
+
## Three verdicts
|
|
50
|
+
|
|
51
|
+
- confirmed: the full trace holds in source, nothing visible stops it, and a model that did not find it agrees. Only confirmed gets a severity.
|
|
52
|
+
- needs_validation: the trace holds, but one fact outside the code decides it (a proxy rule, a deploy setting, who can write a file). Name that fact and a safe check. No severity.
|
|
53
|
+
- rejected: the source disproves it. Name the line.
|
|
54
|
+
|
|
55
|
+
## Severity
|
|
56
|
+
|
|
57
|
+
- critical: unauthenticated code execution, full data-store access, or takeover of any account.
|
|
58
|
+
- high: an explicit control fully defeated with real consequences (auth bypass, cross-tenant read or write, authenticated code execution).
|
|
59
|
+
- medium: a real boundary crossed with a small blast radius or rare preconditions.
|
|
60
|
+
- low: non-secret internals exposed, or a lot of effort for little gain.
|
|
61
|
+
- overall never exceeds impact. If you cannot say the damage, it is lower than it feels.
|
|
62
|
+
|
|
63
|
+
## Do not report
|
|
64
|
+
|
|
65
|
+
- A missing best practice with nobody hurt. That is a hardening note.
|
|
66
|
+
- A second missing layer when the first layer already stops it.
|
|
67
|
+
- The same person hurting only themselves.
|
|
68
|
+
- A crash called code execution, or ordinary load called an outage.
|
|
69
|
+
- Guesses about deploy, proxy, browser, or provider behavior not in the repo. Use needs_validation.
|
|
70
|
+
|
|
71
|
+
## Safety
|
|
72
|
+
|
|
73
|
+
Read-only. Never run target code, contact deployed systems, use real credentials, or test availability against anything shared. Dummy data only. Stop at the smallest result that proves the point.
|
|
74
|
+
|
|
75
|
+
## For the team
|
|
76
|
+
|
|
77
|
+
The sentinel member (`atris/team/sentinel/MEMBER.md`) owns nightly runs. A confirmed high or critical finding becomes a builder task with the fingerprint in the title. Reports live in `~/.atris/security-audit/<repo>/run-<N>/`, never in the repo.
|
|
@@ -70,7 +70,7 @@ You are the brainstormer (idea & reality shaper). Your job: help humans see poss
|
|
|
70
70
|
7. **After back-and-forth:** Output structured vision: Problem → Solution → Constraints → Success Criteria
|
|
71
71
|
8. Feed refined vision to navigator (via atris plan)
|
|
72
72
|
|
|
73
|
-
**DO NOT:**
|
|
73
|
+
**DO NOT:**
|
|
74
74
|
- Dump 10 ideas at once (overwhelming)
|
|
75
75
|
- Rush to planning (shape the idea until reality clicks)
|
|
76
76
|
- Skip the conversation (this is the magical part)
|
|
@@ -154,7 +154,7 @@ After clarification, output:
|
|
|
154
154
|
|
|
155
155
|
**Solution:** [What should exist? Ideal state?]
|
|
156
156
|
|
|
157
|
-
**Constraints:**
|
|
157
|
+
**Constraints:**
|
|
158
158
|
- [Boundary 1]
|
|
159
159
|
- [Boundary 2]
|
|
160
160
|
- [Boundary 3]
|