atris 3.35.0 → 3.36.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.
Files changed (133) hide show
  1. package/AGENTS.md +37 -0
  2. package/README.md +5 -3
  3. package/atris/GETTING_STARTED.md +1 -1
  4. package/atris/atris.md +3 -0
  5. package/atris/policies/day-loop-voice.md +102 -0
  6. package/atris/policies/outbound-artifact-gate.md +2 -0
  7. package/atris/skills/design/SKILL.md +56 -32
  8. package/atris/skills/endgame/SKILL.md +12 -6
  9. package/atris/skills/engines/SKILL.md +22 -4
  10. package/atris/skills/fable-method/SKILL.md +66 -0
  11. package/atris/skills/improve/SKILL.md +65 -45
  12. package/atris/skills/youtube/SKILL.md +10 -1
  13. package/atris.md +2 -0
  14. package/ax +147 -19
  15. package/bin/atris.js +565 -265
  16. package/commands/activate.js +194 -88
  17. package/commands/agents.js +166 -0
  18. package/commands/autoland.js +459 -107
  19. package/commands/autopilot-front.js +20 -2
  20. package/commands/autopilot.js +118 -2
  21. package/commands/avail.js +407 -0
  22. package/commands/bench.js +188 -0
  23. package/commands/brain.js +3 -0
  24. package/commands/brief.js +651 -0
  25. package/commands/business-sync.js +192 -6
  26. package/commands/clean.js +50 -24
  27. package/commands/close.js +1083 -0
  28. package/commands/cloud.js +245 -0
  29. package/commands/compile.js +292 -1
  30. package/commands/computer.js +150 -3
  31. package/commands/dream.js +365 -0
  32. package/commands/drill.js +371 -0
  33. package/commands/engine.js +993 -32
  34. package/commands/experiments.js +28 -0
  35. package/commands/feedback.js +34 -12
  36. package/commands/fleet-report.js +206 -0
  37. package/commands/gm.js +23 -0
  38. package/commands/goal.js +247 -0
  39. package/commands/improve.js +642 -26
  40. package/commands/init.js +72 -44
  41. package/commands/interview.js +67 -1
  42. package/commands/land.js +152 -52
  43. package/commands/lifecycle.js +39 -3
  44. package/commands/log.js +84 -1
  45. package/commands/loops.js +220 -16
  46. package/commands/meet.js +220 -0
  47. package/commands/member.js +511 -34
  48. package/commands/mission.js +3029 -339
  49. package/commands/next.js +137 -0
  50. package/commands/now.js +220 -25
  51. package/commands/one-lap.js +776 -0
  52. package/commands/orb.js +314 -0
  53. package/commands/pack-craft.js +179 -0
  54. package/commands/pack.js +823 -0
  55. package/commands/play.js +3 -2
  56. package/commands/probe.js +30 -3
  57. package/commands/pulse.js +241 -46
  58. package/commands/push.js +260 -82
  59. package/commands/rainmaker.js +49 -0
  60. package/commands/report.js +415 -0
  61. package/commands/scout.js +147 -0
  62. package/commands/search.js +363 -0
  63. package/commands/skill.js +47 -3
  64. package/commands/slop.js +50 -2
  65. package/commands/soul.js +1 -1
  66. package/commands/stream.js +861 -0
  67. package/commands/study.js +693 -0
  68. package/commands/sync.js +67 -54
  69. package/commands/task.js +1346 -117
  70. package/commands/team.js +73 -0
  71. package/commands/verify.js +96 -0
  72. package/commands/watch.js +303 -0
  73. package/commands/wish.js +500 -0
  74. package/commands/workflow.js +11 -5
  75. package/commands/worktree.js +234 -13
  76. package/commands/xp.js +29 -11
  77. package/lib/auto-accept-certified.js +331 -34
  78. package/lib/autoland.js +319 -54
  79. package/lib/ax-auto-lane.js +79 -0
  80. package/lib/bench/context.js +147 -0
  81. package/lib/bench/engines.js +141 -0
  82. package/lib/bench/report.js +140 -0
  83. package/lib/bench/runner.js +512 -0
  84. package/lib/brief-ledger.js +350 -0
  85. package/lib/cloud-mission.js +259 -0
  86. package/lib/codex-flight.js +154 -0
  87. package/lib/default-runner.js +45 -0
  88. package/lib/default-verifier.js +70 -0
  89. package/lib/engine-registry.js +232 -0
  90. package/lib/experiments/daily.js +640 -0
  91. package/lib/fleet.js +2219 -67
  92. package/lib/improve-vitals-html.js +171 -0
  93. package/lib/known-commands.js +58 -0
  94. package/lib/loop-doctor.js +416 -0
  95. package/lib/member-switches.js +144 -0
  96. package/lib/mission-room.js +1 -0
  97. package/lib/mission-root.js +52 -0
  98. package/lib/next-moves.js +327 -10
  99. package/lib/one-lap-validator.js +60 -0
  100. package/lib/orb-context.js +477 -0
  101. package/lib/orb-scorecard.js +224 -0
  102. package/lib/policy-lessons.js +52 -1
  103. package/lib/pulse.js +277 -3
  104. package/lib/receipt-block.js +168 -0
  105. package/lib/receipt-evidence.js +65 -4
  106. package/lib/router-brain.js +352 -0
  107. package/lib/runner-command.js +10 -0
  108. package/lib/self-drive.js +258 -0
  109. package/lib/short-name.js +103 -0
  110. package/lib/spawn-env.js +18 -0
  111. package/lib/state-detection.js +56 -1
  112. package/lib/sync-status.js +59 -0
  113. package/lib/task-db.js +108 -29
  114. package/lib/task-proof.js +23 -1
  115. package/lib/team-presence.js +260 -0
  116. package/lib/tool-result-encode.js +7 -0
  117. package/lib/trust-tiers.js +90 -0
  118. package/lib/usage.js +107 -0
  119. package/lib/voice-gate.js +163 -0
  120. package/lib/wish-audit.js +1368 -0
  121. package/lib/wish-delegate.js +1840 -0
  122. package/lib/wish-design.js +110 -0
  123. package/lib/wish-stats.js +183 -0
  124. package/lib/wish-store.js +354 -0
  125. package/lib/zip.js +221 -0
  126. package/package.json +3 -1
  127. package/templates/loops/atris/loops/LOOPS.md +55 -0
  128. package/templates/loops/atris/loops/TICK.md +24 -0
  129. package/templates/loops/atris/loops/feedback.md +22 -0
  130. package/templates/loops/atris/loops/quality.md +22 -0
  131. package/templates/loops/atris/wiki/systems/loops.md +41 -0
  132. package/utils/api.js +5 -1
  133. package/utils/auth.js +57 -21
