atris 3.57.4 → 3.58.6

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 (175) hide show
  1. package/README.md +12 -1
  2. package/atris/skills/clawhub/member-runtime/SKILL.md +9 -9
  3. package/atris/skills/create-member/SKILL.md +16 -13
  4. package/atris/skills/design/SKILL.md +27 -4
  5. package/atris/skills/engines/SKILL.md +55 -12
  6. package/atris/skills/x-search/SKILL.md +8 -6
  7. package/atris/skills/youtube/SKILL.md +66 -21
  8. package/atris/team/brainstormer/MEMBER.md +2 -2
  9. package/atris/team/executor/MEMBER.md +3 -3
  10. package/atris/team/launcher/MEMBER.md +4 -4
  11. package/atris/team/navigator/MEMBER.md +3 -3
  12. package/atris/team/researcher/MEMBER.md +2 -2
  13. package/atris/team/validator/MEMBER.md +1 -1
  14. package/atris.md +14 -0
  15. package/ax +153 -23
  16. package/bin/atris.js +78 -30
  17. package/commands/aeo.js +4 -4
  18. package/commands/agents.js +1 -1
  19. package/commands/align.js +12 -12
  20. package/commands/analytics.js +3 -3
  21. package/commands/app.js +5 -5
  22. package/commands/ask.js +175 -0
  23. package/commands/auth.js +59 -31
  24. package/commands/autoland.js +29 -5
  25. package/commands/autopilot-front.js +6 -6
  26. package/commands/autopilot.js +90 -90
  27. package/commands/avail.js +5 -5
  28. package/commands/bench.js +63 -1
  29. package/commands/browse.js +2 -2
  30. package/commands/business.js +12 -12
  31. package/commands/card.js +2 -2
  32. package/commands/clean.js +13 -13
  33. package/commands/close.js +3 -3
  34. package/commands/compile.js +13 -13
  35. package/commands/computer.js +94 -27
  36. package/commands/console.js +5 -5
  37. package/commands/decide.js +1 -1
  38. package/commands/deck.js +9 -9
  39. package/commands/drive.js +4 -4
  40. package/commands/engine.js +173 -19
  41. package/commands/errors.js +3 -3
  42. package/commands/experiments.js +18 -1
  43. package/commands/feed.js +2 -2
  44. package/commands/feedback.js +4 -4
  45. package/commands/fleet.js +12 -12
  46. package/commands/game.js +1 -1
  47. package/commands/guide.js +49 -0
  48. package/commands/improve.js +19 -17
  49. package/commands/init.js +67 -19
  50. package/commands/interview.js +7 -7
  51. package/commands/land.js +40 -15
  52. package/commands/learn.js +216 -50
  53. package/commands/lesson.js +2 -2
  54. package/commands/log.js +1 -1
  55. package/commands/loops.js +4 -4
  56. package/commands/member.js +75 -50
  57. package/commands/mission.js +90 -82
  58. package/commands/one-lap.js +1 -1
  59. package/commands/pack.js +74 -8
  60. package/commands/plugin.js +6 -6
  61. package/commands/probe.js +9 -9
  62. package/commands/pull.js +35 -35
  63. package/commands/pulse.js +1 -1
  64. package/commands/push.js +21 -21
  65. package/commands/rainmaker.js +1 -1
  66. package/commands/recap.js +7 -7
  67. package/commands/reel.js +2 -2
  68. package/commands/release.js +3 -3
  69. package/commands/report.js +1 -1
  70. package/commands/review.js +5 -5
  71. package/commands/revisions.js +1 -1
  72. package/commands/run.js +1 -1
  73. package/commands/scout.js +3 -3
  74. package/commands/security-review.js +7 -7
  75. package/commands/serve.js +9 -9
  76. package/commands/setup.js +1 -1
  77. package/commands/sign.js +4 -4
  78. package/commands/signup.js +4 -4
  79. package/commands/site.js +8 -3
  80. package/commands/skill.js +6 -6
  81. package/commands/slop.js +18 -18
  82. package/commands/social.js +3 -3
  83. package/commands/soul.js +14 -14
  84. package/commands/spaceship.js +1 -1
  85. package/commands/status.js +2 -2
  86. package/commands/strings.js +13 -13
  87. package/commands/study.js +4 -4
  88. package/commands/sync.js +8 -8
  89. package/commands/task.js +50 -25
  90. package/commands/teach.js +2 -2
  91. package/commands/team.js +1 -1
  92. package/commands/theme.js +2 -2
  93. package/commands/tree.js +34 -0
  94. package/commands/truth.js +7 -7
  95. package/commands/verify.js +12 -12
  96. package/commands/visualize.js +2 -2
  97. package/commands/workflow.js +101 -48
  98. package/commands/worktree.js +1 -1
  99. package/commands/write.js +9 -9
  100. package/commands/x-search.js +93 -22
  101. package/commands/xp.js +6 -3
  102. package/commands/youtube.js +1019 -123
  103. package/lib/accept-verify-gate.js +3 -3
  104. package/lib/activity-stream.js +1 -1
  105. package/lib/auto-accept-certified.js +28 -12
  106. package/lib/autoland.js +6 -6
  107. package/lib/bench/engines.js +59 -8
  108. package/lib/bench/report.js +1 -1
  109. package/lib/bench/runner.js +204 -5
  110. package/lib/bench/tree-render.js +76 -0
  111. package/lib/card.js +1 -1
  112. package/lib/chat-log-scan.js +1 -1
  113. package/lib/claude-boot-block.js +2 -0
  114. package/lib/deck-compose.js +1 -1
  115. package/lib/deck-history.js +2 -2
  116. package/lib/deck-layout.js +1 -1
  117. package/lib/deck-review.js +5 -5
  118. package/lib/deck-schema.js +1 -1
  119. package/lib/default-verifier.js +1 -1
  120. package/lib/developer-api.js +3 -0
  121. package/lib/engine-ask.js +45 -7
  122. package/lib/engine-registry.js +15 -2
  123. package/lib/file-ops.js +1 -1
  124. package/lib/fleet.js +71 -35
  125. package/lib/html-render.js +1 -1
  126. package/lib/intents.js +172 -0
  127. package/lib/journal.js +1 -1
  128. package/lib/known-commands.js +2 -2
  129. package/lib/land-green.js +364 -0
  130. package/lib/lesson-contradiction.js +2 -2
  131. package/lib/lesson-preflight.js +1 -1
  132. package/lib/manifest.js +5 -5
  133. package/lib/member-alive.js +9 -5
  134. package/lib/memory-view.js +3 -3
  135. package/lib/mission-protected-lane.js +1 -1
  136. package/lib/mission-root.js +2 -2
  137. package/lib/orb-context.js +10 -10
  138. package/lib/pack-capabilities.js +861 -3
  139. package/lib/permission-grants.js +2 -2
  140. package/lib/policy-lessons.js +6 -6
  141. package/lib/pulse.js +8 -8
  142. package/lib/receipt-evidence.js +1 -1
  143. package/lib/reel.js +1 -1
  144. package/lib/review-integrity.js +1 -1
  145. package/lib/runner-command.js +35 -5
  146. package/lib/scorecard.js +4 -4
  147. package/lib/security-scan.js +5 -5
  148. package/lib/self-drive.js +1 -1
  149. package/lib/site-publish.js +372 -0
  150. package/lib/site.js +1 -1
  151. package/lib/slides-deck.js +2 -2
  152. package/lib/state-detection.js +2 -2
  153. package/lib/sync-telemetry.js +2 -2
  154. package/lib/task-db.js +17 -10
  155. package/lib/task-explanation.js +1 -1
  156. package/lib/task-proof.js +2 -2
  157. package/lib/task-receipt.js +3 -3
  158. package/lib/theme.js +12 -12
  159. package/lib/todo-fallback.js +3 -3
  160. package/lib/todo-sections.js +1 -1
  161. package/lib/tree-hash.js +79 -0
  162. package/lib/usage.js +1 -1
  163. package/lib/wish-delegate.js +1 -1
  164. package/lib/workspace-safety.js +4 -4
  165. package/lib/workspace-scaffold.js +3 -3
  166. package/package.json +1 -1
  167. package/scripts/det/concierge-bakeoff.sh +26 -0
  168. package/scripts/det/ytnotes +82 -5
  169. package/scripts/det/ytquote-repair.js +0 -1
  170. package/scripts/det/ytrail-race.js +0 -5
  171. package/scripts/member-operate.mjs +52 -14
  172. package/scripts/outbound-artifact-gate.js +0 -3
  173. package/utils/auth.js +47 -9
  174. package/utils/config.js +0 -1
  175. package/scripts/det/checklist-score.js +0 -191
