synth-optimizers 0.2.11.dev20260816__tar.gz → 0.2.12.dev20260816__tar.gz

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.
Files changed (112) hide show
  1. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/PKG-INFO +1 -1
  2. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/pyproject.toml +1 -1
  3. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/openapi/gepa-service-v1.yaml +41 -1
  4. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/service.rs +39 -0
  5. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/Cargo.lock +0 -0
  6. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/Cargo.toml +0 -0
  7. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/README.md +0 -0
  8. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/Cargo.toml +0 -0
  9. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/README.md +0 -0
  10. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/codex_app_server.rs +0 -0
  11. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/jesterky_workflow.rs +0 -0
  12. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/lib.rs +0 -0
  13. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/machines.rs +0 -0
  14. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/pipeline.rs +0 -0
  15. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/planner.rs +0 -0
  16. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/prompting_best_practices.md +0 -0
  17. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_gepa/src/runtime.rs +0 -0
  18. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/Cargo.toml +0 -0
  19. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/README.md +0 -0
  20. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/README.md +0 -0
  21. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/app_server.rs +0 -0
  22. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/codex_home.rs +0 -0
  23. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/daytona.rs +0 -0
  24. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/docker.rs +0 -0
  25. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/jsonrpc_read_window.rs +0 -0
  26. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/limits.rs +0 -0
  27. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/local.rs +0 -0
  28. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/mod.rs +0 -0
  29. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/nano.rs +0 -0
  30. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/role_agent.rs +0 -0
  31. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/session.rs +0 -0
  32. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/substrate.rs +0 -0
  33. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/supervisor.rs +0 -0
  34. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/agent_runtime/usage.rs +0 -0
  35. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/artifact_store.rs +0 -0
  36. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/artifacts.rs +0 -0
  37. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/cache.rs +0 -0
  38. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/candidates.rs +0 -0
  39. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/checkpoints.rs +0 -0
  40. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/config.rs +0 -0
  41. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/configured_limits.rs +0 -0
  42. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/container_contract.rs +0 -0
  43. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/data_models.rs +0 -0
  44. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/disk_budget.rs +0 -0
  45. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/error.rs +0 -0
  46. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/event_visualization.rs +0 -0
  47. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/events.rs +0 -0
  48. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/evidence.rs +0 -0
  49. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/failures.rs +0 -0
  50. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/fsm.rs +0 -0
  51. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/http.rs +0 -0
  52. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/invariants.rs +0 -0
  53. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/jesterky.rs +0 -0
  54. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/jobs.rs +0 -0
  55. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/levers.rs +0 -0
  56. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/lib.rs +0 -0
  57. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/limit_engine.rs +0 -0
  58. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/limits.rs +0 -0
  59. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/observability.rs +0 -0
  60. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/operations.rs +0 -0
  61. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/process.rs +0 -0
  62. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/projections.rs +0 -0
  63. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/prompt_program.rs +0 -0
  64. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/registry.rs +0 -0
  65. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/resources.rs +0 -0
  66. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/rollouts.rs +0 -0
  67. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/runtime_records.rs +0 -0
  68. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/scores.rs +0 -0
  69. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/sensors.rs +0 -0
  70. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/state_machine.rs +0 -0
  71. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/stopper.rs +0 -0
  72. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/storage_maintenance.rs +0 -0
  73. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/usage.rs +0 -0
  74. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizer_platform/src/workspace.rs +0 -0
  75. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizers_py/Cargo.toml +0 -0
  76. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizers_py/README.md +0 -0
  77. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/rust/crates/synth_optimizers_py/src/lib.rs +0 -0
  78. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/README.md +0 -0
  79. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/__init__.py +0 -0
  80. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/_synth_optimizers.pyi +0 -0
  81. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/board_server.py +0 -0
  82. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/cli.py +0 -0
  83. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/discovery.py +0 -0
  84. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gelo/00-index.md +0 -0
  85. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gelo/10-cli.md +0 -0
  86. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gelo/20-sdk.md +0 -0
  87. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gelo/30-hosted.md +0 -0
  88. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gelo/containers/00-overview.md +0 -0
  89. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gelo/containers/20-contract.md +0 -0
  90. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/00-index.md +0 -0
  91. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/10-cli.md +0 -0
  92. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/20-sdk.md +0 -0
  93. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/algorithms/00-overview.md +0 -0
  94. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/algorithms/10-pipeline-modes.md +0 -0
  95. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/algorithms/20-proposer-and-policies.md +0 -0
  96. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/assets/synth-logo.png +0 -0
  97. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/containers/00-overview.md +0 -0
  98. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/containers/10-catalog.md +0 -0
  99. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs/gepa/containers/20-contract.md +0 -0
  100. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/docs_server.py +0 -0
  101. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/eval_stats.py +0 -0
  102. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/future_algorithms.py +0 -0
  103. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/gelo.py +0 -0
  104. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/gepa.py +0 -0
  105. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/hosted.py +0 -0
  106. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/hosted_config.py +0 -0
  107. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/o11y.py +0 -0
  108. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/observability.py +0 -0
  109. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/py.typed +0 -0
  110. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/sdk.py +0 -0
  111. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/tunnels.py +0 -0
  112. {synth_optimizers-0.2.11.dev20260816 → synth_optimizers-0.2.12.dev20260816}/src/synth_optimizers/victorialogs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-optimizers
3
- Version: 0.2.11.dev20260816
3
+ Version: 0.2.12.dev20260816
4
4
  Requires-Dist: pydantic>=2.0.0
5
5
  Requires-Dist: synth-containers==0.4.1.dev20260814
