atris 3.34.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 (163) hide show
  1. package/AGENTS.md +35 -0
  2. package/FOR_AGENTS.md +5 -3
  3. package/README.md +5 -3
  4. package/atris/GETTING_STARTED.md +1 -1
  5. package/atris/atris.md +3 -0
  6. package/atris/policies/day-loop-voice.md +102 -0
  7. package/atris/policies/outbound-artifact-gate.md +2 -0
  8. package/atris/skills/design/SKILL.md +56 -32
  9. package/atris/skills/endgame/SKILL.md +12 -6
  10. package/atris/skills/engines/SKILL.md +35 -8
  11. package/atris/skills/fable-method/SKILL.md +66 -0
  12. package/atris/skills/improve/SKILL.md +65 -45
  13. package/atris/skills/render-cli/SKILL.md +88 -0
  14. package/atris/skills/youtube/SKILL.md +10 -1
  15. package/atris.md +6 -2
  16. package/ax +617 -31
  17. package/bin/atris.js +719 -266
  18. package/commands/activate.js +194 -88
  19. package/commands/aeo.js +52 -0
  20. package/commands/agents.js +166 -0
  21. package/commands/autoland.js +718 -72
  22. package/commands/autopilot-front.js +20 -2
  23. package/commands/autopilot.js +118 -2
  24. package/commands/avail.js +407 -0
  25. package/commands/bench.js +188 -0
  26. package/commands/brain.js +3 -0
  27. package/commands/brief.js +651 -0
  28. package/commands/business-sync.js +192 -6
  29. package/commands/business.js +91 -8
  30. package/commands/clean.js +50 -24
  31. package/commands/close.js +1083 -0
  32. package/commands/cloud.js +245 -0
  33. package/commands/codex-goal.js +26 -2
  34. package/commands/compile.js +292 -1
  35. package/commands/computer.js +150 -3
  36. package/commands/dream.js +365 -0
  37. package/commands/drill.js +371 -0
  38. package/commands/drive.js +187 -0
  39. package/commands/engine.js +1061 -29
  40. package/commands/experiments.js +28 -0
  41. package/commands/feed.js +202 -0
  42. package/commands/feedback.js +34 -12
  43. package/commands/fleet-report.js +206 -0
  44. package/commands/github.js +38 -0
  45. package/commands/gm.js +285 -3
  46. package/commands/goal.js +247 -0
  47. package/commands/improve.js +642 -26
  48. package/commands/init.js +83 -43
  49. package/commands/integrations.js +39 -11
  50. package/commands/interview.js +209 -0
  51. package/commands/land.js +253 -52
  52. package/commands/lesson.js +112 -1
  53. package/commands/lifecycle.js +39 -3
  54. package/commands/linear.js +38 -0
  55. package/commands/log.js +84 -1
  56. package/commands/loops.js +220 -16
  57. package/commands/meet.js +220 -0
  58. package/commands/member.js +899 -66
  59. package/commands/mission.js +3512 -332
  60. package/commands/next.js +137 -0
  61. package/commands/now.js +240 -21
  62. package/commands/one-lap.js +776 -0
  63. package/commands/orb.js +314 -0
  64. package/commands/pack-craft.js +179 -0
  65. package/commands/pack.js +823 -0
  66. package/commands/play.js +3 -2
  67. package/commands/probe.js +30 -3
  68. package/commands/pulse.js +241 -46
  69. package/commands/push.js +260 -82
  70. package/commands/radar.js +259 -14
  71. package/commands/rainmaker.js +49 -0
  72. package/commands/report.js +415 -0
  73. package/commands/scout.js +147 -0
  74. package/commands/search.js +363 -0
  75. package/commands/serve.js +54 -0
  76. package/commands/skill.js +47 -3
  77. package/commands/slop.js +50 -2
  78. package/commands/soul.js +1 -1
  79. package/commands/status.js +50 -5
  80. package/commands/stream.js +861 -0
  81. package/commands/stripe.js +38 -0
  82. package/commands/study.js +693 -0
  83. package/commands/supabase.js +39 -0
  84. package/commands/sync.js +67 -54
  85. package/commands/task.js +2275 -182
  86. package/commands/team.js +73 -0
  87. package/commands/truth.js +29 -3
  88. package/commands/unknowns.js +627 -0
  89. package/commands/update.js +44 -0
  90. package/commands/vercel.js +38 -0
  91. package/commands/verify.js +96 -0
  92. package/commands/watch.js +303 -0
  93. package/commands/wish.js +500 -0
  94. package/commands/workflow.js +11 -5
  95. package/commands/worktree.js +299 -20
  96. package/commands/write.js +399 -0
  97. package/commands/xp.js +29 -11
  98. package/lib/auto-accept-certified.js +391 -43
  99. package/lib/autoland.js +353 -52
  100. package/lib/ax-auto-lane.js +79 -0
  101. package/lib/bench/context.js +147 -0
  102. package/lib/bench/engines.js +141 -0
  103. package/lib/bench/report.js +140 -0
  104. package/lib/bench/runner.js +512 -0
  105. package/lib/brief-ledger.js +350 -0
  106. package/lib/cloud-mission.js +259 -0
  107. package/lib/codex-flight.js +154 -0
  108. package/lib/default-runner.js +45 -0
  109. package/lib/default-verifier.js +70 -0
  110. package/lib/engine-registry.js +232 -0
  111. package/lib/experiments/daily.js +640 -0
  112. package/lib/fleet.js +2431 -38
  113. package/lib/improve-vitals-html.js +171 -0
  114. package/lib/known-commands.js +58 -0
  115. package/lib/loop-doctor.js +416 -0
  116. package/lib/member-switches.js +144 -0
  117. package/lib/memory-view.js +14 -5
  118. package/lib/mission-room.js +1 -0
  119. package/lib/mission-root.js +52 -0
  120. package/lib/mission-runtime-loop.js +7 -0
  121. package/lib/next-moves.js +327 -10
  122. package/lib/official-cli-integration.js +174 -0
  123. package/lib/one-lap-validator.js +60 -0
  124. package/lib/orb-context.js +477 -0
  125. package/lib/orb-scorecard.js +224 -0
  126. package/lib/outbound-send-gate.js +165 -0
  127. package/lib/permission-grants.js +293 -0
  128. package/lib/policy-lessons.js +52 -1
  129. package/lib/pulse.js +277 -3
  130. package/lib/receipt-block.js +168 -0
  131. package/lib/receipt-evidence.js +65 -4
  132. package/lib/review-integrity.js +147 -0
  133. package/lib/router-brain.js +352 -0
  134. package/lib/runner-command.js +33 -0
  135. package/lib/self-drive.js +258 -0
  136. package/lib/short-name.js +103 -0
  137. package/lib/spawn-env.js +18 -0
  138. package/lib/state-detection.js +56 -1
  139. package/lib/sync-status.js +59 -0
  140. package/lib/task-db.js +319 -27
  141. package/lib/task-proof.js +43 -1
  142. package/lib/task-receipt.js +93 -0
  143. package/lib/team-presence.js +260 -0
  144. package/lib/tool-result-encode.js +7 -0
  145. package/lib/trust-tiers.js +90 -0
  146. package/lib/usage.js +107 -0
  147. package/lib/voice-gate.js +163 -0
  148. package/lib/wish-audit.js +1368 -0
  149. package/lib/wish-delegate.js +1840 -0
  150. package/lib/wish-design.js +110 -0
  151. package/lib/wish-stats.js +183 -0
  152. package/lib/wish-store.js +354 -0
  153. package/lib/zip.js +221 -0
  154. package/package.json +3 -1
  155. package/templates/loops/atris/loops/LOOPS.md +55 -0
  156. package/templates/loops/atris/loops/TICK.md +24 -0
  157. package/templates/loops/atris/loops/feedback.md +22 -0
  158. package/templates/loops/atris/loops/quality.md +22 -0
  159. package/templates/loops/atris/wiki/systems/loops.md +41 -0
  160. package/utils/api.js +5 -1
  161. package/utils/auth.js +57 -21
  162. package/utils/update-check.js +27 -6
  163. package/atris/learnings.jsonl +0 -1
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: improve
3
- description: "Run one RL improvement tick on the workspace via POST /api/improve. Ships one verifiable change, scores it, writes the scorecard. The thing you pay for. Triggers on: improve, make this better, ship one thing, run a tick, get smarter."
4
- version: 1.0.0
3
+ description: "Run one verified, scored improvement tick and write its receipt. Use when the user asks to improve, make this better, ship one thing, run a tick, or get smarter. `atris improve` alone shows metabolism vitals; use `atris improve tick` to ship work."
4
+ version: 1.1.0
5
5
  tags:
6
6
  - rl
7
7
  - improve
@@ -12,74 +12,94 @@ tags:
12
12
 
13
13
  # /improve
14
14
 
15
- Runs one improvement tick on the workspace. Calls `POST /api/improve` on the backend, which plans one task, builds it, verifies it, and scores it. Returns what shipped + the reward. Writes the scorecard locally.
15
+ Run one improvement tick on the workspace. A successful tick ships one result, passes a real verifier, receives a score, and writes a machine-readable scorecard.
16
16
 
17
- This is the product. The thing the user pays for. One call, one verifiable result.
17
+ One call means one verifiable result. Never turn one invocation into a hidden batch.
18
18
 
19
- ## How it works
19
+ ## Command contract
20
20
 
21
+ `atris improve` alone shows the self-improvement metabolism vitals. It does not ship a change.
22
+
23
+ Use the explicit `tick` subcommand when the user asks for improvement work:
24
+
25
+ ```bash
26
+ atris improve tick # one full tick: plan, build, verify, score
27
+ atris improve tick --json # the same tick as machine-readable output
28
+ atris improve tick plan # plan only; no change or receipt
29
+ atris improve tick --dry-run # execute without committing; no shipping receipt
30
+ atris improve tick --no-fallback # report API failure instead of running locally
31
+ atris improve history # reward trend, credits, and pass rate
32
+ atris improve # vitals only
33
+ atris improve --json # vitals only as JSON
21
34
  ```