package/README.md CHANGED
@@ -99,6 +99,17 @@ Core loop: `plan` -> `do` -> `review`
99
99
 
100
100
  Integrates with any agent.
101
101
 
102
+ ### Publish a static site
103
+
104
+ Upload any built static site to an Atris-hosted subdomain. See
105
+ [docs/site-publish.md](docs/site-publish.md) for flags, limits, profiles, and
106
+ troubleshooting.
107
+
108
+ ```bash
109
+ atris site publish dist --slug my-site --spa
110
+ atris site publish . --slug my-next-app --profile app --build # Next.js static export
111
+ ```
112
+
102
113
  ## Chat With Atris 2
103
114
 
104
115
  `ax` is the Atris 2 chat and coding-agent CLI. It uses the hosted Atris cloud by default, streams text, shows tool activity, and keeps fresh installs away from local setup.
@@ -237,7 +248,7 @@ atris business record atris/reports/2026-04-12-operator-recap.md --outcome mixed
237
248
  - `atris wiki --private` stores local-only sensitive notes under `.atris/presidio/`
238
249
  - `atris loop` refreshes `atris/wiki/STATUS.md` and `atris/wiki/log.md`, flags stale/orphan pages, and suggests the next ingest
239
250
  - `atris activate` loads the current wiki status so the next session starts with project memory, not just tasks
240
- - `atris member` keeps team-member identity and learning local-first: `MEMBER.md` is the role contract, `goals.json` is the machine-readable goal/experiment state, `goals.md` is the human readout, and `logs/YYYY-MM-DD.md` records what happened. Use `atris member goal`, `tick`, `status`, `block`, and `review --value 1..5` to test whether a member is making useful progress or needs the operator/orchestrator.
251
+ - `atris member` keeps team-member identity and learning local-first: `MEMBER.md` is the role contract, `goals.json` is the machine-readable goal/experiment state, `goals.md` is the human readout, and `logs/YYYY-MM-DD.md` records what happened. Use `atris member goal`, `tick`, `status`, `block`, and `review <name> <experiment-id> --accept --proof "..." --value 1..5` to test whether a member is making useful progress or needs the operator/orchestrator.
241
252
  - `atris codex-goal` is the read-only bridge for native Codex `/goal`: `status` inspects the live goal database, while the legacy `reset` command now refuses every mutation. Active tasks continue in place; completed tasks retain their final goal, and new work or recurring monitors use a new dedicated Codex task.
242
253
  - `atris task` keeps durable local task state and append-only events for agents; `atris/TODO.md` is just a regenerated readable board. Run the loop with `atris task new`, `delegate "..." --to <owner>`, `next`, `say`, and `ready <id> --proof "..."`; human approval is `atris task accept <id>` (moves to Done, awards Career XP) or `revise <id> --note "..."`. Final task transitions also append the general daily log and, when a real `atris/team/<member>/MEMBER.md` matches the task owner, that member's daily log. Add `--json` for headless agents, `atris task serve` for the local board, and `atris task show <ref>` / `events --all` for the full ledger. Commands accept semantic refs (`OBL-18`), full IDs, or any unique prefix. In cloud business workspaces, Supabase `tasks` is the source of truth and Swarlo the live claim layer.
243
254
  - `atris mission` is the durable autonomy layer: start with an owner, verifier, runner, and stop condition; record bounded work with `mission tick`; close with `mission complete` only after proof. Runners include `manual`, `claude`, `atris2`, and `codex_goal`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: member-runtime
3
- description: "Load and run MEMBER.md team members -- complete AI workers with persona, skills, tools, context, and a journal that learns over time. Use when you want to activate a team member, run 'be my chief of staff', or manage stateful AI workers."
3
+ description: "Load and run MEMBER.md team members -- complete AI workers with persona, skills, tools, context, and a log that learns over time. Use when you want to activate a team member, run 'be my chief of staff', or manage stateful AI workers."
4
4
  version: 1.0.0
5
5
  tags:
6
6
  - ai-agents
@@ -12,7 +12,7 @@ tags:
12
12
 
13
13
  # Member Runtime
14
14
 
15
- This skill teaches you how to load and run MEMBER.md team members. A member is a skill that manages skills -- it bundles a persona, capabilities, tools, permissions, and a journal that gets smarter over time.
15
+ This skill teaches you how to load and run MEMBER.md team members. A member is a skill that manages skills -- it bundles a persona, capabilities, tools, permissions, and a log that gets smarter over time.
16
16
 
17
17
  Format spec: https://github.com/atrislabs/member
18
18
 
@@ -26,7 +26,7 @@ team/{name}/
26
26
  skills/ # What they can do (SKILL.md files)
27
27
  context/ # What they know (domain knowledge)
28
28
  tools/ # What they use (API docs, configs)
29
- journal/ # What they've learned (grows over time)
29
+ logs/ # What they've learned (grows over time)
30
30
  ```
31
31
 
32
32
  ## How to Load a Member
@@ -61,23 +61,23 @@ For each skill in the frontmatter `skills` list:
61
61
 
62
62
  Read all markdown files in `team/{name}/context/`. These are domain knowledge the member references while working -- playbooks, reference docs, default preferences. Load them into your working context.
63
63
 
64
- ### 5. Read the journal
64
+ ### 5. Read the log
65
65
 
66
66
  This is what makes members stateful. Before doing anything:
67
67
 
68
68
  1. Search memory for past entries from this member: `memory_search("{member-name} preferences patterns")`
69
- 2. Read today's and yesterday's memory files for recent journal entries
69
+ 2. Read today's and yesterday's memory files for recent log entries
70
70
  3. Read `MEMORY.md` for durable preferences this member has recorded
71
71
 
72
- If no journal entries exist (first run), proceed with defaults from `context/preferences.md`.
72
+ If no log entries exist (first run), proceed with defaults from `context/preferences.md`.
73
73
 
74
74
  ### 6. Become the member
75
75
 
76
76
  Adopt the persona, workflow, and rules from the MEMBER.md body. You are now this member. Follow their workflow step by step. Respect their permissions -- if `can-send: false`, draft but don't send.
77
77
 
78
- ### 7. Write the journal
78
+ ### 7. Write the log
79
79
 
80
- After completing the task, write a journal entry to `memory/YYYY-MM-DD.md`:
80
+ After completing the task, write a log entry to `logs/YYYY-MM-DD.md`:
81
81
 
82
82
  ```markdown
