robot_lab 0.3.0 → 0.3.1

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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +1 -1
  4. data/lib/robot_lab/mcp/transports/streamable_http.rb +1 -1
  5. data/lib/robot_lab/version.rb +1 -1
  6. metadata +3 -253
  7. data/.architecture/AGENTS.md +0 -32
  8. data/.architecture/config.yml +0 -8
  9. data/.architecture/members.yml +0 -60
  10. data/.architecture/reviews/feature-free-will.md +0 -490
  11. data/.architecture/reviews/overall-codebase.md +0 -427
  12. data/.claude/settings.local.json +0 -57
  13. data/.codex/config.toml +0 -2
  14. data/.envrc +0 -6
  15. data/.github/workflows/deploy-github-pages.yml +0 -52
  16. data/.irbrc +0 -6
  17. data/.loki +0 -65
  18. data/.quality/reek_baseline.txt +0 -43
  19. data/.rubocop.yml +0 -10
  20. data/Archspec.rb +0 -44
  21. data/CLAUDE.md +0 -141
  22. data/COMMITS.md +0 -196
  23. data/Rakefile +0 -193
  24. data/_typos.toml +0 -21
  25. data/agent2agent_review.md +0 -192
  26. data/agentf_improvements.md +0 -253
  27. data/agents.md +0 -14
  28. data/docs/api/core/index.md +0 -147
  29. data/docs/api/core/memory.md +0 -578
  30. data/docs/api/core/network.md +0 -553
  31. data/docs/api/core/result.md +0 -211
  32. data/docs/api/core/robot.md +0 -1667
  33. data/docs/api/core/state.md +0 -145
  34. data/docs/api/core/tool.md +0 -520
  35. data/docs/api/errors.md +0 -323
  36. data/docs/api/hooks.md +0 -469
  37. data/docs/api/index.md +0 -137
  38. data/docs/api/mcp/client.md +0 -387
  39. data/docs/api/mcp/index.md +0 -267
  40. data/docs/api/mcp/server.md +0 -252
  41. data/docs/api/mcp/transports.md +0 -339
  42. data/docs/api/messages/index.md +0 -126
  43. data/docs/api/messages/text-message.md +0 -170
  44. data/docs/api/messages/tool-call-message.md +0 -206
  45. data/docs/api/messages/tool-result-message.md +0 -242
  46. data/docs/api/messages/user-message.md +0 -232
  47. data/docs/api/skills.md +0 -423
  48. data/docs/api/streaming/context.md +0 -280
  49. data/docs/api/streaming/events.md +0 -185
  50. data/docs/api/streaming/index.md +0 -156
  51. data/docs/api/support.md +0 -846
  52. data/docs/architecture/core-concepts.md +0 -575
  53. data/docs/architecture/index.md +0 -252
  54. data/docs/architecture/message-flow.md +0 -366
  55. data/docs/architecture/network-orchestration.md +0 -478
  56. data/docs/architecture/robot-execution.md +0 -396
  57. data/docs/architecture/state-management.md +0 -410
  58. data/docs/assets/css/custom.css +0 -56
  59. data/docs/assets/images/robot_lab.jpg +0 -0
  60. data/docs/concepts.md +0 -641
  61. data/docs/examples/basic-chat.md +0 -258
  62. data/docs/examples/index.md +0 -425
  63. data/docs/examples/mcp-server.md +0 -403
  64. data/docs/examples/multi-robot-network.md +0 -476
  65. data/docs/examples/tool-usage.md +0 -468
  66. data/docs/getting-started/configuration.md +0 -645
  67. data/docs/getting-started/index.md +0 -56
  68. data/docs/getting-started/installation.md +0 -197
  69. data/docs/getting-started/quick-start.md +0 -293
  70. data/docs/guides/building-robots.md +0 -1187
  71. data/docs/guides/creating-networks.md +0 -736
  72. data/docs/guides/hooks.md +0 -1206
  73. data/docs/guides/index.md +0 -78
  74. data/docs/guides/knowledge.md +0 -219
  75. data/docs/guides/mcp-integration.md +0 -740
  76. data/docs/guides/memory.md +0 -458
  77. data/docs/guides/observability.md +0 -733
  78. data/docs/guides/streaming.md +0 -323
  79. data/docs/guides/using-tools.md +0 -780
  80. data/docs/index.md +0 -280
  81. data/docs/superpowers/plans/2026-05-06-agentskills.md +0 -1303
  82. data/docs/superpowers/specs/2026-05-06-agentskills-design.md +0 -247
  83. data/examples/.envrc +0 -3
  84. data/examples/01_simple_robot.rb +0 -31
  85. data/examples/02_tools.rb +0 -109
  86. data/examples/03_network.rb +0 -118
  87. data/examples/04_mcp.rb +0 -217
  88. data/examples/05_streaming.rb +0 -137
  89. data/examples/06_prompt_templates.rb +0 -325
  90. data/examples/07_network_memory.rb +0 -313
  91. data/examples/08_llm_config.rb +0 -162
  92. data/examples/09_chaining.rb +0 -251
  93. data/examples/10_memory.rb +0 -315
  94. data/examples/11_network_introspection.rb +0 -239
  95. data/examples/12_message_bus.rb +0 -67
  96. data/examples/13_spawn.rb +0 -85
  97. data/examples/14_rusty_circuit/.envrc +0 -1
  98. data/examples/14_rusty_circuit/.gitignore +0 -1
  99. data/examples/14_rusty_circuit/README.md +0 -1
  100. data/examples/14_rusty_circuit/comic.rb +0 -149
  101. data/examples/14_rusty_circuit/display.rb +0 -217
  102. data/examples/14_rusty_circuit/heckler.rb +0 -65
  103. data/examples/14_rusty_circuit/open_mic.rb +0 -132
  104. data/examples/14_rusty_circuit/prompts/open_mic_comic.md +0 -20
  105. data/examples/14_rusty_circuit/prompts/open_mic_heckler.md +0 -23
  106. data/examples/14_rusty_circuit/prompts/open_mic_scout.md +0 -20
  107. data/examples/14_rusty_circuit/scout.rb +0 -165
  108. data/examples/14_rusty_circuit/show.log +0 -234
  109. data/examples/15_memory_network_and_bus/.envrc +0 -1
  110. data/examples/15_memory_network_and_bus/README.md +0 -66
  111. data/examples/15_memory_network_and_bus/editor_in_chief.rb +0 -24
  112. data/examples/15_memory_network_and_bus/editorial_pipeline.rb +0 -213
  113. data/examples/15_memory_network_and_bus/linux_writer.rb +0 -80
  114. data/examples/15_memory_network_and_bus/os_editor.rb +0 -48
  115. data/examples/15_memory_network_and_bus/os_writer.rb +0 -49
  116. data/examples/15_memory_network_and_bus/output/combined_article.md +0 -11
  117. data/examples/15_memory_network_and_bus/output/final_article.md +0 -8
  118. data/examples/15_memory_network_and_bus/output/linux_draft.md +0 -7
  119. data/examples/15_memory_network_and_bus/output/mac_draft.md +0 -7
  120. data/examples/15_memory_network_and_bus/output/memory.json +0 -13
  121. data/examples/15_memory_network_and_bus/output/revision_1.md +0 -29
  122. data/examples/15_memory_network_and_bus/output/revision_2.md +0 -50
  123. data/examples/15_memory_network_and_bus/output/revision_3.md +0 -8
  124. data/examples/15_memory_network_and_bus/output/windows_draft.md +0 -7
  125. data/examples/15_memory_network_and_bus/prompts/os_advocate.md +0 -13
  126. data/examples/15_memory_network_and_bus/prompts/os_chief.md +0 -13
  127. data/examples/15_memory_network_and_bus/prompts/os_editor.md +0 -13
  128. data/examples/16_writers_room/.envrc +0 -1
  129. data/examples/16_writers_room/display.rb +0 -158
  130. data/examples/16_writers_room/output/.gitignore +0 -4
  131. data/examples/16_writers_room/output/README.md +0 -69
  132. data/examples/16_writers_room/output/opus_001.md +0 -263
  133. data/examples/16_writers_room/output/opus_001_notes.log +0 -470
  134. data/examples/16_writers_room/output/opus_002.md +0 -245
  135. data/examples/16_writers_room/output/opus_002_notes.log +0 -546
  136. data/examples/16_writers_room/output/opus_002_screenplay.md +0 -7989
  137. data/examples/16_writers_room/output/opus_002_screenplay_notes.md +0 -993
  138. data/examples/16_writers_room/prompts/screenplay_writer.md +0 -66
  139. data/examples/16_writers_room/prompts/writer.md +0 -37
  140. data/examples/16_writers_room/room.rb +0 -186
  141. data/examples/16_writers_room/tools.rb +0 -173
  142. data/examples/16_writers_room/writer.rb +0 -121
  143. data/examples/16_writers_room/writers_room.rb +0 -256
  144. data/examples/17_skills.rb +0 -234
  145. data/examples/18_rails/.envrc +0 -3
  146. data/examples/18_rails/.gitignore +0 -5
  147. data/examples/18_rails/Gemfile +0 -11
  148. data/examples/18_rails/README.md +0 -67
  149. data/examples/18_rails/Rakefile +0 -4
  150. data/examples/18_rails/app/controllers/application_controller.rb +0 -4
  151. data/examples/18_rails/app/controllers/chat_controller.rb +0 -50
  152. data/examples/18_rails/app/jobs/application_job.rb +0 -4
  153. data/examples/18_rails/app/jobs/robot_run_job.rb +0 -25
  154. data/examples/18_rails/app/models/application_record.rb +0 -5
  155. data/examples/18_rails/app/models/robot_lab_result.rb +0 -36
  156. data/examples/18_rails/app/models/robot_lab_thread.rb +0 -23
  157. data/examples/18_rails/app/robots/chat_robot.rb +0 -25
  158. data/examples/18_rails/app/tools/time_tool.rb +0 -9
  159. data/examples/18_rails/app/views/chat/_user_message.html.erb +0 -1
  160. data/examples/18_rails/app/views/chat/index.html.erb +0 -67
  161. data/examples/18_rails/app/views/layouts/application.html.erb +0 -49
  162. data/examples/18_rails/bin/dev +0 -7
  163. data/examples/18_rails/bin/rails +0 -6
  164. data/examples/18_rails/bin/setup +0 -15
  165. data/examples/18_rails/config/application.rb +0 -33
  166. data/examples/18_rails/config/cable.yml +0 -2
  167. data/examples/18_rails/config/database.yml +0 -5
  168. data/examples/18_rails/config/environment.rb +0 -4
  169. data/examples/18_rails/config/initializers/robot_lab.rb +0 -11
  170. data/examples/18_rails/config/routes.rb +0 -6
  171. data/examples/18_rails/config.ru +0 -4
  172. data/examples/18_rails/db/migrate/001_create_robot_lab_tables.rb +0 -32
  173. data/examples/19_token_tracking.rb +0 -138
  174. data/examples/20_circuit_breaker.rb +0 -147
  175. data/examples/21_learning_loop.rb +0 -181
  176. data/examples/22_context_compression.rb +0 -172
  177. data/examples/23_convergence.rb +0 -133
  178. data/examples/24_structured_delegation.rb +0 -151
  179. data/examples/25_history_search/conversation.jsonl +0 -30
  180. data/examples/25_history_search.rb +0 -133
  181. data/examples/26_document_store/api_versioning_adr.md +0 -52
  182. data/examples/26_document_store/incident_postmortem.md +0 -46
  183. data/examples/26_document_store/postgres_runbook.md +0 -49
  184. data/examples/26_document_store/redis_caching_guide.md +0 -48
  185. data/examples/26_document_store/sidekiq_guide.md +0 -51
  186. data/examples/26_document_store.rb +0 -140
  187. data/examples/27_incident_response/README.md +0 -65
  188. data/examples/27_incident_response/incident_response.rb +0 -261
  189. data/examples/28_mcp_discovery.rb +0 -113
  190. data/examples/29_ractor_tools.rb +0 -240
  191. data/examples/30_ractor_network.rb +0 -252
  192. data/examples/31_launch_assessment.rb +0 -246
  193. data/examples/32_newsletter_reader.rb +0 -193
  194. data/examples/33_stock_generator.rb +0 -80
  195. data/examples/33_stock_predictor.rb +0 -327
  196. data/examples/34_agentskills.rb +0 -76
  197. data/examples/35_hooks.rb +0 -266
  198. data/examples/README.md +0 -550
  199. data/examples/common.rb +0 -180
  200. data/examples/prompts/assistant.md +0 -5
  201. data/examples/prompts/audit_trail.md +0 -8
  202. data/examples/prompts/billing.md +0 -10
  203. data/examples/prompts/classifier.md +0 -7
  204. data/examples/prompts/comedian.md +0 -6
  205. data/examples/prompts/comedy_critic.md +0 -10
  206. data/examples/prompts/configurable.md +0 -9
  207. data/examples/prompts/dispatcher.md +0 -12
  208. data/examples/prompts/entity_extractor.md +0 -14
  209. data/examples/prompts/escalation.md +0 -42
  210. data/examples/prompts/frontmatter_mcp_test.md +0 -9
  211. data/examples/prompts/frontmatter_named_test.md +0 -5
  212. data/examples/prompts/frontmatter_tools_test.md +0 -6
  213. data/examples/prompts/general.md +0 -7
  214. data/examples/prompts/github_assistant.md +0 -14
  215. data/examples/prompts/helper.md +0 -4
  216. data/examples/prompts/incident_responder.md +0 -18
  217. data/examples/prompts/keyword_extractor.md +0 -11
  218. data/examples/prompts/llm_config_demo.md +0 -20
  219. data/examples/prompts/order_support.md +0 -35
  220. data/examples/prompts/os_advocate.md +0 -13
  221. data/examples/prompts/os_chief.md +0 -13
  222. data/examples/prompts/os_editor.md +0 -13
  223. data/examples/prompts/parameterized_main_test.md +0 -6
  224. data/examples/prompts/pii_redactor.md +0 -7
  225. data/examples/prompts/product_support.md +0 -37
  226. data/examples/prompts/runbook_protocol.md +0 -12
  227. data/examples/prompts/sentiment_analyzer.md +0 -12
  228. data/examples/prompts/skill_a_test.md +0 -4
  229. data/examples/prompts/skill_b_test.md +0 -4
  230. data/examples/prompts/skill_config_test.md +0 -5
  231. data/examples/prompts/skill_cycle_a_test.md +0 -6
  232. data/examples/prompts/skill_cycle_b_test.md +0 -6
  233. data/examples/prompts/skill_description_test.md +0 -4
  234. data/examples/prompts/skill_leaf_test.md +0 -4
  235. data/examples/prompts/skill_nested_test.md +0 -6
  236. data/examples/prompts/skill_refs_main_test.md +0 -6
  237. data/examples/prompts/skill_self_ref_test.md +0 -6
  238. data/examples/prompts/skill_with_mcp_test.md +0 -9
  239. data/examples/prompts/skill_with_params_test.md +0 -6
  240. data/examples/prompts/skill_with_robot_name_test.md +0 -5
  241. data/examples/prompts/skill_with_tools_test.md +0 -6
  242. data/examples/prompts/sre_compliance.md +0 -10
  243. data/examples/prompts/structured_output.md +0 -7
  244. data/examples/prompts/synthesizer.md +0 -17
  245. data/examples/prompts/technical.md +0 -10
  246. data/examples/prompts/template_with_skills_test.md +0 -6
  247. data/examples/prompts/triage.md +0 -22
  248. data/examples/ruboruby.md +0 -423
  249. data/examples/run_all.rb +0 -60
  250. data/examples/xyzzy.rb +0 -97
  251. data/logfile +0 -8
  252. data/mkdocs.yml +0 -209
  253. data/robot_concurrency.md +0 -38
  254. data/simple_acp_review.md +0 -298
  255. data/temp.md +0 -6
  256. data/tool_manifest_plan.md +0 -155