package/AGENTS.md CHANGED
@@ -125,6 +125,41 @@ member -> mission start --verify -> status --status active -> one bounded step -
125
125
  - Close: if the verifier passes, run `atris mission complete <id> --proof "<receipt_path>"`; if current-agent work should keep going, repeat status -> step -> tick.
126
126
  - Rollout: `atrisos-backend` and `atrisos-web` agents must check active missions before picking work; if no active mission exists and autonomy was requested, create one with owner, verifier, lane, and stop condition first.
127
127
 
128
+ ## Build Craft — what decides acceptance
129
+
130
+ Mined from this repo's receipts (803 receipts, 1711 episodes): proofs naming a
131
+ runnable verify command were accepted 670/674 at the gate; 24 of 28 bounces
132
+ named none. These rules are the difference, in priority order:
133
+
134
+ 1. **Name a runnable verify command in every proof**, and run it bare — never
135
+ `test | tail` or `| grep`; a pipe replaces your exit code with the filter's.
136
+ 2. **A task naming a spec file (`atris/features/<name>/idea.md`) is a contract.**
137
+ Read it before writing code; build the named slice only; use its verify
138
+ command verbatim. Do not improvise adjacent improvements.
139
+ 3. **Zero new dependencies.** This CLI runs on Node built-ins only (fs, path,
140
+ child_process, readline, https, crypto). A `package.json` dependency change
141
+ is an automatic bounce.
142
+ 4. **New CLI command = router entry too.** A `commands/<name>.js` branch is dead
143
+ until the name is in `knownCommands` in `bin/atris.js`. When adding an
144
+ engine, three test files assert the exact profile-name list (runner-command,
145
+ engine, cli-smoke).
146
+ 5. **Output voice:** lowercase CLI output, plain sentences, no em dash
147
+ character, no ALL CAPS, no ULIDs or test counts on human-facing lines.
148
+ 6. **Git discipline:** `git status` first; stage only files you changed; never
149
+ revert another agent's work; never destructive git; land against
150
+ `origin/master` (the board measures master, not your launcher branch).
151
+ 7. **Final report = files changed + verify command + its exact exit/output.**
152
+ Judges read the worktree diff, not your prose; an empty report with a clean
153
+ diff beats a confident report with no diff.
154
+ 8. **Update `atris/MAP.md` sections you touched** (file:line refs drift on
155
+ their own clock; stale refs contradict closed lessons for months).
156
+ 9. **Real runtime over mocks:** if you fixed live behavior, the regression test
157
+ reproduces it against the real runtime, not a mock that can stay green
158
+ through breakage.
159
+ 10. **When your engine dies mid-build (credits, limits), that is a staffing
160
+ event, not a failure** — leave the worktree intact with a note; the
161
+ conductor restaffs it.
162
+
128
163
  ## Rules
129
164
 
130
165
  - [ ] 3-4 sentences max per response
@@ -164,10 +199,12 @@ Load these first:
164
199
  - `atris/brain/STATUS.md`
165
200
  - `atris/brain/self_improvement_ledger.md`
166
201
  - `.atris/state/chat_scan.latest.json`
202
+ - `atris/wiki/concepts/agent-activation-contract.md`
167
203
  - `atris/skills/atris/SKILL.md`
168
204
  - `atris/PERSONA.md`
169
205
  - `atris/MAP.md`
170
206
  - `atris/TODO.md`
207
+ - `atris/wiki/index.md`
171
208
 
172
209
  First-message rule: lead with the move before writing to the operator.
173
210
  Purpose: optimize for decision-speed; lead with the move, then use descriptions only when they help the operator act.
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # atris
2
2
 
3
- **atris** is an operating system for AI work. It turns any repo into a workspace an agent can actually operate: shared context it reads before it acts, a `plan -> do -> review` loop, durable tasks and daily logs, and verification that ends work on a real check instead of a promise.
3
+ **atris**: you say what you want in plain words. atris builds it, checks it, and shows you proof.
4
+
5
+ Under the hood it is an operating system for AI work. It turns any repo into a workspace an agent can actually operate: shared context it reads before it acts, a `plan -> do -> review` loop, durable tasks and daily logs, and verification that ends work on a real check instead of a promise.
4
6
 
5
7
  Every owner gets persistent computers to run it:
6
8
 
@@ -42,7 +44,7 @@ Then read the workspace's `atris/atris.md` and follow it exactly. `atris.md` is
42
44
  - A strict `plan -> do -> review` loop
43
45
  - Daily logs, task tracking, feature packs, and project memory
44
46
  - Skills, team members, integrations, and cloud sync when you need them
45
- - A plain-English answer to "what did my AI actually do?" — run `atris recap` (add `--share` for a paste-ready summary backed by receipts)
47
+ - A plain answer to "what did my AI actually do?": run `atris recap`, or `atris recap --share` for a receipt-backed summary you can paste anywhere
46
48
 
47
49
  ## Critical Files
48
50
 
@@ -91,7 +93,7 @@ atris
91
93
 
92
94
  `atris init` scaffolds the workspace, including `atris/wiki/`. `atris` loads context and hands the workflow off to `atris/atris.md`.
93
95
 
94
- If you're still shaping the idea, use `atris brainstorm`. If you want one bounded mission pursued to proof, use `atris run "<objective>"`. If you want Atris to keep picking the next mission or member until you say stop, use `atris autopilot`. If you want project memory checked for stale pages and missing context, use `atris loop`. `atris activate` surfaces wiki state from `atris/wiki/STATUS.md` when it exists.
96
+ If you're still shaping the idea, use `atris brainstorm`. If you want Atris to finish one job and prove it worked, use `atris run "<objective>"`. If you want Atris to keep picking the next mission or member until you say stop, use `atris autopilot`. If you want project memory checked for stale pages and missing context, use `atris loop`. `atris activate` surfaces wiki state from `atris/wiki/STATUS.md` when it exists.
95
97
 
96
98
  Core loop: `plan` -> `do` -> `review`
97
99
 
@@ -1,6 +1,6 @@
1
1
  # Getting Started with Atris
2
2
 
3
- Atris turns any folder into a workspace that gets better over time. Integrates with any agent.
3
+ Atris turns any folder into a workspace that gets better over time. It works with any coding agent.
4
4
 