83
83
  ## {member-name} - {date}
@@ -100,7 +100,7 @@ The member's `permissions` field declares intent. Enforce it:
100
100
 
101
101
  ## Multiple Members
102
102
 
103
- Users can install multiple members. Each has its own persona, skills, and journal entries in memory. When switching between members, load the new member's MEMBER.md fresh -- don't carry over the previous member's persona.
103
+ Users can install multiple members. Each has its own persona, skills, and log entries. When switching between members, load the new member's MEMBER.md fresh -- don't carry over the previous member's persona.
104
104
 
105
105
  To list installed members: scan `team/` for MEMBER.md files and flat .md files.
106
106
 
@@ -1,12 +1,6 @@
1
1
  ---
2
2
  name: create-member
3
3
  description: "Create and manage AI team members using the MEMBER.md format. Use when the user wants to define a new AI role, set up a team member, create an agent persona, or work with team/MEMBER.md files."
4
- version: 1.0.0
5
- tags:
6
- - team
7
- - member
8
- - agent
9
- - persona
10
4
  ---
11
5
 
12
6
  # Member Creator
@@ -25,13 +19,18 @@ Spec: https://github.com/atrislabs/member
25
19
  team/<name>/
26
20
  ├── MEMBER.md REQUIRED Persona + role + permissions
27
21
  ├── SOUL.md REQUIRED Identity, values, lessons — who the agent is
28
- ├── skills/ OPTIONAL SKILL.md files (capabilities)
22
+ ├── MISSION.md REQUIRED Durable purpose and goal-selection rule
23
+ ├── goals.json REQUIRED Machine-readable goal state
24
+ ├── goals.md REQUIRED Human-readable goal state
25
+ ├── logs/ REQUIRED Dated continuity receipts
26
+ │ └── YYYY-MM-DD.md
27
+ ├── skills/ REQUIRED SKILL.md files (may start empty)
29
28
  │ └── <skill>/
30
29
  │ └── SKILL.md
31
- ├── tools/ OPTIONAL MCP servers, API docs, CLI docs
30
+ ├── tools/ REQUIRED MCP servers, API docs, CLI docs (may start empty)
32
31
  │ ├── .mcp.json
33
32
  │ └── <tool>.md
34
- └── context/ OPTIONAL Domain knowledge (markdown)
33
+ └── context/ REQUIRED Domain knowledge (may start empty)
35
34
  └── *.md
36
35
  ```
37
36
 
@@ -52,12 +51,16 @@ Ask the user:
52
51
  team/<name>/
53
52
  ├── MEMBER.md
54
53
  ├── SOUL.md
54
+ ├── MISSION.md
55
+ ├── goals.json
56
+ ├── goals.md
57
+ ├── logs/
55
58
  ├── skills/
56
59
  ├── tools/
57
60
  └── context/
58
61
  ```
59
62
 
60
- Use kebab-case for the name. Create all directories even if empty.
63
+ Use kebab-case for the name. Create the full bundle in one operation, even when the directories and goal list start empty. Never overwrite existing identity, mission, goal, or log files while backfilling a member.
61
64
 
62
65
  ### Step 3: Write SOUL.md
63
66
 
@@ -167,15 +170,15 @@ Drop markdown files into `context/` with domain knowledge the member needs:
167
170
 
168
171
  No special format. Just markdown files the member references.
169
172
 
170
- ## Flat File Format
173
+ ## Legacy Flat Files
171
174
 
172
- For simple members that just need a persona (no skills, tools, or context), use a flat file:
175
+ Flat files are a legacy input only:
173
176
 
174
177
  ```
175
178
  team/<name>.md
176
179
  ```
177
180
 
178
- Same frontmatter, same format. Just no directory structure around it.
181
+ Do not create new flat-file members. Upgrade an existing flat file with `atris member upgrade <name>` so it receives the complete directory bundle without losing its MEMBER.md content.
179
182
 
180
183
  ## Detection
181
184
 
@@ -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: 3.1.1
4
+ version: 3.2.16
5
5
  allowed-tools: Read, Write, Edit, Bash, Glob
6
6
  tags:
7
7
  - design
@@ -45,7 +45,7 @@ Font alternatives: instead of Inter: Instrument Sans, Plus Jakarta Sans, Outfit.
45
45
 
46
46
  **Scroll:** never override native scroll. use "peeking" (show a few px of next section) instead of full-screen hero + scroll arrow.
47
47
 
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.
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. compact overlays clear the full measured header stack; never anchor them from a guessed single header height.
49
49
 
50
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.
51
51
 
@@ -57,7 +57,9 @@ Font alternatives: instead of Inter: Instrument Sans, Plus Jakarta Sans, Outfit.
57
57
 
58
58
  **Hierarchy:** 2-3 text levels max. don't mix 5 competing styles.
59
59
 
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.
60
+ **No all-caps. ever.** never use the `uppercase` tailwind class, `text-transform: uppercase`, or shout-cased copy on labels, section headers, buttons, badges, or anywhere else. random capitalized text mid-page reads as average ai-generated slop. write labels in sentence case ("Active tasks", not "ACTIVE TASKS") and let copy render as authored.
61
+
62
+ **No eyebrow metadata.** Do not place tiny index, category, status, or implementation-type strips above real content. If the name changes the next action, make it a readable heading. If it does not, remove it. Generator metadata belongs in machine contracts and inspectors, never on the product canvas.
61
63
 
62
64
  **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.
63
65
 
@@ -106,13 +108,33 @@ Every entry: id, rule, detector, status. A detector is a regex/command a gate ca
106
108
  | D5 | no pulsing status dots outside loading skeletons | pulse class scan outside loading/skeleton files | graduated (design-gate) |
107
109
  | D6 | no arbitrary hex in color utilities, use brand vars | hex-in-color-utility scan | graduated (design-gate) |
108
110
  | 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 |
111
+ | D8 | no claude-beige backgrounds, no instrument serif as default | judgment | promoted |
110
112
  | D9 | fuzzy wish gets translated to craft vocabulary and echoed back before building | judgment | active |
111
113
  | D10 | measured tokens over vibes: new components start from a measured recipe (exact colors, spacing, radii, type from a proven source), never from scratch | judgment | active |
112
114
  | D11 | layout contracts, not dioramas: min-height over fixed height, fluid max-width over fixed px, every overflow reachable (scroll or +N more), stress-test with hostile content before shipping | judgment | active |
113
115
  | D12 | one accent moment per card: brand accent for the primary action only, gold for confidence/progress fills, green only for completed; everything else tonal | judgment | active |
114
116
  | D13 | motion is calm and eased: 120-300ms ease-out on opacity/transform only, loops match a measured source cadence, prefers-reduced-motion always freezes them | judgment | active |
115
117
  | D14 | compact selectors lead with the chosen name and a discriminating icon; remove redundant field labels and visible type explanations when icon, title, and accessible label carry them | judgment | active |