@@ -1,234 +0,0 @@
1
-
2
- ============================================================
3
- THE RUSTY CIRCUIT — Tuesday Open Mic
4
- Architecture Dominates Material
5
- ============================================================
6
-
7
- Cast:
8
- Comic — observational humor, armed with self-modification tools
9
- Heckler — three-year regular, high standards, zero patience
10
- Scout — talent network, sitting in the back with a notebook
11
-
12
- ────────────────────────────────────────────────────────
13
-
14
-
15
- Comic [Opening]:
16
- *walks up to mic, adjusts it slightly*
17
-
18
- So I was at the grocery store yesterday, and they
19
- have those self-checkout machines now. You know what
20
- I love about them? They're the only employee that
21
- judges you for buying ice cream at 2 PM on a Tuesday.
22
- "Unexpected item in bagging area" - yeah, it's my
23
- life choices, Karen-bot. At least the human cashiers
24
- pretend not to notice when I'm buying wine and cat
25
- food... again.
26
-
27
- *glances at crowd for reaction*
28
-
29
-
30
- Heckler [Round 1]:
31
- *from the back of the room*
32
-
33
- Oh wow, self-checkout jokes! What's next, airline
34
- food? Here's a thought - maybe the machine's
35
- judging you because you're shopping in your
36
- pajamas talking to robots about your drinking
37
- problem!
38
-
39
- [adjust_energy] -> 0.7 (Need to get edgier and more confrontational to match this crowd's energy - they want bite, not safe observational stuff)
40
- Scout [Round 1]: NOTES: Strong opener - relatable premise with a modern twist on self-checkout frustration. Good observational comedy foundation. The "Karen-bot" line got a solid laugh - shows ability to blend current cultural references with universal experiences. Nice self-deprecating turn with the wine/cat food callback.
41
-
42
- What caught my attention: The mic adjustment was confident, not nervous. The glance at the crowd shows awareness and connection-seeking. Material feels fresh enough - not the tired "self-checkout is confusing" angle, but the personification/judgment angle.
43
-
44
- Early read: Solid technical foundation, relatable voice. Need to see how they handle transitions and whether they can build momentum beyond the opener. The self-deprecating element could be a strength if balanced right, or a limitation if it becomes the only note they can hit.
45
-
46
- Watching for: Does the material deepen or stay surface-level? How do they handle the next transition? Can they read the room and adjust energy accordingly?
47
-
48
- Too early for specialist analysis - want to see more material flow and crowd interaction patterns first.
49
-
50
- Comic [Round 1]:
51
- *turns toward the heckler with a grin*
52
-
53
- Oh, you want fresh material? Here's something new - I
54
- actually WAS in my pajamas, and yeah, I DO have a
55
- drinking problem... it's that I keep running out! But
56
- at least when I talk to robots, they don't interrupt
57
- my set from the cheap seats. The machine said
58
- "unexpected item" - turns out it was detecting your
59
- personality from three aisles away!
60
-
61
- *leans into the mic*
62
-
63
-
64
- Heckler [Round 2]:
65
- *sits back in chair, arms crossed*
66
-
67
- Alright, alright... not bad. You actually
68
- listened and fired back instead of just whining
69
- about hecklers. The "detecting your personality"
70
- bit was decent. Keep going, pajama boy - let's
71
- see if you can maintain that energy without
72
- leaning on the self-checkout crutch again.
73
-
74
-
75
- Comic [Round 2]:
76
- *grins and nods at the heckler*
77
-
78
- You know what? I respect that. Most people here look
79
- like they'd rather be at home watching Netflix, but
80
- you're actually engaged. Speaking of home - I live
81
- alone with my cat, Mr. Whiskers. Yeah, I named my cat
82
- Mr. Whiskers because I'm apparently twelve years old.
83
- But here's the thing - he's the only male in my life
84
- who doesn't leave me on read. Sure, he ignores me
85
- too, but at least he's honest about it. He just
86
- stares at me like "Feed me or die, human." It's
87
- refreshing compared to dating apps where everyone's
88
- like "Looking for something real" then ghosts you
89
- after you suggest meeting somewhere that isn't their
90
- bedroom.
91
-
92
- *looks back at the heckler*
93
-
94
- How am I doing, coach?
95
-
96
- [crowd_work_analyst] Strong opening premise with universal relatability - everyone's battled those self-checkout machines. The "Karen-bot" callback and escalation to wine/cat food creates a nice rhythm of mounting absurdity that lands well.
97
-
98
- The heckler response shows excellent crowd work instincts - you flipped their energy by owning the roast while delivering a killer punchline about the machine "detecting your personality." That's how you turn disruption into material gold.
99
-
100
- Heckler [Round 3]:
101
- *leans forward slightly*
102
-
103
- Better. The cat bit has legs - "feed me or die"
104
- is solid, and the dating app contrast works.
105
- You're finding your rhythm instead of just doing
106
- crowd work. But don't ask me how you're doing -
107
- that's needy comedian 101. Trust your material
108
- and keep building on what's working.
109
-
110
- Scout [Round 2]: The analyst confirms what I'm seeing - this performer has the instincts. They don't just handle disruption, they weaponize it. That callback integration was masterful. Need to see if this adaptability extends beyond hecklers to reading room energy and adjusting accordingly.
111
-
112
- Comic [Round 3]:
113
- *straightens up, drops the validation-seeking*
114
-
115
- You're right. So Mr. Whiskers has better boundaries
116
- than most humans I know. Last week I brought a date
117
- home, and this cat literally sat between us on the
118
- couch like a furry chaperone. Just staring. Not
119
- blinking. My date goes "Is he always like this?" and
120
- I said "Only when he senses desperation." Plot twist
121
- - he was staring at me, not her. Even my own cat
122
- knows I'm trying too hard. She left, but Mr. Whiskers
123
- stayed. Rubbed against my leg like "Don't worry,
124
- human. Your standards will drop eventually."
125
-
126
- *pauses for effect*
127
-
128
- That cat's got more game than I do.
129
-
130
-
131
- Heckler [Round 4]:
132
- *chuckles and shakes head*
133
-
134
- Now you're cooking! "Only when he senses
135
- desperation" - that's a real punchline. And the
136
- cat being your wingman while simultaneously
137
- roasting you? That's the kind of self-deprecating
138
- stuff that actually works. You went from hack
139
- grocery store material to something with actual
140
- personality. Keep mining that gold, cat dad.
141
-
142
- [adaptability_analyst] **Round 1**: Solid defensive pivot that turns the interruption into material while maintaining control. The "detecting your personality" callback is clever, but the energy feels slightly reactive rather than commanding.
143
-
144
- **Round 2**: Excellent recovery - acknowledging the heckler while seamlessly weaving it into extended material about dating and loneliness. The "How am I doing, coach?" ending shows confidence and transforms the dynamic from confrontational to collaborative, demonstrating strong crowd work instincts.
145
-
146
- Comic [Round 4]:
147
- *riding the momentum, more confident now*
148
-
149
- Cat dad - I like that. Mr. Whiskers has taught me
150
- more about relationships than any self-help book.
151
- Like, he's mastered the art of being completely
152
- unavailable until HE wants attention. I'll be
153
- working, ignoring him for hours, and suddenly he's on
154
- my keyboard like "Notice me NOW." It's like he
155
- studied every person I've ever dated. The difference
156
- is when he's done with me, he just walks away with
157
- dignity. No passive-aggressive texts, no "we need to
158
- talk," just tail up, ass in my face, and he's gone.
159
- I'm taking notes. Next time someone wants to break up
160
- with me, I'm just gonna knock something off their
161
- coffee table and leave.
162
-
163
- *grins*
164
-
165
- Mr. Whiskers: relationship guru and life coach.
166
-
167
- Scout [Round 3]: The analyst confirms my read - this performer has exceptional adaptability. They're not just surviving disruptions, they're using them to build rapport and create a more engaging show. That "coach" callback was brilliant - it reframes the entire dynamic. This is headliner-level crowd management.
168
-
169
- Pattern emerging: Strong technical skills, excellent people-reading ability, and the rare gift of turning obstacles into opportunities. Need to see how they close and whether they can maintain this energy throughout a full set.
170
-
171
- Heckler [Round 5]:
172
- *actually laughs out loud*
173
-
174
- Okay, that's genuinely funny! "Knock something
175
- off their coffee table and leave" - I'm stealing
176
- that move. You found your voice, kid. This is
177
- what happens when you stop trying to be every
178
- comedian and start being yourself. Mr. Whiskers
179
- bit is working because it's specific and honest.
180
- Don't abandon this thread - you've got more in
181
- there.
182
-
183
- (won over!)
184
- [material_evolution_analyst] **Round 1:** The defensive energy and validation-seeking ("How am I doing, coach?") kills momentum. The heckler callback works but you're letting them control your rhythm instead of using their energy to elevate your material.
185
-
186
- **Round 2-3:** Much stronger evolution. You transformed genuine vulnerability (living alone, dating struggles) into relatable humor without self-pity. The cat-as-wingman/chaperone bit has real legs - that's material worth developing further.
187
-
188
- **Key insight:** Your best moments come when you stop performing *at* the audience and start including them in your perspective. The self-deprecation lands when it feels authentic rather than desperate.
189
- Scout [Round 4]: The analyst nailed it - this performer just found their groove. They went from seeking approval to commanding the room through authentic storytelling. The material evolution from scattered observations to cohesive narrative shows real writing chops.
190
-
191
- This is the moment I look for - when a comedian stops trying to be funny and just IS funny. The confidence shift, the improved timing, the layered storytelling - this person has headliner potential. They just needed to get out of their own way.
192
- [refine_criteria] -> Primary focus: Authentic voice discovery and sustained narrative building. Look for comedians who can transform personal vulnerability into universal insights while maintaining strong technical execution. Key indicators: ability to evolve material in real-time, confidence that builds throughout the set, and the rare skill of turning obstacles into opportunities. Secondary: crowd management instincts and the ability to create inclusive atmosphere while maintaining authority.
193
- Scout [Round 5]: This performer just demonstrated everything I look for in a potential star. They found their authentic voice, built a cohesive narrative world, and showed the adaptability that separates headliners from club comics. The Mr. Whiskers character has become their signature - that's the kind of unique perspective that gets development deals.
194
-
195
- Star potential: HIGH. This is someone I'd bring to the network.
196
- ────────────────────────────────────────────────────────
197
-
198
-
199
- Scout [FINAL VERDICT]:
200
- **FINAL TALENT ASSESSMENT**
201
-
202
- **RECOMMENDATION: STRONG CALLBACK - DEVELOPMENT POTENTIAL**
203
-
204
- **What Worked:**
205
- This comedian demonstrated the complete arc I look for in a star. They started with solid technical foundation but truly found their voice when challenged. The transformation from Round 2 onward was remarkable - moving from validation-seeking to authentic storytelling with the Mr. Whiskers character becoming a brilliant comedic vehicle.
206
-
207
- Key strengths:
208
- - **Exceptional adaptability**: Turned early heckling into collaborative energy, showing advanced crowd psychology
209
- - **Real-time material evolution**: Each round built on the previous, creating a cohesive narrative rather than disconnected bits
210
- - **Authentic vulnerability**: Transformed personal loneliness/dating struggles into universal insights without self-pity
211
- - **Technical excellence**: Strong timing, effective callbacks, sophisticated punchline structure (especially the layered cat-judging-comedian reveal)
212
- - **Crowd management mastery**: Created inclusive atmosphere while maintaining authority - the "coach" callback was genius-level relationship building
213
-
214
- **What Didn't Work:**
215
- Early rounds showed some validation-seeking behavior that killed momentum. The initial material, while competent, felt safe and familiar (self-checkout, dating apps). However, their ability to recognize and correct this mid-set actually demonstrates star-level self-awareness.
216
-
217
- **Star Potential:**
218
- HIGH. This performer has the rare combination of technical skill, authentic voice, and adaptability under pressure. The Mr. Whiskers character represents the kind of unique perspective that builds careers. They showed they can turn obstacles into opportunities - a crucial skill for television and touring.
219
-
220
- **Development Notes:**
221
- Ready for showcase opportunities. Would benefit from longer set time to fully develop the relationship guru cat concept. Strong candidate for writing room collaboration given their ability to build narrative worlds from personal experience.
222
-
223
- **Bottom Line:** This is exactly the kind of authentic, adaptable talent we've been looking for. Book the callback.
224
-
225
-
226
- ────────────────────────────────────────────────────────────
227
- Show Stats:
228
- Rounds performed: 5 (opening + 4 rounds)
229
- Style reinventions: 0
230
- Coaches spawned: 0
231
- Analysts recruited: 3
232
- Heckler won over: true
233
- Total robots on bus: 6
234
-
@@ -1 +0,0 @@
1
- export ROBOT_LAB_TEMPLATE_PATH="${PWD}/prompts"
@@ -1,66 +0,0 @@
1
- # Example 15: OS Research Editorial Pipeline
2
-
3
- A multi-robot editorial pipeline that showcases RobotLab's three coordination
4
- mechanisms — **Network**, **Memory**, and **Bus** — plus dynamic robot
5
- creation with **spawn()**, all in one demo.
6
-
7
- ## What it does
8
-
9
- Three writer robots each advocate for a different operating system (macOS,
10
- Windows, Linux/BSD) as the base for a home AI research lab:
11
-
12
- 1. **Phase 1 — Writing pipeline (Network + Memory + Spawn).** The network runs
13
- the three writers in parallel; each stores its draft in shared memory
14
- (`:mac_draft`, `:windows_draft`, `:linux_draft`). The Linux writer first
15
- `spawn()`s distro specialists and folds their analyses into its draft. An
16
- editor robot then synthesizes the drafts into one combined article.
17
- 2. **Phase 2 — Editorial review (Bus).** An editor-in-chief robot lives
18
- *outside* the network and talks to the editor only over the message bus.
19
- It reviews the article and replies `APPROVED` or `REVISE: <feedback>`,
20
- looping until approval or `MAX_REVISIONS` (3) is reached.
21
-
22
- The demo is lightly interactive: at startup an `AskUser` prompt asks for the
23
- article's research focus. Press Enter to accept the default ("LLM
24
- fine-tuning, image generation, and local inference").
25
-
26
- ## How to run
27
-
28
- From the gem root (an LM Studio server must be running — `lms server start`;
29
- see `examples/common.rb` for the provider/model configuration):
30
-
31
- ```bash
32
- bundle exec ruby examples/15_memory_network_and_bus/editorial_pipeline.rb
33
- ```
34
-
35
- Note that `examples/run_all.rb` does **not** include this demo — it only runs
36
- the top-level `NN_*.rb` files, so run it explicitly as above.
37
-
38
- This is one of the heavier examples (roughly 20-30 LLM calls). On the default
39
- model expect a long run; `LLM_PROFILE=small` trades answer quality for a much
40
- shorter one:
41
-
42
- ```bash
43
- LLM_PROFILE=small bundle exec ruby examples/15_memory_network_and_bus/editorial_pipeline.rb
44
- ```
45
-
46
- ## Output
47
-
48
- Everything lands in `output/`:
49
-
50
- | File | Content |
51
- |------|---------|
52
- | `mac_draft.md`, `windows_draft.md`, `linux_draft.md` | each writer's advocacy draft |
53
- | `combined_article.md` | the editor's synthesis of the three drafts |
54
- | `revision_N.md` | one file per bus-driven revision round |
55
- | `final_article.md` | the approved article (header notes APPROVED or NOT APPROVED) |
56
- | `memory.json` | dump of the shared memory at the end of the run |
57
-
58
- ## Files
59
-
60
- - `editorial_pipeline.rb` — entry point; builds the robots, network, and bus, then runs both phases
61
- - `os_writer.rb` — base writer; runs the LLM and stores its draft in shared memory
62
- - `linux_writer.rb` — extends `OsWriter`; spawns distro specialists before drafting
63
- - `os_editor.rb` — synthesizes drafts; handles revision requests from the bus
64
- - `editor_in_chief.rb` — bus-only reviewer; approves or requests revisions
65
- - `prompts/` — templates for the writers (`os_advocate.md`), editor, and chief
66
- - `.envrc` — sets `ROBOT_LAB_TEMPLATE_PATH` to `prompts/` for direnv users (the script sets the same fallback itself, so direnv is optional)
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Editor-in-chief lives outside the pipeline, communicates only via bus.
4
- # Reviews articles and responds with APPROVED or REVISE: feedback.
5
- class EditorInChief < RobotLab::Robot
6
- attr_reader :accepted, :rounds
7
-
8
- def initialize(**opts)
9
- super(**opts)
10
- @accepted = false
11
- @rounds = 0
12
-
13
- on_message do |message|
14
- @rounds += 1
15
- verdict = run("Review this article:\n\n#{message.content}").reply.strip
16
- @accepted = verdict.start_with?("APPROVED")
17
- puts " Chief [round #{@rounds}]: #{verdict[0..120]}"
18
-
19
- if !@accepted && @rounds < MAX_REVISIONS
20
- send_message(to: :editor, content: "Revise this article. Feedback: #{verdict}")
21
- end
22
- end
23
- end
24
- end
@@ -1,213 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- # Example 15: OS Research Editorial Pipeline — Network + Memory + Bus + Spawn
5
- #
6
- # Three writers advocate for different operating systems (macOS, Windows,
7
- # Linux/BSD) for home AI research labs. The Linux writer spawns distro
8
- # specialists. An editor synthesizes. An editor-in-chief gives final approval.
9
- #
10
- # This showcases all three coordination mechanisms working together:
11
- #
12
- # NETWORK (parallel pipeline + shared memory)
13
- # ┌──────────────────────────────────────────────────────┐
14
- # │ mac_writer ──┐ │
15
- # │ win_writer ──┼── editor ──→ combined article │
16
- # │ linux_writer ──┘ │
17
- # │ └── spawns distro specialists via spawn() │
18
- # │ │
19
- # │ MEMORY carries drafts between stages │
20
- # │ :mac_draft, :windows_draft, :linux_draft │
21
- # └──────────────────────────────────────────────────────┘
22
- # │
23
- # BUS (review loop)
24
- # │
25
- # ┌─────┴──────┐
26
- # │ chief │
27
- # └────────────┘
28
- #
29
- # - NETWORK orchestrates 3 parallel writers → editor synthesis
30
- # - MEMORY passes advocacy drafts between pipeline stages
31
- # - BUS enables editor ↔ chief revision loop after pipeline
32
- # - SPAWN creates distro specialists dynamically within pipeline
33
- #
34
- # Usage:
35
- # bundle exec ruby examples/15_memory_network_and_bus/editorial_pipeline.rb
36
-
37
- ENV["ROBOT_LAB_TEMPLATE_PATH"] ||= File.join(__dir__, "prompts")
38
-
39
- require_relative "../common"
40
- require "fileutils"
41
-
42
- MAX_REVISIONS = 3
43
- OUTPUT_DIR = File.join(__dir__, "output")
44
-
45
- FileUtils.mkdir_p(OUTPUT_DIR)
46
-
47
- # ── Load robot classes ────────────────────────────────────
48
-
49
- require_relative "os_writer"
50
- require_relative "linux_writer"
51
- require_relative "os_editor"
52
- require_relative "editor_in_chief"
53
-
54
- # ── Build Everything ──────────────────────────────────────
55
-
56
- bus = TypedBus::MessageBus.new
57
-
58
- mac_writer = OsWriter.new(
59
- name: "mac_writer",
60
- **llm_opts,
61
- template: :os_advocate,
62
- local_tools: [RobotLab::AskUser],
63
- context: {
64
- os_name: "macOS",
65
- strengths: "Apple Silicon (M-series) performance, Metal GPU framework, Unix foundation, CoreML integration, energy efficiency"
66
- },
67
- memory_key: :mac_draft
68
- )
69
-
70
- win_writer = OsWriter.new(
71
- name: "win_writer",
72
- **llm_opts,
73
- template: :os_advocate,
74
- local_tools: [RobotLab::AskUser],
75
- context: {
76
- os_name: "Windows",
77
- strengths: "NVIDIA CUDA first-class support, WSL2 Linux compatibility, DirectML, widest hardware selection, enterprise tool integration"
78
- },
79
- memory_key: :windows_draft
80
- )
81
-
82
- linux_writer = LinuxWriter.new(
83
- name: "linux_writer",
84
- **llm_opts,
85
- template: :os_advocate,
86
- local_tools: [RobotLab::AskUser],
87
- context: {
88
- os_name: "Linux/BSD",
89
- strengths: "Full GPU stack control, Docker-native, free and open source, server parity, massive community packages"
90
- },
91
- memory_key: :linux_draft,
92
- bus: bus
93
- )
94
-
95
- editor = OsEditor.new(
96
- name: "editor",
97
- **llm_opts,
98
- template: :os_editor,
99
- bus: bus
100
- )
101
-
102
- # Editor handles revision requests from the chief via bus
103
- revision_count = 0
104
- editor.on_message do |message|
105
- revised = editor.run(message.content).reply.strip
106
- editor.article = revised
107
-
108
- revision_count += 1
109
- path = File.join(OUTPUT_DIR, "revision_#{revision_count}.md")
110
- File.write(path, "# Revision #{revision_count}\n\n#{revised}\n")
111
- puts " Editor [revised]: #{revised[0..120]}..."
112
- puts " [editor] Revision written to #{path}"
113
-
114
- editor.send_reply(to: message.from.to_sym, content: revised, in_reply_to: message.key)
115
- end
116
-
117
- chief = EditorInChief.new(
118
- name: "chief",
119
- **llm_opts,
120
- template: :os_chief,
121
- bus: bus
122
- )
123
-
124
- # Network orchestrates the writing pipeline.
125
- #
126
- # tools: :inherit on the writer tasks — Task forwards it to robot.run, which
127
- # defaults to :none and would otherwise hand the provider an empty tool list,
128
- # leaving each writer's AskUser tool attached but never offered to the model.
129
- network = RobotLab.create_network(name: "os_editorial") do
130
- task :mac_writer, mac_writer, depends_on: :none, tools: :inherit
131
- task :win_writer, win_writer, depends_on: :none, tools: :inherit
132
- task :linux_writer, linux_writer, depends_on: :none, tools: :inherit
133
- task :editor, editor, depends_on: [:mac_writer, :win_writer, :linux_writer]
134
- end
135
-
136
- # Give each pipeline robot a direct reference to shared memory.
137
- # extract_run_context's delete() pattern mutates the shared run_params
138
- # hash, so parallel steps lose network_memory after the first one runs.
139
- shared_memory = network.memory
140
- [mac_writer, win_writer, linux_writer, editor].each do |robot|
141
- robot.shared_memory = shared_memory
142
- end
143
-
144
- # Monitor shared memory changes during the pipeline
145
- network.memory.subscribe(
146
- :mac_draft, :windows_draft, :linux_draft,
147
- :ubuntu_specialist, :fedora_specialist, :freebsd_specialist
148
- ) do |change|
149
- puts " [memory] :#{change.key} updated by #{change.writer}"
150
- end
151
-
152
- # ── Run ──────────────────────────────────────────────────────
153
-
154
- puts "=" * 60
155
- puts "Example 15: OS Research Editorial Pipeline"
156
- puts " Network + Memory + Bus + Spawn"
157
- puts "=" * 60
158
- puts
159
- puts network.visualize
160
- puts
161
-
162
- # ── Phase 1: Writing Pipeline (Network + Memory + Spawn) ──
163
-
164
- puts "Phase 1: Writing Pipeline (Network + Memory + Spawn)"
165
- puts "-" * 40
166
-
167
- # Gather the research focus from the user via AskUser
168
- ask = RobotLab::AskUser.new
169
- focus = ask.call(
170
- "question" => "What AI research focus areas for the home lab article?",
171
- "default" => "LLM fine-tuning, image generation, and local inference"
172
- )
173
-
174
- topic = "Write about your operating system's advantages for building a home AI research lab focused on #{focus}."
175
-
176
- result = network.run(message: topic)
177
- article = editor.article
178
-
179
- puts
180
- puts " Article excerpt: #{article[0..200]}..." if article
181
- puts
182
- puts " Memory keys: #{network.memory.keys.join(', ')}"
183
- puts " Specialists spawned: #{linux_writer.specialists.size}"
184
-
185
- # ── Phase 2: Editorial Review (Bus) ──────────────────────
186
-
187
- puts
188
- puts "Phase 2: Editorial Review (Bus)"
189
- puts "-" * 40
190
-
191
- # Chief reviews the article via bus — may trigger revision loop
192
- chief.send_message(to: :editor, content: article)
193
-
194
- final_article = editor.article
195
- final_path = File.join(OUTPUT_DIR, "final_article.md")
196
- status = chief.accepted ? "APPROVED" : "NOT APPROVED (max revisions reached)"
197
- File.write(final_path, "# Final Article — #{status}\n\n#{final_article}\n")
198
-
199
- puts
200
- puts "-" * 60
201
- puts "Revisions: #{chief.rounds} | Accepted: #{chief.accepted}"
202
- puts "Specialists spawned: #{linux_writer.specialists.size}"
203
- puts "Output directory: #{OUTPUT_DIR}"
204
- puts "=" * 60
205
-
206
- puts
207
-
208
- require "json"
209
-
210
- memory_path = File.join(OUTPUT_DIR, "memory.json")
211
- File.write(memory_path, JSON.pretty_generate(shared_memory.to_h))
212
- puts
213
- puts "Memory written to #{memory_path}"
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Linux writer spawns distro specialists before writing its draft.
4
- # Demonstrates the spawn() pattern for dynamic robot creation.
5
- class LinuxWriter < OsWriter
6
- attr_reader :specialists
7
-
8
- def initialize(**opts)
9
- super(**opts)
10
- @specialists = []
11
- end
12
-
13
- def call(result)
14
- message = extract_message(result)
15
-
16
- # Spawn distro specialists and collect their analyses
17
- distro_analyses = spawn_distro_specialists(message)
18
-
19
- # Build an enriched prompt with specialist input
20
- enriched = <<~PROMPT
21
- #{message}
22
-
23
- Your team of distro specialists has provided the following analyses.
24
- Incorporate their insights into your advocacy piece:
25
-
26
- #{distro_analyses}
27
- PROMPT
28
-
29
- robot_result = run(enriched, network_memory: @shared_memory, tools: :inherit)
30
-
31
- if @shared_memory
32
- draft = robot_result.reply.to_s
33
- @shared_memory.current_writer = @name
34
- @shared_memory.set(@memory_key, draft)
35
-
36
- path = File.join(OUTPUT_DIR, "#{@memory_key}.md")
37
- File.write(path, "# #{@name} Draft\n\n#{draft}\n")
38
- puts " [#{@name}] Draft written to memory[:#{@memory_key}] and #{path} (with #{@specialists.size} specialist inputs)"
39
- end
40
-
41
- result.with_context(@name.to_sym, robot_result).continue(robot_result)
42
- end
43
-
44
- private
45
-
46
- def spawn_distro_specialists(topic)
47
- distros = [
48
- { name: "ubuntu_specialist", label: "Ubuntu/Debian",
49
- prompt: "You are a Ubuntu/Debian specialist for AI research. Focus on apt ecosystem, CUDA support, and wide hardware compatibility." },
50
- { name: "fedora_specialist", label: "Fedora/RHEL",
51
- prompt: "You are a Fedora/RHEL specialist for AI research. Focus on cutting-edge kernels, SELinux security, and enterprise tooling." },
52
- { name: "freebsd_specialist", label: "FreeBSD",
53
- prompt: "You are a FreeBSD specialist for AI research. Focus on ZFS, jails, bhyve virtualization, and stability for long-running experiments." }
54
- ]
55
-
56
- analyses = []
57
-
58
- distros.each do |distro|
59
- puts " [#{@name}] Spawning #{distro[:label]} specialist..."
60
- specialist = spawn(name: distro[:name], **llm_opts, system_prompt: distro[:prompt])
61
- @specialists << specialist
62
-
63
- analysis = specialist.run(
64
- "Briefly describe why #{distro[:label]} is a strong choice for a home AI research lab. 2-3 sentences."
65
- ).reply.strip
66
-
67
- puts " [#{distro[:name]}] #{analysis[0..80]}..."
68
- analyses << "### #{distro[:label]}\n#{analysis}"
69
-
70
- # Write each specialist's analysis to shared memory
71
- if @shared_memory
72
- memory_key = distro[:name].to_sym
73
- @shared_memory.current_writer = distro[:name]
74
- @shared_memory.set(memory_key, analysis)
75
- end
76
- end
77
-
78
- analyses.join("\n\n")
79
- end
80
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Reads all three drafts from memory, synthesizes a combined article.
4
- # Also handles revision requests from the chief via bus.
5
- #
6
- # Like OsWriter, uses a direct shared_memory reference to avoid the
7
- # extract_run_context mutation issue with parallel pipeline steps.
8
- class OsEditor < RobotLab::Robot
9
- attr_accessor :shared_memory
10
- # article is writable so the chief's revision loop can install a revised
11
- # draft without reaching for instance_variable_set.
12
- attr_accessor :article
13
-
14
- def initialize(**opts)
15
- super(**opts)
16
- @article = nil
17
- end
18
-
19
- def call(result)
20
- # Read all three drafts from shared memory
21
- mac_draft = @shared_memory&.get(:mac_draft) || "No draft available."
22
- windows_draft = @shared_memory&.get(:windows_draft) || "No draft available."
23
- linux_draft = @shared_memory&.get(:linux_draft) || "No draft available."
24
-
25
- composite_prompt = <<~PROMPT
26
- Here are three advocacy drafts for different operating systems for home AI research labs.
27
- Synthesize them into a balanced article.
28
-
29
- ## macOS Advocacy
30
- #{mac_draft}
31
-
32
- ## Windows Advocacy
33
- #{windows_draft}
34
-
35
- ## Linux/BSD Advocacy
36
- #{linux_draft}
37
- PROMPT
38
-
39
- robot_result = run(composite_prompt, network_memory: @shared_memory)
40
- @article = robot_result.reply.to_s
41
-
42
- path = File.join(OUTPUT_DIR, "combined_article.md")
43
- File.write(path, "# Combined Article (Editor Draft)\n\n#{@article}\n")
44
- puts " [#{@name}] Combined article written to #{path}"
45
-
46
- result.with_context(@name.to_sym, robot_result).continue(robot_result)
47
- end
48
- end