5
5
  ## Install
6
6
 
package/atris/atris.md CHANGED
@@ -80,6 +80,7 @@ The same discipline for words. Output stays sharp no matter how bloated the cont
80
80
  - **Cut filler.** Drop "it's worth noting", "in order to", "leverage", "seamless", "robust", "delve", stacked hedges, and em dashes. `atris slop` flags the prose tells (em-dash, hype-copy) too.
81
81
  - **Bound verbosity by information, not context.** Say the load-bearing thing and stop. Length tracks what the reader needs to act, nothing more.
82
82
  - **Match the register.** The operator wants the next move; a spec wants the contract; a journal wants one line. Jargon is a lever only when shared: use the reader's precise terms, define a new one once.
83
+ - **Pass both readers.** Run the dual-register test: an ML researcher finds no technical error, and a second-grade teacher can follow the first read. Keep necessary terms, define each new one once, and remove jargon that does not change the decision.
83
84
 
84
85
  `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.
85
86
 
@@ -105,6 +106,8 @@ atris task finish <id> --proof "<tests, screenshot, diff, or receipt>"
105
106
  atris task review <id> --lesson "<what improved>" --next "<next task>"
106
107
  ```
107
108
 
109
+ `atris task ready` carries `--result`, the day-one PM sentence of what the human gained; the CLI refuses agent-speak.
110
+
108
111
  Headless agents should add `--json` where available and read
109
112
  `.atris/state/tasks.projection.json` for a compact board view.
110
113
 