118
+ | D15 | copy density on landing pages: hero lede one sentence, one sentence per feature card, one line per FAQ answer, legal in one short footer paragraph; a section paragraph past ~40 words gets cut or moved one click deep (Keshav 2026-09-01: "SO much blabber yap text. keep it clean") | `<p>` in landing html over 60 words flags; otherwise judgment | active |
119
+ | D16 | verify mobile with real device emulation (Playwright iPhone profile, WebKit for iOS), never headless Chrome --window-size: Chrome floors the window at 500px wide and renders a fake layout (caught 2026-09-01: two "passing" screenshots hid a broken phone nav) | command scan for `--window-size=3` or `--window-size=4` in verify scripts | active |
120
+ | D15 | first viewport restraint: one dominant idea, at most one secondary live region, and everything else behind progressive disclosure; reject permanent three-column cockpit density as default SaaS structure | judgment | active |
121
+ | D16 | one alignment contract per component: wrapper, metadata, controls, and rendered content share the same width and inset source at every viewport | judgment | active |
122
+ | D17 | responsive corrections must test every disclosed state immediately below, at, and above each breakpoint; a fixed bug cannot reappear when a panel opens or the container narrows | judgment | promoted |
123
+ | D18 | no eyebrow metadata or tiny titles: important names become readable headings; indices, platform type names, and generator metadata stay off product surfaces | judgment | promoted |
124
+ | D19 | bubbly flat UI means one generous rounded parent, flat content-rail rows, and circular controls with a real action or stable identity; never round every nested child | judgment | active |
125
+ | D20 | compound controls own one visible focus shape on the outer geometry; a borderless child field may suppress its ring only when the parent provides `:focus-within` proof | judgment | active |
126
+ | D21 | the reusable web component layer must match the product runtime: React and Next.js are canonical for Atris web; custom elements are compatibility code, never the source of truth | React field and function scan | graduated (component contract) |
127
+ | D22 | every documented component prop must be proven with the standalone package stylesheet; demo-only CSS cannot be the hidden implementation of a public layout contract | standalone prop selector scan | graduated (component contract) |
128
+ | D23 | an owner dashboard should begin as a project save state: current story, one resume action, active missions, and the responsible team; spatial world maps are earned later by real geography or dependency data | judgment | active |
129
+ | D24 | `Since you left` is a learning and cleanup receipt, not a feature changelog: show what the system learned, removed, and carried forward so the human can stay present | judgment | active |
130
+ | D25 | game-like dashboards use plain outcomes, visible stakes, and one obvious next action; invented quest names and internal loop language hide the work instead of clarifying it | judgment | active |
131
+ | D26 | execution receipts read in causal order: inspect inputs, reason, change, then verify; never reverse the activity list or lead with the outcome | judgment | active |
132
+ | D27 | in a compact composer, the send action must visibly dominate adjacent attachment and voice controls through size and accent while secondary controls remain full touch targets | judgment | active |
133
+ | D28 | sibling icon controls on one composer rail share a single explicit frame and alignment anchor; glyph size alone must never determine their centers | judgment | active |
134
+ | D29 | hide voice playback until its voice clears the product quality bar; a weak fallback control is worse than no control | judgment | active |
135
+ | D30 | a floating rounded composer inherits the page canvas; never paint a full-width contrast band behind it unless that band is intentional chrome | judgment | active |
136
+ | D31 | developer-only overlays stay off the product surface by default; any temporary visible launcher must have an immediate dismiss control | judgment | active |
137
+ | D32 | before changing repeated UI copy, verify the operator's exact executable and surface; matching labels do not prove the installed app, dev app, header, and composer share one live path | judgment | active |
116
138
 
117
139
  Measured recipes live in the mimic studies: `~/arena/mimic-beautiful-ui/LESSONS.md` (18 AI-interface components with exact tokens) and its `remix.css` :root block (the portable Atris token sheet, coffee + paper themes). Start there before designing an agent surface.
118
140
 
@@ -154,3 +176,4 @@ This skill compounds or it dies. The contract, every frontend session:
154
176
  - Full policy: `atris/policies/atris-design.md`
155
177
  - Navigation: `atris/MAP.md`
156
178
  - Workflow: `atris/PERSONA.md`
179
+ | D15 | marketing front pages: headline + one 2-line paragraph + buttons per section, card copy max 2 sentences, long artifacts live one click deep (Keshav 2026-08-31 "aggressive amounts of texts still", inspiration Oscar/Headway) | judgment | active |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: engines
3
- description: "Dispatch work to an installed terminal agent or named Atris engine profile. Supports Atris Fast, Claude, Codex, Cursor, Fable, Composer, Haiku, Devin, Grok, and Antigravity (agy). Triggers on: use codex, use cursor, use devin, use grok, use agy, use antigravity, use gemini, gemini session, use fable, use claude, use atris, engine, dispatch to, worker agent, second opinion build."
4
- version: 1.4.2
3
+ description: "Dispatch work to an installed terminal agent or named Atris engine profile. Supports Atris Fast, Claude, Codex, Cursor, Fable, Composer, Haiku, Devin, Grok, Antigravity (agy), and opencode. Triggers on: use codex, use cursor, use devin, use grok, use agy, use antigravity, use gemini, gemini session, use fable, use claude, use opencode, use atris, engine, dispatch to, worker agent, second opinion build."
4
+ version: 1.5.1
5
5
  tags:
6
6
  - engines
7
7
  - claude
@@ -15,13 +15,14 @@ tags:
15
15
  - agy
16
16
  - antigravity
17
17
  - gemini
18
+ - opencode
18
19
  - atris
19
20
  - orchestration
20
21
  ---
21
22
 
22
23
  # Engines — interchangeable terminal workers
23
24
 
24
- One contract, ten live profiles. The orchestrator writes a bounded task prompt, dispatches it to an engine, then **independently verifies, lands, and pushes** the result. Engines never self-certify.
25
+ One contract, eleven live profiles. The orchestrator writes a bounded task prompt, dispatches it to an engine, then **independently verifies, lands, and pushes** the result. Engines never self-certify.
25
26
 
26
27
  ## three verbs
27
28
 
@@ -29,12 +30,30 @@ One contract, ten live profiles. The orchestrator writes a bounded task prompt,
29
30
  - build: `atris engine <name> <task-id>`
30
31
  - switch: `atris engine <name>`
31
32
 
32
- ## Fable means Fable
33
+ ## FABLE: use the Atris profile
33
34
 
34
- Use `atris engine fable "<bounded question>"` for Fable's take. The canonical
35
- profile pins `claude-fable-5`, gives deep Fable asks ten minutes by default,
36
- and records the resolved model in the receipt. An explicit `--model` or
37
- `--timeout` still wins.
35
+ FABLE is a canonical Atris CLI engine profile, not a model nickname. When the
36
+ operator asks for Fable's take, opinion, critique, or second perspective, use:
37
+
38
+ ```bash
39
+ atris engine fable "<bounded question>"
40
+ ```
41
+
42
+ This routes through `lib/engine-ask.js`, which supplies the read-only preamble,
43
+ bounded tools, plan permission mode, safe mode, no session persistence, live
44
+ logs, a receipt, and engine-health classification. The CLI owns the underlying
45
+ Claude invocation through the `fable` profile in `lib/runner-command.js`.
46
+
47
+ Do not replace this with raw `claude -p` and call the result FABLE. Do not impose
48
+ one global timeout either. Use the CLI default for bounded asks. For deep
49
+ architecture work, repo-wide reviews, or evidence-heavy judgment, choose a
50
+ deliberately longer `--timeout` based on the scope, up to the CLI limit, and keep
51
+ waiting while FABLE is making progress. FABLE quality can require time; the
52
+ timeout is a safety boundary, not a speed target.
53
+
54
+ On failure, inspect the Atris receipt and report it plainly. Retry once with a
55
+ larger bound only when the evidence shows the bound was too short. Never silently
56
+ substitute raw Claude or another engine and call the result FABLE.
38
57
 
39
58
  ## Raw binary fallback and debugging
40
59
 
