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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/lib/robot_lab/mcp/transports/streamable_http.rb +1 -1
- data/lib/robot_lab/version.rb +1 -1
- metadata +3 -253
- data/.architecture/AGENTS.md +0 -32
- data/.architecture/config.yml +0 -8
- data/.architecture/members.yml +0 -60
- data/.architecture/reviews/feature-free-will.md +0 -490
- data/.architecture/reviews/overall-codebase.md +0 -427
- data/.claude/settings.local.json +0 -57
- data/.codex/config.toml +0 -2
- data/.envrc +0 -6
- data/.github/workflows/deploy-github-pages.yml +0 -52
- data/.irbrc +0 -6
- data/.loki +0 -65
- data/.quality/reek_baseline.txt +0 -43
- data/.rubocop.yml +0 -10
- data/Archspec.rb +0 -44
- data/CLAUDE.md +0 -141
- data/COMMITS.md +0 -196
- data/Rakefile +0 -193
- data/_typos.toml +0 -21
- data/agent2agent_review.md +0 -192
- data/agentf_improvements.md +0 -253
- data/agents.md +0 -14
- data/docs/api/core/index.md +0 -147
- data/docs/api/core/memory.md +0 -578
- data/docs/api/core/network.md +0 -553
- data/docs/api/core/result.md +0 -211
- data/docs/api/core/robot.md +0 -1667
- data/docs/api/core/state.md +0 -145
- data/docs/api/core/tool.md +0 -520
- data/docs/api/errors.md +0 -323
- data/docs/api/hooks.md +0 -469
- data/docs/api/index.md +0 -137
- data/docs/api/mcp/client.md +0 -387
- data/docs/api/mcp/index.md +0 -267
- data/docs/api/mcp/server.md +0 -252
- data/docs/api/mcp/transports.md +0 -339
- data/docs/api/messages/index.md +0 -126
- data/docs/api/messages/text-message.md +0 -170
- data/docs/api/messages/tool-call-message.md +0 -206
- data/docs/api/messages/tool-result-message.md +0 -242
- data/docs/api/messages/user-message.md +0 -232
- data/docs/api/skills.md +0 -423
- data/docs/api/streaming/context.md +0 -280
- data/docs/api/streaming/events.md +0 -185
- data/docs/api/streaming/index.md +0 -156
- data/docs/api/support.md +0 -846
- data/docs/architecture/core-concepts.md +0 -575
- data/docs/architecture/index.md +0 -252
- data/docs/architecture/message-flow.md +0 -366
- data/docs/architecture/network-orchestration.md +0 -478
- data/docs/architecture/robot-execution.md +0 -396
- data/docs/architecture/state-management.md +0 -410
- data/docs/assets/css/custom.css +0 -56
- data/docs/assets/images/robot_lab.jpg +0 -0
- data/docs/concepts.md +0 -641
- data/docs/examples/basic-chat.md +0 -258
- data/docs/examples/index.md +0 -425
- data/docs/examples/mcp-server.md +0 -403
- data/docs/examples/multi-robot-network.md +0 -476
- data/docs/examples/tool-usage.md +0 -468
- data/docs/getting-started/configuration.md +0 -645
- data/docs/getting-started/index.md +0 -56
- data/docs/getting-started/installation.md +0 -197
- data/docs/getting-started/quick-start.md +0 -293
- data/docs/guides/building-robots.md +0 -1187
- data/docs/guides/creating-networks.md +0 -736
- data/docs/guides/hooks.md +0 -1206
- data/docs/guides/index.md +0 -78
- data/docs/guides/knowledge.md +0 -219
- data/docs/guides/mcp-integration.md +0 -740
- data/docs/guides/memory.md +0 -458
- data/docs/guides/observability.md +0 -733
- data/docs/guides/streaming.md +0 -323
- data/docs/guides/using-tools.md +0 -780
- data/docs/index.md +0 -280
- data/docs/superpowers/plans/2026-05-06-agentskills.md +0 -1303
- data/docs/superpowers/specs/2026-05-06-agentskills-design.md +0 -247
- data/examples/.envrc +0 -3
- data/examples/01_simple_robot.rb +0 -31
- data/examples/02_tools.rb +0 -109
- data/examples/03_network.rb +0 -118
- data/examples/04_mcp.rb +0 -217
- data/examples/05_streaming.rb +0 -137
- data/examples/06_prompt_templates.rb +0 -325
- data/examples/07_network_memory.rb +0 -313
- data/examples/08_llm_config.rb +0 -162
- data/examples/09_chaining.rb +0 -251
- data/examples/10_memory.rb +0 -315
- data/examples/11_network_introspection.rb +0 -239
- data/examples/12_message_bus.rb +0 -67
- data/examples/13_spawn.rb +0 -85
- data/examples/14_rusty_circuit/.envrc +0 -1
- data/examples/14_rusty_circuit/.gitignore +0 -1
- data/examples/14_rusty_circuit/README.md +0 -1
- data/examples/14_rusty_circuit/comic.rb +0 -149
- data/examples/14_rusty_circuit/display.rb +0 -217
- data/examples/14_rusty_circuit/heckler.rb +0 -65
- data/examples/14_rusty_circuit/open_mic.rb +0 -132
- data/examples/14_rusty_circuit/prompts/open_mic_comic.md +0 -20
- data/examples/14_rusty_circuit/prompts/open_mic_heckler.md +0 -23
- data/examples/14_rusty_circuit/prompts/open_mic_scout.md +0 -20
- data/examples/14_rusty_circuit/scout.rb +0 -165
- data/examples/14_rusty_circuit/show.log +0 -234
- data/examples/15_memory_network_and_bus/.envrc +0 -1
- data/examples/15_memory_network_and_bus/README.md +0 -66
- data/examples/15_memory_network_and_bus/editor_in_chief.rb +0 -24
- data/examples/15_memory_network_and_bus/editorial_pipeline.rb +0 -213
- data/examples/15_memory_network_and_bus/linux_writer.rb +0 -80
- data/examples/15_memory_network_and_bus/os_editor.rb +0 -48
- data/examples/15_memory_network_and_bus/os_writer.rb +0 -49
- data/examples/15_memory_network_and_bus/output/combined_article.md +0 -11
- data/examples/15_memory_network_and_bus/output/final_article.md +0 -8
- data/examples/15_memory_network_and_bus/output/linux_draft.md +0 -7
- data/examples/15_memory_network_and_bus/output/mac_draft.md +0 -7
- data/examples/15_memory_network_and_bus/output/memory.json +0 -13
- data/examples/15_memory_network_and_bus/output/revision_1.md +0 -29
- data/examples/15_memory_network_and_bus/output/revision_2.md +0 -50
- data/examples/15_memory_network_and_bus/output/revision_3.md +0 -8
- data/examples/15_memory_network_and_bus/output/windows_draft.md +0 -7
- data/examples/15_memory_network_and_bus/prompts/os_advocate.md +0 -13
- data/examples/15_memory_network_and_bus/prompts/os_chief.md +0 -13
- data/examples/15_memory_network_and_bus/prompts/os_editor.md +0 -13
- data/examples/16_writers_room/.envrc +0 -1
- data/examples/16_writers_room/display.rb +0 -158
- data/examples/16_writers_room/output/.gitignore +0 -4
- data/examples/16_writers_room/output/README.md +0 -69
- data/examples/16_writers_room/output/opus_001.md +0 -263
- data/examples/16_writers_room/output/opus_001_notes.log +0 -470
- data/examples/16_writers_room/output/opus_002.md +0 -245
- data/examples/16_writers_room/output/opus_002_notes.log +0 -546
- data/examples/16_writers_room/output/opus_002_screenplay.md +0 -7989
- data/examples/16_writers_room/output/opus_002_screenplay_notes.md +0 -993
- data/examples/16_writers_room/prompts/screenplay_writer.md +0 -66
- data/examples/16_writers_room/prompts/writer.md +0 -37
- data/examples/16_writers_room/room.rb +0 -186
- data/examples/16_writers_room/tools.rb +0 -173
- data/examples/16_writers_room/writer.rb +0 -121
- data/examples/16_writers_room/writers_room.rb +0 -256
- data/examples/17_skills.rb +0 -234
- data/examples/18_rails/.envrc +0 -3
- data/examples/18_rails/.gitignore +0 -5
- data/examples/18_rails/Gemfile +0 -11
- data/examples/18_rails/README.md +0 -67
- data/examples/18_rails/Rakefile +0 -4
- data/examples/18_rails/app/controllers/application_controller.rb +0 -4
- data/examples/18_rails/app/controllers/chat_controller.rb +0 -50
- data/examples/18_rails/app/jobs/application_job.rb +0 -4
- data/examples/18_rails/app/jobs/robot_run_job.rb +0 -25
- data/examples/18_rails/app/models/application_record.rb +0 -5
- data/examples/18_rails/app/models/robot_lab_result.rb +0 -36
- data/examples/18_rails/app/models/robot_lab_thread.rb +0 -23
- data/examples/18_rails/app/robots/chat_robot.rb +0 -25
- data/examples/18_rails/app/tools/time_tool.rb +0 -9
- data/examples/18_rails/app/views/chat/_user_message.html.erb +0 -1
- data/examples/18_rails/app/views/chat/index.html.erb +0 -67
- data/examples/18_rails/app/views/layouts/application.html.erb +0 -49
- data/examples/18_rails/bin/dev +0 -7
- data/examples/18_rails/bin/rails +0 -6
- data/examples/18_rails/bin/setup +0 -15
- data/examples/18_rails/config/application.rb +0 -33
- data/examples/18_rails/config/cable.yml +0 -2
- data/examples/18_rails/config/database.yml +0 -5
- data/examples/18_rails/config/environment.rb +0 -4
- data/examples/18_rails/config/initializers/robot_lab.rb +0 -11
- data/examples/18_rails/config/routes.rb +0 -6
- data/examples/18_rails/config.ru +0 -4
- data/examples/18_rails/db/migrate/001_create_robot_lab_tables.rb +0 -32
- data/examples/19_token_tracking.rb +0 -138
- data/examples/20_circuit_breaker.rb +0 -147
- data/examples/21_learning_loop.rb +0 -181
- data/examples/22_context_compression.rb +0 -172
- data/examples/23_convergence.rb +0 -133
- data/examples/24_structured_delegation.rb +0 -151
- data/examples/25_history_search/conversation.jsonl +0 -30
- data/examples/25_history_search.rb +0 -133
- data/examples/26_document_store/api_versioning_adr.md +0 -52
- data/examples/26_document_store/incident_postmortem.md +0 -46
- data/examples/26_document_store/postgres_runbook.md +0 -49
- data/examples/26_document_store/redis_caching_guide.md +0 -48
- data/examples/26_document_store/sidekiq_guide.md +0 -51
- data/examples/26_document_store.rb +0 -140
- data/examples/27_incident_response/README.md +0 -65
- data/examples/27_incident_response/incident_response.rb +0 -261
- data/examples/28_mcp_discovery.rb +0 -113
- data/examples/29_ractor_tools.rb +0 -240
- data/examples/30_ractor_network.rb +0 -252
- data/examples/31_launch_assessment.rb +0 -246
- data/examples/32_newsletter_reader.rb +0 -193
- data/examples/33_stock_generator.rb +0 -80
- data/examples/33_stock_predictor.rb +0 -327
- data/examples/34_agentskills.rb +0 -76
- data/examples/35_hooks.rb +0 -266
- data/examples/README.md +0 -550
- data/examples/common.rb +0 -180
- data/examples/prompts/assistant.md +0 -5
- data/examples/prompts/audit_trail.md +0 -8
- data/examples/prompts/billing.md +0 -10
- data/examples/prompts/classifier.md +0 -7
- data/examples/prompts/comedian.md +0 -6
- data/examples/prompts/comedy_critic.md +0 -10
- data/examples/prompts/configurable.md +0 -9
- data/examples/prompts/dispatcher.md +0 -12
- data/examples/prompts/entity_extractor.md +0 -14
- data/examples/prompts/escalation.md +0 -42
- data/examples/prompts/frontmatter_mcp_test.md +0 -9
- data/examples/prompts/frontmatter_named_test.md +0 -5
- data/examples/prompts/frontmatter_tools_test.md +0 -6
- data/examples/prompts/general.md +0 -7
- data/examples/prompts/github_assistant.md +0 -14
- data/examples/prompts/helper.md +0 -4
- data/examples/prompts/incident_responder.md +0 -18
- data/examples/prompts/keyword_extractor.md +0 -11
- data/examples/prompts/llm_config_demo.md +0 -20
- data/examples/prompts/order_support.md +0 -35
- data/examples/prompts/os_advocate.md +0 -13
- data/examples/prompts/os_chief.md +0 -13
- data/examples/prompts/os_editor.md +0 -13
- data/examples/prompts/parameterized_main_test.md +0 -6
- data/examples/prompts/pii_redactor.md +0 -7
- data/examples/prompts/product_support.md +0 -37
- data/examples/prompts/runbook_protocol.md +0 -12
- data/examples/prompts/sentiment_analyzer.md +0 -12
- data/examples/prompts/skill_a_test.md +0 -4
- data/examples/prompts/skill_b_test.md +0 -4
- data/examples/prompts/skill_config_test.md +0 -5
- data/examples/prompts/skill_cycle_a_test.md +0 -6
- data/examples/prompts/skill_cycle_b_test.md +0 -6
- data/examples/prompts/skill_description_test.md +0 -4
- data/examples/prompts/skill_leaf_test.md +0 -4
- data/examples/prompts/skill_nested_test.md +0 -6
- data/examples/prompts/skill_refs_main_test.md +0 -6
- data/examples/prompts/skill_self_ref_test.md +0 -6
- data/examples/prompts/skill_with_mcp_test.md +0 -9
- data/examples/prompts/skill_with_params_test.md +0 -6
- data/examples/prompts/skill_with_robot_name_test.md +0 -5
- data/examples/prompts/skill_with_tools_test.md +0 -6
- data/examples/prompts/sre_compliance.md +0 -10
- data/examples/prompts/structured_output.md +0 -7
- data/examples/prompts/synthesizer.md +0 -17
- data/examples/prompts/technical.md +0 -10
- data/examples/prompts/template_with_skills_test.md +0 -6
- data/examples/prompts/triage.md +0 -22
- data/examples/ruboruby.md +0 -423
- data/examples/run_all.rb +0 -60
- data/examples/xyzzy.rb +0 -97
- data/logfile +0 -8
- data/mkdocs.yml +0 -209
- data/robot_concurrency.md +0 -38
- data/simple_acp_review.md +0 -298
- data/temp.md +0 -6
- 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
|