6
6
  Requires-Dist: websocket-client>=1.8.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-optimizers"
3
- version = "0.2.11.dev20260816"
3
+ version = "0.2.12.dev20260816"
4
4
  description = "Public Synth optimizer tooling with a Rust GEPA core."
5
5
  authors = [{name = "Synth Laboratories", email = "josh@usesynth.ai"}]
6
6
  readme = "README.md"
@@ -32,6 +32,28 @@ servers:
32
32
  description: Local single-workspace server
33
33
 
34
34
  paths:
35
+ /v1/optimizer/capabilities:
36
+ get:
37
+ operationId: getOptimizerCapabilities
38
+ summary: Advertise Workshop optimizer compatibility
39
+ responses:
40
+ '200':
41
+ description: Optimizer algorithms, recipes, and runtime capabilities.
42
+ content:
43
+ application/json:
44
+ schema: { $ref: '#/components/schemas/OptimizerCapabilities' }
45
+
46
+ /v1/optimizer/status:
47
+ get:
48
+ operationId: getOptimizerStatus
49
+ summary: Return the Workshop-compatible optimizer status document
50
+ responses:
51
+ '200':
52
+ description: Alias of the optimizer capability document for compatibility.
53
+ content:
54
+ application/json:
55
+ schema: { $ref: '#/components/schemas/OptimizerCapabilities' }
56
+
35
57
  # ---------------------------------------------------------------------------
36
58
  # Submission + lifecycle
37
59
  # ---------------------------------------------------------------------------
@@ -648,7 +670,6 @@ paths:
648
670
 
649
671
  # =============================================================================
650
672
  components:
651
-
652
673
  parameters:
653
674
  RunId:
654
675
  name: run_id
@@ -698,6 +719,25 @@ components:
698
719
  schema: { $ref: '#/components/schemas/ErrorEnvelope' }
699
720
 
700
721
  schemas:
722
+ OptimizerCapabilities:
723
+ type: object
724
+ required: [status, algorithms, recipes, replay, cancellation, compatibleTemplateIds]
725
+ properties:
726
+ status: { type: string, const: ok }
727
+ algorithms:
728
+ type: array
729
+ minItems: 1
730
+ items: { type: string }
731
+ recipes:
732
+ type: array
733
+ minItems: 1
734
+ items: { type: string }
735
+ replay: { type: boolean }
736
+ cancellation: { type: boolean }
737
+ compatibleTemplateIds:
738
+ type: array
739
+ minItems: 1
740
+ items: { type: string }
701
741
 
702
742
  # ---- Enums -------------------------------------------------------------
703
743
  RunStatus:
@@ -1508,6 +1508,9 @@ fn route_request(request: HttpRequest, runtime: GepaServiceRuntime) -> HttpRespo
1508
1508
  let config = &runtime.config;
1509
1509
  match (request.method.as_str(), segments.as_slice()) {
1510
1510
  ("GET", ["health"]) => json_response(200, &json!({"status": "ok"})),
1511
+ ("GET", ["v1", "optimizer", "capabilities"]) | ("GET", ["v1", "optimizer", "status"]) => {
1512
+ json_response(200, &optimizer_capabilities_payload())
1513
+ }
1511
1514
  ("GET", ["whoami"]) => json_response(
1512
1515
  200,
1513
1516
  &service_identity_payload(config, &runtime.service_url, &runtime.started_at, None),
@@ -1592,6 +1595,25 @@ fn route_request(request: HttpRequest, runtime: GepaServiceRuntime) -> HttpRespo
1592
1595
  }
1593
1596
  }
1594
1597
 
1598
+ fn optimizer_capabilities_payload() -> Value {
1599
+ json!({
1600
+ "status": "ok",
1601
+ "algorithms": ["gepa"],
1602
+ "recipes": [
1603
+ "gepa.banking77.smoke.v1",
1604
+ "gepa.banking77.luna.v1",
1605
+ "gepa.banking77.sol.v1",
1606
+ "gepa.craftax.smoke.v1"
1607
+ ],
1608
+ "replay": true,
1609
+ "cancellation": true,
1610
+ "compatibleTemplateIds": [
1611
+ "optimizer.gepa.live.v1",
1612
+ "optimizer.run.v1"
1613
+ ]
1614
+ })
1615
+ }
1616
+
1595
1617
  fn handle_websocket_connection(
1596
1618
  stream: &mut TcpStream,
1597
1619
  runtime: GepaServiceRuntime,
@@ -5772,6 +5794,23 @@ mod tests {
5772
5794
  );
5773
5795
  }
5774
5796
 
5797
+ #[test]
5798
+ fn workshop_capability_handshake_is_complete() {
5799
+ let capabilities = optimizer_capabilities_payload();
5800
+ for field in ["algorithms", "recipes", "compatibleTemplateIds"] {
5801
+ let values = capabilities[field].as_array().unwrap();
5802
+ assert!(!values.is_empty());
5803
+ assert!(values.iter().all(Value::is_string));
5804
+ }
5805
+ assert_eq!(capabilities["replay"], true);
5806
+ assert_eq!(capabilities["cancellation"], true);
5807
+ assert!(capabilities["recipes"]
5808
+ .as_array()
5809
+ .unwrap()
5810
+ .iter()
5811
+ .any(|recipe| recipe == "gepa.banking77.smoke.v1"));
5812
+ }
5813
+
5775
5814
  #[test]
5776
5815
  fn optimizer_event_pages_are_cursor_idempotent_and_run_isolated() {
5777
5816
  let path = scratch_path("cursor");