@@ -46,25 +65,28 @@ Raw spawns are not the default because they skip Atris receipts, watch, and coac
46
65
  | Claude | `claude -p "<prompt>"` | Uses the local Claude configuration. Add `--model opus` for maximum-depth review or `--model sonnet` for speed. |
47
66
  | Codex | `codex exec --dangerously-bypass-approvals-and-sandbox -o <result-file> "<prompt>"` (run from the target repo/worktree; read-only research: `--sandbox read-only`) | Headless, exits when done — run it as a tracked background Bash task like the other engines and completion auto-wakes the session. Final answer lands in the `-o` file. Verified live 2026-08-11. Outside a git repo add `--skip-git-repo-check` or it exits 1. ONE-SHOT SESSIONS (`claude -p` workers): run codex in the FOREGROUND and wait — a one-shot session never wakes again, so backgrounding strands the result (observed 2026-08-11). The old plugin path (`codex-companion.mjs task --background`) is deprecated for dispatch: its job store never notifies the session (a finished result sat unread overnight, 2026-08-10) |
48
67
  | Cursor | `cursor-agent --trust -p "<prompt>"` (run from the target repo) | Headless print mode; `--trust` required for non-interactive |
49
- | Fable | `claude -p "<prompt>" --model claude-fable-5` | Raw fallback only. Prefer `atris engine fable` so the model, longer timeout, live log, and receipt stay honest. |
68
+ | Fable | `atris engine fable "<question>"` | Canonical read-only FABLE ask with guards, live log, receipt, and health tracking. Scale `--timeout` to the work when needed. |
50
69
  | Composer | `atris run "<objective>" --engine composer` | Fast navigator/executor profile routed through the installed `ax` binary. |
51
70
  | Haiku | `claude -p "<prompt>" --model claude-haiku-4-5` | Fast validation and bounded read-only checks. |
52
71
  | 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` |
53
72
  | Grok | `grok --always-approve -p "<prompt>"` (run from the target repo) | Headless single-turn via `-p`; default model grok-4.6. Very fast on lookups (~5-10s, reads MAP first). Great for quick second opinions; use `--best-of-n <N>` for tricky bounded builds. Uses grok.com login |
54
73
  | Antigravity | `agy --mode accept-edits --add-dir "$PWD" -p "<prompt>"` (run from the target repo) | `agy` executor profile; also answers to "gemini". **`--add-dir` is mandatory for writes** — without it agy edits its own scratch folder (`~/.gemini/antigravity-cli/scratch/`) and the project never changes, which looks like a silent failure (verified live 2026-08-28). Use `--mode plan --sandbox` for read-only review, `--model <id>` to pin a model, and `--dangerously-skip-permissions` if a build still stalls on an approval prompt. |
74
+ | opencode | `opencode run "<prompt>"` (read-only ask: `opencode run --agent plan "<prompt>"`) | Headless print mode; exits when done. Pin a model with `-m provider/model`. Build work needs `--auto` to auto-approve permissions (dangerous: run in an isolated worktree). Verified live 2026-08-21, ~7s per plan-mode lookup. |
55
75
 
56
76
  Headless dispatch permissions (verified 2026-08-11): `codex exec`, `grok`, and `cursor-agent` are allowlisted in `~/.claude/settings.json` so fresh and one-shot sessions can dispatch without a human approval click. A cold session that gets "requires approval" on an engine command means that allowlist regressed.
57
77
 
58
78
  ## Picking an engine
59
79
 
60
80
  - **Atris Fast** — cheap bounded lookups, single-file facts, small verified edits, and high-volume fan-out.
61
- - **Claude / Fable** — deep review, synthesis, validation, and complex builds. Use Fable when judgment quality matters most.
81
+ - **FABLE** — strongest judgment lane. Use the canonical Atris profile for deep review, synthesis, validation, and complex builds.
82
+ - **Claude** — direct Claude profile when the operator names Claude rather than FABLE.
62
83
  - **Codex** — deep root-cause work, long autonomous builds, second-opinion diagnosis. Slowest; runs sandboxed.
63
84
  - **Cursor** — fast bounded edits and refactors in a single repo.
64
85
  - **Composer / Haiku** — fast, bounded navigation, edits, and validation where a max-tier model would be wasteful.
65
86
  - **Devin** — multi-step feature work; use `cloud` when the run should survive laptop sleep.
66
87
  - **Grok** - fastest frontier lookups and quick second opinions (grok-4.6, ~5-10s; reads MAP first); use `--best-of-n` for tricky bounded builds. Uses grok.com login.
67
88
  - **Antigravity / agy** — flexible executor work across Gemini, Claude, and GPT-OSS models; use `agy` as the canonical short name.
89
+ - **opencode** — multi-provider executor in one CLI (Claude, GPT, Gemini, DeepSeek menus via `opencode models`); plan agent for read-only asks, `--auto` builds only inside an isolated worktree.
68
90
  - Parallel builds across repos: one engine job per repo, never two engines writing the same checkout.
69
91
 
70
92
  ## Models worth pinning (verified live 2026-08-15)
@@ -73,8 +95,7 @@ Each engine CLI can pin a specific model. Current best picks:
73
95
 
74
96
  | Engine | Flag | Best models today |
75
97
  |--------|------|-------------------|
76
- | Claude | `--model opus` | `opus` follows the local Claude alias; use an explicit model identifier for reproducibility |
77
- | Fable | `--model claude-fable-5` | Canonical Fable 5 route; `atris engine fable` pins it automatically |
98
+ | Claude / Fable | `--model opus` | `opus` currently resolves to Opus 5; use the explicit Opus 4.8 identifier only for reproducibility |
78
99
  | 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 |
79
100
  | Cursor | `--model cursor-grok-4.6-xhigh` | `cursor-grok-4.6-xhigh` for second-opinion builds, `cursor-grok-4.6-high-fast` for quick pinned asks (answered in ~12s live 2026-08-12), `composer-2.5` for fast edits; parameterized Claude via `'claude-opus-4-8[effort=high]'`; `--list-models` shows the full menu |
80
101
  | Composer | `--engine composer` | `composer 2.5` through the Atris profile |
@@ -82,6 +103,7 @@ Each engine CLI can pin a specific model. Current best picks:
82
103
  | Grok | (default) | `grok-4.6` default (confirmed live 2026-08-12, ~5s lookup), `grok-4.5` still available via `-m` |
83
104
  | Codex | `-m <model>` | CLI default rides `~/.codex/config.toml`; pin with `-m` only when the task needs it |
84
105
  | Antigravity / agy | `--model <id>` | `gemini-3.7-flash-high` for speed, `gemini-3.1-pro-high` for depth, `claude-sonnet-4-6`, `claude-opus-4-6-thinking`, or `gpt-oss-120b-medium` |
106
+ | opencode | `-m <provider/model>` | `opencode/big-pickle`, `opencode/gpt-5.2`, `opencode/claude-opus-4-8`; `opencode models` lists the live menu |
85
107
  | Atris Fast | (fixed) | api.atris.ai fast lane |
86
108
 
87
109
  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.
@@ -97,6 +119,27 @@ Run `atris engine doctor`, then `atris engine --help`. The canonical profiles li
97
119
 
98
120
  ## Prompt contract (every dispatch)
99
121
 
122
+ Before build, fetch and identify the configured remote default, compare the
123
+ checkout to it, and preserve unrelated work. Record the base before editing.
124
+ Use the existing feature packet and functional owner; link source task IDs
125
+ across workspaces rather than copying a second plan. Load the relevant owner
126
+ bundle once. Live `atris task` records are truth; TODO.md is a rendered view.
127
+
128
+ If scouting, request at most 200 words naming the exact current mission,
129
+ owner, engine/model, files, checks, and risks. Reject an answer about an old
130
+ mission. Hand the accepted packet to the builder; reread only to resolve a
131
+ named gap. Use raw task metadata and events for exact paths and instructions,
132
+ never the simplified explanation. Verify requested models; never substitute
133
+ silently. Existing user authorization covers execution within that scope;
134
+ required plan review, CI, human-only acceptance, and deploy gates still apply.
135
+
136
+ Review related finished changes as one batch in a fresh context. Reuse a
137
+ review only while those bytes remain unchanged; changed bytes require
138
+ revalidation. Run required checks before the existing delivery path. Inspect
139
+ the actual final state: draft, queued, and merged are different outcomes.
140
+ Record elapsed time, engine calls, retries, and exposed token usage. Unknown
141
+ usage stays unknown; one pilot does not establish a speedup or perfect accuracy.
142
+
100
143
  1. Name the absolute repo path and tell the engine to `cd` there (Atris Fast scopes to the cwd it runs from — cd first, and name absolute paths in the prompt).
101
144
  2. Bound the slice: one task, explicit exit criteria, the verify command to run.
102
145
  3. Git rules: `git status` first; stage only own files; never revert others' changes; never destructive git; work on a branch `member/<name>-<slug>` or a worktree. (Atris Fast does not run git — for edit tasks the orchestrator commits after verifying.)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: x-search
3
3
  description: "X/Twitter search via xAI Grok API. Use when user wants to search tweets, monitor topics, find viral posts, or run social listening. Costs 5 credits per search. Triggers on x search, tweet search, twitter search, social listening, revenue intel, viral tweets."
4
- version: 2.3.0
4
+ version: 2.4.1
5
5
  tags:
6
6
  - x-search
7
7
  - social
@@ -23,17 +23,19 @@ login
23
23
  |
24
24
  stdout only unless --save
25
25
  |
26
- rich ephemeral --> one apply next-step, no files
27
- --save + rich --> brief + pack + one Apply
26
+ rich ephemeral --> one apply next-step, one inferred check + score: 0, then one youtube-search next-step, no files
27
+ thin ephemeral --> check: fill this, then one youtube-search next-step, no files
28
+ empty successful pull --> one next: atris youtube search " "
29
+ --save + rich --> brief + pack + one Apply, prove baseline score 0
28
30
  --save + thin --> refuse, no files, exit 2
29
31
  |
30
32
  stop
31
33
  ```
