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/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
|
|
package/bin/atris.js
CHANGED
|
@@ -632,6 +632,7 @@ function showHelpAll() {
|
|
|
632
632
|
console.log(' harvest - Find bugs and next actions from receipts, run logs, and thinking');
|
|
633
633
|
console.log(' verify - Validate work is done (tests, MAP.md, changes)');
|
|
634
634
|
console.log(' slop - Deterministic slop detector: frontend/prose tells, dead code (slop dead --exports)');
|
|
635
|
+
console.log(' sentinel - Security audit: engines hunt for holes, a different model verifies each one');
|
|
635
636
|
console.log(' voice - Scan binary voice tells or judge reply shape and plainness');
|
|
636
637
|
console.log(' recover - Explain stopped missions; --apply performs safe recovery only');
|
|
637
638
|
console.log(' task - Local agent task plane (atomic claims, TODO import)');
|
|
@@ -3371,6 +3372,11 @@ if (command === 'guide') {
|
|
|
3371
3372
|
Promise.resolve().then(() => require('../commands/strings').stringsCommand(process.argv.slice(3)))
|
|
3372
3373
|
.then((code) => exitAfterStdoutDrain(typeof code === 'number' ? code : 0))
|
|
3373
3374
|
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
3375
|
+
} else if (command === 'sentinel') {
|
|
3376
|
+
// Sentinel: the full security audit (engines hunt, another model verifies). Same as `security-review audit`.
|
|
3377
|
+
Promise.resolve().then(() => require('../commands/security-review').securityReviewCommand(['audit', ...process.argv.slice(3)]))
|
|
3378
|
+
.then((code) => exitAfterStdoutDrain(typeof code === 'number' ? code : 0))
|
|
3379
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
3374
3380
|
} else if (command === 'security-review' || command === 'secure') {
|
|
3375
3381
|
// Security review: deterministic secrets/PII/code-risk scan (no LLM). Exit 1 = HIGH finding,
|
|
3376
3382
|
// for the autopilot/mission/CI gate + a SOC 2 evidence artifact via --json.
|
package/commands/brief.js
CHANGED
|
@@ -479,7 +479,7 @@ function renderOwnerHtml(data) {
|
|
|
479
479
|
blocks: [
|
|
480
480
|
{ type: 'title', headline: 'atris brief', sub: `${needs} ${needs === 1 ? 'thing needs' : 'things need'} you, ${done} landed this week` },
|
|
481
481
|
...ownerBlocks(shown),
|
|
482
|
-
{ type: 'close', tagline: '
|
|
482
|
+
{ type: 'close', tagline: 'This screen only reads your jobs.' },
|
|
483
483
|
],
|
|
484
484
|
}, { title: 'atris brief' });
|
|
485
485
|
}
|
|
@@ -559,7 +559,11 @@ function showHelp() {
|
|
|
559
559
|
console.log(' atris brief outcome <brief_id> --result pass|fail|partial --note <text> [--json|--raw]');
|
|
560
560
|
console.log(' atris brief review [--lessons] [--json] [--limit N]');
|
|
561
561
|
console.log('One screen: what needs you, what got done this week, and how the team is doing.');
|
|
562
|
-
console.log('
|
|
562
|
+
console.log('It reads your jobs. Before the screen it may quietly check GitHub and credit or release held jobs');
|
|
563
|
+
console.log('whose pull request merged or closed. A merge is usually credited within the hour, by a command that');
|
|
564
|
+
console.log('reaches GitHub; atris task sweep --held does it right away.');
|
|
565
|
+
console.log('ATRIS_HELD_SWEEP=off turns that off.');
|
|
566
|
+
console.log('--days N sets the older landed list in --json.');
|
|
563
567
|
}
|
|
564
568
|
|
|
565
569
|
function isBriefLedgerSubcommand(value) {
|
|
@@ -795,6 +799,8 @@ async function briefCommand(args = [], root = process.cwd(), io = {}) {
|
|
|
795
799
|
showHelp();
|
|
796
800
|
return 0;
|
|
797
801
|
}
|
|
802
|
+
// A person's merge pays the builder with no command: the held-job check runs here.
|
|
803
|
+
require('../lib/held-autosweep').autoSweepHeld({ root });
|
|
798
804
|
|
|
799
805
|
const data = buildBriefData(root, { days: flags.days, owner: true });
|
|
800
806
|
if (flags.json) {
|