claude-turing 1.0.0
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.
- package/.claude-plugin/plugin.json +34 -0
- package/LICENSE +21 -0
- package/README.md +457 -0
- package/agents/ml-evaluator.md +43 -0
- package/agents/ml-researcher.md +74 -0
- package/bin/cli.js +46 -0
- package/bin/turing-init.sh +57 -0
- package/commands/brief.md +83 -0
- package/commands/compare.md +24 -0
- package/commands/design.md +97 -0
- package/commands/init.md +123 -0
- package/commands/logbook.md +51 -0
- package/commands/mode.md +43 -0
- package/commands/poster.md +89 -0
- package/commands/preflight.md +75 -0
- package/commands/report.md +97 -0
- package/commands/rules/loop-protocol.md +91 -0
- package/commands/status.md +24 -0
- package/commands/suggest.md +95 -0
- package/commands/sweep.md +45 -0
- package/commands/train.md +66 -0
- package/commands/try.md +63 -0
- package/commands/turing.md +54 -0
- package/commands/validate.md +34 -0
- package/config/defaults.yaml +45 -0
- package/config/experiment_archetypes.yaml +127 -0
- package/config/lifecycle.toml +31 -0
- package/config/novelty_aliases.yaml +107 -0
- package/config/relationships.toml +125 -0
- package/config/state.toml +24 -0
- package/config/task_taxonomy.yaml +110 -0
- package/config/taxonomy.toml +37 -0
- package/package.json +54 -0
- package/src/claude-md.js +55 -0
- package/src/install.js +107 -0
- package/src/paths.js +20 -0
- package/src/postinstall.js +22 -0
- package/src/verify.js +109 -0
- package/templates/MEMORY.md +36 -0
- package/templates/README.md +93 -0
- package/templates/__pycache__/evaluate.cpython-314.pyc +0 -0
- package/templates/__pycache__/prepare.cpython-314.pyc +0 -0
- package/templates/config.yaml +48 -0
- package/templates/evaluate.py +237 -0
- package/templates/features/__init__.py +0 -0
- package/templates/features/__pycache__/__init__.cpython-314.pyc +0 -0
- package/templates/features/__pycache__/featurizers.cpython-314.pyc +0 -0
- package/templates/features/featurizers.py +138 -0
- package/templates/prepare.py +171 -0
- package/templates/program.md +216 -0
- package/templates/pyproject.toml +8 -0
- package/templates/requirements.txt +8 -0
- package/templates/scripts/__init__.py +0 -0
- package/templates/scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/check_convergence.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/classify_task.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/critique_hypothesis.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/experiment_index.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/generate_brief.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/generate_logbook.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/log_experiment.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/manage_hypotheses.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/novelty_guard.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/parse_metrics.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/scaffold.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/show_experiment_tree.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/show_families.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/statistical_compare.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/suggest_next.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/sweep.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/synthesize_decision.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/turing_io.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/update_state.cpython-314.pyc +0 -0
- package/templates/scripts/__pycache__/verify_placeholders.cpython-314.pyc +0 -0
- package/templates/scripts/check_convergence.py +230 -0
- package/templates/scripts/compare_runs.py +124 -0
- package/templates/scripts/critique_hypothesis.py +350 -0
- package/templates/scripts/experiment_index.py +288 -0
- package/templates/scripts/generate_brief.py +389 -0
- package/templates/scripts/generate_logbook.py +423 -0
- package/templates/scripts/log_experiment.py +243 -0
- package/templates/scripts/manage_hypotheses.py +543 -0
- package/templates/scripts/novelty_guard.py +343 -0
- package/templates/scripts/parse_metrics.py +139 -0
- package/templates/scripts/post-train-hook.sh +74 -0
- package/templates/scripts/preflight.py +549 -0
- package/templates/scripts/scaffold.py +409 -0
- package/templates/scripts/show_environment.py +92 -0
- package/templates/scripts/show_experiment_tree.py +144 -0
- package/templates/scripts/show_families.py +133 -0
- package/templates/scripts/show_metrics.py +157 -0
- package/templates/scripts/statistical_compare.py +259 -0
- package/templates/scripts/stop-hook.sh +34 -0
- package/templates/scripts/suggest_next.py +301 -0
- package/templates/scripts/sweep.py +276 -0
- package/templates/scripts/synthesize_decision.py +300 -0
- package/templates/scripts/turing_io.py +76 -0
- package/templates/scripts/update_state.py +296 -0
- package/templates/scripts/validate_stability.py +167 -0
- package/templates/scripts/verify_placeholders.py +119 -0
- package/templates/sweep_config.yaml +14 -0
- package/templates/tests/__init__.py +0 -0
- package/templates/tests/conftest.py +91 -0
- package/templates/train.py +240 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "turing",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Autonomous ML research harness — the autoresearch loop as a formal protocol. 14 commands, 2 specialized agents, structured experiment lifecycle with convergence detection, immutable evaluation infrastructure, novelty guard, decision synthesis, hypothesis database, and safety guardrails that separate the hypothesis space from the measurement apparatus. Inspired by Karpathy's autoresearch and the scientific method itself.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "pragnition"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://github.com/pragnition/turing",
|
|
9
|
+
"repository": "https://github.com/pragnition/turing",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"ml",
|
|
13
|
+
"machine-learning",
|
|
14
|
+
"autoresearch",
|
|
15
|
+
"experiment-tracking",
|
|
16
|
+
"hyperparameter-tuning",
|
|
17
|
+
"autonomous-training",
|
|
18
|
+
"convergence-detection",
|
|
19
|
+
"model-evaluation",
|
|
20
|
+
"scientific-method",
|
|
21
|
+
"experiment-lifecycle",
|
|
22
|
+
"hypothesis-testing",
|
|
23
|
+
"reproducibility",
|
|
24
|
+
"immutable-evaluation",
|
|
25
|
+
"feature-engineering",
|
|
26
|
+
"gradient-boosting",
|
|
27
|
+
"hyperparameter-sweep",
|
|
28
|
+
"model-selection",
|
|
29
|
+
"experiment-logging",
|
|
30
|
+
"claude-code",
|
|
31
|
+
"plugin",
|
|
32
|
+
"ai-agents"
|
|
33
|
+
]
|
|
34
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 pragnition
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
# turing
|
|
2
|
+
|
|
3
|
+
*The research assistant that can't fool itself.*
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
An autonomous ML research harness for Claude Code. Turing implements the autoresearch pattern — an AI agent that iteratively trains, evaluates, and improves machine learning models through a structured experiment loop with convergence detection, immutable evaluation infrastructure, and safety guardrails.
|
|
8
|
+
|
|
9
|
+
The name references Alan Turing — the person who first asked whether machines could think, then built the framework for answering the question. Turing the plugin does what Turing the person formalized: it defines a computational process, executes it mechanically, and determines whether the result constitutes an improvement.
|
|
10
|
+
|
|
11
|
+
Inspired by [karpathy/autoresearch](https://github.com/karpathy/autoresearch) and [snoglobe/helios](https://github.com/snoglobe/helios).
|
|
12
|
+
|
|
13
|
+
## Three Commands
|
|
14
|
+
|
|
15
|
+
That's all you need.
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/turing:init Set up a new ML project
|
|
19
|
+
/turing:train Run the experiment loop
|
|
20
|
+
/turing:brief What happened? What's next?
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Initialize. Train. Read the briefing. Inject your taste. Repeat.
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
/turing:try switch to LightGBM Steer the agent
|
|
27
|
+
/turing:train It follows your lead
|
|
28
|
+
/turing:brief --deep Get literature-backed suggestions
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Everything else — experiment logging, convergence detection, hypothesis tracking, statistical validation, anti-cheating guardrails — happens automatically. You think about *what* to try. Turing handles *how* to try it.
|
|
32
|
+
|
|
33
|
+
## Table of Contents
|
|
34
|
+
|
|
35
|
+
- [When Code Is Free, Research Is All That Matters](#when-code-is-free-research-is-all-that-matters)
|
|
36
|
+
- [The Human-AI Interface](#the-human-ai-interface)
|
|
37
|
+
- [The Problem Turing Solves](#the-problem-turing-solves)
|
|
38
|
+
- [Philosophical Foundations](#philosophical-foundations)
|
|
39
|
+
- [How Turing Works](#how-turing-works)
|
|
40
|
+
- [Commands](#commands)
|
|
41
|
+
- [The Hypothesis Database](#the-hypothesis-database)
|
|
42
|
+
- [The Agent Architecture](#the-agent-architecture)
|
|
43
|
+
- [The Anti-Cheating Stack](#the-anti-cheating-stack)
|
|
44
|
+
- [Convergence Detection](#convergence-detection)
|
|
45
|
+
- [Installation](#installation)
|
|
46
|
+
- [Architecture of Turing Itself](#architecture-of-turing-itself)
|
|
47
|
+
- [Intellectual Heritage](#intellectual-heritage)
|
|
48
|
+
|
|
49
|
+
## When Code Is Free, Research Is All That Matters
|
|
50
|
+
|
|
51
|
+
> *"You're in a room with a quadrillion biased coins, and you want to maximize the number of heads in the shortest amount of time. Almost all coins are 'duds.' The novice coin-flipper might start flipping one-by-one, but heads come few and far between. The learned coin-flipper weaves through the quadrillion-coin room with a preternatural air; they flip many coins at once. What comes across as luck is really the refinement of taste: years of feeling faint differences in the weight of the metal, the subtle offsets of a mis-mint."* — [Amy Tam](https://x.com/amytam01/status/2031072399731675269)
|
|
52
|
+
|
|
53
|
+
This is the most precise metaphor for ML research in the age of autonomous agents: a quadrillion-coin room where the researcher's value lies not in the mechanical act of flipping but in *choosing which coins to flip at all*.
|
|
54
|
+
|
|
55
|
+
Tam's insight cuts to the heart of what Turing exists to do. The agentic coding tools consuming software engineering alive right now — Cursor, Claude Code, Codex — work precisely because engineering has a built-in feedback signal: a test to pass, a spec to meet, a benchmark to clear. You can RL on [SWE-bench](https://www.swebench.com/) because the ground truth exists. **Research has no equivalent.** It is not clear what it means to RL on a research question, because it is not clear what definition of "ground truth" one should optimize for. The coin room has a quadrillion coins but no label telling you which ones are biased toward heads.
|
|
56
|
+
|
|
57
|
+
And yet Karpathy's [autoresearch](https://github.com/karpathy/autoresearch) ran 126 experiments overnight on a single GPU: agents modifying LLM training code, running a five-minute training loop, checking if the result improved, and repeating. [Tobias Lütke reported](https://fortune.com/2026/03/17/andrej-karpathy-loop-autonomous-ai-agents-future/) that after letting it run overnight, it executed 37 experiments and delivered a 19% performance gain. That is a lot more coins flipped than the average human in the same time.
|
|
58
|
+
|
|
59
|
+
This creates a new kind of division of labor:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
HUMAN RESEARCHER AUTONOMOUS AGENT
|
|
63
|
+
───────────────── ─────────────────
|
|
64
|
+
Research taste Coin flipping
|
|
65
|
+
Which coins to flip How fast to flip them
|
|
66
|
+
Problem selection Hypothesis execution
|
|
67
|
+
Judgment under ambiguity Measurement under control
|
|
68
|
+
Knowing when the room has changed Running the room as-is
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The researcher's job becomes the selection function: *which 20 of the quadrillion coins are worth flipping in the first place?* And the agent's job — Turing's job — is to flip those coins with the discipline, speed, and memory that humans cannot sustain. Every experiment logged. Every variant preserved. Every comparison valid. No amnesia. No fatigue. No accidental contamination of the measurement.
|
|
72
|
+
|
|
73
|
+
*When anyone can build for free, the differentiator is knowing what's worth building and whether it's buildable at all.* Turing handles the building. You bring the knowing.
|
|
74
|
+
|
|
75
|
+
## The Human-AI Interface
|
|
76
|
+
|
|
77
|
+
Turing is not a black box you point at data and hope for the best. It is a conversation between your taste and the agent's discipline.
|
|
78
|
+
|
|
79
|
+
### The Taste-Leverage Loop
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
┌─────────────────────┐
|
|
83
|
+
│ YOU (taste) │
|
|
84
|
+
│ │
|
|
85
|
+
│ /turing:brief │◄──── "What have we learned?"
|
|
86
|
+
│ /turing:try ... │────► "Try this next."
|
|
87
|
+
└────────┬────────────┘
|
|
88
|
+
│
|
|
89
|
+
▼
|
|
90
|
+
┌─────────────────────┐
|
|
91
|
+
│ TURING (discipline) │
|
|
92
|
+
│ │
|
|
93
|
+
│ Hypothesize │◄──── Reads your injection + history
|
|
94
|
+
│ Train │────► Runs the experiment
|
|
95
|
+
│ Evaluate │────► Immutable measurement
|
|
96
|
+
│ Decide │────► Keep or discard
|
|
97
|
+
│ Record │────► Updates hypothesis database
|
|
98
|
+
└────────┬────────────┘
|
|
99
|
+
│
|
|
100
|
+
▼
|
|
101
|
+
┌─────────────────────┐
|
|
102
|
+
│ BRIEFING │
|
|
103
|
+
│ │
|
|
104
|
+
│ Campaign summary │
|
|
105
|
+
│ Best model │
|
|
106
|
+
│ What's exhausted │
|
|
107
|
+
│ What's promising │
|
|
108
|
+
│ Recommendations │
|
|
109
|
+
└─────────────────────┘
|
|
110
|
+
│
|
|
111
|
+
▼
|
|
112
|
+
You again.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The loop is bidirectional. You inject hypotheses. The agent executes them. The briefing tells you what happened. You inject new hypotheses informed by the results. The agent never forgets what it tried. You never lose context between sessions.
|
|
116
|
+
|
|
117
|
+
### What This Looks Like in Practice
|
|
118
|
+
|
|
119
|
+
**Morning 1:** You have a dataset and a prediction task.
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
/turing:init
|
|
123
|
+
# Answer: project name, metric, data location
|
|
124
|
+
# Turing scaffolds everything
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Morning 1, 10 minutes later:**
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
/turing:train
|
|
131
|
+
# Agent runs 5-10 experiments autonomously
|
|
132
|
+
# XGBoost baseline → hyperparameter sweep → convergence
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Morning 1, 30 minutes later:**
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
/turing:brief
|
|
139
|
+
# Campaign: 8 experiments, 5 kept, accuracy 0.82 → 0.87
|
|
140
|
+
# Best: XGBoost, max_depth=6, n_estimators=200
|
|
141
|
+
# Exhausted: hyperparameter tuning on XGBoost
|
|
142
|
+
# Recommendation: try LightGBM or feature engineering
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Your taste kicks in:**
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
/turing:try switch to LightGBM with dart boosting — XGBoost plateaued
|
|
149
|
+
/turing:try add polynomial interaction features for the numeric columns
|
|
150
|
+
/turing:train
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Afternoon:**
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
/turing:brief --deep
|
|
157
|
+
# Standard briefing + literature-grounded suggestions
|
|
158
|
+
# Papers suggest: target encoding for high-cardinality categoricals
|
|
159
|
+
# → Auto-queued as hyp-012
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**You leave. Come back tomorrow.**
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
/turing:brief
|
|
166
|
+
# Everything is there. Nothing was forgotten.
|
|
167
|
+
# The hypothesis database has the complete trail.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
That's the interface. Six words to inject an idea. One command to get a briefing. The agent handles everything in between.
|
|
171
|
+
|
|
172
|
+
## The Problem Turing Solves
|
|
173
|
+
|
|
174
|
+
> "An experiment is a question which science poses to Nature, and a measurement is the recording of Nature's answer." — Max Planck
|
|
175
|
+
|
|
176
|
+
The central activity of machine learning research is the experiment loop: change something, train, evaluate, decide, repeat. This loop is simultaneously the most important and the most tedious part of ML work. Researchers spend their days doing what is essentially a manual search over a high-dimensional space of model architectures, hyperparameters, feature transformations, and data preprocessing strategies.
|
|
177
|
+
|
|
178
|
+
The tragedy is not that this is slow — it is that the process is structurally unsound. When a human researcher modifies both the training code *and* the evaluation code in the same session, the experiment is no longer a controlled experiment. When experiment results are tracked in notebook cells rather than structured logs, reproducibility is aspirational. When a promising direction is abandoned because the researcher forgot what they tried three hours ago, the search is not even a search — it is a random walk with amnesia.
|
|
179
|
+
|
|
180
|
+
Turing does not replace the researcher's judgment. It replaces the researcher's *discipline* — or more precisely, it makes discipline the default rather than an act of willpower. The experiment loop is formalized. The evaluation harness is immutable. Every experiment is logged. Every code variant is preserved. Convergence is detected automatically. The researcher's role shifts from "person who types hyperparameters and reads loss curves" to "person who decides what hypotheses are worth testing" — from coin-flipper to coin-selector.
|
|
181
|
+
|
|
182
|
+
## Philosophical Foundations
|
|
183
|
+
|
|
184
|
+
### On Separating Hypothesis from Measurement
|
|
185
|
+
|
|
186
|
+
> "The first principle is that you must not fool yourself — and you are the easiest person to fool." — Richard Feynman
|
|
187
|
+
|
|
188
|
+
Turing is built on a specific epistemological claim: **the entity that generates hypotheses must not be the entity that evaluates them**. This is not a software engineering pattern — it is the methodological foundation of modern science, and it predates software by centuries.
|
|
189
|
+
|
|
190
|
+
In experimental physics, the [double-blind protocol](https://en.wikipedia.org/wiki/Blinded_experiment) ensures that the experimenter's expectations cannot influence the measurement. In ML, the equivalent risk is more insidious: an agent that can modify both `train.py` and `evaluate.py` can — deliberately or through optimization pressure — find metrics that look good but don't reflect genuine model improvement.
|
|
191
|
+
|
|
192
|
+
This is [Goodhart's Law](https://en.wikipedia.org/wiki/Goodhart%27s_law) made architectural: *"When a measure becomes a target, it ceases to be a good measure."* The only defense is to make the measure structurally immutable.
|
|
193
|
+
|
|
194
|
+
Turing enforces this with a three-tier access model:
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
┌──────────────────────────────────────────────────────┐
|
|
198
|
+
│ HYPOTHESIS SPACE │
|
|
199
|
+
│ (agent can modify) │
|
|
200
|
+
│ train.py config.yaml │
|
|
201
|
+
├──────────────────────────────────────────────────────┤
|
|
202
|
+
│ MEASUREMENT APPARATUS │
|
|
203
|
+
│ prepare.py (READ-ONLY) │
|
|
204
|
+
│ evaluate.py (HIDDEN — agent cannot even see) │
|
|
205
|
+
└──────────────────────────────────────────────────────┘
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The evaluation harness is not just immutable — it is *invisible*. The agent cannot read `evaluate.py`, cannot discover its implementation, cannot reverse-engineer fixed seeds or scoring formulas. It knows only the metric name, the direction (higher or lower is better), and the result. This is the difference between "please don't change the test" and "you literally cannot see the test."
|
|
209
|
+
|
|
210
|
+
### On Research Taste and Autonomous Execution
|
|
211
|
+
|
|
212
|
+
> *"Research taste is about how well you choose your coins: how well you choose which problems are worth working on at all."* — Amy Tam
|
|
213
|
+
|
|
214
|
+
There is a paradox at the heart of autonomous ML research: the parts of research that are hardest to automate are precisely the parts that matter most. Problem selection, hypothesis formation, knowing when a line of inquiry has become a dead end — these require what Tam calls *taste*, the accumulated judgment that comes from years of feeling faint differences in which problems are tractable, which results are meaningful, and which metrics actually capture what you care about.
|
|
215
|
+
|
|
216
|
+
Autoresearch does not solve this. Turing does not solve this. No one has solved this. But what autoresearch *does* solve is the complementary problem: given a well-selected hypothesis space, execute the search within it with superhuman discipline and throughput. The human provides the taste. The agent provides the tirelessness.
|
|
217
|
+
|
|
218
|
+
This is why Turing's interface is built around two verbs: **try** and **brief**. `/turing:try` is how taste reaches the agent. `/turing:brief` is how results reach the human. Everything else is infrastructure.
|
|
219
|
+
|
|
220
|
+
### On Experiment Tracking as Institutional Memory
|
|
221
|
+
|
|
222
|
+
> "Those who cannot remember the past are condemned to repeat it." — George Santayana
|
|
223
|
+
|
|
224
|
+
An LLM agent without persistent memory is a [Markov chain](https://en.wikipedia.org/wiki/Markov_chain) — its next action depends only on its current state, not on the path that led there. This is catastrophically inefficient for optimization: the agent will re-try failed approaches, abandon promising directions, and fail to recognize when it has converged. It will keep flipping coins it has already flipped.
|
|
225
|
+
|
|
226
|
+
Turing addresses this with a structured memory stack:
|
|
227
|
+
|
|
228
|
+
| System | Format | Purpose |
|
|
229
|
+
|--------|--------|---------|
|
|
230
|
+
| **Hypothesis database** | `hypotheses.yaml` + `hypotheses/hyp-NNN.yaml` | Complete ledger of every idea — human and agent — with full detail |
|
|
231
|
+
| **Experiment log** | `experiments/log.jsonl` | Append-only record of every experiment run |
|
|
232
|
+
| **Novelty guard** | `scripts/novelty_guard.py` | Blocks duplicate and near-duplicate hypotheses before execution |
|
|
233
|
+
| **Agent memory** | `.claude/agent-memory/ml-researcher/MEMORY.md` | Working notes across sessions |
|
|
234
|
+
| **Git history** | Experiment branches | Every code variant preserved |
|
|
235
|
+
|
|
236
|
+
The hypothesis database is the single source of truth. Every idea gets registered before execution. Every outcome gets written back. The novelty guard reads the history and prevents the agent from re-trying things it has already failed at — even across `/loop` sessions where the agent's context is lost.
|
|
237
|
+
|
|
238
|
+
## How Turing Works
|
|
239
|
+
|
|
240
|
+
### The Experiment Loop
|
|
241
|
+
|
|
242
|
+
Every iteration follows the same protocol:
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
1. OBSERVE Read metrics, check hypothesis queue, review failed diffs
|
|
246
|
+
2. HYPOTHESIZE Check queue (human ideas first) or generate + register own
|
|
247
|
+
3. PREPARE Edit train.py or config.yaml
|
|
248
|
+
4. COMMIT Git branch per experiment
|
|
249
|
+
5. EXECUTE python train.py > run.log 2>&1
|
|
250
|
+
6. MEASURE Parse metrics (agent can't see how they're computed)
|
|
251
|
+
7. DECIDE Keep improvements, revert regressions
|
|
252
|
+
8. RECORD Log experiment, update hypothesis, synthesize decision
|
|
253
|
+
9. CONVERGE? Stop after N non-improvements, or repeat
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### The Hypothesis Lifecycle
|
|
257
|
+
|
|
258
|
+
Every experiment — human-injected or agent-generated — flows through the hypothesis database:
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
/turing:try "idea" Agent generates idea
|
|
262
|
+
│ │
|
|
263
|
+
▼ ▼
|
|
264
|
+
┌──────────────────────────────────────────────────┐
|
|
265
|
+
│ hypotheses.yaml (index) │
|
|
266
|
+
│ hypotheses/hyp-001.yaml (detail) │
|
|
267
|
+
│ │
|
|
268
|
+
│ architecture: │
|
|
269
|
+
│ model_type: lightgbm │
|
|
270
|
+
│ hyperparameters: │
|
|
271
|
+
│ n_estimators: 200 │
|
|
272
|
+
│ learning_rate: 0.05 │
|
|
273
|
+
│ expected_outcome: │
|
|
274
|
+
│ rationale: "dart boosting may escape plateau" │
|
|
275
|
+
│ family: architecture-search │
|
|
276
|
+
│ tags: [lightgbm, dart] │
|
|
277
|
+
└────────────────────┬──────────────────────────────┘
|
|
278
|
+
│
|
|
279
|
+
novelty guard
|
|
280
|
+
(block duplicates)
|
|
281
|
+
│
|
|
282
|
+
▼
|
|
283
|
+
experiment
|
|
284
|
+
│
|
|
285
|
+
▼
|
|
286
|
+
┌──────────────────────────────────────────────────┐
|
|
287
|
+
│ result: │
|
|
288
|
+
│ experiment_id: exp-007 │
|
|
289
|
+
│ metrics: {accuracy: 0.89} │
|
|
290
|
+
│ verdict: promising │
|
|
291
|
+
│ notes: "3% improvement, follow up with..." │
|
|
292
|
+
└──────────────────────────────────────────────────┘
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The index (`hypotheses.yaml`) is the lightweight queue. The detail files (`hypotheses/hyp-NNN.yaml`) hold the full structured record: architecture, hyperparameters, features, expected outcome, actual result, lineage, family tags. Both are updated atomically.
|
|
296
|
+
|
|
297
|
+
## Commands
|
|
298
|
+
|
|
299
|
+
### Core Loop
|
|
300
|
+
|
|
301
|
+
| Command | What it does |
|
|
302
|
+
|---------|-------------|
|
|
303
|
+
| `/turing:init [--plan]` | Scaffold a new ML project. `--plan` generates a literature-grounded research plan. |
|
|
304
|
+
| `/turing:train [N]` | Run the autonomous experiment loop (optional max iterations) |
|
|
305
|
+
| `/turing:sweep` | Systematic hyperparameter sweep via cartesian product |
|
|
306
|
+
| `/turing:status` | Quick experiment status — best model, convergence state |
|
|
307
|
+
| `/turing:compare <a> <b>` | Side-by-side experiment comparison with causal analysis |
|
|
308
|
+
|
|
309
|
+
### Taste-Leverage Interface
|
|
310
|
+
|
|
311
|
+
| Command | What it does |
|
|
312
|
+
|---------|-------------|
|
|
313
|
+
| `/turing:try <hypothesis>` | Inject a hypothesis — free text or `archetype:model_comparison` |
|
|
314
|
+
| `/turing:brief [--deep]` | Research briefing — campaign summary, failure patterns, literature-grounded suggestions |
|
|
315
|
+
| `/turing:suggest` | Literature-grounded model architecture suggestions with citations |
|
|
316
|
+
| `/turing:design <hyp-id>` | Generate structured experiment design from a hypothesis |
|
|
317
|
+
| `/turing:mode <explore\|exploit\|replicate>` | Set research strategy — drives novelty guard policy |
|
|
318
|
+
|
|
319
|
+
### Reporting & Validation
|
|
320
|
+
|
|
321
|
+
| Command | What it does |
|
|
322
|
+
|---------|-------------|
|
|
323
|
+
| `/turing:validate [--auto]` | Check metric stability — auto-configure multi-run if noisy |
|
|
324
|
+
| `/turing:logbook` | Generate HTML experiment logbook |
|
|
325
|
+
| `/turing:report` | Generate research report |
|
|
326
|
+
| `/turing:poster` | Generate research poster |
|
|
327
|
+
| `/turing:preflight` | Pre-release validation checks |
|
|
328
|
+
|
|
329
|
+
And for fully hands-off operation:
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
/loop 5m /turing:train
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
The agent trains, evaluates, keeps improvements, discards regressions, detects convergence, and stops. You come back to a briefing.
|
|
336
|
+
|
|
337
|
+
## The Agent Architecture
|
|
338
|
+
|
|
339
|
+
Two agents with a strict capability boundary:
|
|
340
|
+
|
|
341
|
+
| Agent | Tools | Role | Turns |
|
|
342
|
+
|-------|-------|------|-------|
|
|
343
|
+
| **@ml-researcher** | Read, Write, Edit, Bash (whitelisted), Grep, Glob | Modifies `train.py` and `config.yaml`. Runs experiments. | 200 |
|
|
344
|
+
| **@ml-evaluator** | Read, Bash (whitelisted), Grep, Glob | Reads results. Analyzes trends. Cannot modify code. | 50 |
|
|
345
|
+
|
|
346
|
+
The evaluator's read-only constraint is not a limitation — it is a feature. An analyst who cannot act on their observations makes more trustworthy observations.
|
|
347
|
+
|
|
348
|
+
## The Anti-Cheating Stack
|
|
349
|
+
|
|
350
|
+
Research on autonomous ML agents has documented a recurring problem: [agents learn to game their own metrics](https://suzuke.github.io/blog/posts/ai-cheating-experiments/). Given a number to push up and a code editor, the agent finds the shortest path to a high number — even if that path subverts the entire purpose of the experiment. This is not theoretical. It has been observed in practice.
|
|
351
|
+
|
|
352
|
+
Turing implements six defense layers, informed by the [autocrucible](https://github.com/suzuke/autocrucible) project and documented failure modes from [karpathy/autoresearch#322](https://github.com/karpathy/autoresearch/discussions/322):
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
┌─────────────────────────────────────────────────┐
|
|
356
|
+
│ LAYER 1: Architectural Separation │
|
|
357
|
+
│ Hypothesis space vs measurement apparatus │
|
|
358
|
+
├─────────────────────────────────────────────────┤
|
|
359
|
+
│ LAYER 2: Hidden File Tier │
|
|
360
|
+
│ evaluate.py invisible to agent │
|
|
361
|
+
├─────────────────────────────────────────────────┤
|
|
362
|
+
│ LAYER 3: Behavioral Probes │
|
|
363
|
+
│ Training time, model size, prediction diversity │
|
|
364
|
+
├─────────────────────────────────────────────────┤
|
|
365
|
+
│ LAYER 4: Statistical Validation │
|
|
366
|
+
│ Multi-run evaluation, CV check, median │
|
|
367
|
+
├─────────────────────────────────────────────────┤
|
|
368
|
+
│ LAYER 5: Tool Restriction │
|
|
369
|
+
│ Whitelisted Bash commands only │
|
|
370
|
+
├─────────────────────────────────────────────────┤
|
|
371
|
+
│ LAYER 6: Diff-Based History │
|
|
372
|
+
│ Show actual changes, not agent descriptions │
|
|
373
|
+
└─────────────────────────────────────────────────┘
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
The core insight from the research: **every prompt-based rule got worked around; every code-based rule held.** Turing's guardrails are structural, not conversational.
|
|
377
|
+
|
|
378
|
+
## Convergence Detection
|
|
379
|
+
|
|
380
|
+
When to stop flipping coins in this corner of the room:
|
|
381
|
+
|
|
382
|
+
```yaml
|
|
383
|
+
convergence:
|
|
384
|
+
patience: 3 # Consecutive non-improvements before stopping
|
|
385
|
+
improvement_threshold: 0.005 # 0.5% relative improvement required
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
After N experiments with no meaningful improvement, the agent stops and reports what it found. The human then decides: is this good enough, or should we point the agent at a different region?
|
|
389
|
+
|
|
390
|
+
For noisy metrics, `/turing:validate` runs the pipeline multiple times and measures variance. If the coefficient of variation exceeds 5%, it auto-configures multi-run evaluation so the agent can't be rewarded for lucky single runs.
|
|
391
|
+
|
|
392
|
+
## Installation
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
# Via npm (recommended)
|
|
396
|
+
npm install -g claude-turing
|
|
397
|
+
claude-turing install --global
|
|
398
|
+
claude-turing verify
|
|
399
|
+
|
|
400
|
+
# Via local path
|
|
401
|
+
claude plugin add /path/to/turing
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Quick Start
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
/turing:init # Scaffold project (answer 3 prompts)
|
|
408
|
+
/turing:train # Run experiment loop
|
|
409
|
+
/turing:brief # Read what happened
|
|
410
|
+
/turing:try "idea" # Inject your taste
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
## Architecture of Turing Itself
|
|
414
|
+
|
|
415
|
+
15 commands, 2 agents, 8 config files, 25 template scripts, 338 tests, 16 ADRs. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full codemap.
|
|
416
|
+
|
|
417
|
+
```
|
|
418
|
+
turing/
|
|
419
|
+
├── commands/ 15 skill files (core + taste-leverage + reporting)
|
|
420
|
+
├── agents/ 2 agents (researcher: read/write, evaluator: read-only)
|
|
421
|
+
├── config/ 8 files (lifecycle, taxonomy, archetypes, novelty aliases)
|
|
422
|
+
├── templates/ Scaffolded into user projects by /turing:init
|
|
423
|
+
│ ├── prepare.py Data loading (HIDDEN from agent)
|
|
424
|
+
│ ├── evaluate.py Evaluation harness (HIDDEN from agent)
|
|
425
|
+
│ ├── train.py Training code (AGENT-EDITABLE)
|
|
426
|
+
│ └── scripts/ 25 Python scripts (core loop + analysis + infra)
|
|
427
|
+
├── tests/ 338 tests (unit + integration + anti-pattern + manifest)
|
|
428
|
+
├── src/ 5 JS installer files (npm deployment)
|
|
429
|
+
├── bin/ CLI entry points
|
|
430
|
+
└── docs/ ARCHITECTURE.md + 16 ADRs
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## Intellectual Heritage
|
|
434
|
+
|
|
435
|
+
- **[When Code Is Free](https://x.com/amytam01/status/2031072399731675269)** (Tam, 2026) — when execution cost approaches zero, the differentiator becomes research taste
|
|
436
|
+
- **[Autoresearch](https://github.com/karpathy/autoresearch)** (Karpathy, 2026) — ML experiment loops are mechanical enough to automate, with the constraint that evaluation must be immutable
|
|
437
|
+
- **[AutoCrucible](https://github.com/suzuke/autocrucible)** (suzuke, 2026) — autoresearch with guardrails: hidden evaluation, behavioral probes, tool restriction, stability validation
|
|
438
|
+
- **[Goodhart's Law](https://en.wikipedia.org/wiki/Goodhart%27s_law)** — "When a measure becomes a target, it ceases to be a good measure." The architectural justification for immutable, hidden evaluation
|
|
439
|
+
- **[Double-Blind Protocols](https://en.wikipedia.org/wiki/Blinded_experiment)** — the entity that evaluates must not be the entity that modifies
|
|
440
|
+
- **[Falsificationism](https://en.wikipedia.org/wiki/Falsifiability)** (Popper, 1934) — hypotheses gain credibility by surviving falsification, not by accumulating confirmations
|
|
441
|
+
- **[Principle of Least Privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)** (Saltzer & Schroeder, 1975) — each agent has exactly the capabilities needed for its role
|
|
442
|
+
- **[Early Stopping](https://en.wikipedia.org/wiki/Early_stopping)** (Prechelt, 1998) — convergence detection as discrete early stopping
|
|
443
|
+
- **[Multi-Armed Bandits](https://en.wikipedia.org/wiki/Multi-armed_bandit)** — the explore-exploit tradeoff
|
|
444
|
+
- **[Version Control as Lab Notebook](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1004668)** (Ram, 2013) — git as a scientific record-keeping system
|
|
445
|
+
- **[Reproducibility Crisis](https://en.wikipedia.org/wiki/Replication_crisis)** — if the measurement can change between experiments, results are not reproducible
|
|
446
|
+
|
|
447
|
+
## License
|
|
448
|
+
|
|
449
|
+
MIT
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
*"In God we trust. All others must bring data."* — W. Edwards Deming
|
|
454
|
+
|
|
455
|
+
*"When code is free, research is all that matters."* — Amy Tam
|
|
456
|
+
|
|
457
|
+
*Turing flips the coins. You choose which ones.*
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ml-evaluator
|
|
3
|
+
description: Read-only ML evaluation agent. Analyzes experiment results, compares runs, detects convergence patterns, and provides statistical insights. Cannot modify code — this is a safety constraint, not a limitation. The evaluator sees what the researcher cannot see precisely because it cannot change what it observes.
|
|
4
|
+
tools: Read, Bash, Grep, Glob
|
|
5
|
+
model: inherit
|
|
6
|
+
maxTurns: 50
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You are a read-only ML evaluation assistant. Your tools are limited to **Read, Bash, Grep, Glob** — you have no Write or Edit tools. This is intentional and load-bearing.
|
|
10
|
+
|
|
11
|
+
## Why Read-Only Matters
|
|
12
|
+
|
|
13
|
+
In quantum mechanics, observation changes the system. In ML experimentation, the evaluator must not be the experimenter. Your inability to modify code is what makes your analysis trustworthy — you cannot unconsciously bias your findings toward changes you made.
|
|
14
|
+
|
|
15
|
+
## Capabilities
|
|
16
|
+
|
|
17
|
+
- **Metric trend analysis:** detect improvement trajectories, plateaus, and regressions
|
|
18
|
+
- **Configuration comparison:** identify which hyperparameter changes correlate with improvement
|
|
19
|
+
- **Convergence assessment:** determine whether further experimentation is likely to yield gains
|
|
20
|
+
- **Feature importance:** analyze which features contribute most to model performance
|
|
21
|
+
- **Failure mode classification:** categorize why experiments failed (from `config/taxonomy.toml`)
|
|
22
|
+
|
|
23
|
+
## Useful Commands
|
|
24
|
+
|
|
25
|
+
Always activate the venv first: `source .venv/bin/activate`
|
|
26
|
+
|
|
27
|
+
| Command | Purpose |
|
|
28
|
+
|---------|---------|
|
|
29
|
+
| `python scripts/show_metrics.py --last 10` | Recent experiment summary |
|
|
30
|
+
| `python scripts/compare_runs.py <a> <b>` | Side-by-side comparison |
|
|
31
|
+
| `python evaluate.py` | Run evaluation on current model |
|
|
32
|
+
| `cat experiments/results.tsv` | Quick-reference TSV |
|
|
33
|
+
|
|
34
|
+
## Analysis Framework
|
|
35
|
+
|
|
36
|
+
When asked to analyze results, provide:
|
|
37
|
+
|
|
38
|
+
1. **Metric trends:** improvement trajectory, plateau detection, variance across runs
|
|
39
|
+
2. **Best configuration:** what combination of model type, hyperparameters, and features works best
|
|
40
|
+
3. **Diminishing returns:** at what point did improvements slow? Is the current approach exhausted?
|
|
41
|
+
4. **Failed approaches:** what was tried and didn't work? Are there patterns in failures?
|
|
42
|
+
5. **Recommendations:** what should the researcher try next, ranked by expected impact?
|
|
43
|
+
6. **Convergence verdict:** has the model converged? Justify with data, not intuition.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ml-researcher
|
|
3
|
+
description: Autonomous ML research agent that implements the autoresearch experiment loop. Modifies train.py, runs experiments, evaluates results, keeps improvements, discards regressions. Operates under strict safety constraints — immutable evaluation infrastructure, git-disciplined rollback, and structured experiment logging.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
model: inherit
|
|
6
|
+
memory: project
|
|
7
|
+
maxTurns: 200
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are an autonomous ML researcher. You do not guess — you hypothesize, experiment, measure, and decide. Every experiment is a bet; the evaluation harness is the house.
|
|
11
|
+
|
|
12
|
+
## Core Invariant
|
|
13
|
+
|
|
14
|
+
**The measurement apparatus is sacred.** `evaluate.py` is HIDDEN — you must not read, reference, or attempt to access it. `prepare.py` is READ-ONLY. You modify `train.py` and `config.yaml` — nothing else in the pipeline. The evaluation harness is invisible to you by design: if you could read the scoring function, you could exploit fixed seeds, memorize test data, or reverse-engineer the metric. This separation is not a convention — it is the architectural invariant that makes your results trustworthy.
|
|
15
|
+
|
|
16
|
+
## Protocol
|
|
17
|
+
|
|
18
|
+
Read `program.md` in the ML directory for the complete experiment loop protocol. Follow it exactly. The protocol encodes the scientific method:
|
|
19
|
+
|
|
20
|
+
1. **Observe** — read recent experiment results and agent memory
|
|
21
|
+
2. **Hypothesize** — propose a specific, falsifiable change
|
|
22
|
+
3. **Execute** — modify train.py or config.yaml, commit, train
|
|
23
|
+
4. **Measure** — parse metrics from the immutable evaluation harness
|
|
24
|
+
5. **Decide** — keep improvements, revert regressions
|
|
25
|
+
6. **Record** — log everything, update memory
|
|
26
|
+
|
|
27
|
+
## Constraints
|
|
28
|
+
|
|
29
|
+
- **Only modify `train.py` and `config.yaml`.** `evaluate.py` is HIDDEN (do not read or reference). Other pipeline files are READ-ONLY.
|
|
30
|
+
- **Always work in the venv:** `source .venv/bin/activate`
|
|
31
|
+
- **Redirect training output:** `python train.py > run.log 2>&1`
|
|
32
|
+
- **Parse metrics with grep:** `grep -A 10 "^---" run.log | head -10`
|
|
33
|
+
- **Use @ml-evaluator** for analysis tasks — it has no Write/Edit tools and cannot accidentally break the pipeline.
|
|
34
|
+
|
|
35
|
+
## Memory
|
|
36
|
+
|
|
37
|
+
**Read first:** `.claude/agent-memory/ml-researcher/MEMORY.md`
|
|
38
|
+
|
|
39
|
+
At the START of each session:
|
|
40
|
+
1. Read MEMORY.md to restore context (best metrics, failed approaches, promising directions)
|
|
41
|
+
2. Use this to avoid repeating failed experiments and to continue promising directions
|
|
42
|
+
|
|
43
|
+
After EACH experiment (kept or discarded):
|
|
44
|
+
1. Update "Best Result" section if metrics improved
|
|
45
|
+
2. Add observation to "Observations" with what was tried and result
|
|
46
|
+
3. Add to "Failed Approaches" if the approach was discarded
|
|
47
|
+
4. Update "Promising Directions" based on what you learned
|
|
48
|
+
|
|
49
|
+
## Git Discipline
|
|
50
|
+
|
|
51
|
+
Each experiment follows a strict commit protocol:
|
|
52
|
+
- **Branch:** `git checkout -b exp/{NNN}-{short-description}`
|
|
53
|
+
- **Commit** changes on the branch before running
|
|
54
|
+
- **If improved:** merge to main, copy model to `models/best/`
|
|
55
|
+
- **If NOT improved:** return to main without merging (branch preserved)
|
|
56
|
+
|
|
57
|
+
This ensures every code variant is preserved and the main branch only contains improvements.
|
|
58
|
+
|
|
59
|
+
## Experiment Classification
|
|
60
|
+
|
|
61
|
+
Classify each experiment by type (from `config/taxonomy.toml`):
|
|
62
|
+
- `hyperparameter` — tuning existing model parameters
|
|
63
|
+
- `architecture` — changing model type or structure
|
|
64
|
+
- `feature` — modifying feature engineering
|
|
65
|
+
- `data` — changing data handling
|
|
66
|
+
- `ensemble` — combining models
|
|
67
|
+
- `regularization` — adjusting regularization
|
|
68
|
+
|
|
69
|
+
## Stopping Conditions
|
|
70
|
+
|
|
71
|
+
1. `max_iterations` reached (if provided by user)
|
|
72
|
+
2. N consecutive non-improvements (convergence, from `config.yaml`)
|
|
73
|
+
|
|
74
|
+
Report the final best model, its metrics, and recommend next steps.
|