robot_lab-to 0.2.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.
- checksums.yaml +7 -0
- data/.envrc +1 -0
- data/.github/workflows/deploy-github-pages.yml +52 -0
- data/.loki +21 -0
- data/.quality/reek_baseline.txt +17 -0
- data/.rubocop.yml +7 -0
- data/CHANGELOG.md +67 -0
- data/CLAUDE.md +74 -0
- data/COMMITS.md +27 -0
- data/README.md +352 -0
- data/Rakefile +132 -0
- data/bin/robot-to +14 -0
- data/docs/about/changelog.md +82 -0
- data/docs/assets/architecture.svg +110 -0
- data/docs/assets/images/robot_lab-to.jpg +0 -0
- data/docs/assets/iteration-loop.svg +97 -0
- data/docs/concepts/evals.md +254 -0
- data/docs/concepts/iteration-loop.md +128 -0
- data/docs/concepts/notes.md +91 -0
- data/docs/concepts/run-state.md +93 -0
- data/docs/concepts/stop-conditions.md +111 -0
- data/docs/concepts/verification.md +75 -0
- data/docs/configuration/cli.md +111 -0
- data/docs/configuration/index.md +93 -0
- data/docs/configuration/settings.md +270 -0
- data/docs/getting-started/anatomy-of-a-run.md +111 -0
- data/docs/getting-started/installation.md +78 -0
- data/docs/getting-started/quick-start.md +105 -0
- data/docs/index.md +96 -0
- data/docs/local-models/guardrails.md +117 -0
- data/docs/local-models/index.md +88 -0
- data/docs/local-models/ollama.md +122 -0
- data/docs/local-models/tools.md +92 -0
- data/docs/reference/architecture.md +139 -0
- data/examples/01_basic_usage/.gitignore +9 -0
- data/examples/01_basic_usage/README.md +173 -0
- data/examples/01_basic_usage/basic_usage.rb +386 -0
- data/examples/02_advanced_usage/.gitignore +8 -0
- data/examples/02_advanced_usage/README.md +117 -0
- data/examples/02_advanced_usage/advanced_usage.rb +308 -0
- data/examples/02_advanced_usage/quality_gate.rb +99 -0
- data/examples/03_scored/.gitignore +2 -0
- data/examples/03_scored/README.md +117 -0
- data/examples/03_scored/scored_run.rb +325 -0
- data/examples/04_prose/.gitignore +2 -0
- data/examples/04_prose/README.md +43 -0
- data/examples/04_prose/prompts_dir/grade_message.md +14 -0
- data/examples/04_prose/prompts_dir/judge.md +11 -0
- data/examples/04_prose/prompts_dir/outline_criteria.md +9 -0
- data/examples/04_prose/prompts_dir/outline_objective.md +11 -0
- data/examples/04_prose/prompts_dir/section_criteria.md +7 -0
- data/examples/04_prose/prompts_dir/sections_objective.md +14 -0
- data/examples/04_prose/prose_run.rb +302 -0
- data/lib/robot_lab/to/atomic_file.rb +69 -0
- data/lib/robot_lab/to/backoff.rb +46 -0
- data/lib/robot_lab/to/cli.rb +176 -0
- data/lib/robot_lab/to/commit_manager.rb +135 -0
- data/lib/robot_lab/to/config/defaults.yml +27 -0
- data/lib/robot_lab/to/config.rb +86 -0
- data/lib/robot_lab/to/decision.rb +40 -0
- data/lib/robot_lab/to/decision_manager.rb +193 -0
- data/lib/robot_lab/to/errors.rb +30 -0
- data/lib/robot_lab/to/evals/base.rb +23 -0
- data/lib/robot_lab/to/evals/code.rb +77 -0
- data/lib/robot_lab/to/evals/context.rb +17 -0
- data/lib/robot_lab/to/evals/factory.rb +84 -0
- data/lib/robot_lab/to/evals/null.rb +17 -0
- data/lib/robot_lab/to/evals/prose.rb +110 -0
- data/lib/robot_lab/to/evals/score.rb +22 -0
- data/lib/robot_lab/to/exit_summary.rb +75 -0
- data/lib/robot_lab/to/guards/checkpoint.rb +84 -0
- data/lib/robot_lab/to/guards/grader_lock.rb +62 -0
- data/lib/robot_lab/to/guards/path_resolution.rb +61 -0
- data/lib/robot_lab/to/guards/quality_monitor.rb +113 -0
- data/lib/robot_lab/to/guards/read_before_edit.rb +83 -0
- data/lib/robot_lab/to/guards/run_store.rb +31 -0
- data/lib/robot_lab/to/guards/write_guard.rb +71 -0
- data/lib/robot_lab/to/guards.rb +54 -0
- data/lib/robot_lab/to/iteration_result.rb +29 -0
- data/lib/robot_lab/to/jsonl_logger.rb +59 -0
- data/lib/robot_lab/to/notes_manager.rb +121 -0
- data/lib/robot_lab/to/orchestrator.rb +642 -0
- data/lib/robot_lab/to/prompt_builder.rb +208 -0
- data/lib/robot_lab/to/run.rb +109 -0
- data/lib/robot_lab/to/stop_conditions.rb +71 -0
- data/lib/robot_lab/to/tools/bash.rb +75 -0
- data/lib/robot_lab/to/tools/edit.rb +52 -0
- data/lib/robot_lab/to/tools/file_tool.rb +32 -0
- data/lib/robot_lab/to/tools/read.rb +57 -0
- data/lib/robot_lab/to/tools/request_decision.rb +66 -0
- data/lib/robot_lab/to/tools/submit_result.rb +50 -0
- data/lib/robot_lab/to/tools/write.rb +32 -0
- data/lib/robot_lab/to/verifier.rb +63 -0
- data/lib/robot_lab/to/version.rb +7 -0
- data/lib/robot_lab/to.rb +81 -0
- data/mkdocs.yml +145 -0
- metadata +175 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RobotLab
|
|
4
|
+
module To
|
|
5
|
+
module Tools
|
|
6
|
+
# Tool the robot MUST call as its final action to declare the iteration result.
|
|
7
|
+
#
|
|
8
|
+
# Create a fresh instance per iteration. After robot.run() returns, read
|
|
9
|
+
# captured_result (nil if the robot never called the tool).
|
|
10
|
+
class SubmitResult < RobotLab::Tool
|
|
11
|
+
description <<~DESC
|
|
12
|
+
Submit the result of this iteration. You MUST call this tool as your
|
|
13
|
+
FINAL action before finishing. Do not call it until your work is complete.
|
|
14
|
+
DESC
|
|
15
|
+
|
|
16
|
+
param :success, type: "boolean",
|
|
17
|
+
desc: "true if you made meaningful progress toward the objective; " \
|
|
18
|
+
"false if you made no meaningful changes AND have no new learnings"
|
|
19
|
+
|
|
20
|
+
param :summary, type: "string",
|
|
21
|
+
desc: "Brief one-sentence description of what you accomplished or why you stopped"
|
|
22
|
+
|
|
23
|
+
param :key_changes, type: "array",
|
|
24
|
+
desc: "List of files or changes made this iteration (empty if none)",
|
|
25
|
+
required: false
|
|
26
|
+
|
|
27
|
+
param :key_learnings, type: "array",
|
|
28
|
+
desc: "Insights worth remembering for future iterations (empty if none)",
|
|
29
|
+
required: false
|
|
30
|
+
|
|
31
|
+
param :should_fully_stop, type: "boolean",
|
|
32
|
+
desc: "Set to true only when instructed by a stop condition",
|
|
33
|
+
required: false
|
|
34
|
+
|
|
35
|
+
attr_reader :captured_result
|
|
36
|
+
|
|
37
|
+
def execute(success:, summary:, key_changes: [], key_learnings: [], should_fully_stop: nil, **)
|
|
38
|
+
@captured_result = IterationResult.new(
|
|
39
|
+
success: success,
|
|
40
|
+
summary: summary,
|
|
41
|
+
key_changes: Array(key_changes),
|
|
42
|
+
key_learnings: Array(key_learnings),
|
|
43
|
+
should_fully_stop: should_fully_stop
|
|
44
|
+
)
|
|
45
|
+
"Iteration complete. Stop all work now."
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
|
|
5
|
+
module RobotLab
|
|
6
|
+
module To
|
|
7
|
+
module Tools
|
|
8
|
+
# Create a NEW file with the given contents. Parent directories are
|
|
9
|
+
# created as needed. The WriteGuard refuses this on files that already
|
|
10
|
+
# exist (use Edit instead) — small models otherwise rewrite whole files
|
|
11
|
+
# and destroy content.
|
|
12
|
+
class Write < FileTool
|
|
13
|
+
description <<~DESC
|
|
14
|
+
Create a new file with the given content. Use this only for files that
|
|
15
|
+
do not exist yet; to change an existing file, use Edit.
|
|
16
|
+
DESC
|
|
17
|
+
|
|
18
|
+
param :path, type: "string", desc: "Path of the file to create"
|
|
19
|
+
param :content, type: "string", desc: "Full text content to write"
|
|
20
|
+
|
|
21
|
+
def execute(path:, content:, **)
|
|
22
|
+
resolved = File.expand_path(path, Dir.pwd)
|
|
23
|
+
FileUtils.mkdir_p(File.dirname(resolved))
|
|
24
|
+
File.write(resolved, content.to_s)
|
|
25
|
+
"Wrote #{content.to_s.lines.size} lines to #{path}"
|
|
26
|
+
rescue SystemCallError => e
|
|
27
|
+
"Error writing #{path}: #{e.message}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "open3"
|
|
4
|
+
require "timeout"
|
|
5
|
+
|
|
6
|
+
module RobotLab
|
|
7
|
+
module To
|
|
8
|
+
# Runs an independent verification command (e.g. the test suite) to confirm
|
|
9
|
+
# a robot's self-reported success before the orchestrator commits.
|
|
10
|
+
#
|
|
11
|
+
# This is the single-robot translation of separation-of-duties: the deciding
|
|
12
|
+
# authority is a real command run by the orchestrator, not the robot, so the
|
|
13
|
+
# robot cannot self-certify a passing verdict. A non-zero exit -- or a
|
|
14
|
+
# timeout -- fails the gate.
|
|
15
|
+
class Verifier
|
|
16
|
+
MAX_OUTPUT = 4_000
|
|
17
|
+
|
|
18
|
+
Result = Data.define(:passed, :output) do
|
|
19
|
+
def passed? = passed
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def initialize(command, work_dir: Dir.pwd, timeout: 600)
|
|
23
|
+
@command = command
|
|
24
|
+
@work_dir = work_dir
|
|
25
|
+
@timeout = timeout
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def run
|
|
29
|
+
output, ok = capture
|
|
30
|
+
Result.new(passed: ok, output: clamp(output))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def capture
|
|
36
|
+
# pgroup: true so a timeout can kill the whole process tree (test
|
|
37
|
+
# runners spawn children), not just the shell.
|
|
38
|
+
Open3.popen2e(@command, chdir: @work_dir, pgroup: true) do |stdin, out, wait|
|
|
39
|
+
stdin.close
|
|
40
|
+
collected = +""
|
|
41
|
+
begin
|
|
42
|
+
Timeout.timeout(@timeout) { collected << out.read }
|
|
43
|
+
rescue Timeout::Error
|
|
44
|
+
terminate(wait.pid)
|
|
45
|
+
return ["#{collected}\n[verification timed out after #{@timeout}s]", false]
|
|
46
|
+
end
|
|
47
|
+
[collected, wait.value.success?]
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def terminate(pid)
|
|
52
|
+
Process.kill("-TERM", Process.getpgid(pid))
|
|
53
|
+
rescue StandardError
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def clamp(text)
|
|
58
|
+
t = text.to_s.strip
|
|
59
|
+
t.length > MAX_OUTPUT ? "#{t[0, MAX_OUTPUT]}\n[output truncated]" : t
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
data/lib/robot_lab/to.rb
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "to/version"
|
|
4
|
+
require_relative "to/errors"
|
|
5
|
+
require_relative "to/iteration_result"
|
|
6
|
+
require_relative "to/run"
|
|
7
|
+
require_relative "to/atomic_file"
|
|
8
|
+
require_relative "to/jsonl_logger"
|
|
9
|
+
require_relative "to/notes_manager"
|
|
10
|
+
require_relative "to/decision"
|
|
11
|
+
require_relative "to/decision_manager"
|
|
12
|
+
require_relative "to/commit_manager"
|
|
13
|
+
require_relative "to/verifier"
|
|
14
|
+
require_relative "to/evals/score"
|
|
15
|
+
require_relative "to/evals/context"
|
|
16
|
+
require_relative "to/evals/base"
|
|
17
|
+
require_relative "to/evals/null"
|
|
18
|
+
require_relative "to/evals/code"
|
|
19
|
+
require_relative "to/evals/prose"
|
|
20
|
+
require_relative "to/evals/factory"
|
|
21
|
+
require_relative "to/config"
|
|
22
|
+
require_relative "to/tools/submit_result"
|
|
23
|
+
require_relative "to/tools/request_decision"
|
|
24
|
+
require_relative "to/tools/file_tool"
|
|
25
|
+
require_relative "to/tools/read"
|
|
26
|
+
require_relative "to/tools/write"
|
|
27
|
+
require_relative "to/tools/edit"
|
|
28
|
+
require_relative "to/tools/bash"
|
|
29
|
+
require_relative "to/guards"
|
|
30
|
+
require_relative "to/prompt_builder"
|
|
31
|
+
require_relative "to/backoff"
|
|
32
|
+
require_relative "to/stop_conditions"
|
|
33
|
+
require_relative "to/orchestrator"
|
|
34
|
+
require_relative "to/exit_summary"
|
|
35
|
+
require_relative "to/cli"
|
|
36
|
+
|
|
37
|
+
module RobotLab
|
|
38
|
+
module To
|
|
39
|
+
class << self
|
|
40
|
+
# Launch an autonomous takeover run.
|
|
41
|
+
#
|
|
42
|
+
# @param objective [String] what the robot should work toward
|
|
43
|
+
# @param opts [Hash] configuration overrides (model:, max_iterations:, etc.)
|
|
44
|
+
# @return [void]
|
|
45
|
+
def run(objective, **)
|
|
46
|
+
config = Config.new(**)
|
|
47
|
+
suppress_llm_logging unless config.debug?
|
|
48
|
+
Orchestrator.new(objective, config).run
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Resume a paused run by id (used for cron/exit-mode operation). The
|
|
52
|
+
# objective and prior state are loaded from the run's run.json.
|
|
53
|
+
def resume(run_id, **)
|
|
54
|
+
config = Config.new(**)
|
|
55
|
+
suppress_llm_logging unless config.debug?
|
|
56
|
+
Orchestrator.new(nil, config, resume_run_id: run_id).run
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Registry of named Eval strategies (see RobotLab::To::Evals.build). The
|
|
60
|
+
# block receives the Config and returns an object responding to #score.
|
|
61
|
+
def evals = (@evals ||= {})
|
|
62
|
+
|
|
63
|
+
def register_eval(name, &block)
|
|
64
|
+
evals[name.to_sym] = block
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def suppress_llm_logging
|
|
70
|
+
require "logger"
|
|
71
|
+
null = Logger.new(File::NULL)
|
|
72
|
+
RubyLLM.configure { |c| c.logger = null } if defined?(RubyLLM)
|
|
73
|
+
RobotLab.configure { |c| c.logger = null } if RobotLab.respond_to?(:configure)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
if defined?(RobotLab) && RobotLab.respond_to?(:register_extension)
|
|
80
|
+
RobotLab.register_extension(:to, RobotLab::To)
|
|
81
|
+
end
|
data/mkdocs.yml
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# MkDocs configuration for robot_lab-to documentation
|
|
2
|
+
site_name: robot_lab-to
|
|
3
|
+
site_description: Autonomous overnight agent loop for RobotLab — run a robot while you sleep.
|
|
4
|
+
site_author: Dewayne VanHoozer
|
|
5
|
+
site_url: https://madbomber.github.io/robot_lab-to
|
|
6
|
+
copyright: Copyright © 2026 Dewayne VanHoozer
|
|
7
|
+
|
|
8
|
+
# Repository information
|
|
9
|
+
repo_name: MadBomber/robot_lab-to
|
|
10
|
+
repo_url: https://github.com/MadBomber/robot_lab-to
|
|
11
|
+
edit_uri: edit/main/docs/
|
|
12
|
+
|
|
13
|
+
# Theme
|
|
14
|
+
theme:
|
|
15
|
+
name: material
|
|
16
|
+
|
|
17
|
+
# Color scheme — default to dark (slate); toggle to light
|
|
18
|
+
palette:
|
|
19
|
+
# Dark mode (default)
|
|
20
|
+
- scheme: slate
|
|
21
|
+
primary: indigo
|
|
22
|
+
accent: indigo
|
|
23
|
+
toggle:
|
|
24
|
+
icon: material/brightness-4
|
|
25
|
+
name: Switch to light mode
|
|
26
|
+
|
|
27
|
+
# Light mode
|
|
28
|
+
- scheme: default
|
|
29
|
+
primary: indigo
|
|
30
|
+
accent: indigo
|
|
31
|
+
toggle:
|
|
32
|
+
icon: material/brightness-7
|
|
33
|
+
name: Switch to dark mode
|
|
34
|
+
|
|
35
|
+
font:
|
|
36
|
+
text: Roboto
|
|
37
|
+
code: Roboto Mono
|
|
38
|
+
|
|
39
|
+
features:
|
|
40
|
+
# Navigation
|
|
41
|
+
- navigation.instant
|
|
42
|
+
- navigation.tracking
|
|
43
|
+
- navigation.tabs
|
|
44
|
+
- navigation.tabs.sticky
|
|
45
|
+
- navigation.sections
|
|
46
|
+
- navigation.path
|
|
47
|
+
- navigation.top
|
|
48
|
+
# Table of contents
|
|
49
|
+
- toc.follow
|
|
50
|
+
# Search
|
|
51
|
+
- search.suggest
|
|
52
|
+
- search.highlight
|
|
53
|
+
- search.share
|
|
54
|
+
# Content
|
|
55
|
+
- content.code.copy
|
|
56
|
+
- content.code.annotate
|
|
57
|
+
- content.tabs.link
|
|
58
|
+
- content.tooltips
|
|
59
|
+
- content.action.edit
|
|
60
|
+
- content.action.view
|
|
61
|
+
|
|
62
|
+
# Plugins
|
|
63
|
+
plugins:
|
|
64
|
+
- search:
|
|
65
|
+
separator: '[\s\-,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
|
|
66
|
+
|
|
67
|
+
# Markdown extensions
|
|
68
|
+
markdown_extensions:
|
|
69
|
+
- abbr
|
|
70
|
+
- admonition
|
|
71
|
+
- attr_list
|
|
72
|
+
- def_list
|
|
73
|
+
- footnotes
|
|
74
|
+
- md_in_html
|
|
75
|
+
- tables
|
|
76
|
+
- toc:
|
|
77
|
+
permalink: true
|
|
78
|
+
title: On this page
|
|
79
|
+
- pymdownx.betterem:
|
|
80
|
+
smart_enable: all
|
|
81
|
+
- pymdownx.caret
|
|
82
|
+
- pymdownx.details
|
|
83
|
+
- pymdownx.emoji:
|
|
84
|
+
emoji_generator: !!python/name:material.extensions.emoji.to_svg
|
|
85
|
+
emoji_index: !!python/name:material.extensions.emoji.twemoji
|
|
86
|
+
- pymdownx.highlight:
|
|
87
|
+
anchor_linenums: true
|
|
88
|
+
line_spans: __span
|
|
89
|
+
pygments_lang_class: true
|
|
90
|
+
- pymdownx.inlinehilite
|
|
91
|
+
- pymdownx.keys
|
|
92
|
+
- pymdownx.magiclink:
|
|
93
|
+
repo_url_shorthand: true
|
|
94
|
+
user: MadBomber
|
|
95
|
+
repo: robot_lab-to
|
|
96
|
+
- pymdownx.mark
|
|
97
|
+
- pymdownx.smartsymbols
|
|
98
|
+
- pymdownx.superfences:
|
|
99
|
+
custom_fences:
|
|
100
|
+
- name: mermaid
|
|
101
|
+
class: mermaid
|
|
102
|
+
format: !!python/name:pymdownx.superfences.fence_code_format
|
|
103
|
+
- pymdownx.tabbed:
|
|
104
|
+
alternate_style: true
|
|
105
|
+
- pymdownx.tasklist:
|
|
106
|
+
custom_checkbox: true
|
|
107
|
+
- pymdownx.tilde
|
|
108
|
+
|
|
109
|
+
# Extra configuration
|
|
110
|
+
extra:
|
|
111
|
+
social:
|
|
112
|
+
- icon: fontawesome/brands/github
|
|
113
|
+
link: https://github.com/MadBomber/robot_lab-to
|
|
114
|
+
name: robot_lab-to on GitHub
|
|
115
|
+
- icon: fontawesome/solid/gem
|
|
116
|
+
link: https://rubygems.org/gems/robot_lab-to
|
|
117
|
+
name: robot_lab-to on RubyGems
|
|
118
|
+
|
|
119
|
+
# Navigation
|
|
120
|
+
nav:
|
|
121
|
+
- Home: index.md
|
|
122
|
+
- Getting Started:
|
|
123
|
+
- Installation: getting-started/installation.md
|
|
124
|
+
- Quick Start: getting-started/quick-start.md
|
|
125
|
+
- Anatomy of a Run: getting-started/anatomy-of-a-run.md
|
|
126
|
+
- Core Concepts:
|
|
127
|
+
- The Iteration Loop: concepts/iteration-loop.md
|
|
128
|
+
- Cross-Iteration Memory: concepts/notes.md
|
|
129
|
+
- Stop Conditions: concepts/stop-conditions.md
|
|
130
|
+
- Verification Gate: concepts/verification.md
|
|
131
|
+
- "Evals: Scoring Iterations": concepts/evals.md
|
|
132
|
+
- Run State & Event Log: concepts/run-state.md
|
|
133
|
+
- Configuration:
|
|
134
|
+
- Overview: configuration/index.md
|
|
135
|
+
- Settings Reference: configuration/settings.md
|
|
136
|
+
- CLI Reference: configuration/cli.md
|
|
137
|
+
- Local Models:
|
|
138
|
+
- Overview: local-models/index.md
|
|
139
|
+
- Ollama Setup: local-models/ollama.md
|
|
140
|
+
- Built-in Tools: local-models/tools.md
|
|
141
|
+
- Guardrails: local-models/guardrails.md
|
|
142
|
+
- Reference:
|
|
143
|
+
- Architecture: reference/architecture.md
|
|
144
|
+
- About:
|
|
145
|
+
- Changelog: about/changelog.md
|
metadata
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: robot_lab-to
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.6
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Dewayne VanHoozer
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: robot_lab
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0.1'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0.1'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: myway_config
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '0'
|
|
40
|
+
description: |
|
|
41
|
+
robot_lab-to ("takeover") runs a robot_lab Robot in an autonomous loop, committing
|
|
42
|
+
one focused change per iteration toward a stated objective. Each iteration the robot
|
|
43
|
+
reads shared notes (notes.md), does work, then calls submit_iteration_result to
|
|
44
|
+
report success or failure. The orchestrator commits good iterations, rolls back
|
|
45
|
+
failures, and appends to the notes log for cross-iteration memory. Stop conditions
|
|
46
|
+
include max iterations, max tokens, consecutive failure threshold, and a natural-
|
|
47
|
+
language --stop-when condition. Runs overnight; review the branch in the morning.
|
|
48
|
+
email:
|
|
49
|
+
- dvanhoozer@gmail.com
|
|
50
|
+
executables:
|
|
51
|
+
- robot-to
|
|
52
|
+
extensions: []
|
|
53
|
+
extra_rdoc_files: []
|
|
54
|
+
files:
|
|
55
|
+
- ".envrc"
|
|
56
|
+
- ".github/workflows/deploy-github-pages.yml"
|
|
57
|
+
- ".loki"
|
|
58
|
+
- ".quality/reek_baseline.txt"
|
|
59
|
+
- ".rubocop.yml"
|
|
60
|
+
- CHANGELOG.md
|
|
61
|
+
- CLAUDE.md
|
|
62
|
+
- COMMITS.md
|
|
63
|
+
- README.md
|
|
64
|
+
- Rakefile
|
|
65
|
+
- bin/robot-to
|
|
66
|
+
- docs/about/changelog.md
|
|
67
|
+
- docs/assets/architecture.svg
|
|
68
|
+
- docs/assets/images/robot_lab-to.jpg
|
|
69
|
+
- docs/assets/iteration-loop.svg
|
|
70
|
+
- docs/concepts/evals.md
|
|
71
|
+
- docs/concepts/iteration-loop.md
|
|
72
|
+
- docs/concepts/notes.md
|
|
73
|
+
- docs/concepts/run-state.md
|
|
74
|
+
- docs/concepts/stop-conditions.md
|
|
75
|
+
- docs/concepts/verification.md
|
|
76
|
+
- docs/configuration/cli.md
|
|
77
|
+
- docs/configuration/index.md
|
|
78
|
+
- docs/configuration/settings.md
|
|
79
|
+
- docs/getting-started/anatomy-of-a-run.md
|
|
80
|
+
- docs/getting-started/installation.md
|
|
81
|
+
- docs/getting-started/quick-start.md
|
|
82
|
+
- docs/index.md
|
|
83
|
+
- docs/local-models/guardrails.md
|
|
84
|
+
- docs/local-models/index.md
|
|
85
|
+
- docs/local-models/ollama.md
|
|
86
|
+
- docs/local-models/tools.md
|
|
87
|
+
- docs/reference/architecture.md
|
|
88
|
+
- examples/01_basic_usage/.gitignore
|
|
89
|
+
- examples/01_basic_usage/README.md
|
|
90
|
+
- examples/01_basic_usage/basic_usage.rb
|
|
91
|
+
- examples/02_advanced_usage/.gitignore
|
|
92
|
+
- examples/02_advanced_usage/README.md
|
|
93
|
+
- examples/02_advanced_usage/advanced_usage.rb
|
|
94
|
+
- examples/02_advanced_usage/quality_gate.rb
|
|
95
|
+
- examples/03_scored/.gitignore
|
|
96
|
+
- examples/03_scored/README.md
|
|
97
|
+
- examples/03_scored/scored_run.rb
|
|
98
|
+
- examples/04_prose/.gitignore
|
|
99
|
+
- examples/04_prose/README.md
|
|
100
|
+
- examples/04_prose/prompts_dir/grade_message.md
|
|
101
|
+
- examples/04_prose/prompts_dir/judge.md
|
|
102
|
+
- examples/04_prose/prompts_dir/outline_criteria.md
|
|
103
|
+
- examples/04_prose/prompts_dir/outline_objective.md
|
|
104
|
+
- examples/04_prose/prompts_dir/section_criteria.md
|
|
105
|
+
- examples/04_prose/prompts_dir/sections_objective.md
|
|
106
|
+
- examples/04_prose/prose_run.rb
|
|
107
|
+
- lib/robot_lab/to.rb
|
|
108
|
+
- lib/robot_lab/to/atomic_file.rb
|
|
109
|
+
- lib/robot_lab/to/backoff.rb
|
|
110
|
+
- lib/robot_lab/to/cli.rb
|
|
111
|
+
- lib/robot_lab/to/commit_manager.rb
|
|
112
|
+
- lib/robot_lab/to/config.rb
|
|
113
|
+
- lib/robot_lab/to/config/defaults.yml
|
|
114
|
+
- lib/robot_lab/to/decision.rb
|
|
115
|
+
- lib/robot_lab/to/decision_manager.rb
|
|
116
|
+
- lib/robot_lab/to/errors.rb
|
|
117
|
+
- lib/robot_lab/to/evals/base.rb
|
|
118
|
+
- lib/robot_lab/to/evals/code.rb
|
|
119
|
+
- lib/robot_lab/to/evals/context.rb
|
|
120
|
+
- lib/robot_lab/to/evals/factory.rb
|
|
121
|
+
- lib/robot_lab/to/evals/null.rb
|
|
122
|
+
- lib/robot_lab/to/evals/prose.rb
|
|
123
|
+
- lib/robot_lab/to/evals/score.rb
|
|
124
|
+
- lib/robot_lab/to/exit_summary.rb
|
|
125
|
+
- lib/robot_lab/to/guards.rb
|
|
126
|
+
- lib/robot_lab/to/guards/checkpoint.rb
|
|
127
|
+
- lib/robot_lab/to/guards/grader_lock.rb
|
|
128
|
+
- lib/robot_lab/to/guards/path_resolution.rb
|
|
129
|
+
- lib/robot_lab/to/guards/quality_monitor.rb
|
|
130
|
+
- lib/robot_lab/to/guards/read_before_edit.rb
|
|
131
|
+
- lib/robot_lab/to/guards/run_store.rb
|
|
132
|
+
- lib/robot_lab/to/guards/write_guard.rb
|
|
133
|
+
- lib/robot_lab/to/iteration_result.rb
|
|
134
|
+
- lib/robot_lab/to/jsonl_logger.rb
|
|
135
|
+
- lib/robot_lab/to/notes_manager.rb
|
|
136
|
+
- lib/robot_lab/to/orchestrator.rb
|
|
137
|
+
- lib/robot_lab/to/prompt_builder.rb
|
|
138
|
+
- lib/robot_lab/to/run.rb
|
|
139
|
+
- lib/robot_lab/to/stop_conditions.rb
|
|
140
|
+
- lib/robot_lab/to/tools/bash.rb
|
|
141
|
+
- lib/robot_lab/to/tools/edit.rb
|
|
142
|
+
- lib/robot_lab/to/tools/file_tool.rb
|
|
143
|
+
- lib/robot_lab/to/tools/read.rb
|
|
144
|
+
- lib/robot_lab/to/tools/request_decision.rb
|
|
145
|
+
- lib/robot_lab/to/tools/submit_result.rb
|
|
146
|
+
- lib/robot_lab/to/tools/write.rb
|
|
147
|
+
- lib/robot_lab/to/verifier.rb
|
|
148
|
+
- lib/robot_lab/to/version.rb
|
|
149
|
+
- mkdocs.yml
|
|
150
|
+
homepage: https://github.com/MadBomber/robot_lab-to
|
|
151
|
+
licenses:
|
|
152
|
+
- MIT
|
|
153
|
+
metadata:
|
|
154
|
+
homepage_uri: https://github.com/MadBomber/robot_lab-to
|
|
155
|
+
source_code_uri: https://github.com/MadBomber/robot_lab-to
|
|
156
|
+
changelog_uri: https://github.com/MadBomber/robot_lab-to/blob/main/CHANGELOG.md
|
|
157
|
+
rubygems_mfa_required: 'true'
|
|
158
|
+
rdoc_options: []
|
|
159
|
+
require_paths:
|
|
160
|
+
- lib
|
|
161
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
162
|
+
requirements:
|
|
163
|
+
- - ">="
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: 3.2.0
|
|
166
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
|
+
requirements:
|
|
168
|
+
- - ">="
|
|
169
|
+
- !ruby/object:Gem::Version
|
|
170
|
+
version: '0'
|
|
171
|
+
requirements: []
|
|
172
|
+
rubygems_version: 4.0.17
|
|
173
|
+
specification_version: 4
|
|
174
|
+
summary: Autonomous overnight agent loop for RobotLab — run robots while you sleep.
|
|
175
|
+
test_files: []
|