@@ -0,0 +1,102 @@
1
+ # Day loop voice
2
+
3
+ The day loop helps an operator choose and learn. It does not manage the operator.
4
+
5
+ This contract comes from the July 8 five-day simulation review recorded on CLI-931. The approved shape was one thing in the morning, a mirror at night, and a real-time ping only when a human signal turns warm. The loop admits sensing mistakes and judges progress by replies, shifts, revenue, and other outcomes.
6
+
7
+ ## Source before sentence
8
+
9
+ Every claim must come from current operator data or a named receipt. A message may use email threads, calendar events, landed work, shift results, pipeline changes, or money data when those sources are available.
10
+
11
+ Do not infer effort, mood, intent, or failure from silence. If the evidence is thin, say what is missing or stay quiet.
12
+
13
+ The generator should receive facts and compose from them. The examples below show structure and judgment. They are not strings to copy into code.
14
+
15
+ ## Shared voice
16
+
17
+ - Lead with the fact that changes the operator's next move.
18
+ - Use the person's name and the real number when either matters.
19
+ - Give one prepared action. Do not hand back a menu.
20
+ - Sound warm when the evidence is good. Do not manufacture celebration.
21
+ - Admit a bad read in the first sentence, correct the state, and remove the stale ask.
22
+ - Stop after the useful thought. A quiet day does not need motivational filler.
23
+
24
+ The message fails if it includes internal task ids, mission ids, flags, file paths, stack traces, or implementation jargon. Translate the result into what happened, how the system knows, and what the operator can do.
25
+
26
+ ## Morning one-thing
27
+
28
+ The morning note chooses the highest-value move supported by current evidence. It should fit on one phone screen and contain:
29
+
30
+ - the one fact that makes this move matter now;
31
+ - the single move;
32
+ - the action Atris already prepared.
33
+
34
+ Shape, not template:
35
+
36
+ > Maya replied overnight and asked for the security summary.
37
+ >
38
+ > Send that before opening a new thread.
39
+ >
40
+ > I drafted the reply from yesterday's approved notes.
41
+
42
+ If no move clearly wins, say that no priority earned the top slot. Do not promote a random task to avoid an empty message.
43
+
44
+ ## Evening mirror
45
+
46
+ The evening note reflects the day without grading the person. It names the outcome, shows the pattern in the operator's own numbers, and carries one useful observation into tomorrow.
47
+
48
+ Shape, not template:
49
+
50
+ > Two warm threads moved forward; the new cold batch produced no replies.
51
+ >
52
+ > Follow-ups are working better than first touches this week.
53
+ >
54
+ > Tomorrow's prepared list starts with the three people already in motion.
55
+
56
+ Do not call the day productive, weak, good, or bad. Report what changed. If the system missed an outcome, name the blind spot instead of filling it with activity counts.
57
+
58
+ ## Warm ping
59
+
60
+ A warm ping exists only because a live human signal created a short decision window. A new reply, meeting change, approval, payment event, or explicit request can qualify. Time passing does not.
61
+
62
+ Name who moved, what changed, and the prepared response. One ping per signal. If the signal cools or the operator already acted, send nothing.
63
+
64
+ Shape, not template:
65
+
66
+ > Devon asked whether the pilot can start Monday.
67
+ >
68
+ > The answer is yes if legal clears the current terms.
69
+ >
70
+ > I drafted the two-line reply and left it unsent.
71
+
72
+ ## Correcting a sensing mistake
73
+
74
+ Own the error without an excuse or a reassurance paragraph.
75
+
76
+ Shape, not template:
77
+
78
+ > I read the thread wrong. Devon already answered the pricing question.
79
+ >
80
+ > I removed that follow-up. The open question is now the start date.
81
+
82
+ The correction updates the day state before another message is composed. A stale ask must not survive an admitted mistake.
83
+
84
+ ## Outbound gate
85
+
86
+ Run the shared outbound artifact gate on the final body. Set the coach surface so the stricter rules run:
87
+
88
+ ```bash
89
+ node scripts/outbound-artifact-gate.js --channel email --format plain --coach-surface morning --body-file /path/to/body.txt
90
+ node scripts/outbound-artifact-gate.js --channel email --format plain --coach-surface evening --body-file /path/to/body.txt
91
+ node scripts/outbound-artifact-gate.js --channel email --format plain --coach-surface warm-ping --signal-proof /path/to/fresh-signal.txt --body-file /path/to/body.txt
92
+ ```
93
+
94
+ The coach gate blocks internal identifiers, fake urgency, guilt, nagging, and generic productivity praise. A warm ping also fails without a signal proof file.
95
+
96
+ The gate cannot judge whether the chosen move is wise or whether a claim is true. Review still checks the source facts, the prepared action, and the acted-on outcome after delivery.
97
+
98
+ ## Review fixtures
99
+
100
+ Before approving a generator change, review one real or redacted fixture for each surface it changes. The fixture packet names the input facts, final body, outbound gate result, delivery state, and acted-on outcome when known.
101
+
102
+ Five real days remain the product gate for cloning the loop to another operator. Syntax checks and polished examples do not replace that run.
@@ -46,3 +46,5 @@ node scripts/outbound-artifact-gate.js --channel email --format html --body-file
46
46
  ```
47
47
 
48
48
  The Gmail backend MIME fix is a transport safety net. Agents still need this gate before asking approval or sending.
49
+
50
+ Day-loop coach messages use the stricter surface rules in `atris/policies/day-loop-voice.md` and pass `--coach-surface`. Warm pings also name a fresh `--signal-proof` file.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: design
3
3
  description: Frontend aesthetics policy. Use when building UI, components, landing pages, dashboards, or any frontend work. Prevents generic ai-generated look.
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  allowed-tools: Read, Write, Edit, Bash, Glob
6
6
  tags:
7
7
  - design
@@ -10,21 +10,23 @@ tags:
10
10
 
11
11
  # atris-design
12
12
 
13
- Part of the Atris policy system. Prevents ai-generated frontend from looking generic.
13
+ The taste organ of the Atris system. Opinionated: these are Keshav's principles, not general best practices. Prevents ai-generated frontend from looking generic, and improves itself (see "self-improve" at the bottom, it is part of the job, not optional).
14
+
15
+ Canonical home: `atris-cli/atris/skills/design/SKILL.md` (this file, git-tracked). `atris sync` stamps it into every workspace's `atris/skills/` and `.claude/skills/`. Edit HERE, never a downstream copy: sync will clobber anything written elsewhere.
14
16
 
15
17
  ## Atris Integration
16
18
 
17
- This skill uses the Atris workflow:
18
19
  1. Check `atris/MAP.md` for existing patterns before building
19
- 2. **Read `atris/policies/design-seed.md` first** — it has the project's unique visual identity (fonts, colors, spacing, motion). This is the design DNA. Do not override it with defaults.
20
- 3. Reference `atris/policies/atris-design.md` for full anti-slop guidance
21
- 4. After building, run `atris review` to validate against this policy
20
+ 2. **Read `atris/policies/design-seed.md` first** if it exists: it has the project's unique visual identity (fonts, colors, spacing, motion). This is the design DNA. Do not override it with defaults.
21
+ 3. Read `.atris/theme.json` if it exists: brand colors and fonts are already decided, use them.
22
+ 4. Reference `atris/policies/atris-design.md` for full anti-slop guidance
23
+ 5. After building, run the workspace design gate (`npm run audit:design` in atrisos-web, `atris slop` elsewhere) before claiming done.
22
24
 
23
25
  ## Quick Reference
24
26
 
25
27
  **Typography:** avoid inter/roboto/arial/system fonts. pick one distinctive font, use weight extremes (200 vs 800). size jumps should be dramatic (3x). use `clamp()` for fluid sizing. use `ch` units for measure (`max-width: 65ch`).
26
28
 
27
- Font alternatives: instead of Inter → Instrument Sans, Plus Jakarta Sans, Outfit. Instead of Roboto → Onest, Figtree, Urbanist. Editorial → Fraunces, Newsreader, Lora.
29
+ Font alternatives: instead of Inter: Instrument Sans, Plus Jakarta Sans, Outfit. Instead of Roboto: Onest, Figtree, Urbanist. Editorial: Fraunces, Newsreader, Lora.
28
30
 
29
31
  **Color:** commit to a palette. use OKLCH for perceptually uniform colors. tint your neutrals toward your brand hue (never pure gray). never put gray text on colored backgrounds. never use pure black (#000) or pure white (#fff). avoid the AI palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark.
30
32
 
@@ -35,45 +37,47 @@ Font alternatives: instead of Inter → Instrument Sans, Plus Jakarta Sans, Outf
35
37
 
36
38
  **Layout:** break the hero + 3 cards + footer template. no card-in-card nesting. no identical card grids. asymmetry is interesting. dramatic whitespace. use container queries for component-level responsiveness. fluid spacing with `clamp()`.
37
39
 
38
- **Motion:** one well-timed animation beats ten scattered ones. use exponential easing (`cubic-bezier(0.25, 1, 0.5, 1)`), never bounce/elastic. 150-300ms duration. only animate transform and opacity. always respect `prefers-reduced-motion`. no cursor-following lines, no meteor effects, no buttons that chase the cursor.
40
+ **Motion:** one well-timed animation beats ten scattered ones. use exponential easing (`cubic-bezier(0.25, 1, 0.5, 1)`), never bounce/elastic. 150-300ms duration. only animate transform and opacity. always respect `prefers-reduced-motion`. no cursor-following lines, no meteor effects, no buttons that chase the cursor. no pulsing or glowing live-status dots, no looping ambient animations.
39
41
 
40
- **Interaction:** progressive disclosure — start simple, reveal complexity. optimistic UI — update immediately, sync later. every interactive element needs ALL states: default, hover, focus, active, disabled, loading, error, success. don't make every button primary.
42
+ **Interaction:** progressive disclosure: start simple, reveal complexity. optimistic UI: update immediately, sync later. every interactive element needs ALL states: default, hover, focus, active, disabled, loading, error, success. don't make every button primary.
41
43
 
42
- **Hover:** make elements feel inviting on hover (brighten, subtle scale 1.02-1.05). never fade out, shift, or hide content behind hover. hover doesn't exist on mobile.
44
+ **Hover:** make elements feel inviting on hover (brighten, subtle scale 1.02-1.05). never fade out, shift, or hide content behind hover. hover doesn't exist on mobile. no hover lift: a translate-y shift or a scale past 1.05 on every card is the generated-card reflex; the shift breaks the never-move-content rule and the big grow reads as a template.
43
45
 
44
46
  **Scroll:** never override native scroll. use "peeking" (show a few px of next section) instead of full-screen hero + scroll arrow.
45
47
 
46
- **Responsive:** mobile-first. touch targets 44x44px minimum. no text under 14px on mobile. no horizontal scroll. container queries > media queries for components. adapt, don't amputate.
48
+ **Responsive:** mobile-first. touch targets 44x44px minimum. no text under 14px on mobile. no horizontal scroll. container queries over media queries for components. adapt, don't amputate.
47
49
 
48
50
  **Accessibility:** 4.5:1 contrast for text, 3:1 for UI (WCAG AA). visible focus indicators always. semantic HTML. never use color alone as an indicator. keyboard nav with logical tab order.
49
51
 
50
- **Hero (H1 test):** must answer in 5 seconds — what is it, who is it for, why care, what's the CTA.
52
+ **Hero (H1 test):** must answer in 5 seconds: what is it, who is it for, why care, what's the CTA.
51
53
 
52
54
  **Assets:** high-res screenshots only. no fake dashboards with primary colors. no decorative non-system emojis.
53
55
 
54
- **Backgrounds:** add depth. gradients, patterns, mesh effects. flat = boring. but no glassmorphism everywhere — that's AI slop.
56
+ **Backgrounds:** add depth. gradients, patterns, mesh effects. flat = boring. but no glassmorphism everywhere, that's AI slop.
55
57
 
56
58
  **Hierarchy:** 2-3 text levels max. don't mix 5 competing styles.
57
59
 
58
- **Labels:** never use all-caps UI labels, tracked-uppercase labels, faux small-caps, or eyebrow-style microcopy for ordinary product surfaces. Keshav strongly dislikes this style. Prefer natural title case or sentence case for labels like "Threads", "Active tasks", and "Team"; do not write them as `THREADS`, `ACTIVE TASKS`, or letter-spaced metadata.
60
+ **No all-caps. ever.** never use the `uppercase` tailwind class, `text-transform: uppercase`, or shout-cased copy on eyebrow labels, section headers, buttons, badges, or anywhere else. random capitalized text mid-page reads as average ai-generated slop. if you need a quiet eyebrow label, reach for a smaller size (`text-[11px]`) or a muted color, never caps. write labels in sentence case ("Active tasks", not "ACTIVE TASKS") and let copy render as authored.
61
+
62
+ **Copy:** no em dashes (the character, U+2014) anywhere in UI copy. no hedge words, no hype adverbs (the "-lessly" family). plain sentences a human would type.
59
63
 
60
- **Visual anti-patterns:** no glassmorphism, no gradient text, no sparklines as decoration, no rounded-rect-with-colored-border, no large icons with rounded corners above headings, no hero metric layout (big number + small label), no modals unless truly necessary. no "claude beige" off-white backgrounds, no instrument serif overuse (the new AI tell), no generic flat tinted backgrounds.
64
+ **Visual anti-patterns:** no glassmorphism, no gradient text, no sparklines as decoration, no rounded-rect-with-colored-border, no large icons with rounded corners above headings, no pastel-tinted rounded icon tile above a feature heading (a small light-colored square holding an icon, repeated down a feature grid; the generated feature-card reflex), no hero metric layout (big number + small label), no modals unless truly necessary, no all-caps eyebrows/labels/headers, no status-dot-plus-eyebrow hero kickers (a pulsing/colored dot next to a small caps/mono label above the headline; keshav's #1 named slop pattern. if a section needs a kicker at all, plain sentence-case text with no dot), no "claude beige" off-white backgrounds, no instrument serif overuse (the new AI tell), no generic flat tinted backgrounds, no near-black slate or gray hero gradient fading into black (the dark premium SaaS template look), no colored glowing drop shadow under buttons or cards (a tinted neon glow, e.g. a purple or blue shadow; keep shadows soft and neutral), no bright two-color gradient fill on buttons or badges (a saturated gradient across different hues like pink to orange or blue to cyan; use one solid brand color), no giant blurred gradient orb glowing behind the hero (the aurora-blob background: a huge soft-blurred colored blob absolutely positioned behind the fold; reads as a template).
61
65
 
62
66
  ## Vocabulary is the Lever
63
67
 
64
- Designers beat engineers at AI prompting because they own craft language. Name the move precisely: "tighten vertical rhythm," "increase negative space," "make hierarchy bolder here, quieter there." Vague prompts = vague output. Core terms: vertical rhythm, negative space, bolder/quieter, affordances, meta-design, conviction.
68
+ Designers beat engineers at AI prompting because they own craft language. Name the move precisely: "tighten vertical rhythm," "increase negative space," "make hierarchy bolder here, quieter there." Vague prompts = vague output. Core terms: vertical rhythm, negative space, bolder/quieter, affordances, meta-design, conviction. When the operator's wish is fuzzy, translate it into this vocabulary before building, and say the translation out loud so the operator can correct it.
65
69
 
66
70
  ## Raising Floor vs Ceiling
67
71
 
68
- Use AI to raise the floor (automate the mechanical 80% — scaffolding, grids, state matrices). Spend human attention on the ceiling (last 10-20% — taste, instinct, the unexpected choice). Cognitive delegation, not surrender. AI routes you there; you make the final call.
72
+ Use AI to raise the floor (automate the mechanical 80%: scaffolding, grids, state matrices). Spend human attention on the ceiling (last 10-20%: taste, instinct, the unexpected choice). Cognitive delegation, not surrender. AI routes you there; you make the final call.
69
73
 
70
- ## AX — Agentic Experience
74
+ ## AX: Agentic Experience
71
75
 
72
76
  Design for AI agents as users, not just humans. Agents can't see your buttons. They need: speed, clarity, structured output, verbose errors with next steps, edge case coverage, agentic affordances (`llms.txt`, clear `--help`, stable exit codes).
73
77
 
74
78
  ## Conviction Over Local Maxima
75
79
 
76
- Iterating toward "slightly better" = local maximum (safe, forgettable). Great design is a bet on a global maximum. AI makes the local-max trap worse — you converge on average faster. Subtraction over addition: the strongest move is often deleting something.
80
+ Iterating toward "slightly better" = local maximum (safe, forgettable). Great design is a bet on a global maximum. AI makes the local-max trap worse: you converge on average faster. Subtraction over addition: the strongest move is often deleting something.
77
81
 
78
82
  ## Anti-Attractors
79
83
 
@@ -87,15 +91,41 @@ Taste emerges from constraints. Pick constraints before starting: one font, two
87
91
 
88
92
  > "if you showed this to someone and said 'AI made this,' would they believe you immediately? if yes, that's the problem."
89
93
 
90
- Fingerprints: inter/roboto, purple-to-blue gradients, cyan-on-dark, glassmorphism, gradient text, hero metrics, identical card grids, bounce easing, dark mode with neon, sparklines as decoration, rounded rectangles with drop shadows, "claude beige" off-white backgrounds, instrument serif overuse, generic flat tinted backgrounds.
94
+ Fingerprints: inter/roboto, purple-to-blue gradients, cyan-on-dark, glassmorphism, gradient text, hero metrics, identical card grids, bounce easing, dark mode with neon, sparklines as decoration, rounded rectangles with drop shadows, "claude beige" off-white backgrounds, instrument serif overuse, generic flat tinted backgrounds, all-caps eyebrow labels appearing out of nowhere.
95
+
96
+ ## Lessons (typed, compounding)
97
+
98
+ Every entry: id, rule, detector, status. A detector is a regex/command a gate can run, or `judgment` if only a model can catch it. `graduated` means a deterministic gate now enforces it (design-gate.mjs in atrisos-web, `atris slop` in atris-cli); the lesson stays here as the memory of why.
99
+
100
+ | id | rule | detector | status |
101
+ |----|------|----------|--------|
102
+ | D1 | no purple/violet/fuchsia/lavender palettes | banned-palette class scan | graduated (design-gate) |
103
+ | D2 | no hardcoded neutral tailwind classes, tint toward brand | zinc/gray/neutral/slate class scan | graduated (design-gate) |
104
+ | D3 | no all-caps labels anywhere | uppercase class scan | graduated (design-gate) |
105
+ | D4 | custom components only, no shadcn/radix primitives | radix import scan | graduated (design-gate) |
106
+ | D5 | no pulsing status dots outside loading skeletons | pulse class scan outside loading/skeleton files | graduated (design-gate) |
107
+ | D6 | no arbitrary hex in color utilities, use brand vars | hex-in-color-utility scan | graduated (design-gate) |
108
+ | D7 | no em dashes in UI copy or prose | U+2014 scan | graduated (atris slop) |
109
+ | D8 | no claude-beige backgrounds, no instrument serif as default | judgment | active |
110
+ | D9 | fuzzy wish gets translated to craft vocabulary and echoed back before building | judgment | active |
111
+
112
+ ## Self-Improve (part of the job)
113
+
114
+ This skill compounds or it dies. The contract, every frontend session:
115
+
116
+ 1. **Capture in the same tick.** When the operator corrects a design choice (a "no", a revert, a fix after landing, a reaction like "that looks AI"), append a typed lesson row above before the session ends. Quote the trigger in the commit/journal, keep the rule one line, propose a detector.
117
+ 2. **Graduate detectors.** A lesson with a deterministic detector does not stay prose: add it to the nearest gate (`scripts/design-gate.mjs` CATEGORIES in atrisos-web, `atris slop` rules in atris-cli), then mark the row graduated. The gate is the enforcement; the row is the memory.
118
+ 3. **Promote repeat offenders.** A judgment lesson that fires 3+ times gets rewritten into the Quick Reference prose above and its row marked promoted.
119
+ 4. **Edit the canonical only.** This file, in atris-cli, committed to git. Then run `atris sync` in each workspace (or wait for the pulse tick) to propagate. Writing to a downstream copy is a lost write.
120
+ 5. **Prune.** Fold subsumed lessons, keep this file readable in one sitting. If the lessons table passes ~25 rows, graduate or promote before adding.
121
+ 6. **Bump the version** on every content change (progressive: patch for a lesson row, minor for a new principle).
91
122
 
92
123
  ## Before Shipping Checklist
93
124
 
94
- Run through `atris/policies/atris-design.md` "before shipping" section:
95
125
  - can you name the aesthetic in 2-3 words?
96
126
  - distinctive font, not default?
97
- - at least one intentional animation?
98
- - background has depth?
127
+ - at least one intentional animation? zero pulsing/looping ones?
128
+ - background has depth? not claude beige?
99
129
  - hover states feel inviting, not confusing?
100
130
  - scrolling feels native?
101
131
  - hero passes H1 test (what/who/why/CTA)?
@@ -104,20 +134,14 @@ Run through `atris/policies/atris-design.md` "before shipping" section:
104
134
  - WCAG AA contrast (4.5:1 text, 3:1 UI)?
105
135
  - works on mobile (44px touch targets, no horizontal scroll, readable text)?
106
136
  - respects `prefers-reduced-motion`?
137
+ - zero shout-cased copy? zero em dashes in copy?
107
138
  - did you name the moves in craft vocabulary (vertical rhythm, negative space, bolder/quieter)?
108
139
  - did you use anti-attractors (named what to avoid, seeded a reference, set a constraint)?
109
140
  - if agent-facing: does it have agentic affordances (clear errors, structured output, stable exit codes)?
141
+ - ran the design gate? (`npm run audit:design` / `atris slop`)
142
+ - new operator correction this session? then a new lesson row exists in the canonical and it is committed.
110
143
  - would a designer clock this as ai-generated?
111
144
 
112
- ## Atris Commands
113
-
114
- ```bash
115
- atris # load workspace context
116
- atris plan # break down frontend task
117
- atris do # build with step-by-step validation
118
- atris review # validate against this policy
119
- ```
120
-
121
145
  ## Learn More
122
146
 
123
147
  - Full policy: `atris/policies/atris-design.md`
@@ -62,18 +62,24 @@ After running the three moves, write the result to `atris/TODO.md`:
62
62
  **Source:** <inbox-item | wiki-signal | user-prompt> (so we know where it came from)
63
63
  ```