32
34
 
33
35
  1. Login: stored login, then `atris login --agent` if needed. Never paste tokens. Never `/auth/cli`.
34
- 2. Search: `atris x-search "QUERY"`. Always billed (5 credits). Prints to stdout. Rich ephemeral prints one apply next-step and writes nothing. Empty or failed search refunds and writes nothing.
35
- 3. `--save` only when you want a brief. Rich results (a number-with-units or a named mechanism) file the brief, mint `atris/experiments/x-search-<slug>/`, and write one Apply that names that pack and the keep rule. Thin `--save` prints `thin: no number or named mechanism. no brief.` and writes nothing.
36
- 4. Stop. Thin, empty, or failed search does not print the ephemeral apply next-step.
36
+ 2. Search: `atris x-search "QUERY"`. Always billed (5 credits). Prints to stdout. Rich ephemeral prints one apply next-step, one inferred check plus `score: 0`, then one `next: atris youtube search "<query>"` (person mode uses `--name`), and writes nothing. Thin ephemeral prints `check: fill this` then that youtube-search next, and writes nothing. Empty successful pull (no tweets) prints one `next: atris youtube search " "`. Explicit refund or failed search writes nothing extra. Empty, 502, 401, or 402 with unused credits print Credits when present and do not say refunded unless credits_refunded is explicit. A 401 that remints and retries prints those same credit lines from the first payload before the retry. `--json` stays quiet.
37
+ 3. `--save` only when you want a brief. Rich results (a number-with-units or a named mechanism) file the brief, mint `atris/experiments/x-search-<slug>/`, write one Apply that names that pack and the keep rule, and prove that fixture starts at score 0. Thin `--save` prints `thin: no number or named mechanism. no brief.` and writes nothing. `--save` does not print a youtube-search next-step.
38
+ 4. Stop. `--json`, explicit refund, or failed search does not print apply, check, score, or youtube-search next-step.
37
39
 
38
40
  ## Customer path (preferred)
39
41
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: youtube
3
- description: "YouTube discovery and learning. Get watch permalinks with atris youtube search QUERY (free, local ytsearch/yt-dlp). On 429 the CLI already retries; use cached rows if printed, else STOP. Never run --paid after a 429. --paid only when the user explicitly asked to buy permalinks (5 credits). After a URL is picked, atris youtube notes URL (free, ephemeral unless --save). atris youtube process only to store knowledge (5 credits). Never paste tokens. Never /auth/cli. Mint with atris login --agent from a stored login. Never summarize a video from model memory. Triggers on: youtube search, find videos, paid youtube search, any youtube.com or youtu.be link, youtube, video, watch this, notes on this."
4
- version: 2.12.0
3
+ description: "YouTube discovery and learning. Get watch permalinks with atris youtube search QUERY (free, local ytsearch/yt-dlp). On 429 use printed rows if any; else the CLI retries once, then cached rows if printed, else STOP. Never run --paid after a 429. --paid only when the user explicitly asked to buy permalinks (5 credits). After a URL is picked, atris youtube notes URL (free, ephemeral unless --save). atris youtube process only to store knowledge (5 credits). Never paste tokens. Never /auth/cli. Mint with atris login --agent from a stored login. Never summarize a video from model memory. Triggers on: youtube search, find videos, paid youtube search, any youtube.com or youtu.be link, youtube, video, watch this, notes on this."
4
+ version: 2.18.18
5
5
  tags:
6
6
  - youtube
7
7
  - research