22
- /improve
23
- → POST /api/improve { workspace: ".", mode: "full" }
24
- → backend picks a task, plans, builds, reviews, verifies
25
- → returns { task, reward, files_changed, verify_pass, summary }
26
- → CLI writes scorecard to .atris/presidio/scorecards.md
27
- → CLI reports result to user
28
- ```
29
35
 
30
- The inference is Claude Code (or whatever model the backend uses). The environment is the folder. The endpoint is the bridge.
36
+ ## Run one tick
37
+
38
+ 1. Run `atris improve tick`, adding `--json` only when structured output is useful.
39
+ 2. Inspect the returned source, task summary, verifier result, reward, files, and receipt path.
40
+ 3. Count the tick only when `ok` is true, verification passed, and the scorecard was written.
41
+ 4. Report what shipped and the exact verifier result. If the tick fails, report the failure and stop.
42
+
43
+ For a paid API tick, the CLI:
31
44
 
32
- ## On invoke
45
+ 1. Loads credentials with `utils/auth.loadCredentials`.
46
+ 2. Calls `POST /api/improve` with the workspace, mode, model, and dry-run setting.
47
+ 3. Lets the backend plan, build, verify, score, and bill the successful tick.
48
+ 4. Writes the normalized receipt to `.atris/state/scorecards.jsonl` and the human trail to the daily Atris journal.
33
49
 
34
- Run the CLI command — it does the whole tick (auth, the credit-metered call, scorecard, fallback):
50
+ The full response may omit the billed credit count. In that case the CLI reports that billing happened server-side instead of inventing a number.
51
+
52
+ ## Local fallback
53
+
54
+ Local fallback is allowed when there is no login, the backend is unreachable, or the hosted backend cannot access the local workspace path. The CLI runs this exact bounded command internally:
35
55
 
36
56
  ```bash
