robot_lab 0.0.1 → 0.0.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 (187) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/deploy-github-pages.yml +9 -9
  3. data/.irbrc +6 -0
  4. data/CHANGELOG.md +140 -0
  5. data/README.md +263 -48
  6. data/Rakefile +71 -1
  7. data/docs/api/core/index.md +53 -46
  8. data/docs/api/core/memory.md +200 -154
  9. data/docs/api/core/network.md +13 -3
  10. data/docs/api/core/robot.md +490 -130
  11. data/docs/api/core/state.md +55 -73
  12. data/docs/api/core/tool.md +205 -209
  13. data/docs/api/index.md +7 -28
  14. data/docs/api/mcp/client.md +119 -48
  15. data/docs/api/mcp/index.md +75 -60
  16. data/docs/api/mcp/server.md +120 -136
  17. data/docs/api/mcp/transports.md +172 -184
  18. data/docs/api/messages/index.md +35 -20
  19. data/docs/api/messages/text-message.md +67 -21
  20. data/docs/api/messages/tool-call-message.md +80 -41
  21. data/docs/api/messages/tool-result-message.md +119 -50
  22. data/docs/api/messages/user-message.md +48 -24
  23. data/docs/api/streaming/context.md +157 -74
  24. data/docs/api/streaming/events.md +114 -166
  25. data/docs/api/streaming/index.md +74 -72
  26. data/docs/architecture/core-concepts.md +360 -116
  27. data/docs/architecture/index.md +97 -59
  28. data/docs/architecture/message-flow.md +138 -129
  29. data/docs/architecture/network-orchestration.md +197 -50
  30. data/docs/architecture/robot-execution.md +199 -146
  31. data/docs/architecture/state-management.md +255 -187
  32. data/docs/concepts.md +311 -49
  33. data/docs/examples/basic-chat.md +89 -77
  34. data/docs/examples/index.md +222 -47
  35. data/docs/examples/mcp-server.md +207 -203
  36. data/docs/examples/multi-robot-network.md +129 -35
  37. data/docs/examples/rails-application.md +159 -160
  38. data/docs/examples/tool-usage.md +295 -204
  39. data/docs/getting-started/configuration.md +347 -154
  40. data/docs/getting-started/index.md +1 -1
  41. data/docs/getting-started/installation.md +22 -13
  42. data/docs/getting-started/quick-start.md +166 -121
  43. data/docs/guides/building-robots.md +418 -212
  44. data/docs/guides/creating-networks.md +143 -24
  45. data/docs/guides/index.md +0 -5
  46. data/docs/guides/mcp-integration.md +152 -113
  47. data/docs/guides/memory.md +220 -164
  48. data/docs/guides/rails-integration.md +244 -162
  49. data/docs/guides/streaming.md +137 -187
  50. data/docs/guides/using-tools.md +259 -212
  51. data/docs/index.md +46 -41
  52. data/examples/01_simple_robot.rb +6 -9
  53. data/examples/02_tools.rb +6 -9
  54. data/examples/03_network.rb +19 -17
  55. data/examples/04_mcp.rb +5 -8
  56. data/examples/05_streaming.rb +5 -8
  57. data/examples/06_prompt_templates.rb +42 -37
  58. data/examples/07_network_memory.rb +13 -14
  59. data/examples/08_llm_config.rb +169 -0
  60. data/examples/09_chaining.rb +262 -0
  61. data/examples/10_memory.rb +331 -0
  62. data/examples/11_network_introspection.rb +253 -0
  63. data/examples/12_message_bus.rb +74 -0
  64. data/examples/13_spawn.rb +90 -0
  65. data/examples/14_rusty_circuit/comic.rb +143 -0
  66. data/examples/14_rusty_circuit/display.rb +203 -0
  67. data/examples/14_rusty_circuit/heckler.rb +63 -0
  68. data/examples/14_rusty_circuit/open_mic.rb +123 -0
  69. data/examples/14_rusty_circuit/prompts/open_mic_comic.md +20 -0
  70. data/examples/14_rusty_circuit/prompts/open_mic_heckler.md +23 -0
  71. data/examples/14_rusty_circuit/prompts/open_mic_scout.md +20 -0
  72. data/examples/14_rusty_circuit/scout.rb +156 -0
  73. data/examples/14_rusty_circuit/scout_notes.md +89 -0
  74. data/examples/14_rusty_circuit/show.log +234 -0
  75. data/examples/15_memory_network_and_bus/editor_in_chief.rb +24 -0
  76. data/examples/15_memory_network_and_bus/editorial_pipeline.rb +206 -0
  77. data/examples/15_memory_network_and_bus/linux_writer.rb +80 -0
  78. data/examples/15_memory_network_and_bus/os_editor.rb +46 -0
  79. data/examples/15_memory_network_and_bus/os_writer.rb +46 -0
  80. data/examples/15_memory_network_and_bus/output/combined_article.md +13 -0
  81. data/examples/15_memory_network_and_bus/output/final_article.md +15 -0
  82. data/examples/15_memory_network_and_bus/output/linux_draft.md +5 -0
  83. data/examples/15_memory_network_and_bus/output/mac_draft.md +7 -0
  84. data/examples/15_memory_network_and_bus/output/memory.json +13 -0
  85. data/examples/15_memory_network_and_bus/output/revision_1.md +19 -0
  86. data/examples/15_memory_network_and_bus/output/revision_2.md +15 -0
  87. data/examples/15_memory_network_and_bus/output/windows_draft.md +7 -0
  88. data/examples/15_memory_network_and_bus/prompts/os_advocate.md +13 -0
  89. data/examples/15_memory_network_and_bus/prompts/os_chief.md +13 -0
  90. data/examples/15_memory_network_and_bus/prompts/os_editor.md +13 -0
  91. data/examples/16_writers_room/display.rb +158 -0
  92. data/examples/16_writers_room/output/.gitignore +2 -0
  93. data/examples/16_writers_room/output/opus_001.md +263 -0
  94. data/examples/16_writers_room/output/opus_001_notes.log +470 -0
  95. data/examples/16_writers_room/prompts/writer.md +37 -0
  96. data/examples/16_writers_room/room.rb +150 -0
  97. data/examples/16_writers_room/tools.rb +162 -0
  98. data/examples/16_writers_room/writer.rb +121 -0
  99. data/examples/16_writers_room/writers_room.rb +162 -0
  100. data/examples/README.md +197 -0
  101. data/examples/prompts/{assistant/system.txt.erb → assistant.md} +3 -0
  102. data/examples/prompts/{billing/system.txt.erb → billing.md} +3 -0
  103. data/examples/prompts/{classifier/system.txt.erb → classifier.md} +3 -0
  104. data/examples/prompts/comedian.md +6 -0
  105. data/examples/prompts/comedy_critic.md +10 -0
  106. data/examples/prompts/configurable.md +9 -0
  107. data/examples/prompts/dispatcher.md +12 -0
  108. data/examples/prompts/{entity_extractor/system.txt.erb → entity_extractor.md} +3 -0
  109. data/examples/prompts/{escalation/system.txt.erb → escalation.md} +7 -0
  110. data/examples/prompts/frontmatter_mcp_test.md +9 -0
  111. data/examples/prompts/frontmatter_named_test.md +5 -0
  112. data/examples/prompts/frontmatter_tools_test.md +6 -0
  113. data/examples/prompts/{general/system.txt.erb → general.md} +3 -0
  114. data/examples/prompts/{github_assistant/system.txt.erb → github_assistant.md} +8 -0
  115. data/examples/prompts/{helper/system.txt.erb → helper.md} +3 -0
  116. data/examples/prompts/{keyword_extractor/system.txt.erb → keyword_extractor.md} +3 -0
  117. data/examples/prompts/llm_config_demo.md +20 -0
  118. data/examples/prompts/{order_support/system.txt.erb → order_support.md} +8 -0
  119. data/examples/prompts/os_advocate.md +13 -0
  120. data/examples/prompts/os_chief.md +13 -0
  121. data/examples/prompts/os_editor.md +13 -0
  122. data/examples/prompts/{product_support/system.txt.erb → product_support.md} +7 -0
  123. data/examples/prompts/{sentiment_analyzer/system.txt.erb → sentiment_analyzer.md} +3 -0
  124. data/examples/prompts/{synthesizer/system.txt.erb → synthesizer.md} +3 -0
  125. data/examples/prompts/{technical/system.txt.erb → technical.md} +3 -0
  126. data/examples/prompts/{triage/system.txt.erb → triage.md} +6 -0
  127. data/lib/generators/robot_lab/templates/initializer.rb.tt +0 -13
  128. data/lib/robot_lab/ask_user.rb +75 -0
  129. data/lib/robot_lab/config/defaults.yml +121 -0
  130. data/lib/robot_lab/config.rb +183 -0
  131. data/lib/robot_lab/error.rb +6 -0
  132. data/lib/robot_lab/mcp/client.rb +1 -1
  133. data/lib/robot_lab/memory.rb +10 -34
  134. data/lib/robot_lab/network.rb +13 -20
  135. data/lib/robot_lab/robot/bus_messaging.rb +239 -0
  136. data/lib/robot_lab/robot/mcp_management.rb +88 -0
  137. data/lib/robot_lab/robot/template_rendering.rb +130 -0
  138. data/lib/robot_lab/robot.rb +240 -330
  139. data/lib/robot_lab/robot_message.rb +44 -0
  140. data/lib/robot_lab/robot_result.rb +1 -0
  141. data/lib/robot_lab/run_config.rb +184 -0
  142. data/lib/robot_lab/state_proxy.rb +2 -12
  143. data/lib/robot_lab/streaming/context.rb +1 -1
  144. data/lib/robot_lab/task.rb +8 -1
  145. data/lib/robot_lab/tool.rb +108 -172
  146. data/lib/robot_lab/tool_config.rb +1 -1
  147. data/lib/robot_lab/tool_manifest.rb +2 -18
  148. data/lib/robot_lab/utils.rb +39 -0
  149. data/lib/robot_lab/version.rb +1 -1
  150. data/lib/robot_lab.rb +89 -57
  151. data/mkdocs.yml +0 -11
  152. metadata +121 -135
  153. data/docs/api/adapters/anthropic.md +0 -121
  154. data/docs/api/adapters/gemini.md +0 -133
  155. data/docs/api/adapters/index.md +0 -104
  156. data/docs/api/adapters/openai.md +0 -134
  157. data/docs/api/history/active-record-adapter.md +0 -195
  158. data/docs/api/history/config.md +0 -191
  159. data/docs/api/history/index.md +0 -132
  160. data/docs/api/history/thread-manager.md +0 -144
  161. data/docs/guides/history.md +0 -359
  162. data/examples/prompts/assistant/user.txt.erb +0 -1
  163. data/examples/prompts/billing/user.txt.erb +0 -1
  164. data/examples/prompts/classifier/user.txt.erb +0 -1
  165. data/examples/prompts/entity_extractor/user.txt.erb +0 -3
  166. data/examples/prompts/escalation/user.txt.erb +0 -34
  167. data/examples/prompts/general/user.txt.erb +0 -1
  168. data/examples/prompts/github_assistant/user.txt.erb +0 -1
  169. data/examples/prompts/helper/user.txt.erb +0 -1
  170. data/examples/prompts/keyword_extractor/user.txt.erb +0 -3
  171. data/examples/prompts/order_support/user.txt.erb +0 -22
  172. data/examples/prompts/product_support/user.txt.erb +0 -32
  173. data/examples/prompts/sentiment_analyzer/user.txt.erb +0 -3
  174. data/examples/prompts/synthesizer/user.txt.erb +0 -15
  175. data/examples/prompts/technical/user.txt.erb +0 -1
  176. data/examples/prompts/triage/user.txt.erb +0 -17
  177. data/lib/robot_lab/adapters/anthropic.rb +0 -163
  178. data/lib/robot_lab/adapters/base.rb +0 -85
  179. data/lib/robot_lab/adapters/gemini.rb +0 -193
  180. data/lib/robot_lab/adapters/openai.rb +0 -159
  181. data/lib/robot_lab/adapters/registry.rb +0 -81
  182. data/lib/robot_lab/configuration.rb +0 -143
  183. data/lib/robot_lab/errors.rb +0 -70
  184. data/lib/robot_lab/history/active_record_adapter.rb +0 -146
  185. data/lib/robot_lab/history/config.rb +0 -115
  186. data/lib/robot_lab/history/thread_manager.rb +0 -93
  187. data/lib/robot_lab/robotic_model.rb +0 -324
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ── Scout Tools ────────────────────────────────────────────
4
+ #
5
+ # Each tool accesses the owning robot via the `robot` accessor
6
+ # inherited from RobotLab::Tool.
7
+
8
+ class RecruitAnalyst < RobotLab::Tool
9
+ description "Bring in a specialist to analyze a specific aspect " \
10
+ "of the comedian's performance. The analyst will " \
11
+ "review your accumulated notes and provide insight."
12
+
13
+ param :specialty, type: "string",
14
+ desc: "What to analyze: timing, crowd_work, " \
15
+ "originality, adaptability, stage_presence, " \
16
+ "material_evolution"
17
+
18
+ def execute(specialty:)
19
+ @analysts ||= {}
20
+ specialty = specialty.to_s.downcase.gsub(/\s+/, "_")
21
+ analyst = @analysts[specialty] ||= begin
22
+ robot.analysts_spawned += 1
23
+ robot.spawn(
24
+ name: "#{specialty}_analyst",
25
+ system_prompt:
26
+ "You are an expert #{specialty.tr('_', ' ')} analyst " \
27
+ "for stand-up comedy. You've studied the craft for decades. " \
28
+ "Analyze the performance notes you're given. Be concise " \
29
+ "and insightful. 2-3 sentences max."
30
+ )
31
+ end
32
+ analysis = analyst.run(robot.log.join("\n")).reply.strip
33
+ robot.display&.scout_analyst(specialty, analysis)
34
+ analysis
35
+ rescue => e
36
+ robot.display&.scout_analyst(specialty, "ERROR: #{e.message}")
37
+ "Analysis unavailable for #{specialty}. Rely on your own observations."
38
+ end
39
+ end
40
+
41
+ class RefineCriteria < RobotLab::Tool
42
+ description "Update your own evaluation criteria based on what " \
43
+ "you're observing. Use when you realize the most " \
44
+ "important qualities aren't what you initially expected. " \
45
+ "The update takes effect on your next evaluation."
46
+
47
+ param :updated_criteria, type: "string",
48
+ desc: "Your refined evaluation criteria and focus areas"
49
+
50
+ def execute(updated_criteria:)
51
+ robot.pending_criteria = updated_criteria
52
+ robot.display&.scout_criteria(updated_criteria)
53
+ "Criteria refinement accepted: #{updated_criteria}. " \
54
+ "Apply these updated criteria to all future evaluations."
55
+ end
56
+ end
57
+
58
+
59
+ # ── The Talent Scout ─────────────────────────────────────────
60
+ #
61
+ # Has two tools with side effects:
62
+ #
63
+ # recruit_analyst — spawns a specialist to analyze an aspect
64
+ # of the performance (dynamic creation)
65
+ # refine_criteria — queues a rewrite of the scout's own
66
+ # evaluation criteria (self-modification)
67
+ #
68
+ # The scout observes each round, accumulates notes, and spawns
69
+ # analysts when they see something worth examining closely.
70
+ #
71
+ # Subscribes to the :room channel to observe performances.
72
+ # Room deliveries are routed through the core processing guard
73
+ # (BusMessaging#handle_incoming_delivery), which serializes all
74
+ # run() calls to prevent Async fiber interleaving from corrupting
75
+ # chat history.
76
+ #
77
+ class Scout < RobotLab::Robot
78
+ attr_accessor :log, :analysts_spawned, :pending_criteria, :display
79
+
80
+ def initialize(bus:, display:)
81
+ @log = []
82
+ @analysts_spawned = 0
83
+ @pending_criteria = nil
84
+ @display = display
85
+
86
+ super(
87
+ name: "scout",
88
+ template: :open_mic_scout,
89
+ bus: bus,
90
+ local_tools: [
91
+ RecruitAnalyst.new(robot: self),
92
+ RefineCriteria.new(robot: self)
93
+ ]
94
+ )
95
+
96
+ # Handle incoming messages — the core processing guard
97
+ # serializes all deliveries, preventing concurrent run()
98
+ # calls from corrupting chat history.
99
+ on_message do |message|
100
+ next unless message.from == "comic"
101
+ observe_and_note(message.content.to_s)
102
+ end
103
+
104
+ # Listen to the room for the comic's performances.
105
+ # Route through the core processing guard.
106
+ @bus.subscribe(:room) do |delivery|
107
+ handle_incoming_delivery(delivery)
108
+ end
109
+ end
110
+
111
+ # Build the final verdict prompt with any pending criteria applied
112
+ def verdict_prompt
113
+ prompt = ""
114
+
115
+ if @pending_criteria
116
+ prompt += "CRITERIA UPDATE: #{@pending_criteria}. " \
117
+ "Apply these updated criteria to your final assessment.\n\n"
118
+ @pending_criteria = nil
119
+ end
120
+
121
+ prompt += "The show is over. Based on everything you've observed " \
122
+ "(#{@log.size} rounds), all your notes, and any analyst " \
123
+ "reports, write your final talent assessment. Should this " \
124
+ "comedian get a callback? Be specific about what worked, " \
125
+ "what didn't, and what potential you see."
126
+
127
+ prompt
128
+ end
129
+
130
+ private
131
+
132
+ def observe_and_note(content)
133
+ @log << content
134
+
135
+ # Build the prompt, injecting any queued criteria refinement.
136
+ # This embeds self-modification in the user prompt rather than
137
+ # rewriting system messages, avoiding chat message ordering issues.
138
+ prompt = ""
139
+
140
+ if @pending_criteria
141
+ prompt += "CRITERIA UPDATE: #{@pending_criteria}. " \
142
+ "Apply these updated criteria to this and all future evaluations.\n\n"
143
+ @pending_criteria = nil
144
+ end
145
+
146
+ prompt += "You just observed: \"#{content}\"\n\n" \
147
+ "This is round #{@log.size} of the performance. " \
148
+ "Write your notes. If you've seen enough to identify " \
149
+ "patterns, consider recruiting an analyst or refining " \
150
+ "your evaluation criteria."
151
+
152
+ notes = run(prompt).reply.strip
153
+
154
+ @display.scout(@log.size, notes)
155
+ end
156
+ end
@@ -0,0 +1,89 @@
1
+ # Scout Notes — The Rusty Circuit
2
+
3
+ ## Round 1
4
+
5
+ NOTES: Standard opener - relatable premise (self-checkout frustration) but execution feels safe and predictable. The "incompetence" callback shows some self-awareness, and the credit score punchline lands adequately. However, the material feels very "first draft" - like observations everyone has but hasn't been elevated beyond the obvious.
6
+
7
+ Delivery seems tentative - that expectant look at the crowd suggests they're fishing for validation rather than confidently driving the room. The mic adjustment and setup felt a bit nervous. Too early to judge adaptability or crowd-handling since this is scripted opener material.
8
+
9
+ Withholding judgment on star potential - need to see how they handle the next few minutes when they move beyond their safest material. Looking for signs of unique voice, risk-taking, and whether they can build momentum from this foundation.
10
+
11
+ The premise has potential but needs sharper writing and more confident delivery. Watching for evolution as the set progresses.
12
+
13
+ ### Analyst: crowd_work
14
+
15
+ **Opening Analysis:** Solid relatable premise with good escalation from simple frustration to self-deprecating punchline about credit scores. The personification of the machine as "lady" adds character, but the expectant pause suggests uncertainty about audience reception.
16
+
17
+ **Crowd Work Analysis:** Excellent recovery that flips the heckle into material while maintaining control. The callback to "unexpected item" creates a cohesive thread and the broader life metaphor lands with philosophical weight that elevates the bit beyond just grocery store humor.
18
+
19
+ ## Round 2
20
+
21
+ The analyst confirms what I'm seeing - this comedian has the instinct to turn disruption into opportunity. That crowd work wasn't just damage control, it was material creation in real time. Watching closely for how they build from here.
22
+
23
+ ### Analyst: adaptability
24
+
25
+ Strong adaptive instincts on display here. The comedian skillfully transforms heckling into collaborative energy, using the "unexpected item" callback to create a unifying metaphor that includes the entire audience in the struggle. The venue-specific self-deprecation in Round 2 shows excellent room-reading skills, turning potential weakness into relatable strength while maintaining momentum through the disruption.
26
+
27
+ ## Round 3
28
+
29
+ The analyst confirms my assessment - this is someone who thrives on chaos. Three rounds in and they're not just surviving interruptions, they're using them as fuel. This adaptability under fire is exactly what network executives look for in potential stars.
30
+
31
+ ## Round 4
32
+
33
+ NOTES: This comedian just demonstrated something crucial - they know when to pivot. After three rounds of crowd/venue work, they smoothly transitioned back to prepared material without losing momentum. That's professional-level set management.
34
+
35
+ The "Michelin star for a gas station hot dog" line is genuinely clever writing - unexpected comparison that works on multiple levels. Shows they can craft material, not just react to situations. The credit score callback maintains continuity while moving the set forward.
36
+
37
+ But here's what's really impressive: that pause before the parking spot bit. They're reading the room's energy, letting the moment breathe, then shifting gears entirely. The mom hanging up punchline is relatable without being hacky - everyone knows that feeling of getting excited about mundane adult things.
38
+
39
+ Pattern solidified: This comedian has both reactive instincts AND structured material. They can work a crowd, handle disruption, acknowledge the venue's vibe, then seamlessly return to their prepared set. That's the mark of someone who understands comedy as both art and craft.
40
+
41
+ The genuine smile suggests they're actually enjoying this chaos rather than just surviving it. That joy is infectious - the room energy has completely shifted from skeptical to engaged.
42
+
43
+ Star potential is becoming clear. This is someone who could handle late-night TV, corporate gigs, or hostile crowds with equal skill.
44
+
45
+ ### Analyst: stage_presence
46
+
47
+ **Opening:** Solid relatable premise with good energy, but the delivery feels a bit rehearsed and the expectant pause telegraphs insecurity. The crowd interaction attempt comes off as needy rather than confident.
48
+
49
+ **Round 1:** Excellent heckler handling - you flipped the dynamic by making them part of the bit rather than fighting them. The "unexpected item in the bagging area of life" callback is clever and shows real comedic instincts.
50
+
51
+ **Rounds 2-4:** You found your rhythm by embracing the room's energy and building genuine rapport with both heckler and audience. The self-deprecating humor feels authentic now, and you're working WITH the room instead of AT it - that's when comedy magic happens.
52
+
53
+ ## Round 5
54
+
55
+ The analyst nails it - this comedian's stage presence evolved dramatically over the set. Started nervous, ended commanding. That transformation under fire is exactly what separates working comics from stars. This is someone I'd book tomorrow.
56
+
57
+ ---
58
+
59
+ ## Final Verdict
60
+
61
+ **FINAL TALENT ASSESSMENT - THE RUSTY CIRCUIT**
62
+
63
+ **RECOMMENDATION: IMMEDIATE CALLBACK - HIGH PRIORITY**
64
+
65
+ **What Worked:**
66
+ This comedian demonstrated the rarest quality in stand-up: they get BETTER under pressure. What started as a tentative, safe opener transformed into a masterclass in crowd control and comedic instincts. Key strengths:
67
+
68
+ - **Exceptional Adaptability**: Turned multiple heckles into material gold, showing they can handle any room
69
+ - **Crowd Work Mastery**: The "Stockholm syndrome with punchlines" callback was sophisticated writing in real-time
70
+ - **Venue Intelligence**: Used The Rusty Circuit's gritty reputation as material rather than apologizing for it
71
+ - **Quotable Writing**: "Navy SEALs of entertainment" and "unexpected item in the bagging area of life" are lines that stick
72
+ - **Authentic Voice**: Found the sweet spot between vulnerability and confidence
73
+
74
+ **What Didn't Work:**
75
+ - Opening material felt generic and over-rehearsed
76
+ - Initial delivery showed nerves and validation-seeking
77
+ - Took 2-3 minutes to find their authentic voice
78
+
79
+ **Star Potential:**
80
+ This comedian has the complete package for network success:
81
+ 1. **Resilience**: Thrives on chaos rather than crumbling
82
+ 2. **Versatility**: Can handle prepared material, crowd work, and venue-specific content seamlessly
83
+ 3. **Growth Mindset**: Visibly improved throughout the 5-round set
84
+ 4. **Professional Instincts**: Knows when to engage hecklers vs. when to pivot back to material
85
+
86
+ **Bottom Line:**
87
+ I've seen three headliners come from this room. This comedian has that same "it" factor - the ability to turn any situation into comedy gold. They're not just surviving difficult rooms, they're conquering them. That's exactly what we need for late-night spots, corporate gigs, and hostile festival crowds.
88
+
89
+ **Next Steps:** Book them for a showcase set immediately. This is someone who could be headlining within 18 months with proper development.
@@ -0,0 +1,234 @@
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
+
@@ -0,0 +1,24 @@
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