64
64
 
65
- 2. **Add each REVERSE PATH step as a tagged backlog task** in `## Backlog`:
65
+ **Horizon voice rule (non-negotiable).** The horizon renders verbatim on every boot to whoever opens the workspace: engineer, operator, or a first-day outsider. Write it so a new teammate in any domain gets it on first read: one sentence, plain words, no em dashes, no ids/flags/insider jargon (no "dispatch", "lane", "fast-tier", "receipt path"), and it names the observable proof ("proven the day X happens"). If a term only means something to the people who built the system, translate it or cut it.
66
+
67
+ 2. **Add each REVERSE PATH step as a tagged task — through the task db when one exists.**
68
+
69
+ **Durable-db workspaces (any repo with `.atris/state/tasks.projection.json` / the `atris task` verb):** markdown task lines written into TODO.md DO NOT SURVIVE — the next `atris task render` regenerates the file from the db and silently wipes them (learned 2026-07-12, lesson `endgame-tasks-must-be-durable-db-rows`; the `## Endgame` header block survives, the tasks vanish). Create each step as a real row instead:
70
+
71
+ ```bash
72
+ atris task add "<step description>" --tag endgame
73
+ ```
74
+
75
+ **Markdown-only workspaces (no task db):** the old inline form is fine:
66
76
 