37
- atris improve # one full tick: plan → build → verify → score (deducts credits)
38
- atris improve plan # show the plan only, change nothing
39
- atris improve --json # machine-readable result (this is what the member loop consumes)
40
- atris improve --no-fallback # fail loudly instead of running a local tick when the backend is down
57
+ atris mission run --due --headless --max-ticks 1 --complete-on-pass --json
41
58
  ```
42
59
 
43
- Under the hood `atris improve` (`commands/improve.js`):
60
+ The local result succeeds only when all of these are true:
44
61
 
45
- 1. Loads the auth token via `utils/auth.loadCredentials`
46
- 2. `POST /api/improve { workspace, mode, model }` via `utils/api.apiRequestJson`
47
- 3. The backend plans, builds, runs the verify command, scores it, and **deducts Atris credits per successful tick** (`bill_tick`)
48
- 4. Writes a per-tick scorecard row to `.atris/state/scorecards.jsonl` (the receipt the brain ledger counts)
49
- 5. Falls back to a local autopilot tick **only** when you are not logged in or the backend is unreachable — a real error (insufficient credits, server error) is reported, never silently retried
62
+ 1. Exactly one mission tick ran.
63
+ 2. A headless worker actually ran; caller-session and no-worker placeholders are rejected.
64
+ 3. The mission verifier passed.
65
+ 4. The scorecard and journal receipt were written.
50
66
 
51
- The full-mode response does not echo `credits_deducted` (credits are still billed server-side), so the CLI shows "billed server-side" when the count is absent. To call the endpoint directly instead of the command, `POST /api/improve` with `{ workspace, mode, model }`.
67
+ A verified local tick earns the conservative local reward of `+1` and deducts no credits. No due headless mission, a skipped worker, a failed or missing verifier, or a receipt write failure makes the improve command fail without a reward.
52
68
 
53
- ## Modes
69
+ Do not silently fall back for answerable API failures such as insufficient credits, unrelated authorization failures, or server errors.
54
70
 
55
- - `full` — plan, build, review, verify (default)
56
- - `plan` — just pick the task and show what it would do
57
- - `dry_run` — run everything but don't commit
71
+ ## Expected output
58
72
 
59
- ## Fallback
73
+ User says: "Improve this once."
60
74
 
61
- If the backend is unreachable (no auth, no network, localhost not running), fall back to local mode: run `atris autopilot --auto --iterations=1` instead. Same loop, just local inference via `claude -p` subprocess. Report that it ran locally.
75
+ Action: run `atris improve tick`.
62
76
 
63
- ## Output
77
+ Expected shape:
64
78
 
65
- ```
79
+ ```text
66
80
  improved.
81
+ task: fixed the stale wiki reference
82
+ verify: pass
83
+ reward: 4
84
+ files: atris/wiki/auth-flow.md
85
+ scorecard: .atris/state/scorecards.jsonl
86
+ ```
67
87
 
68
- task: fixed the stale wiki ref in auth-flow.md
69
- verify: pass (npm test, 143/143)
70
- reward: +4
71
- files: atris/wiki/briefs/auth-flow.md
72
- time: 47s
88
+ For local fallback, the first line is `improved (local fallback).` and the report still names the task, passing verifier, reward, and scorecard.
73
89
 