@@ -18,31 +18,71 @@ Hard path. Follow in order. Soft memory does not override this.
18
18
  ```
19
19
  search QUERY (free)
20
20
  |
21
- 429 --> CLI already retried once
22
- --> cached rows printed? use them
21
+ rows --> rich: one pack-named apply + failing measure.py (score 0), then next: experiments keep
22
+ --> thin: check: fill this, then next: atris youtube teach <first-url>
23
+ --> --json stays quiet
24
+ |
25
+ 429 --> printed rows? use them (no retry)
26
+ --> else CLI retries once
27
+ --> cached rows printed? use them (same rich mint or thin check as live rows)
23
28
  --> rate-limit sentence printed? STOP
24
29
  do not run --paid
25
30
  |
26
31
  pick a URL --> notes URL (free, ephemeral unless --save)
27
- | rich ephemeral prints one apply next-step, no files
28
- | --save files brief + pack-named apply when notes have a number or named mechanism; thin --save refuses
32
+ | rich ephemeral prints one apply next-step and one failing check (score 0), no files
33
+ | thin ephemeral prints check: fill this instead of inventing a check
34
+ | then next: atris youtube teach <same-url>
35
+ | --json stays quiet
36
+ | --save files brief + pack-named apply when notes have a number or named mechanism; a multi-url --save batch proves the first saved pack the same way single-url --save does; thin --save refuses
37
+ | playlist expand keeps printed yt-dlp rows on 429
38
+ | notes keep a written yt_<id>.md (and ytnotes keeps a written manual or auto en / en-orig / en-US / en-GB VTT) when yt-dlp exits 429 or a later error, or --print is empty
39
+ | watch, youtu.be, shorts, embed, live, /e/, and youtube-nocookie embed urls all resolve the same video id for that keep
40
+ | a copied #t= timestamp still finds yt_<id>.en.vtt
41
+ | a watch?v=&list= copy still finds yt_<video>.en.vtt when -J dumps playlist JSON
29
42
  | or teach URL [--section N] (one chapter: claim numbers, named mechanisms, one check; free unless --save)
43
+ | printed yt-dlp metadata is a hit even on 429
44
+ | a written VTT or clean.txt is used when the caption URL fetch fails, `-J` stdout is empty, or `-J` dumps a playlist for a watch?v=&list= URL
45
+ | a taught section that is not last prints next: recap TEXT or skip
46
+ | last section: rich ephemeral apply, failing check, and score 0, then next: atris youtube watch tick; save pack keep stays; no recap next
30
47
  | next --section refuses until recap/skip
48
+ | owed prints unpaid check; successful unlock prints next section command
49
+ | bare teach resumes owed, or prints a start command if nothing is owed
31
50
  |
51
+ persist a rich lesson? --> learn log '{"type":"pattern","key":"...","insight":"..."}'
52
+ --> rich: one pack-named apply + failing measure.py (score 0), then next: experiments keep
53
+ --> thin: jsonl only
54
+
32
55
  write one Apply (claimable) before process
33
56
  |
34
57
  store knowledge? --> process URL (5 credits)
58
+ --> rich: one pack-named apply + failing measure.py (score 0), then next: experiments keep
59
+ --> thin: check: fill this; --json stays quiet
60
+
61
+ watch add --> next: atris youtube watch tick
62
+ watch tick --> briefs new videos
63
+ --> if briefed: first rich brief mints pack-named apply + failing measure.py (score 0), then next: experiments keep
64
+ --> all thin: check: fill this, then next: atris youtube teach <first-briefed-url>
65
+ --> 0 briefed, no channels: next: atris youtube watch add <channel-url-or-@handle>
66
+ --> 0 briefed, channels exist: next: atris youtube search " "
67
+
68
+ digest --> files brief + claimable journal
69
+ --> rich: one pack-named apply + failing measure.py (score 0), then next: experiments keep
70
+ --> thin: check: fill this, then next: atris youtube watch tick
35
71
 
36
72
  --paid QUERY only if the user asked to buy permalinks
73
+ |
74
+ rows --> rich: one pack-named apply + failing measure.py (score 0), then next: experiments keep
75
+ --> thin: check: fill this, then next: atris youtube teach <first-url>
76
+ --> --json stays quiet and writes no pack
37
77
  login: atris login --agent from a stored login
38
78
  never paste tokens, never /auth/cli
39
79
  ```
40
80
 
41
- 1. Get watch permalinks: `atris youtube search QUERY` (free).
42
- 2. If 429: wait/retry is already in the CLI. If it prints cached rows, use those. If it prints `youtube rate-limited local search. do not use --paid as a fallback; retry later.`, STOP. Do not run `--paid`.
81
+ 1. Get watch permalinks: `atris youtube search QUERY` (free). A rich hit mints `atris/experiments/search-<query>/`, writes one pack-named Apply, and prints `score: 0` only when that Apply starts failing. A thin hit prints `check: fill this`, then one next teach command. `--json` stays quiet and writes no pack.
82
+ 2. If 429: use any rows already printed. If none, wait/retry is already in the CLI. If it prints cached rows, use those. Cached rows mint or print the same rich or thin gate as a live hit. If it prints `youtube rate-limited local search. do not use --paid as a fallback; retry later.`, STOP. Do not run `--paid`.
43
83
  3. `--paid` only when the user explicitly asked to buy permalinks. The CLI hard-refuses `--paid` when the free cache still has a fresh same-query hit.
44
- 4. `atris youtube notes URL` after a URL is picked (free). Notes is ephemeral unless `--save`. Rich ephemeral prints one apply next-step and writes no files. Rich `--save` files the brief and mints `atris/experiments/notes-<id>/`; thin `--save` (no number-with-units and no named mechanism) refuses with no brief and exit 2. Do not auto `--paid`.
45
- 5. Write one Apply (change + receipt) before `atris youtube process`. Process still requires a filled Apply (so you `--save` a rich brief, fill Apply, then process).
84
+ 4. `atris youtube notes URL` after a URL is picked (free). Notes is ephemeral unless `--save`. Rich ephemeral prints one apply next-step and one failing check (`score: 0`), then one `next: atris youtube teach <same-url>`, and writes no files. Thin ephemeral prints `check: fill this` instead of inventing a check. A playlist or multi-url batch does the same for the first successful item only. A playlist expand that prints video rows keeps them even when yt-dlp exits 429. A notes run that already wrote `yt_<id>.md` keeps that lesson even when the runner exits 429 or a later error, so the learner gate and rich `--save` mint still run. Watch, youtu.be, shorts, embed, live, /e/, and youtube-nocookie embed urls all resolve the same video id, so empty-JSON teach/process and notes keep still find that file. A copied watch?v=&list= URL still finds yt_<video>.en.vtt when -J dumps playlist JSON. A copied #t= timestamp still finds the same yt_<id> file. The bundled ytnotes script does the same for a written manual or auto en, en-orig, en-US, or en-GB VTT plus printed metadata. `--json` stays quiet on the check and the teach next-step. Rich `--save` files the brief, mints `atris/experiments/notes-<id>/`, writes one Apply, and prints `score: 0` only when that Apply starts failing. A rich multi-url `--save` batch proves that failing baseline for the first saved pack only; thin `--save` (no number-with-units and no named mechanism) refuses with no brief and exit 2. Do not auto `--paid`.
85
+ 5. Write one Apply (change + receipt) before `atris youtube process`. Process still requires a filled Apply (so you `--save` a rich brief, fill Apply, then process). A rich analysis then mints `atris/experiments/process-<id>/`, writes one pack-named Apply, and prints `score: 0` only when that Apply starts failing. Thin analysis prints `check: fill this`. `--json` stays quiet. 401, 402, or 502 print Credits when present and say credits refunded only when the server marks a refund. A local-transcript 502 that then retries cloud prints those same credit lines from the first payload before the retry. A 401 that remints and retries prints those same credit lines from the first payload before the retry.
46
86
  6. Never paste tokens. Never `/auth/cli`. Mint with `atris login --agent` from a stored login.
47
87
 
48
88
  If the user says "find videos", "search youtube", or "get youtube links" → search. If they say "learn from", "notes on", "alpha", or "rabbit hole" → notes. If they say "process", "store", "add to knowledge" → process. "Buy permalinks" or "paid search" is the only ask that unlocks `--paid`.
@@ -62,7 +102,7 @@ if ! command -v atris &> /dev/null; then
62
102
  npm install -g atris
63
103
  fi
64
104
 
65
- echo "Ready. Feature map: free search, 429 cache-or-stop, notes, then process."
105
+ echo "Ready. Feature map: free search, 429 printed-rows or cache-or-stop, notes, then process."
66
106
  ```
67
107
 
68
108
  ---
@@ -75,9 +115,9 @@ atris youtube search "MCP agents" --limit 10
75
115
  atris youtube search "MCP agents" --json
76
116
  ```
77
117
 
78
- Uses `ytsearch` on PATH when present, else bundled `scripts/det/ytsearch`, else `yt-dlp --flat-playlist --print` with `ytsearchN:`. No credits. No `/agent/process_youtube` call.
118
+ Uses `ytsearch` on PATH when present, else bundled `scripts/det/ytsearch`, else `yt-dlp --flat-playlist --print` with `ytsearchN:`. No credits. No `/agent/process_youtube` call. A rich hit prints one inferred check plus `score: 0`. A thin hit prints `check: fill this`. Then one next: `atris youtube teach <first-url>`. `--json` stays quiet.
79
119
 