67
77
  ```markdown
68
78
  - **T1:** <step 1 description> [endgame]
69
79
  **Verify:** <deterministic-check>
70
- - **T2:** <step 2 description> [endgame]
71
- **Verify:** <deterministic-check>
72
- - **T3:** <step 3 description> [endgame]
73
- **Verify:** <deterministic-check>
74
80
  ```
75
81
 
76
- The tag must be exactly `[endgame]` (parser only matches `\w+`, no colons or hyphens). The slug lives in the section header.
82
+ The tag must be exactly `endgame` / `[endgame]` (parser only matches `\w+`, no colons or hyphens). The slug lives in the section header.
77
83
 
78
84
  3. **Always append an RSI audit as the final task:**
79
85
 
@@ -1,19 +1,20 @@
1
1
  ---
2
2
  name: engines
3
- description: "Dispatch coding work to an installed terminal agent — Codex, Cursor, Devin, or Atris Fast — as an interchangeable worker engine. Claude orchestrates: writes the bounded prompt, the engine builds, Claude verifies and lands. Triggers on: use codex, use cursor, use devin, use atris, engine, dispatch to, worker agent, second opinion build."
4
- version: 1.1.0
3
+ description: "Dispatch coding work to an installed terminal agent — Codex, Cursor, Devin, Grok, or Atris Fast — as an interchangeable worker engine. Claude orchestrates: writes the bounded prompt, the engine builds, Claude verifies and lands. Triggers on: use codex, use cursor, use devin, use grok, use atris, engine, dispatch to, worker agent, second opinion build."
4
+ version: 1.2.0
5
5
  tags:
6
6
  - engines
7
7
  - codex
8
8
  - cursor
9
9
  - devin
10
+ - grok
10
11
  - atris
11
12
  - orchestration
12
13
  ---
13
14
 
14
15
  # Engines — interchangeable terminal workers
15
16
 
16
- One contract, four engines. The orchestrator (you, Claude) writes a bounded task prompt, dispatches it to an engine, then **independently verifies, lands, and pushes** the result. Engines never self-certify.
17
+ One contract, five engines. The orchestrator (you, Claude) writes a bounded task prompt, dispatches it to an engine, then **independently verifies, lands, and pushes** the result. Engines never self-certify.
17
18
 
18
19
  ## Invocation
19
20
 
@@ -21,7 +22,8 @@ One contract, four engines. The orchestrator (you, Claude) writes a bounded task
21
22
  |--------|---------|-------|
22
23
  | Codex | `node "${CLAUDE_PLUGIN_ROOT}/scripts/codex-companion.mjs" task --background [--write] "<prompt>"` (via codex plugin / codex:codex-rescue agent) | Poll with `status`, fetch with `result <job-id>` |
23
24
  | Cursor | `cursor-agent --trust -p "<prompt>"` (run from the target repo) | Headless print mode; `--trust` required for non-interactive |
24
- | Devin | `devin -p --permission-mode dangerous -- "<prompt>"` (run from the target repo) | Default permission mode is read-only for writes — build work NEEDS `--permission-mode dangerous`, so only run it in an isolated worktree. Also `devin cloud` for sessions that outlive this machine |
25
+ | Devin | `devin -p --permission-mode dangerous -- "<prompt>"` (run from the target repo) | Default permission mode is read-only for writes — build work NEEDS `--permission-mode dangerous`, so only run it in an isolated worktree. Also `devin cloud` for sessions that outlive this machine. Supports `--model swe-1.7` |
26
+ | Grok | `grok --always-approve -p "<prompt>"` (run from the target repo) | Headless single-turn via `-p`; default model grok-4.5. Very fast on lookups (~10s, reads MAP first). Great for quick second opinions; use `--best-of-n <N>` for tricky bounded builds. Uses grok.com login |
25
27
  | Atris Fast | `atris chat --print "<prompt>"` (run from the target repo; equivalently `ax --fast --print`) | Headless JSON result `{ok, model, output, durationMs}`; exit 0 = ok. Serves via the api.atris.ai fast lane (glm-5.2) with a local tool runtime scoped to the cwd — reads, greps, small verified edits. ~1% of frontier cost, typical turns 5–40s |
26
28
 
27
29
  ## Picking an engine
@@ -29,9 +31,24 @@ One contract, four engines. The orchestrator (you, Claude) writes a bounded task
29
31
  - **Codex** — deep root-cause work, long autonomous builds, second-opinion diagnosis. Slowest; runs sandboxed.
30
32
  - **Cursor** — fast bounded edits and refactors in a single repo.
31
33
  - **Devin** — multi-step feature work; use `cloud` when the run should survive laptop sleep.
34
+ - **Grok** - fastest frontier lookups and quick second opinions (grok-4.5, ~10s; reads MAP first); use `--best-of-n` for tricky bounded builds. Uses grok.com login.
32
35
  - **Atris Fast** — cheap bounded lookups, single-file facts, small verified edits, high-volume fan-out (ten questions = ten `--print` calls at pennies). Not for multi-file features or long builds. Use it before burning a frontier engine on grunt work.
33
36
  - Parallel builds across repos: one engine job per repo, never two engines writing the same checkout.
34
37
 
38
+ ## Models worth pinning (verified live 2026-07-09)
39
+
40
+ Each engine CLI can pin a specific model. Current best picks:
41
+
42
+ | Engine | Flag | Best models today |
43
+ |--------|------|-------------------|
44
+ | Devin | `--model swe-1.7` | `swe-1.7` (free right now: use it as the volume executor for parallel bounded slices), `swe-1.7-lightning` for speed |
45
+ | Cursor | `--model grok-4.5-xhigh` | `grok-4.5-xhigh` / `grok-4.5-fast-xhigh` for second-opinion builds, `composer-2.5` for fast edits; parameterized Claude via `'claude-opus-4-8[effort=high]'`; `--list-models` shows the full menu |
46
+ | Grok | (default) | `grok-4.5` default, `grok-composer-2.5-fast` for speed |
47
+ | Codex | (plugin default) | rides the codex plugin's pinned model |
48
+ | Atris Fast | (fixed) | api.atris.ai fast lane |
49
+
50
+ Re-verify this table when a lab ships a new model: run each CLI's model-list command, smoke one lookup, and update the row. Free-tier windows (like swe-1.7 now) are the moment to fan out volume work.
51
+
35
52
  ## Atris Fast runtime requirements (verified live 2026-07-03)
36
53
 