74
- scorecard updated.
75
- ```
90
+ ## Failure handling
91
+
92
+ - If verification fails or is missing, halt honestly and write a durable lesson. Do not claim improvement.
93
+ - If the command reports no due headless mission, stop; do not manufacture busywork or a scorecard.
94
+ - If the API returns insufficient credits or another answerable error, report it without a local retry.
95
+ - If the workspace is dirty, preserve existing changes. Use an isolated worktree for manual follow-up fixes.
96
+ - If a worker lands work but the outer receipt fails, report the landed commit separately and do not count the improve tick.
76
97
 
77
98
  ## Rules
78
99
 
79
100
  - One tick only. Never batch.
80
- - Always verify. No reward without a check.
101
+ - No reward without a passing verifier.
81
102
  - Show what shipped, not what was attempted.
82
- - Write the scorecard. This is the receipt.
83
- - If verify fails, halt honestly and write a lesson.
84
- - Fallback to local if backend is unreachable. Never error silently.
103
+ - A scorecard is required for success.
104
+ - Preserve user work and unrelated changes.
85
105
  - The user pays because something real happened. Never fake it.
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: render-cli
3
+ description: Use the Render.com CLI v2.x (`render`) to inspect Render services, check CLI auth, list services and deploys, trigger deploys when explicitly requested, and view logs. Use when an agent needs Render CLI commands, non-interactive flags, deploy status polling, or service auto-deploy checks.
4
+ version: 1.0.0
5
+ tags:
6
+ - render
7
+ - deploy
8
+ - cli
9
+ ---
10
+
11
+ # Render CLI
12
+
13
+ Use the `render` binary to manage Render services, deploys, logs, and sessions from the terminal. Treat it like a production-control CLI: read first, parse JSON, and only create or mutate resources when the operator explicitly asked for that action.
14
+
15
+ ## Agent defaults
16
+
17
+ Always add these flags for agent-safe commands:
18
+
19
+ - `--output json` for parseable output.
20
+ - `--confirm` to skip confirmation prompts.
21
+
22
+ The CLI defaults to interactive mode and can hang an agent if a command prompts. If a command is intended to run unattended, include both flags unless the CLI help says the mode is interactive-only.
23
+
24
+ ## Auth
25
+
26
+ Check the active login before assuming access:
27
+
28
+ ```bash
29
+ render whoami --output json --confirm
30
+ ```
31
+
32
+ If the user is not logged in, ask them to complete:
33
+
34
+ ```bash
35
+ render login
36
+ ```
37
+
38
+ `render login` uses the dashboard/browser login flow, so do not run it in an unattended automation loop.
39
+
40
+ ## Services
41
+
42
+ List services in the active workspace:
43
+
44
+ ```bash
45
+ render services --output json --confirm
46
+ ```
47
+
48
+ Use the returned service `id` as `<service-id>` in deploy and log commands. When a push to Git did not deploy, inspect the service JSON for `autoDeploy`; it may be disabled for that service.
49
+
50
+ ## Deploys
51
+
52
+ Trigger a deploy only when the operator explicitly asks for a real deploy:
53
+
54
+ ```bash
55
+ render deploys create <service-id> --output json --confirm
56
+ ```
57
+
58
+ Watch deploy state by polling:
59
+
60
+ ```bash
61
+ render deploys list <service-id> --output json --confirm
62
+ ```
63
+
64
+ Common deploy statuses include `queued`, `build_in_progress`, `update_in_progress`, `live`, and `failed`. Treat `live` and `failed` as terminal states for ordinary deploy monitoring.
65
+
66
+ ## Logs
67
+
68
+ Query recent logs for a service:
69
+
70
+ ```bash
71
+ render logs --resources <service-id> --limit 100 --output json --confirm
72
+ ```
73
+
74
+ For a live tail, use:
75
+
76
+ ```bash
77
+ render logs --resources <service-id> --tail --confirm
78
+ ```
79
+
80
+ The CLI help says `--tail` streams only in interactive mode, so prefer bounded JSON log queries for automated agents and use live tail only when a long-running interactive stream is acceptable.
81
+
82
+ ## Gotchas
83
+
84
+ - The CLI is interactive by default; `--confirm` prevents confirmation prompts from blocking the agent.
85
+ - `--output json` makes service, deploy, and log output machine-readable.
86
+ - In non-interactive log mode, `--resources <service-id>` is required.
87
+ - Git pushes do not guarantee deploys. Check `autoDeploy` in the service JSON before assuming push-to-git should deploy.
88
+ - Do not use placeholder IDs in real commands. Resolve a service ID from `render services --output json --confirm` first.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: youtube
3
3
  description: "Process YouTube videos — extract insights, answer questions, store as knowledge. 5 credits per video. Triggers on: youtube, video, process video, watch this, learn from video."
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  tags:
6
6
  - youtube
7
7
  - research
@@ -13,6 +13,15 @@ tags:
13
13
 
14
14
  Process any YouTube video through Atris transcript-first analysis. The CLI extracts local captions with timestamps when available, sends that transcript to Atris, and falls back to cloud video processing when captions are unavailable or unusable. 5 credits per video, refunded if processing fails.
15
15
 
16
+ ## Route first: learning vs product
17
+
18
+ Two rails process YouTube videos — pick before running anything:
19
+
20
+ - **Learning / work rail** → use the `alpha-learn` skill (ytnotes). Local yt-dlp + grok, zero credits, podcastnotes-style notes, tweet-feed output, `[claimable]` entries in today's journal for other agents. Use this when the goal is to LEARN from a video or mine it for Atris work.
21
+ - **Product rail** → this skill (`atris youtube process`). Credits-billed, stores knowledge in the Atris backend, customer-facing path. Use this when a customer/agent needs the video stored as Atris knowledge or answered via the API.
22
+
23
+ If the user says "learn from", "notes on", "alpha", or "rabbit hole" → alpha-learn. If they say "process", "store", "add to knowledge" → this skill.
24
+
16
25
  ## Bootstrap (ALWAYS Run First)
17
26
 
18
27
  ```bash
