-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathconfig.example.json
More file actions
348 lines (348 loc) · 19.2 KB
/
Copy pathconfig.example.json
File metadata and controls
348 lines (348 loc) · 19.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
{
"schema_version": "1.5.0",
"project": {
"name": "my-app",
"locale": "en",
"timezone": "UTC"
},
"mission": "One sentence: what this project is for and what 'done well' means. The loop drives toward this. Set by /ooda-setup; empty string disables mission-aware scoring.",
"domains": {
"service_health": {
"weight": 2.0,
"state_file": "agent/state/service_health.json",
"primary_skill": "/scan-health",
"chain": [],
"branch_prefix": "auto/scan-health/",
"fallback": true,
"enabled": true,
"status": "active",
"mission_alignment": 1.0
},
"test_coverage": {
"weight": 0.5,
"state_file": "agent/state/test_coverage.json",
"primary_skill": "/check-tests",
"chain": [],
"branch_prefix": "auto/check-tests/",
"fallback": true,
"enabled": true,
"status": "active",
"mission_alignment": 1.0
},
"backlog": {
"weight": 0.3,
"state_file": "agent/state/backlog.json",
"primary_skill": "/plan-backlog",
"chain": [],
"branch_prefix": "auto/plan-backlog/",
"fallback": false,
"enabled": true,
"status": "active",
"mission_alignment": 0.5
},
"business_strategy": {
"weight": 1.0,
"state_file": "agent/state/business_strategy.json",
"primary_skill": "/scan-market",
"chain": [],
"branch_prefix": "auto/scan-market/",
"fallback": true,
"enabled": true,
"status": "available",
"description": "Market research and strategic analysis. Run /ooda-skill create scan-market to configure.",
"mission_alignment": 0.5
},
"ux_evolution": {
"weight": 1.0,
"state_file": "agent/state/ux_evolution.json",
"primary_skill": "/scan-ux",
"chain": [],
"branch_prefix": "auto/scan-ux/",
"fallback": true,
"enabled": true,
"status": "available",
"description": "UX audit and UI analysis. Run /ooda-skill create scan-ux to configure.",
"mission_alignment": 0.5
},
"competitors": {
"weight": 0.3,
"state_file": "agent/state/competitors.json",
"primary_skill": "/scan-competitors",
"chain": [],
"branch_prefix": "auto/scan-competitors/",
"fallback": false,
"enabled": true,
"status": "available",
"description": "Competitor monitoring and intelligence. Run /ooda-skill create scan-competitors to configure.",
"mission_alignment": 0.5
}
},
"domain_dependencies": {},
"implementation": {
"enabled": false,
"weight": 1.5,
"primary_skill": "/dev-cycle",
"observe_loop_escape_bonus": 5.0,
"mission_alignment": 1.0
},
"scoring": {
"staleness_curve": "logarithmic",
"balance_enabled": true,
"balance_weight": 5.0,
"goal_weight": 0.3,
"confidence_weight": 0.2,
"hours_if_never_run": 168,
"implementation_formula": {
"pending_multiplier": 2.0,
"age_multiplier": 0.1,
"rice_multiplier": 0.01,
"open_pr_penalty": -3.0
},
"rice_extensions": {},
"__rice_extensions_doc__": "Optional per-label RICE multipliers applied during action extraction (evolve Step 5), e.g. {\"security\": 2.0, \"chore\": 0.5}. Empty = no extensions.",
"mission_weight": 6.0,
"dry_domain_dampen": 0.3,
"monitor_dry_dampen": 0.6,
"off_mission_threshold": 0.2,
"off_mission_dampen": 0.2
},
"confidence": {
"initial": 0.7,
"merge_boost": 0.1,
"reject_penalty": 0.2,
"min": 0.1,
"max": 1.0,
"observation_micro_adjustments": true
},
"safety": {
"halt_file": "agent/safety/HALT",
"confidence_threshold": 0.6,
"min_cycle_interval_minutes": 30,
"max_prs_per_cycle": 1,
"first_cycle_observe_only": true,
"max_files_per_pr": 20,
"max_lines_per_pr": 500,
"protected_paths": [
"agent/safety/*",
"skills/evolve/*",
"agent/contracts/*"
],
"skill_allowlist": [
"/scan-health",
"/check-tests",
"/plan-backlog",
"/run-deploy",
"/dev-cycle",
"/scan-market",
"/scan-ux",
"/scan-competitors"
],
"lock_timeout_minutes": 30,
"max_chain_depth": 3,
"max_silent_failures": 3,
"generated_file_patterns": [],
"enable_rollback": false,
"enable_auto_merge": false,
"auto_merge_max_files": 5,
"auto_merge_max_lines": 100,
"__auto_merge_doc__": "enable_auto_merge (default false) is the SINGLE opt-in switch for autonomous merging. When true AND level>=3, evolve auto-merges ONLY low-risk PRs: no protected paths, files <= auto_merge_max_files, lines <= auto_merge_max_lines, and tests green. Everything else stays a Draft PR you merge by hand. Auto-merge takes a pre-action checkpoint and auto-reverts + HALTs on a failed post-merge health check (it forces enable_rollback behavior). Off by default: you stay in command unless you flip this.",
"risk_rules": []
},
"progressive_complexity": {
"current_level": 0,
"levels": {
"0": {
"name": "Just watching",
"domains": 1,
"implementation": false,
"auto_merge": false
},
"1": {
"name": "Watching + testing",
"domains": 2,
"implementation": false,
"auto_merge": false
},
"2": {
"name": "Full observation",
"domains": "all",
"implementation": false,
"auto_merge": false
},
"3": {
"name": "Autonomous",
"domains": "all",
"implementation": true,
"auto_merge": false,
"__auto_merge_doc__": "Descriptive only \u2014 the engine reads config.safety.enable_auto_merge (NOT this field) to decide auto-merge. Level 3 enables autonomous implementation (Draft PRs by default); set safety.enable_auto_merge=true to also auto-merge low-risk PRs. See safety.__auto_merge_doc__ and README 'Auto-merge status'."
}
},
"last_level_change": null
},
"signals": {
"health_alert_bonus": 5.0,
"alert_cooldown_hours": 4,
"max_consecutive_alert_cycles": 3,
"stale_after_change_hours": 24,
"stale_after_change_bonus": 2.0,
"queue_pressure_threshold": 5,
"queue_pressure_bonus": 3.0,
"queue_age_hours": 48,
"queue_age_bonus": 2.0
},
"saturation": {
"warn_threshold": 5,
"boost_threshold": 10,
"halt_threshold": 15,
"auto_halt": true,
"implementation_boost": 5.0
},
"memory": {
"working_memory_size": 20,
"episode_retention_weeks": 52,
"contrarian_check_interval": 10,
"action_queue_decay_days": 14,
"action_queue_decay_amount": 0.05,
"principle_similarity_threshold": 0.5,
"principle_min_occurrences": 2,
"reflection_recall_count": 3,
"reflections_buffer_size": 20,
"outcomes_buffer_size": 200
},
"season_modes": {
"enabled": false,
"current_mode": "default",
"modes": {
"default": {
"weight_overrides": {},
"disabled_domains": [],
"signal_bonuses": {}
}
},
"__doc__": "Toggle via /ooda-config season <mode>. When enabled: Step 1-A applies weight_overrides to domain_config.weight in-memory; disabled_domains are filtered out alongside status=disabled; signal_bonuses are merged into the cycle's signal table in Step 3-B. The 'default' mode acts as the static multiplier case (e.g., {\"weight_overrides\":{\"service_health\":2.0}} encodes a permanent 2x). See CONCEPTS.md."
},
"active_context": {
"path": null,
"refresh_skill": null,
"refresh_interval_hours": 168,
"__doc__": "Optional stakeholder context blob loaded by evolve Step 1 and exposed to every invoked skill as a context variable. The blob is opaque; each skill interprets it domain-specifically. If refresh_skill is set and the file is older than refresh_interval_hours, evolve queues a refresh cycle. Read-only by default."
},
"output": {
"cycle_card": true,
"__doc__": "When true (default), evolve renders a shareable Cycle Card at the end of every cycle (Step 7) summarizing Observe/Orient/Decide/Act, the single thing it Learned (re-aimed) this cycle, and the cost. Re-render the latest card any time with /ooda-status --share. Set false to suppress."
},
"test_command": "npm test",
"test_timeout_seconds": 300,
"health_endpoints": [],
"health_check_timeout_seconds": 10,
"deploy_workflow": null,
"deploy_workflow_inputs": {},
"deploy_monitor_timeout_seconds": 600,
"deploy_health_wait_seconds": 30,
"notifications": {
"telegram": {
"enabled": false,
"bot_token": "$OODA_TELEGRAM_BOT_TOKEN",
"chat_id": "$OODA_TELEGRAM_CHAT_ID"
}
},
"cost": {
"daily_limit_usd": 10.0,
"warning_threshold_pct": 80,
"max_backfill_cycles": 100,
"__doc__": "daily_limit_usd: crossing it auto-creates a HALT (hard stop). warning_threshold_pct: warn at this % of the cap. max_backfill_cycles: Step 6-C8 caps how many missing ledger entries it will synthesize in one cycle so a corrupt cycle counter can't write thousands of entries (default 100)."
},
"eval": {
"enabled": false,
"model": "claude-haiku-4-5",
"grade_on": [
"pr_created",
"pr_merged",
"action_extracted"
],
"__doc__": "Opt-in maker/checker layer (evolve Step 7-B). When enabled, a SEPARATE model independently judges whether each gradeable cycle achieved its declared GOAL (goal-conformance) and writes {achieved,reason,confidence} into outcomes.json verifier_verdict. Never overrides the score — a second opinion. Distinct from quality_rubric/Step 5-G, which judges whether the ARTIFACT is good and DOES move the score. Default off = zero extra cost."
},
"quality_rubric": {
"__doc__": "ARTIFACT-quality axis (evolve Step 5-G, v1.7.0) — the fix for the dogfood failure where every cycle scored 0.5 / graded A while the built thing was broken, because nothing measured the artifact. CANONICAL placement is PER-DOMAIN: config.domains[<build domain>].quality_rubric (evolve is domain-agnostic). This top-level block is the single-domain fallback. Each cycle that produces an artifact, an INDEPENDENT critic (separate model context) captures the real artifact via capture_method and scores each dimension 0..1; rubric_score.py aggregates to artifact_score, which MULTIPLIES the process score in 6-C9 and drives the Goodhart Guard + LEAP trigger. The rubric is HUMAN-AUTHORED and read-only to the loop — add 'quality_rubric' / the config path to safety.protected_paths so the loop can never write its own grading standard (gaming-resistance). Empty dimensions = artifact axis OFF (process-only scoring, back-compat).",
"bar": 0.65,
"__bars_doc__": "v1.9.0 'Ambition' — DUAL thresholds break the prototype plateau. bar_leap: below it, ALWAYS leap. bar_coast: only above it may the loop coast (stop leaping). The forcing zone (bar_leap..bar_coast) keeps leaping on stagnation so the loop cannot declare victory at prototype quality. Set bar_coast HIGH (~0.85) anchored to a REAL product, not a demo. Legacy single `bar` → bar_leap==bar_coast==bar (old behaviour).",
"bar_leap": 0.65,
"bar_coast": 0.85,
"prototype_ceiling": 0.20,
"capture_method": "screenshot",
"capture_command": "<serve + screenshot for web UIs | run + capture stdout for api_call | run benchmark>",
"plateau_window": 4,
"plateau_eps": 0.05,
"locked": true,
"__anchors_doc__": "v1.9.0 — each dimension SHOULD carry `reference` anchors naming what score_0.10/0.40/0.70/0.90 look like in REAL products, and `ceiling_without_assets`. The 5-G critic scores against these named anchors, not relative to the artifact's own past — without them a critic silently grades a flat-shaded prototype as 0.6 ('it works') instead of 0.1 ('vs Gran Turismo'). When artifact_score >= a dimension's ceiling_without_assets, the loop records a `human_required` skill_gap (authored model/track/audio assets needed) instead of leaping fruitlessly. Reference anchors + ceilings are human-authored + protected.",
"__dimensions_doc__": "v1.8.0: each dimension may override capture_method so the critic gets the evidence it actually needs. 'screenshot' axes share one capture; EXPERIENTIAL axes (feel/fun/responsiveness) a screenshot cannot judge use 'gameplay_metrics' — a HUMAN-AUTHORED harness that exercises the artifact and emits metrics JSON. The harness MUST be in safety.protected_paths AND match gameplay_metrics_hash (independence gate, same invariant as the rubric hash); else the dimension scores null (capture_failure) rather than faking a score. Without per-dimension capture, experiential axes freeze at their initial score and silently cap artifact_quality. v1.8.1 rule (validated by the f1 probe): the harness must MEASURE BEHAVIOUR (e.g. drive the real physics and read the resulting numbers), NOT assert an implementation fact — a hardcoded flag like {feature: false} cannot credit a real fix, so it would trigger a spurious thrashing-HALT. Drive the artifact and report what it actually does.",
"dimensions": [],
"__example_dimension__": {
"name": "visual_fidelity",
"weight": 0.25,
"capture_method": "screenshot",
"__capture_states_doc__": "v1.12.0 (feedback fidelity) — a dimension is only gradeable in the state(s) where it MANIFESTS; a single default frame under-credits + misdirects the loop. List the states to drive the artifact into before capturing; the critic gets ALL frames. The f1 probe earned this: a chase camera / HDRI sky / speed blur / slip-angle physics were all added but every capture was one low-speed cockpit frame, so the work was invisible and the grade stalled. A state that can't be reached = capture_failure (null), not a low score.",
"capture_states": ["chase view, car stationary on a straight", "chase view at ~80% top speed", "camera pitched up to show the sky/horizon"],
"description": "3D visual quality vs SHIPPED games. Score against the reference anchors, not the artifact's past.",
"reference": {
"score_0.10": "flat-shaded primitive meshes, solid-colour sky, no shadows/post-processing (a 1990s look)",
"score_0.40": "textured surfaces, basic shadows, simple post (PS2-era)",
"score_0.70": "PBR materials + image-based lighting, bloom + tone mapping, particle FX, real skybox",
"score_0.90": "authored models, motion blur, SSAO, weather, near-photoreal"
},
"ceiling_without_assets": 0.35,
"ceiling_note": "Procedural geometry + CDN Three.js addons (post-processing, PBR/IBL, particles, Sky shader) top out ~0.35. Above that needs authored glTF models / textures / HDRIs — the loop records a human_required skill_gap, not keep leaping.",
"__asset_sources_doc__": "v1.10.0 hand-off — the OPERATOR supplies authored assets here (CDN URLs or repo paths to glTF models, textures, HDRIs, audio) once the code-only ceiling is hit. Non-empty asset_sources LIFTS ceiling_without_assets (rubric_score.asset_ceiling → None): the human_required gap resolves and the loop resumes leaping toward bar_coast, now integrating the assets. The f1 probe drove this: the loop flagged the box-car ceiling at ~0.21; a real glTF car + an HDRI were supplied here and leaping resumed.",
"asset_sources": [],
"techniques": [
"EffectComposer: RenderPass + UnrealBloomPass + OutputPass (ACES tone map)",
"PMREMGenerator from RoomEnvironment or Sky → scene.environment (IBL)",
"MeshStandardMaterial roughness/metalness + envMapIntensity (PBR paint)",
"three/addons Sky shader (atmospheric scattering) replacing solid clear colour",
"Points/BufferGeometry particle systems (tyre smoke, sparks)",
"procedural normalMap (canvas noise) on the road/track material"
],
"technique_cdns": ["three/addons/postprocessing/*", "three/addons/environments/RoomEnvironment.js", "three/addons/objects/Sky.js"],
"__experiential_example__": {
"name": "driving_feel", "weight": 0.25, "capture_method": "gameplay_metrics",
"gameplay_metrics_command": "node tools/feel_harness.mjs",
"gameplay_metrics_hash": "<sha256 of the harness file>",
"metrics_fields": ["steer_response_rad_s", "has_oversteer", "has_weight_transfer"],
"description": "Responsive, believable handling — judge metrics vs targets, not vibes."
}
}
},
"references": {
"__doc__": "v1.11.0 (anti-maze) — REFERENCE TARGETS that ground the loop in external ground truth instead of model priors. dev-cycle Step 3-PRE resolves the reference for a technique, WebFetches the concrete block, derives acceptance criteria, THEN generates (AlphaCodium pattern). The 5-G critic scores AGAINST these (not the artifact's own past). Permanent: also mirror into agent/state/evolve/principles.json so they survive episode rollover. Populate per project with named real-product levels and reference-implementation URLs.",
"visual": "https://threejs.org/examples/webgl_materials_car.html",
"physics": "https://github.com/spacejack/carphysics2d/blob/master/public/js/Car.js",
"camera": "https://github.com/mrdoob/Starter-Kit-Racing/blob/main/js/Camera.js",
"quality_floor": 0.7
},
"research": {
"__doc__": "v1.11.0 — a researched, CITED knowledge base the loop reads before leaping (the missing external-knowledge input that breaks the 'iterate without improving' maze). Built by a heavy web-research pass (graphics/physics/art/methodology) distilled into an actionable, sourced playbook. dev-cycle Step 3-PRE prefers a concrete playbook move (technique + parameters + source URL) over the model's first idea.",
"playbook_path": "agent/state/research/playbook.md",
"refresh_when_stalled": true
},
"leap": {
"__doc__": "Quantum-leap cycles (evolve Steps 2-G/3-K, v1.7.0) — the fix for monotonic incrementalism (RICE structurally forbids overhauls). When the artifact plateaus BELOW bar, the next cycle is forced into LEAP mode: it overhauls the weakest dimension (step-change, not a new feature), bypassing pure RICE via a gap-to-bar bonus, with a larger size budget and an ARTIFACT-improvement gate instead of the unit-test gate. Safety: min_dimension_delta must be cleared or the leap is reverted; max_attempts_per_dimension failures escalate to HALT; cost/day caps bound spend. v1.8.0: lock_until_bar keeps leaping the SAME dimension until it clears bar (drive-to-good, not detect-and-nudge). v1.11.0: rewrite_on_stall — when recommend_rewrite() fires (incremental leaps THEMSELVES stalled), escalate from patch to a from-scratch REWRITE carrying a Reflexion negative-example memo, instead of thrashing to HALT.",
"rewrite_on_stall": true,
"max_lines": 1500,
"min_dimension_delta": 0.05,
"max_attempts_per_dimension": 2,
"max_per_day": 2,
"gap_weight": 30.0,
"cost_limit_usd": 0.5,
"lock_until_bar": true,
"mega_leap": {
"__doc__": "v1.9.0 — a multi-cycle RE-PLATFORM for radical jumps a normal leap can't make (replace the whole rendering pipeline, swap a subsystem). Unlocked only by a human-authored, approved mega_leap_plan.json after a leap exhausts max_attempts_per_dimension. Bigger budget, no per-cycle revert; the whole sequence reverts if the cumulative artifact delta misses min_artifact_delta_at_completion.",
"enabled": false,
"max_lines": 5000,
"max_cycles": 4,
"min_artifact_delta_at_completion": 0.15,
"requires_human_plan_approval": true,
"plan_file": "agent/state/evolve/mega_leap_plan.json"
}
},
"goal_completion_idle": true
}