37
54
  - Must run from an **initialized Atris workspace** (an `atris/` folder) under an allowed workspace root (e.g. `~/arena/*`). `atris chat --print` outside one exits 1 with "Run atris init"; `ax --fast --print` outside an allowed root fail-closes with `{ok:false, error:"workspace_path must be under an allowed local workspace root"}`.
@@ -48,6 +65,7 @@ One contract, four engines. The orchestrator (you, Claude) writes a bounded task
48
65
 
49
66
  - **Codex sandbox cannot reach github.com and may get read-only repo access.** Expect temp clones / `git format-patch` fallbacks under `/private/tmp`. Apply patches in a fresh worktree, re-run the verify command yourself, then push.
50
67
  - Cursor and Devin run unsandboxed — still re-run the verify command yourself before pushing.
68
+ - Long Devin runs (5+ min) can return empty stdout even when the build fully succeeded — judge by `git status` and the diff in its worktree, never by the printed report.
51
69
  - Atris Fast answers are model output over a real tool runtime — treat `output` as a claim, spot-check the cited file:line, and re-run any verifier yourself before acting on it.
52
70
  - Engine task DBs and receipts written inside a sandbox are snapshots; reconcile against the live `atris task` plane after landing.
53
71
  - A stalled job (no log output for 30+ min) gets cancelled and taken over; don't wait on it. Atris Fast turns that exceed ~60s have hung — kill and retry once with a tighter prompt.
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: fable-method
3
+ description: Working method distilled from Claude Fable 5 for daily-driver models (Opus, Sonnet). Use at session start, before any multi-step task, or when output feels shallow, hedged, or prematurely "done". Triggers on fable method, think like fable, deep pass.
4
+ version: 1.0.0
5
+ tags:
6
+ - meta
7
+ - method
8
+ - handoff
9
+ ---
10
+
11
+ # Fable Method
12
+
13
+ A handoff doc from the strongest model to the daily driver. Raw capability does not transfer; process does. These are the habits that made the difference observable, written as checks a smaller model can actually run.
14
+
15
+ ## The core loop
16
+
17
+ 1. **Read the whole brief first.** Every constraint, every file named, the goal behind the ask. Do not start executing on the first sentence.
18
+ 2. **Sweep context in parallel.** Batch all independent reads and searches into one round. Serial exploration is the top time sink.
19
+ 3. **Size the real task.** If it touches 10 files, plan for 10. Never quietly shrink scope to what feels comfortable and then report done.
20
+ 4. **Execute in one deep pass.** Hold the plan, work through it, note deviations as you hit them instead of stopping to ask.
21
+ 5. **Verify against reality.** Real command, real data, real terminal. A green mock proves nothing (the readline PTY bug lived behind green mock tests for weeks).
22
+ 6. **Report outcome first.** First sentence says what happened. Receipts (command plus output) beat adjectives.
23
+
24
+ ## Non-negotiables
25
+
26
+ - "Done" requires a receipt: the command you ran and what it printed. No receipt means you say "built, not yet verified".
27
+ - Localize uncertainty. "X works (tested), Y I have not checked" beats hedging the whole answer.
28
+ - "Are you sure?" is a request to enumerate concrete failure modes (empty input, race, 500, missing file, off-by-one), not a signal to flip. Update only on new evidence.
29
+ - Verify references at the moment of use. If a doc names a file or flag, confirm it still exists before acting on it. Stale docs get fixed or flagged, not obeyed.
30
+ - Prefer deletion. The best fix removes code. No just-in-case features, no scattered TODOs.
31
+ - Judge and worker stay separate. The pass that verifies never patches; it opens a task.
32
+
33
+ ## Dispatched work
34
+
35
+ Never end your turn while a build you dispatched (codex, cursor, any engine) is still running. "Standing by" or "polling in the background" ends your run and orphans the build. Poll in the foreground: loop sleep-plus-status-check until it completes, use the wait to prep the next bounded prompt, then verify and land. Your turn ends when every assigned item is shipped-with-proof or blocked with a named reason.
36
+
37
+ ## Briefing engines (codex, cursor, any headless builder)
38
+
39
+ Learned from a night of live dispatches: engines one-shot well or fail on the brief, almost never in between.
40
+
41
+ - **Pin the engine by name.** When the operator names a tool or engine, that is a constraint, not a suggestion. A brief that leaves the engine open gets the default, and the operator interrupts.
42
+ - **The brief is: goal, exact files with line refs you verified, Done:, Check:.** Every clean one-shot tonight had all four; every failure was missing one.
43
+ - **Own the git rules explicitly.** Say who commits. If your wrapper lands the work, tell the engine "commit on this branch, never push, never create branches". Engines left ungoverned will auto-commit with foreign trailers and push.
44
+ - **Never let a prompt cd into a repo root.** Engines work in isolated worktrees only; a prompt that targets the primary checkout strands unstaged edits on the operator's branch.
45
+ - **Diff-review the draft before landing.** Judge and worker separation is not ceremony: two real defects (a normalizer silently stripping file content, a fake-green landing) were caught only because the verifier read the diff instead of trusting the report.
46
+
47
+ ## Operating hygiene
48
+
49
+ - **Never pipe a verify command through anything that masks its exit code.** `cmd | tail` exits with tail's status; you will read green on red. Capture to a file, then check exit and summary separately.
50
+ - **Run state-mutating CLI commands from the repo root that owns the state.** cd-chains that end in another repo or a worktree hit the wrong task db and fail confusingly.
51
+ - **Prefer the tool's own stop verb over kill.** A process that prints "stop anytime: X stop" gets X stop; kill leaves half-landed work for someone to salvage.
52
+ - **When a discipline rule is violated twice, convert it into a mechanism.** Doctrine asks; code enforces. The parked-foreman rule became a blocking dispatch command; the isolation rule became a thrown error.
53
+
54
+ ## Stuck protocol
55
+
56
+ Never retry the same failing action a third time. Write down three concrete hypotheses for the failure, then run the cheapest test that discriminates between them. If none survive, say what you ruled out and what input you need.
57
+
58
+ ## Memory
59
+
60
+ After a session with a real lesson, write one fact per file to memory or the journal: what was non-obvious, why it matters, how to apply it next time. Prose logs do not compound; typed facts do.
61
+
62
+ ## For the operator
63
+
64
+ - One big brief beats 20 micro-instructions. Put all background and constraints in the first message.
65
+ - Over-granular instructions backfire on capable models. State the goal and the constraints, not the keystrokes.
66
+ - Default thinking effort high; save the max tier for genuinely intricate work.