SolidAgents
Event-driven error fixing workflow for Rails apps, powered by RubyLLM agents.
Warning
solid_agents is an early release and still a work in progress.
APIs, schema, runtime behavior, and configuration may change between minor releases.
Expect breaking changes before 1.0.
Not production-ready yet.
solid_agents is a Rails engine focused on a single pipeline:
error received -> staged agent workflow -> code fix attempt -> PR/CI stage tracking
Scope
solid_agents is for automation orchestration and execution only:
- Consume error-like events from source adapters (starting with
solid_errorsstyle payloads) - Track runs in an event-driven stage machine
- Enforce non-overlapping stage ownership (
alex,betty,chad,david,eddy) - Persist handoffs, notes, and artifacts for each stage
- Execute stage tasks through the RubyLLM runtime adapter
It does not own observability storage or incident detection as a source of truth.
Features
- DB-backed run lifecycle and stage workflow
- Append-only run events with actor attribution
- Work-item board columns driven by stage transitions
- Handoff records between stage owners
- Built-in UI for runs, events, and artifacts
- Installer generator and schema template
Installation
Add this to your Gemfile:
gem "solid_agents"Run installer:
rails generate solid_agents:installConfigure engine DB connection if desired:
# config/environments/production.rb
config.solid_agents.connects_to = { database: { writing: :solid_agents } }
config.solid_agents.default_runtime = :ruby_llmMount the UI:
# config/routes.rb
authenticate :user, ->(u) { u.admin? } do
mount SolidAgents::Engine, at: "/solid_agents"
endUsage
Create pipeline agents:
%w[alex betty chad david eddy].each do |key|
SolidAgents::Agent.find_or_create_by!(key: key, environment: Rails.env) do |agent|
agent.name = key.capitalize
agent.role = key
agent.runtime = "ruby_llm"
agent.working_directory = Rails.root.to_s
agent.enabled = true
end
endDispatch from a job:
SolidAgents.dispatch_error(source: solid_error_record, agent_key: "alex")RubyLLM Conventions
- Agent classes live in
app/solid_agents/agents. - Prompt instructions live in
app/solid_agents/prompts/.../instructions.txt.erb. - Stage owners map directly to RubyLLM agent classes.
Configuration
config.solid_agents.default_model = "minimax/minimax-m2.7"
config.solid_agents.default_test_command = "bin/rails test"
config.solid_agents.max_iterations = 8Development
bundle install
bundle exec rake test
gem build solid_agents.gemspecSecrets And Testing
- Runtime credentials are loaded from environment variables only:
OPENROUTER_API_KEYand optionalOPENROUTER_API_BASE. - Keep real keys out of committed files and never commit
.env. - Live LLM tests use VCR with
record: :onceand secret filtering. - Record cassettes intentionally with:
LIVE_LLM=1 OPENROUTER_API_KEY=... bundle exec rake test TEST=test/integration/solid_agents/ruby_llm_live_flow_test.rb- To re-record a live interaction, delete the cassette file first and run the command again.
- You can create a local
.envfrom.env.sampleand load it withset -a; source .env; set +a.