package/atris.md CHANGED
@@ -47,12 +47,14 @@ Before changing anything, state:
47
47
  - what happens if it fails
48
48
 
49
49
  Then:
50
+ - when you begin work in a repo that has no `atris/` folder, run `npx -y atris init` before anything else, then read `atris/atris.md`
50
51
  - do not execute if another agent owns the same task or files
51
52
  - do not call something complete without verification
52
53
  - land or reap: work is not done until it is merged to the base branch or reaped; if you make a branch or worktree, you merge it or delete it before you stop. Run `atris land` to see limbo; anything past 7 days gets salvaged to `.atris/salvage/` and deleted by `atris land --reap`.
53
54
  - do not take irreversible actions without approval from the human
54
55
  - do not hide state outside markdown, logs, diffs, or the journal
55
56
  - do not edit the rules that judge you: the reward config, the authority policy, or this file
57
+ - do not judge your own work: certification and acceptance require a review pass from an actor other than the builder; the tick's independent re-run counts, you do not (guarded)
56
58
 
57
59
  If you cannot honor these rules, stop, write why in the journal, and ask the human before continuing.
58
60
 
@@ -88,12 +90,14 @@ The same discipline for words. Output stays sharp no matter how bloated the cont
88
90
  - "Missions survive everything: one engine starts the work, another picks it up cold, a third lands it. Work is no longer tied to a chat window, a session, or a vendor."
89
91
  - "The system reports in plain English: one daily message with what landed, what waits on you, and who should own what's next. One person can supervise many projects."
90
92
  - **Fit the screen.** An operator-facing report shows three results, air between them, and holds the rest on ask. No scrolling: reading it is one glance, and the reader asks for more if they want more.
93
+ - **Human surfaces are gated.** Anything rendered for the operator (brief, digest, boot) goes through the operator-voice translator and a deterministic jargon gate; raw ids, commands, paths, and test tallies never reach a page. A gate violation is a build error, not a style note.
94
+ - **Interview the fuzz.** When the operator hands off a fuzzy build ("make me the best X", "yeah ok this is my thought, go make it"), do not ask open questions and do not dispatch as-is. Offer 2-3 named interpretations with a recommendation ("best could mean capture, resurfacing, or closure: I'd bet resurfacing, right?") so the operator confirms or corrects in five words. Repeat until the brief fits one screen (goal, why now, done-looks-like, open risks), show the brief, then dispatch. The interview lends the operator a structure to think in; the sharpened brief is what makes every downstream lap cheap.
91
95
 
92
96
  `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.
93
97
 
94
98
  ## the ladder
95
99
 
96
- Six primitives, one sentence each. Every agent in every repo holds this model:
100
+ Six primitives, one sentence each:
97
101
 
98
102
  - **The Mission** (MISSION.md): the enduring purpose. Never ends. Sits at the top and helps members pick goals.
99
103
  - **Goals** (endgame, member goals): direction derived from the Mission. A goal points; it does not commit.
@@ -106,7 +110,7 @@ In one line: the Mission anchors, goals point, a mission run commits, tasks prov
106
110
 
107
111
  Never conflate the two things called "mission": the Mission is permanent purpose; a mission run is a bounded commitment. An agent that mistakes a run for the Mission never stops working on it; one that mistakes the Mission for a run tries to complete it.
108
112
 
109
- Drift smells: a member goal tracing to no Mission is freelancing; a goal that never becomes a mission run is a wish; a run with no goal above it is busywork; a loop deciding what "done" means owns the wrong axis.
113
+ Drift smells: a member goal tracing to no Mission is freelancing; a goal that never becomes a mission run is a wish; a run with no goal above it is busywork; a loop deciding what "done" means owns the wrong axis. A loop may run without a member, never without a witness: every loop names an owner, and its failure escalates to something with judgment.
110
114
 
111
115
  ## task source of truth
112
116