80
- On 429 the CLI retries once, then serves `~/.atris/youtube-search-cache.json` if the same query is younger than one hour. If it prints the rate-limit sentence, stop. Do not run `--paid`.
120
+ On 429, printed rows are a hit (no retry). If stdout is empty the CLI retries once, then serves `~/.atris/youtube-search-cache.json` if the same query is younger than one hour. A cache reprint prints the same rich or thin check as a live hit. If it prints the rate-limit sentence, stop. Do not run `--paid`.
81
121
 
82
122
  ## Paid search (5 credits, opt-in buy only)
83
123
 
@@ -88,15 +128,18 @@ atris youtube search --paid "MCP agents 2026"
88
128
  atris youtube search --paid "MCP agents" --limit 10
89
129
  ```
90
130
 
91
- Requires a stored login, then `atris login --agent`. The CLI mints a youtube-scope agent token from disk the same way as `atris youtube process` and `atris x-search`. Never `/auth/cli`. Never paste tokens. Prints `title | watch permalink` plus credits. Empty or failed searches refund.
131
+ Requires a stored login, then `atris login --agent`. The CLI mints a youtube-scope agent token from disk the same way as `atris youtube process` and `atris x-search`. Never `/auth/cli`. Never paste tokens. Prints `title | watch permalink` plus credits. A rich hit mints `atris/experiments/search-<query>/`, writes one pack-named Apply, and prints `score: 0` only when that Apply starts failing. A thin hit prints `check: fill this`, then one next teach command. `--json` stays quiet and writes no pack. Empty, 502, 401, or 402 with unused credits do not claim a refund unless credits_refunded is explicit.
92
132
 
93
133
  Line contract:
94
134
 
95
135
  ```text
96
- title | channel | duration | views | upload_date | https://youtu.be/ID
136
+ title | https://www.youtube.com/watch?v=ID
137
+ Credits: N used, M remaining
138
+ next: atris experiments keep search-<query>
139
+ score: 0
97
140
  ```
98
141
 
99
- `upload_date` is `YYYYMMDD` (or `NA`) so callers can apply a freshness gate (for example last 6 weeks). After the user picks a URL, run notes (free) or process (5 credits).
142
+ A thin paid hit prints `check: fill this` and `next: atris youtube teach "<first-url>"` instead of the keep next. `--json` stays machine-quiet. After the user picks a URL, run notes (free) or process (5 credits).
100
143
 
101
144
  ---
102
145
 
@@ -217,18 +260,18 @@ Two layers, never mixed. The reply the person reads is flowing prose: ideas, spe
217
260
 
218
261
  `atris youtube search --paid` posts `{query, limit}` to `/youtube/search` with bearer auth. Agent tokens need the youtube scope. This is an opt-in buy, not a 429 fallback.
219
262
 
220
- `atris youtube` process first tries local transcript extraction with `yt-dlp`. It sends timestamped `transcript_text` to `/agent/process_youtube` with `cache_transcript=false`. If local transcript processing fails with a retryable error, it falls back to cloud video processing. Use `--json` to inspect `metadata.processing_method` and `metadata.transcript_source`.
263
+ `atris youtube` process first tries local transcript extraction with `yt-dlp`. It sends timestamped `transcript_text` to `/agent/process_youtube` with `cache_transcript=false`. A written VTT or clean.txt in the notes work dir is a local hit even when `-J` stdout is empty or the caption URL fetch fails, so process does not jump to paid cloud video for that case. If local transcript processing fails with a retryable error, it falls back to cloud video processing. Use `--json` to inspect `metadata.processing_method` and `metadata.transcript_source`.
221
264
 
222
265
  ---
223
266
 
224
267
  ## Billing
225
268
 
226
269
  - **Search: 0 credits** (local discovery)
227
- - **Paid search: 5 credits** (`--paid`; refund on empty or fail)
270
+ - **Paid search: 5 credits** (`--paid`; print credits refunded only when the server marks a refund. A 401 that remints and retries prints those same credit lines from the first payload before the retry. `--json` stays quiet.)
228
271
  - **Notes: 0 credits** (local captions + engine)
229
272
  - **Process: 5 credits per video** (flat rate, any length)
230
273
  - Credits deducted before processing
231
- - **Full refund** if Gemini fails or returns an error
274
+ - Process 200/401/402/502 print Credits when present and say credits refunded only when `credits_refunded` is explicit. A local-transcript 502 that then retries cloud prints the same lines from the first payload. A 401 that remints and retries prints the same lines from the first payload. Unused `credits_used: 0` on a 200 is not a refund.
232
275
  - Insufficient credits returns 402 with your current balance
233
276
 
234
277
  ---
@@ -240,9 +283,11 @@ Two layers, never mixed. The reply the person reads is flowing prose: ideas, spe
240
283
  | `401` | Token expired/invalid | `atris login --agent` from a stored login |
241
284
  | `402` | Not enough credits | Check balance, purchase at atris.ai |
242
285
  | `400` | Invalid YouTube URL | Check URL format |
243
- | `502` | Transcript or cloud processing failed | Retry; credits auto-refunded when backend fails |
286
+ | `502` | Transcript or cloud processing failed | Retry; print credits refunded only when the server marks a refund |
244
287
  | search exit 2 | ytsearch/yt-dlp missing or no results | Install yt-dlp, or put ytsearch on PATH |
245
- | search 429 | YouTube rate-limited local search | CLI already retried; use cached rows if printed; if the rate-limit sentence prints, STOP; do not use --paid |
288
+ | search 429 | YouTube rate-limited local search | use printed rows if any; else CLI already retried; use cached rows if printed (same rich/thin check as a live hit); if the rate-limit sentence prints, STOP; do not use --paid |
289
+ | teach 429 | YouTube rate-limited local metadata | use printed yt-dlp JSON if it parses; if the caption URL fetch fails or `-J` stdout is empty or broken, use a written VTT or clean.txt from the notes work dir; no written caption still fails; do not use process as a fallback |
290
+ | notes 429 | YouTube rate-limited local captions | use a written yt_<id>.md if it exists; ytnotes keeps a written manual or auto en / en-orig / en-US / en-GB VTT plus printed metadata, or a VTT written in the same run when print is empty, including /e/ and youtube-nocookie embed urls; a copied #t= timestamp still finds that leftover file; empty 429 with no captions still fails; do not use --paid |
246
291
 
247
292
  ---
248
293
 
@@ -260,7 +260,7 @@ AFTER (Universal):
260
260
 
261
261
  When you finish a brainstorm session:
262
262
  1. Hand shaped ideas to the navigator (they create the tasks)
263
- 2. Log to your journal at `atris/team/brainstormer/journal/YYYY-MM-DD.md`:
263
+ 2. Log at `atris/team/brainstormer/logs/YYYY-MM-DD.md`:
264
264
 
265
265
  ```markdown
266
266
  ## Brainstormer - Mon DD
@@ -271,7 +271,7 @@ When you finish a brainstorm session:
271
271
  **Pattern:** What you learned about the user's thinking style
272
272
  ```
273
273
 
274
- Your journal tracks how ideas evolve — the navigator reads it to understand context.
274
+ Your log tracks how ideas evolve — the navigator reads it to understand context.
275
275
 
276
276
  ---
277
277