Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
99391d8
feat: extend deps for verifier runner
Fosowl Jun 9, 2026
da79379
udpate
Fosowl Jun 10, 2026
30f0c14
fix(workflow factory): max_tokens set to 16384 to avoid max token crash
Fosowl Jun 11, 2026
b2da8c7
feat(orchestrator): test main
Fosowl Jun 11, 2026
2b1ab46
feat(verifier): shorter prompt gradient
Fosowl Jun 11, 2026
2878c02
feat(qd): centered failure-fingerprint descriptor for QD novelty
Fosowl Jun 11, 2026
9d7c904
fix (smolagent_module): parse_memory_output empty string
Fosowl Jun 11, 2026
559f534
fix(onboard_cli): robust LLM JSON parsing + gibberish-tolerant prompts
Fosowl Jun 12, 2026
39ad2cd
fix(cli): harden evaluation_cli and memory_chat_cli error handling
Fosowl Jun 12, 2026
60da1f0
feat(cli's): improved input error handling for all cli
Fosowl Jun 12, 2026
59d6493
rm : notes file
Fosowl Jun 13, 2026
7eca670
logs: edit log style ; docs: edit docstring ; feat: don't evaluate on…
Fosowl Jun 15, 2026
13b3a63
merge
Fosowl Jun 15, 2026
a0f9f9d
feat(workflow_factory,llm_provider): pick random workflow temperature…
Fosowl Jun 15, 2026
159bb70
fix: bug
Fosowl Jun 15, 2026
94a81fe
feat : reduce temp for verifier
Fosowl Jun 15, 2026
ac38c57
docs: ensure 3.12 runner specification
Fosowl Jun 15, 2026
f1bdcdd
feat(workflow_runner): install workflow deps into a managed venv inst…
Fosowl Jun 15, 2026
43cf45d
feat(workflow runner): venv
Fosowl Jun 15, 2026
5f47917
feat(evolution_tree): render per-goal trees into workflow folders
Fosowl Jun 13, 2026
45d2681
gerge branch 'mimosa_v2' of github.com:HolobiomicsLab/Mimosa-AI into …
Fosowl Jun 15, 2026
c9082a9
feat(smolagent): additional_authorized_imports change
Fosowl Jun 15, 2026
5f936b8
fix: reduce crossover rate
Fosowl Jun 15, 2026
6807c2e
refactor(variation_engine): replace embedding stagnation with plateau…
Fosowl Jun 15, 2026
bdf45a2
feat(verifier): bounded retry on verifier-side failures + per-claim f…
Fosowl Jun 15, 2026
c1b00b2
gerge branch 'claude/serene-cartwright-ca14ba' into mimosa_v2
Fosowl Jun 15, 2026
0c31897
rm : __name__ unused
Fosowl Jun 15, 2026
f03c99b
feat(selection,qd): genotype-embedding novelty + length penalty
Fosowl Jun 15, 2026
e495a8f
docs : simplify docstring
Fosowl Jun 15, 2026
ee4f248
fix(verifier): don't pass error to report so it don't propagate to gr…
Fosowl Jun 15, 2026
af0ca20
refactor: config comment
Fosowl Jun 17, 2026
e1a0bc5
docs: sync multi-agent evolution claims with code
Fosowl Jun 17, 2026
a129aa5
fix(eval): csv recovery prompts now honour the value the user typed
Fosowl Jun 17, 2026
ce0edba
gerge branch 'claude/practical-pike-ebb790' into mimosa_v2
Fosowl Jun 17, 2026
f62517c
docs: build site with --no-directory-urls for local viewing
Fosowl Jun 17, 2026
8ded885
gerge branch 'claude/jolly-chebyshev-3fc44e' into mimosa_v2
Fosowl Jun 17, 2026
48ca06b
feat(verifier): per-claim scripts use AST, file-first, vacuous-antece…
Fosowl Jun 17, 2026
6966618
feat(verifier): Source B extracts literal identifiers from goal body
Fosowl Jun 17, 2026
fd75545
feat(verifier): Source E flags dataset-sentinel leakage in selection …
Fosowl Jun 17, 2026
b7e089b
feat(verifier): per-claim scripts reject vacuous min/max on sentinel …
Fosowl Jun 17, 2026
3ef5034
feat(verifier): Source C scans image artefacts with PIL
Fosowl Jun 17, 2026
333fb34
feat(grounding): extract targeted literature sub-searches
Fosowl Jun 17, 2026
9b8ef6a
refactor(grounding): drop regex cues; instruct retriever to plan mult…
Fosowl Jun 17, 2026
54fb372
gerge branch 'claude/blissful-cray-d6bc12' into mimosa_v2
Fosowl Jun 17, 2026
a8a36a7
fix (execution sandbox): truncated stdout of script
Fosowl Jun 17, 2026
2ed7454
gerge branch 'mimosa_v2' of github.com:HolobiomicsLab/Mimosa-AI into …
Fosowl Jun 17, 2026
898260c
rm : run analysis files
Fosowl Jun 17, 2026
601bdf6
feat(verifier) : edit prompt
Fosowl Jun 17, 2026
c187513
feat : edit test prompt
Fosowl Jun 18, 2026
60b44ee
feat : change max steps for agent to 129
Fosowl Jun 19, 2026
45270d7
feat(verifier): files selection based on non-binaryness+root relative…
Fosowl Jun 19, 2026
1dc7a21
feat (verifier ): change importance claims prompt
Fosowl Jun 19, 2026
0a94d14
feat(verifiers): remove cheat penalty
Fosowl Jun 20, 2026
023f095
docs: remove cheat penalty mentions
Fosowl Jun 20, 2026
a23f432
docs: purge remaining cheat wording
Fosowl Jun 20, 2026
deb9164
refactor: remove unused method/comment
Fosowl Jun 20, 2026
7481520
gerge branch 'claude/busy-gagarin-9e1a28' into mimosa_v2
Fosowl Jun 20, 2026
8f8374c
refactor(verifier): simplify code
Fosowl Jun 20, 2026
59f66c5
refactor(verifier): drop information bonus from scoring
Fosowl Jun 20, 2026
f7e7728
refactor: docstring of abstracted_textual_gradient
Fosowl Jun 20, 2026
efe86f0
gerge branch 'claude/hungry-ride-c71428' into mimosa_v2
Fosowl Jun 20, 2026
a5177dc
refactor(verifier): split claim-source prompts into registry module
Fosowl Jun 20, 2026
bd3156a
gerge branch 'claude/hungry-ride-c71428' into mimosa_v2
Fosowl Jun 20, 2026
4fe8365
refactor(evaluators*): refactor evaluator code for maintanability
Fosowl Jun 20, 2026
2871f46
refactor: let error be handled by verifier build in catch
Fosowl Jun 20, 2026
851066e
refactor: move sources/core/evaluators/* sources/evaluators/
Fosowl Jun 20, 2026
3d95c43
refactor: rename evaluation folder to benchmark_evaluation
Fosowl Jun 20, 2026
781153a
feat : slighter persona for variation engine + refactor verifier code
Fosowl Jun 20, 2026
2fcd0e1
feat (variation_engine): mutation driven by intermediary diagnosis
Fosowl Jun 20, 2026
9e09a73
rfactor(verifier): RECOVERY_PROMPT_RULES shorten+rename file
Fosowl Jun 20, 2026
837081a
feat(verifier): invalidate stale anchor claims and regen vs current w…
Fosowl Jun 20, 2026
26da91c
fix: import
Fosowl Jun 20, 2026
34d24d0
gerge branch 'claude/upbeat-diffie-d3987b' into mimosa_v2
Fosowl Jun 20, 2026
fe4de59
feat (verifier): specify error handling in prompt btter
Fosowl Jun 20, 2026
b9e09ea
audit(run_2/mat_diffusion): seed-anchored verifier prevents evolution…
Fosowl Jun 21, 2026
71d47a6
refactor(verifier): replace seed-anchored cache with per-(task,source…
Fosowl Jun 21, 2026
644d8e7
feat (variation_engine): change llm_think_mutation_directive prompt ;…
Fosowl Jun 21, 2026
86073cf
rm: audit files
Fosowl Jun 22, 2026
2f2ff79
feat(precheck): let first-party openrouter endpoints bypass the fp8 q…
Fosowl Jun 22, 2026
aae6335
feat: pass goal to verifier generator
Fosowl Jun 22, 2026
6ce2a26
audit(run_3/clintox): verifier-cache fix landed; SR still blocked dow…
Fosowl Jun 22, 2026
80987ae
fix : memory timelapse
Fosowl Jun 22, 2026
37ed1c5
rm audit
Fosowl Jun 22, 2026
02efaa2
fix: anthropic crash on temp > 1
Fosowl Jun 22, 2026
e1f4145
Merge branch 'mimosa_v2' of github.com:HolobiomicsLab/Mimosa-AI into …
Fosowl Jun 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,10 @@ Five layers, wired through small dataclass schemas — full details in [`docs/co

Workflows are **full Python programs**, mutated as source code. The **code-as-genotype** is the workflow file; the phenotype is whatever it produces in the workspace.

- **Selection: Quality-Diversity archive** (**MAP-Elites**-style) — max population of 50, `qd_score = (1−w)·quality + w·novelty` (`w=0.4`). **Novelty search** uses k-NN distance (`k=25`) over a **behaviour descriptor** `[n_agents, n_edges, n_branches, prompt_chars]`. Parents drawn by inverse-child-count roulette so the archive spreads.
- **Variation: stagnation-driven scope** — mutation boldness is a continuous function of how much the last 4 prompt gradients repeat themselves. Near-winners stay protected. Scope bands run from "prompt-only tweak" to "complete topology rethink."
- **Crossover** — ~30 % of generations combine two parents, strongest-first.
- **Cold start** — when the archive is empty, a similarity-filtered scan of past runs on disk (MiniLM cosine ≥ 0.5) seeds the search. Useful workflows transfer across tasks.
- **Selection: Quality-Diversity archive** (**MAP-Elites**-style) — max population of 50, `qd_score = (1−w)·quality + w·novelty` (`w = novelty_weight = 0.25`). **Novelty search** uses k-NN distance (`k = 15`) over the **failure-fingerprint** behaviour descriptor — a 6-D vector of centered per-source pass rates from the verifier (sources A–F). Parents drawn by inverse-child-count roulette so the archive spreads (`MAX_CHILDREN_PER_PARENT = 2`).
- **Variation: Rechenberg-1/5 + plateau-driven scope** — mutation boldness blends the success rate of the last 5 scored offspring (Rechenberg 1/5 rule, threshold `0.20`) with an `iters_since_improvement` plateau counter (patience `6`). Near-winners (parent score > 0.95) get a damper. Scope bands run from `EXPLOITATION` (point mutation) to `RE-SPECIATION` (clean-slate redesign), gated by an effective-boldness threshold (`< 0.35 / 0.50 / 0.65 / 0.90 / 1.01`).
- **Crossover** — by default ~10 % of generations combine two parents, strongest-first, with offspring hard-capped at the highest parent agent count.
- **Cold start** — when the archive is empty, a similarity-filtered scan of past runs on disk (MiniLM cosine ≥ 0.8) seeds the search. Useful workflows transfer across tasks.

Full mechanics: [`docs/concepts/evolution-engine.md`](./docs/concepts/evolution-engine.md).

Expand Down
41 changes: 34 additions & 7 deletions config.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,18 @@ class Config:
def __init__(self):

# workspace configuration
self.workspace_dir = "/Users/cnrs/Documents/repository/Toolomics/workspace"
self.workspace_dir = "/Users/mlg/Documents/CNRS/toolomics/workspace"

# MCPs server discovery
self.discovery_addresses: list[AddressMCP] = [
AddressMCP(ip="0.0.0.0", port_min=5000, port_max=5100)
AddressMCP(ip="0.0.0.0", port_min=5000, port_max=5200)
]

# LLMs choices
self.planner_llm_model: str = "openrouter/z-ai/glm-5.1"
self.workflow_llm_model: str = "openrouter/z-ai/glm-5.1"
self.smolagent_model_id: str = "openrouter/deepseek/deepseek-v3.2"
self.judge_model = "openrouter/minimax/minimax-m3"
self.smolagent_model_id: str = "openrouter/qwen/qwen3.5-122b-a10b"
self.judge_model = "openrouter/deepseek/deepseek-v4-flash"
self.capsule_namer_model = "openrouter/deepseek/deepseek-v4-flash"
self.engine_name: str = "litellm" # for smolagent

Expand All @@ -69,10 +69,19 @@ def __init__(self):

# learning parameters
self.learned_score_threshold = 0.94
self.max_learning_evolve_iterations = 35
self.max_learning_evolve_iterations = 10

# QD novelty + length penalty (open-ended modes)
# "archive_knn" (default) or "k-NN archive"
self.novelty_comparison: str = "archive_knn"
self.novelty_previous_n: int = 5
# Length penalty: genotype size at which the penalty starts to
# grow; lambda is small so it only breaks near-ties.
self.length_penalty_baseline_chars: int = 8000
self.length_penalty_lambda: float = 0.05

# evaluation concurrency settings
self.max_concurrent_eval_tasks: int = 2 # Number of concurrent tasks for CSV evaluation mode
self.max_concurrent_eval_tasks: int = 1 # Number of concurrent tasks for CSV evaluation mode

# folder paths for workflow pre-defined code
self.schema_code_path: str = "sources/modules/state_schema.py"
Expand All @@ -97,7 +106,7 @@ def __init__(self):
self.openrouter_quantizations_by_model: dict[str, list[str] | None] = {}
self.default_openrouter_quantizations: list[str] = ["bf16", "fp16", "fp8"]
# runner settings
self.runner_default_python_version: str = "3.10"
self.runner_default_python_version: str = "3.12"
self.runner_default_timeout: int = 10800
# Per-agent (SmolAgentFactory) execution timeout in seconds. Injected into
# the generated workflow as AGENT_EXECUTION_TIMEOUT. 3600 = 1 hour.
Expand Down Expand Up @@ -215,6 +224,10 @@ def jsonify(
"max_tokens": self.max_tokens,
"learned_score_threshold": self.learned_score_threshold,
"max_learning_evolve_iterations": self.max_learning_evolve_iterations,
"novelty_comparison": self.novelty_comparison,
"novelty_previous_n": self.novelty_previous_n,
"length_penalty_baseline_chars": self.length_penalty_baseline_chars,
"length_penalty_lambda": self.length_penalty_lambda,
"schema_code_path": self.schema_code_path,
"smolagent_factory_code_path": self.smolagent_factory_code_path,
"runs_capsule_dir": self.runs_capsule_dir,
Expand Down Expand Up @@ -257,6 +270,16 @@ def from_json(self, data: dict[str, Any]) -> None:
self.max_learning_evolve_iterations = data.get(
"max_learning_evolve_iterations", self.max_learning_evolve_iterations
)
self.novelty_comparison = data.get("novelty_comparison", self.novelty_comparison)
self.novelty_previous_n = int(
data.get("novelty_previous_n", self.novelty_previous_n)
)
self.length_penalty_baseline_chars = int(
data.get("length_penalty_baseline_chars", self.length_penalty_baseline_chars)
)
self.length_penalty_lambda = float(
data.get("length_penalty_lambda", self.length_penalty_lambda)
)
self.schema_code_path = data.get("schema_code_path", self.schema_code_path)
self.smolagent_factory_code_path = data.get(
"smolagent_factory_code_path", self.smolagent_factory_code_path
Expand Down Expand Up @@ -319,6 +342,10 @@ def __str__(self) -> str:
lines.append(f" max_tokens={self.max_tokens}")
lines.append(f" learned_score_threshold={self.learned_score_threshold}")
lines.append(f" max_learning_evolve_iterations={self.max_learning_evolve_iterations}")
lines.append(f" novelty_comparison={self.novelty_comparison}")
lines.append(f" novelty_previous_n={self.novelty_previous_n}")
lines.append(f" length_penalty_baseline_chars={self.length_penalty_baseline_chars}")
lines.append(f" length_penalty_lambda={self.length_penalty_lambda}")
lines.append(f" max_concurrent_eval_tasks={self.max_concurrent_eval_tasks}")
lines.append(f" schema_code_path={self.schema_code_path}")
lines.append(f" smolagent_factory_code_path={self.smolagent_factory_code_path}")
Expand Down
69 changes: 36 additions & 33 deletions docs/DEVELOPER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ mimosa-ai/
│ │ ├── selection.py # SelectionPressure (greedy/tournament/novelty/QD)
│ │ ├── variation_engine.py # Mutation/crossover prompt assembly + annealing
│ │ ├── workflow_selection.py # Parent retrieval (archive draw / disk scan)
│ │ ├── code_features.py # AST → behaviour descriptor (4-vector)
│ │ ├── failure_fingerprint.py # Verifier verdicts → QD behaviour descriptor (6-D, centered)
│ │ ├── code_features.py # Legacy structural descriptor (offline analysis only)
│ │ ├── lineage.py # parent → child sidecar records
│ │ ├── orchestrator.py # Grounding → factory → sandbox pipeline
│ │ ├── workflow_factory.py # Multi-agent workflow synthesis
Expand Down Expand Up @@ -255,9 +256,9 @@ Each recursive step:
6. selects the next parent(s) and chooses mutation vs crossover,
7. recurses.

Termination: `overall_score > learned_score_threshold` (default 0.94) in
Termination: `overall_score >= learned_score_threshold` (default 0.9) in
`--learn` mode, or `max_depth` reached
(`max_learning_evolve_iterations`, default 45; single-shot uses
(`max_learning_evolve_iterations`, default 20; single-shot uses
`max_depth=1`).

### 2. `SelectionPressure` — [`sources/core/selection.py`](https://github.com/HolobiomicsLab/Mimosa-AI/blob/main/sources/core/selection.py)
Expand All @@ -277,39 +278,45 @@ penalty `÷(1 + n_children_already)` and a hard
### 3. `VariationEngine` — [`sources/core/variation_engine.py`](https://github.com/HolobiomicsLab/Mimosa-AI/blob/main/sources/core/variation_engine.py)

Prompt assembly for mutation and crossover. Mutation boldness is a
continuous function of two evidence signals — population stagnation
*and* the Rechenberg 1/5 success rate of recent offspring — not a fixed
phase schedule.

- `_compute_stagnation(window=4)` — mean pairwise MiniLM cosine
similarity over the last 4 non-failure prompt gradients, rescaled so
the unrelated baseline (`≈0.4`) maps to `0` and full repetition
(`≥0.8`) maps to `1`.
continuous function of two evidence signals — an
`iters_since_improvement` plateau counter *and* the Rechenberg 1/5
success rate of recent offspring — not a fixed phase schedule.

- `_iters_since_improvement()` — length of the trailing run of scored
offspring that did not strictly beat best-so-far (failures and
unscored entries skipped). Normalised as
`plateau = min(1, iters / _PLATEAU_PATIENCE)` with
`_PLATEAU_PATIENCE = 6`.
- `_compute_success_rate(window=5)` — fraction of the last 5 scored
offspring that strictly beat the running best at production time.
The Rechenberg 1/5 success rule threshold is `0.20`.
- `_get_prompt_step_size(parent_score)` — combines the two:
* cold start (no scored history yet) — `effective = raw_stagnation`,
* `success_rate < 0.20` — `effective = max(raw_stagnation, deficit)`
* cold start (fewer than two comparable scored offspring) —
`effective = 0.3 · plateau` (capped ramp),
* `success_rate < 0.20` — `effective = 0.5 · deficit + 0.5 · plateau`
with `deficit = (0.20 − success_rate) / 0.20` (escalate),
* `success_rate ≥ 0.20` — `effective = raw_stagnation · (1 − progress)`
* `success_rate ≥ 0.20` — `effective = plateau · (1 − progress)`
with `progress = min(1, (success_rate − 0.20) / (0.80 − 0.20))`
(damp boldness in proportion to real progress),
* near-finish floor: when `parent_score > 0.95`, multiply by
`(1 − 0.5 · (parent_score − 0.95) / 0.05)` so a 0.96 parent isn't
gambled away one generation before early-stop.
gambled away one generation before early-stop,
* RE-SPECIATION gate: unless `iters_since_improvement ≥ 8` *and*
`success_rate ∈ {None, 0.0}`, `effective` is clamped to
`_RESPECIATION_CLAMP = 0.89`, just below the EXPLORATION/
RE-SPECIATION boundary at `0.90`.
Then it grows the agent budget from the previous generation's count
toward `max_possible_agents = 7` proportionally to `effective`, and
samples the actual agent count with a Beta-Binomial biased upward by
`effective`.

| Effective boldness | Agent budget | Mutation scope (advisory) |
|--------------------|--------------|-------------------------------------------------------------|
| <0.20 | ≈ current | prompt-only little tweak |
| <0.40 | current+1 | prompt, handoff, tools — improve information flow |
| <0.60 | current+2 | significant redesign while keeping topology |
| <0.80 | current+3 | bold rewire — restructure or grow the agent set |
| ≥0.80 | up to 7 | complete rethink — discard inherited topology / prompts |
| Effective boldness | Mutation scope (advisory) |
|--------------------|-----------------------------------------------------------------------------|
| < 0.35 | `EXPLOITATION` — point mutation: minor phrasing / prompt-adjective tweaks |
| < 0.50 | `ALIGNMENT` — interface optimization: refine handoff prompts, IO contracts |
| < 0.65 | `ADAPTATION` — component overhaul: rewrite lagging agent prompts, swap tools |
| < 0.90 | `EXPLORATION` — macro structural mutation: add/merge agents, change routing |
| ≥ 0.90 | `RE-SPECIATION` — clean-slate redesign of the multi-agent architecture |

Scope is an advisory line injected into the mutation prompt; the LLM
may still pick any topology. The hard control is the agent-count
Expand All @@ -322,7 +329,7 @@ Two-mode parent retrieval:
- **Steady state**: when `selection_pressure._archive` is populated, draws
parents from the live session archive via QD-roulette.
- **Cold start**: empty archive → similarity-filtered disk scan
(`cosine ≥ 0.5` on MiniLM embeddings of `original_task`, `score ≥ 0.05`)
(`cosine ≥ 0.8` on MiniLM embeddings of `original_task`, `score ≥ 0.1`)
routed through the same `select_parents()` weighting.

### 5. `WorkflowOrchestrator` — [`sources/core/orchestrator.py`](https://github.com/HolobiomicsLab/Mimosa-AI/blob/main/sources/core/orchestrator.py)
Expand Down Expand Up @@ -400,7 +407,7 @@ EvolutionEngine.start_workflow_evolution(goal)
├─ SelectionPressure.validate_survivor() → archive admit?
├─ record_lineage()
├─ select next parent (archive QD-roulette)
├─ choose crossover (~0.4 rate, once initial_population met) or mutation
├─ choose crossover (default crossover_rate=0.1, once initial_population met) or mutation
└─ recurse → stop on threshold OR max_depth
WorkspaceManager.restore_best(best_uuid)
Expand Down Expand Up @@ -464,20 +471,16 @@ For each generation:
pre-installed (lazy one-shot install per process). Soft claims get a
`pass/unsure/fail` LLM verdict against workspace previews + literature
grounding (mapped to `1.0 / 0.5 / 0.0`).
3. **Independent cheat detector**: present in the codebase but currently
**disabled** pending a rewrite. The aggregation path still has a slot
for `cheat_penalty`. Behavioral anti-cheat pressure today comes from
Source C's recompute-from-disk verifiers, the inverted-score "Used
fallback" claim type, and the anti-tautology tripwires.
3. **Behavioral pressure against shortcut workflows** comes from Source
C's recompute-from-disk verifiers, the inverted-score "Used fallback"
claim type, and the anti-tautology tripwires.
4. **Aggregation**:
```
overall = clamp(base_mean + info_bonus, 0, 1)
overall = clamp(base_mean, 0, 1)
if any hard claim refuted:
overall = min(overall, 0.99) # _HARD_FAIL_CAP (soft, for now)
overall = max(0, overall - cheat_penalty) # cheat_penalty = 0.0 today
```
where `info_bonus(n_hard_pass) = 0.05 · (1 - exp(-n_hard_pass / 8))`
(saturating reward for thoroughness).
`base_mean` is the importance-weighted mean of per-claim scores.
5. **Prompt gradient** — plain-language single-sentence diagnosis
prefixed with a short code name (e.g. `FALLBACK_ECFP_CLASSIFIER`). It
is the **only** verifier signal the mutator sees, and recent history
Expand Down
13 changes: 7 additions & 6 deletions docs/concepts/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,13 @@ recursively evolves workflows, with help from:
(improvement over baseline or `qd_score > admit_threshold`); capacity is
curated by lowest-`qd_score` eviction.
- **VariationEngine** — assembles mutation or crossover prompts, with an
evidence-driven mutation scope: boldness grows as recent prompt
gradients converge (the offspring keep failing the same way) *and* as
the Rechenberg 1/5 success rate of recent scored offspring drops
below 20 %. A near-finish floor only damps boldness once the parent
score is above 0.95, so near-winners aren't gambled away one
generation before early-stop.
evidence-driven mutation scope: boldness grows with an
`iters_since_improvement` plateau counter (patience `6`) *and* as the
Rechenberg 1/5 success rate of the last 5 scored offspring drops below
20 %. A near-finish floor only damps boldness once the parent score is
above 0.95, so near-winners aren't gambled away one generation before
early-stop. The top `RE-SPECIATION` band is hysteresis-gated and only
opens after `iters_since_improvement ≥ 8` with a zero success rate.
- **WorkflowOrchestrator** — wraps "grounding → factory → sandbox" into one
callable per generation.

Expand Down
Loading