Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
169 commits
Select commit Hold shift + click to select a range
31555d7
ci: add trusted PyPI publishing
JoshuaPurtell Aug 14, 2026
3fd3477
ci: use dedicated PyPI release environment
JoshuaPurtell Aug 14, 2026
c257960
Merge pull request #20 from synth-laboratories/agent/optimizers-relea…
JoshuaPurtell Aug 14, 2026
a3ca2c7
Merge pull request #30 from synth-laboratories/dev
JoshuaPurtell Aug 16, 2026
4746e08
Merge pull request #32 from synth-laboratories/dev
JoshuaPurtell Aug 16, 2026
e887546
ci(eval): publish pinned Craftax target image (#33)
JoshuaPurtell Aug 18, 2026
5ae2323
ci(eval): make Craftax target anonymously pullable (#34)
JoshuaPurtell Aug 18, 2026
efd8965
ci(eval): link Craftax image to public producer (#35)
JoshuaPurtell Aug 18, 2026
47ae255
ci(eval): publish Craftax target for anonymous admission (#36)
JoshuaPurtell Aug 18, 2026
2b3bbe5
Merge remote-tracking branch 'origin/dev' into release/v0.5-main-reco…
JoshuaPurtell Aug 18, 2026
1c89092
Merge pull request #38 from synth-laboratories/release/v0.5-main-reco…
JoshuaPurtell Aug 18, 2026
255ee87
docs: execution plan for the local MLX RL optimizers lane
jp-synth Aug 18, 2026
5236d8c
eval: score a policy served by a local MLX process
JoshuaPurtell Aug 18, 2026
5fd25c9
docs: record that the synth-containers pin predates the responses lane
jp-synth Aug 18, 2026
3f3a1ce
build: bump synth-containers pin to main (a2a316b, 0.4.1.dev20260817)
jp-synth Aug 18, 2026
fdb39dd
feat(training): expose hosted run outputs and checkpoint lineage (#39)
JoshuaPurtell Aug 19, 2026
ad3b66a
Merge branch 'agent/mlx-local-rl-20260818' into v0.6/implementation
JoshuaPurtell Aug 19, 2026
a370c0f
fix(training): forward SynthTunnel readiness mode (#40)
JoshuaPurtell Aug 19, 2026
3f3a651
Merge remote-tracking branch 'origin/main' into v0.6/implementation
JoshuaPurtell Aug 19, 2026
da1b11a
build: pin synth-containers to the pushed v0.6 containers head
JoshuaPurtell Aug 19, 2026
c4e53ff
Merge pull request #41 from synth-laboratories/v0.6/implementation
JoshuaPurtell Aug 19, 2026
1f7948c
release: prepare synth-optimizers 0.2.15
JoshuaPurtell Aug 20, 2026
d3c9edd
Merge pull request #42 from synth-laboratories/codex/v0.2.15-release
JoshuaPurtell Aug 20, 2026
5665cc9
feat(correlation): carry synth.correlation.v1 through GEPA
JoshuaPurtell Aug 20, 2026
ad447e7
feat(experiment): declarative ablations over the executors that alrea…
JoshuaPurtell Aug 20, 2026
b03e34b
fix(experiment): report each executor's own provenance in the plan re…
JoshuaPurtell Aug 20, 2026
173a848
fix(gepa.cli): lift the metrics the manifest carries, not guessed key…
JoshuaPurtell Aug 20, 2026
ca747e7
feat(experiment): allow a rig failure to be retried, never silently
JoshuaPurtell Aug 20, 2026
13dd24b
docs(changelog): record the rig-only retry in the 0.2.15 entry
JoshuaPurtell Aug 20, 2026
7071088
feat(experiment): bounded parallel dispatch, with a port per trial
JoshuaPurtell Aug 20, 2026
279eaf5
Merge pull request #44 from synth-laboratories/v07/experiment-layer-pr
JoshuaPurtell Aug 20, 2026
c671518
test(gepa): stop the heartbeat writer before the foreign-pid drop check
JoshuaPurtell Aug 20, 2026
3b9dc25
ci(craftax-target): verify anonymous pullability instead of PATCHing …
JoshuaPurtell Aug 20, 2026
8642810
Merge pull request #45 from synth-laboratories/v07/fix-craftax-target…
JoshuaPurtell Aug 20, 2026
23b20d0
Merge pull request #46 from synth-laboratories/v07/fix-service-owners…
JoshuaPurtell Aug 20, 2026
a98c701
eval: GSM8K eval target (mlx-lora.v1) + GHCR publish workflow
JoshuaPurtell Aug 20, 2026
21fe277
ci: add the GSM8K eval-target publish workflow to the default branch
JoshuaPurtell Aug 20, 2026
771f515
Merge pull request #47 from synth-laboratories/v07/l2-gsm8k-publish-w…
JoshuaPurtell Aug 20, 2026
cd3175c
eval: pin eval.mlx.local-policy.smoke.v1 to the published GSM8K targe…
JoshuaPurtell Aug 20, 2026
46a9618
Merge pull request #48 from synth-laboratories/v07/l2-gsm8k-catalog
JoshuaPurtell Aug 20, 2026
3e19fbd
feat(eval): build Craftax Rust target locally (#49)
JoshuaPurtell Aug 21, 2026
abf017b
Merge remote-tracking branch 'origin/main' into release/v0.7-reconcil…
JoshuaPurtell Aug 21, 2026
993975b
Merge pull request #50 from synth-laboratories/release/v0.7-reconcile…
JoshuaPurtell Aug 21, 2026
26a4a3d
Merge pull request #51 from synth-laboratories/v0.7
JoshuaPurtell Aug 21, 2026
c88087a
optimizers: P1-1 carry process identity in the service heartbeat
JoshuaPurtell Aug 21, 2026
c488697
optimizers: P0-5 export the event vocabulary
jp-synth Aug 21, 2026
622654c
optimizers: P0-4 stop env from overriding a config after admission
jp-synth Aug 21, 2026
4437763
optimizers: WIP P0-9 file-size cap tests (rust + python), unfinished
JoshuaPurtell Aug 21, 2026
a82a86c
optimizers: P0-9 cap Rust/Python files at 2,000 lines with a shrinkin…
JoshuaPurtell Aug 21, 2026
c187e28
Merge pull request #53 from synth-laboratories/v07/p1-heartbeat-identity
JoshuaPurtell Aug 21, 2026
1e4dfb0
fix(gepa): keep usage registration best effort
JoshuaPurtell Aug 21, 2026
1de0333
fix(gepa): preserve causal runtime failures
JoshuaPurtell Aug 21, 2026
24f8f63
fix(gepa): retain OpenRouter model opt-in
JoshuaPurtell Aug 21, 2026
6b9df82
fix(gepa): read nested runtime failure from map
JoshuaPurtell Aug 21, 2026
33b0e99
fix(gepa): do not replay stateful proposer turns
JoshuaPurtell Aug 21, 2026
71f330a
feat(gepa): support OpenRouter chat proposer
JoshuaPurtell Aug 21, 2026
8ac1fe8
fix(gepa): validate OpenRouter chat proposer
JoshuaPurtell Aug 21, 2026
14758e0
fix(gepa): allow OpenRouter single-call proposer
JoshuaPurtell Aug 21, 2026
184f532
fix(gepa): consume completed jobs after claim race
JoshuaPurtell Aug 21, 2026
5ee2112
fix(gepa): normalize OpenRouter billed proposer cost
JoshuaPurtell Aug 21, 2026
ef3e5a6
release: prepare synth-optimizers 0.2.17
JoshuaPurtell Aug 22, 2026
9e081ce
fix(gepa): settle missing provider cost conservatively
JoshuaPurtell Aug 22, 2026
eaead59
fix(gepa): project conservative proposer cost
JoshuaPurtell Aug 22, 2026
842615e
feat(training): add standalone Tinker SFT and CISPO
JoshuaPurtell Sep 2, 2026
b22ad8b
feat(training): run Harbor TBLite CISPO end to end
JoshuaPurtell Sep 2, 2026
cf77c22
feat(training): add paired TBLite checkpoint evaluation
JoshuaPurtell Sep 2, 2026
c464392
stream paired heldout evaluation for SFT and CISPO
JoshuaPurtell Sep 2, 2026
0b5f46c
honor explicit training idempotency scopes
JoshuaPurtell Sep 2, 2026
63268d1
fix(training): bound Harbor rollout concurrency
JoshuaPurtell Sep 2, 2026
347d9c6
parallelize live banking77 sampling
JoshuaPurtell Sep 2, 2026
14ddd58
separate selection and heldout sampler keys
JoshuaPurtell Sep 2, 2026
2e9676d
feat(training): support robust checkpoint-only TBLite evals
JoshuaPurtell Sep 2, 2026
8e9e7d4
scope live Tinker samplers by training step
JoshuaPurtell Sep 2, 2026
a8913aa
single-flight live Tinker sampler creation
JoshuaPurtell Sep 2, 2026
51b2b02
Stop GEPA refusing every container over a field it does not read
JoshuaPurtell Sep 3, 2026
96d7bba
Cut 0.2.20 for the container preflight fix
JoshuaPurtell Sep 3, 2026
4414240
Lay the container-first RL foundation records
JoshuaPurtell Sep 3, 2026
481a55b
Write the parallel work split for the RL plane
JoshuaPurtell Sep 3, 2026
84ea552
Close the foundation gaps stream 2 found
JoshuaPurtell Sep 3, 2026
da34ee3
Fix four foundation defects and give spans their joint-episode identity
JoshuaPurtell Sep 3, 2026
9ce2f81
Record the CISPO credit parity finding in the note
JoshuaPurtell Sep 3, 2026
d8c8924
Land the queue engine and the checkpoint catalog, and fail closed on …
JoshuaPurtell Sep 3, 2026
243b984
Add the conformance fakes: 15 conformant containers and 16 that are not
JoshuaPurtell Sep 3, 2026
4b8f830
Record the rulings six work streams settled, and what they could not
JoshuaPurtell Sep 3, 2026
d5b3293
Give the handshake a clause for skew, and a way to say "satisfied oth…
JoshuaPurtell Sep 3, 2026
3adf151
Record the three decisions taken after the first implementation pass
JoshuaPurtell Sep 3, 2026
85bc0e1
Read the horizon conversion the container actually declared
JoshuaPurtell Sep 3, 2026
053c3ce
Let a call declare its author instead of leaving it to be inferred
JoshuaPurtell Sep 3, 2026
e000ee3
Stop demanding a verdict for a clause that does not apply
JoshuaPurtell Sep 3, 2026
6ff78bd
Record what building the container half revealed
JoshuaPurtell Sep 3, 2026
8fffc30
Define the seams between the plane's four islands
JoshuaPurtell Sep 3, 2026
3ef7bb4
Make the binding call carry the facts its evidence will need
JoshuaPurtell Sep 3, 2026
ef204ee
Close the loop, and fix two seams that would have failed the first re…
JoshuaPurtell Sep 3, 2026
a391f0e
Make the renderer check touch tokens instead of declarations
JoshuaPurtell Sep 3, 2026
6db627b
Find the contract by what it declares, not by which key it sits under
JoshuaPurtell Sep 3, 2026
060b948
Fix the two seams that stopped any real attempt from dispatching
JoshuaPurtell Sep 3, 2026
fc61a09
Say in the receipt whether the renderer was ever verified
JoshuaPurtell Sep 3, 2026
f9118bc
Record what five containers could not honestly declare
JoshuaPurtell Sep 3, 2026
3c7865c
Name the conflict between the milestone policy and the TBLite harness
JoshuaPurtell Sep 3, 2026
d5e1caf
Let a synchronous container settle the rollout id it alone can name
JoshuaPurtell Sep 3, 2026
0291cc8
Compare a horizon in seconds, not in whatever unit it was declared in
JoshuaPurtell Sep 3, 2026
3b596ed
Accept a one-turn probe and say what it could not check
JoshuaPurtell Sep 3, 2026
9c1c929
Land the queue-native TBLite runner this work started from
JoshuaPurtell Sep 3, 2026
7dbfc32
Write the handoff, and commit the design note it points at
JoshuaPurtell Sep 3, 2026
8fa42ae
Keep the harness that produced the runs
JoshuaPurtell Sep 3, 2026
d062f88
Drop an unused import from the harness
JoshuaPurtell Sep 3, 2026
d1646de
Complete container-first RL acceptance matrix
JoshuaPurtell Sep 4, 2026
aaa3b88
Demonstrate Banking77 async throughput
JoshuaPurtell Sep 4, 2026
b34205b
Record scaled Banking77 throughput experiment
JoshuaPurtell Sep 4, 2026
3417666
Demonstrate Banking77 heldout uplift
JoshuaPurtell Sep 4, 2026
f232087
Hand off scaled Banking77 uplift run
JoshuaPurtell Sep 4, 2026
c29d315
Screen Banking77 rows before scaled RL
JoshuaPurtell Sep 4, 2026
dc00979
Fix zero-gradient Tinker RL updates
JoshuaPurtell Sep 4, 2026
e78fca6
Prove and harden Tinker RL training
JoshuaPurtell Sep 4, 2026
1ee48d0
Document remaining Banking77 heldout uplift work
JoshuaPurtell Sep 4, 2026
dc245a2
prove Banking77 heldout uplift with resumed RL
JoshuaPurtell Sep 4, 2026
7bd541f
document Banking77 sealed uplift result
JoshuaPurtell Sep 4, 2026
ce9c1d1
fix RL throughput and cost receipts
JoshuaPurtell Sep 4, 2026
8a2220d
evaluate Banking77 on fresh 385-example panel
JoshuaPurtell Sep 4, 2026
d553139
remove RL dispatch bottlenecks and launch broad fast50 experiment
JoshuaPurtell Sep 4, 2026
b2522bf
preserve admitted policy revisions and resume fast50 from update 25
JoshuaPurtell Sep 4, 2026
92dd0be
parallelize frozen checkpoint comparisons with deterministic selection
JoshuaPurtell Sep 4, 2026
23488ed
record fast50 real-training heldout uplift and verified cost estimates
JoshuaPurtell Sep 4, 2026
dddcbd6
build bounded real HealthBench and Craftax throughput experiments
JoshuaPurtell Sep 5, 2026
005bd81
record clean Craftax throughput proof and launch training segments
JoshuaPurtell Sep 5, 2026
7068f2a
Configure benchmark sampling before trace capture
JoshuaPurtell Sep 5, 2026
fe7f59a
Resume Craftax from durable revision 22 after disk exhaustion
JoshuaPurtell Sep 5, 2026
3dcea77
Keep disk headroom before paid benchmark calls
JoshuaPurtell Sep 5, 2026
e5c3817
Record positive Craftax heldout uplift after 50 real updates
JoshuaPurtell Sep 5, 2026
5d61f13
Use authorized HealthBench grader and record real pilot budget forecast
JoshuaPurtell Sep 5, 2026
71e7312
Continue HealthBench under approved combined 100 dollar cap
JoshuaPurtell Sep 5, 2026
2ebd516
fix: preserve generic completion text and restart clean benchmark proof
JoshuaPurtell Sep 5, 2026
39f38c8
docs: preserve HealthBench revision 36 credit-blocked recovery
JoshuaPurtell Sep 5, 2026
128d83f
docs: report completed clean RL heldout results and uncertainty
JoshuaPurtell Sep 5, 2026
9de4740
Preserve v0.10 runtime and conformance source candidate
JoshuaPurtell Sep 8, 2026
1b50ac8
Repair training recovery boundaries and add standalone SFT checkpoint…
JoshuaPurtell Sep 8, 2026
cfebb60
Align bundled Containers dependency with v0.10 candidate
JoshuaPurtell Sep 8, 2026
0295bf9
Execute immutable SFT checkpoint evaluations with durable budget admi…
JoshuaPurtell Sep 8, 2026
5c5bb56
Align bundled Containers dependency with v0.10 candidate
JoshuaPurtell Sep 8, 2026
8c2ef5b
Pin projection cursors to durable history and expose checkpoint evalu…
JoshuaPurtell Sep 8, 2026
edcef2d
Score CISPO importance ratios in the original prompt context
JoshuaPurtell Sep 8, 2026
0740620
Reject sealed workspace commands before loading optional execution de…
JoshuaPurtell Sep 8, 2026
0a20955
Journal running state atomically when claiming a resumed job
JoshuaPurtell Sep 8, 2026
0046d4b
Expose actual renderer provenance for checkpoint evaluator admission
JoshuaPurtell Sep 8, 2026
e3aa5ec
fix(sft): expose checkpoint child panels in normal evaluation pages
JoshuaPurtell Sep 8, 2026
6f057bb
fix(sft): verify evaluator image before paid session admission
JoshuaPurtell Sep 8, 2026
e18b79d
fix(training): settle drained pauses and preserve blocked recovery co…
JoshuaPurtell Sep 8, 2026
a37c95b
Materialize bounded historical training projections transactionally
JoshuaPurtell Sep 8, 2026
ff73ec3
Retain source-exact checkpoint rollouts as portable Trace V5 evidence
JoshuaPurtell Sep 8, 2026
2106b4d
Declare packaged Harbor TBLite conformance dependency
JoshuaPurtell Sep 8, 2026
10ea33b
Exercise installed training recovery across real process exits
JoshuaPurtell Sep 8, 2026
31e3ca1
Integrate durable SFT CISPO implementation into release candidate
JoshuaPurtell Sep 8, 2026
3630f75
Align Rust workspace version with Python distribution 0.2.20
JoshuaPurtell Sep 8, 2026
137fe71
Pin Optimizers 0.2.21 to reconciled Containers and Harbor artifacts
JoshuaPurtell Sep 9, 2026
19ecb4b
Pin what the training aggregate counts
JoshuaPurtell Sep 9, 2026
128cd51
Inject crash recovery where the money actually is
JoshuaPurtell Sep 9, 2026
5a16a15
Make the declared gates pass, and restore a test suite that stopped c…
JoshuaPurtell Sep 9, 2026
dcf7e8f
Cut 0.2.22.dev20260909 and gate the publish on the test suite
JoshuaPurtell Sep 9, 2026
7dc4ef2
Prepare Optimizers 0.2.22 with isolated eval dependencies and complet…
JoshuaPurtell Sep 9, 2026
a6ee92d
Resolve formatter and size ratchet conflict by extracting intact test…
JoshuaPurtell Sep 9, 2026
2b668dd
Run production package gates on SSH candidate pushes
JoshuaPurtell Sep 9, 2026
1f06bd5
Refresh vendored Containers wheel digest for clean CI installs
JoshuaPurtell Sep 9, 2026
0b30dff
Refresh candidate wheel with Containers serialization and recovery fixes
JoshuaPurtell Sep 9, 2026
0d072d6
Make inherited type debt explicit without requiring eval dependencies
JoshuaPurtell Sep 9, 2026
c21d6fe
Fix proposer cache identity across replay output directories
JoshuaPurtell Sep 9, 2026
1598571
Preserve adaptive concurrency configuration and integrate release doc…
JoshuaPurtell Sep 9, 2026
65d06d6
Include documented offline parity probe and require all evidence feeds
JoshuaPurtell Sep 9, 2026
d04cc09
Record GEPA storage facts before terminal stream seal
JoshuaPurtell Sep 9, 2026
fe571fe
Gate release wheels against public PyPI dependencies
JoshuaPurtell Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
31 changes: 23 additions & 8 deletions .github/workflows/publish-craftax-eval-target.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,30 @@ jobs:
'architectures=linux/amd64,linux/arm64' \
'digest=${{ steps.publish.outputs.digest }}' | tee craftax-eval-target-receipt.txt

- name: Make the repository-linked target public
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh api --method PATCH \
/orgs/synth-laboratories/packages/container/workshop-craftax-eval-target \
-f visibility=public

- uses: actions/upload-artifact@v4
with:
name: craftax-eval-target-receipt
path: craftax-eval-target-receipt.txt

# GitHub has no REST route for package visibility: PATCH
# /orgs/{org}/packages/container/{name} is 404 for every token, which is
# what failed runs 32094428767 and 32098386835 after the push succeeded.
# Visibility is a one-time package-settings action by an org owner, so
# verify it here instead of pretending to set it. Once the package is
# public this step passes on every later run.
- name: Verify the target is anonymously pullable
env:
DIGEST: ${{ steps.publish.outputs.digest }}
run: |
set -euo pipefail
repo='synth-laboratories/workshop-craftax-eval-target'
token="$(curl -sS "https://ghcr.io/token?scope=repository:${repo}:pull" | jq -r '.token // empty')"
if [ -z "$token" ]; then
echo "::error::ghcr.io/${repo} is not anonymously pullable. The image ${DIGEST} was pushed and its receipt uploaded; an org owner must set the package public once at https://github.com/orgs/synth-laboratories/packages/container/workshop-craftax-eval-target/settings (Danger Zone -> Change visibility -> Public)."
exit 1
fi
curl -fsS -o /dev/null \
-H "Authorization: Bearer ${token}" \
-H 'Accept: application/vnd.oci.image.index.v1+json, application/vnd.docker.distribution.manifest.list.v2+json' \
"https://ghcr.io/v2/${repo}/manifests/${DIGEST}"
echo "anonymous pull verified for ${DIGEST}"
108 changes: 108 additions & 0 deletions .github/workflows/publish-gsm8k-eval-target.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
name: Publish GSM8K eval target

# Same shape as publish-craftax-eval-target.yml: an immutable build context from
# pinned sources, a multi-arch push by digest, a receipt artifact. The dataset
# pin (revision + split digests) is owned by containers' gsm8k_world.py; the
# stage step refuses to build if the rows fetched at that revision do not
# reproduce the recorded digests.

on:
workflow_dispatch:
inputs:
containers_ref:
description: "containers commit to vendor gsm8k_world.py from (full SHA)"
required: true
default: "9916cd7479c1029d7dd9091db43f52af1cdf484e"

permissions:
contents: read
packages: write

jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Check out Optimizers producer
uses: actions/checkout@v4

- name: Check out pinned containers source
uses: actions/checkout@v4
with:
repository: synth-laboratories/containers
ref: ${{ inputs.containers_ref }}
path: containers-source

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Assemble immutable build context (pinned dataset, verified digests)
id: stage
run: |
set -euo pipefail
python -m pip install --quiet "huggingface_hub>=0.25" "pyarrow>=15"
python docker/gsm8k-eval-target/stage.py \
--containers-src containers-source/src \
--out "${RUNNER_TEMP}/gsm8k-eval-target"
revision="$(python -c 'import json,sys; print(json.load(open(sys.argv[1]))["revision"])' \
"${RUNNER_TEMP}/gsm8k-eval-target/stage-receipt.json")"
containers_sha="$(git -C containers-source rev-parse HEAD)"
echo "revision=${revision}" >> "$GITHUB_OUTPUT"
echo "containers_sha=${containers_sha}" >> "$GITHUB_OUTPUT"
echo "tag=v0.7-gsm8k-${revision:0:8}-containers-${containers_sha:0:8}" >> "$GITHUB_OUTPUT"

- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and publish immutable multi-architecture target
id: publish
uses: docker/build-push-action@v6
with:
context: ${{ runner.temp }}/gsm8k-eval-target
platforms: linux/amd64,linux/arm64
push: true
tags: ghcr.io/synth-laboratories/workshop-gsm8k-eval-target:${{ steps.stage.outputs.tag }}
labels: |
org.opencontainers.image.source=https://github.com/synth-laboratories/optimizers
org.opencontainers.image.revision=${{ steps.stage.outputs.containers_sha }}
org.opencontainers.image.title=Workshop GSM8K eval target
build-args: |
GSM8K_REVISION=${{ steps.stage.outputs.revision }}
CONTAINERS_SOURCE_COMMIT=${{ steps.stage.outputs.containers_sha }}
provenance: mode=max
sbom: true

- name: Record immutable publication receipt
run: |
cp "${RUNNER_TEMP}/gsm8k-eval-target/stage-receipt.json" gsm8k-eval-target-stage-receipt.json
printf '%s\n' \
'image=ghcr.io/synth-laboratories/workshop-gsm8k-eval-target' \
'tag=${{ steps.stage.outputs.tag }}' \
'dataset_revision=${{ steps.stage.outputs.revision }}' \
'containers_source_commit=${{ steps.stage.outputs.containers_sha }}' \
'architectures=linux/amd64,linux/arm64' \
'digest=${{ steps.publish.outputs.digest }}' | tee gsm8k-eval-target-receipt.txt

# Known to 404 on this org (same step as the Craftax workflow); the image
# is pushed and its digest recorded regardless, and visibility can be
# fixed from the org's package settings.
- name: Make the repository-linked target public
continue-on-error: true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh api --method PATCH \
/orgs/synth-laboratories/packages/container/workshop-gsm8k-eval-target \
-f visibility=public

- uses: actions/upload-artifact@v4
with:
name: gsm8k-eval-target-receipt
path: |
gsm8k-eval-target-receipt.txt
gsm8k-eval-target-stage-receipt.json
85 changes: 78 additions & 7 deletions .github/workflows/publish-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ on:
- dev
- official
push:
branches:
- codex/v010-stable-packages
tags:
- "v*"

Expand All @@ -30,7 +32,7 @@ jobs:
- id: release
name: Enforce branch, tag, and version policy
env:
REQUESTED_CHANNEL: ${{ github.event_name == 'push' && 'official' || inputs.channel }}
REQUESTED_CHANNEL: ${{ github.event_name == 'push' && (github.ref_type == 'tag' && 'official' || 'candidate') || inputs.channel }}
RELEASE_REF: ${{ github.ref }}
RELEASE_REF_NAME: ${{ github.ref_name }}
RELEASE_REF_TYPE: ${{ github.ref_type }}
Expand All @@ -54,7 +56,12 @@ jobs:
ref_name = os.environ["RELEASE_REF_NAME"]
ref_type = os.environ["RELEASE_REF_TYPE"]

if channel == "dev":
if channel == "candidate":
if ref != "refs/heads/codex/v010-stable-packages":
raise SystemExit("candidate checks require the release preparation branch")
if not re.fullmatch(r"\d+\.\d+\.\d+", version):
raise SystemExit(f"candidate version is invalid: {version}")
elif channel == "dev":
if ref != "refs/heads/dev":
raise SystemExit("development releases must be dispatched from the dev branch")
if not re.fullmatch(r"\d+\.\d+\.\d+\.dev\d+", version):
Expand All @@ -73,30 +80,92 @@ jobs:
output.write(f"version={version}\n")
PY

build:
name: Build macOS arm64 wheel
# A package must not reach PyPI having never run its own suite. `cargo test`
# was absent here and had stopped compiling entirely before this release.
# `synth_optimizers_py` is excluded because linking the PyO3 extension as a
# test binary is a harness problem, not a source one.
test:
name: Test
needs: validate
runs-on: macos-14
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
- uses: dtolnay/rust-toolchain@stable
- uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
with:
enable-cache: true
python-version: "3.11"

- name: Rust suite
run: cargo test --workspace --exclude synth_optimizers_py

- name: Python production suite
run: uv run --locked --group dev pytest tests -q

- name: Static gates
run: |
cargo fmt --check
cargo clippy --workspace -- -D warnings
uv run --locked --project . --group dev ruff check src
python3 scripts/check-type-debt.py
git diff --check

build:
name: Build ${{ matrix.target }} wheel
needs:
- validate
- test
strategy:
matrix:
include:
- runner: macos-14
target: aarch64-apple-darwin
- runner: ubuntu-24.04
target: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262

- name: Build wheel
uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b
with:
command: build
target: aarch64-apple-darwin
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter

- name: Verify production dependency metadata
run: python3 scripts/check-production-wheel.py dist/*.whl

- uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
with:
python-version: "3.11"

- name: Fresh vendored dependency installation
run: |
uv venv .release-smoke --python 3.11
uv pip install --python .release-smoke/bin/python dist/*.whl vendor/synth-containers/synth_containers-0.4.2-py3-none-any.whl
.release-smoke/bin/python -c 'from importlib.metadata import distributions; import synth_optimizers._synth_optimizers; assert not any("tblite" in d.metadata["Name"].lower() for d in distributions())'
.release-smoke/bin/synth-optimizers --help

- name: Fresh public dependency installation
run: |
uv venv .public-release-smoke --python 3.11
uv pip install --python .public-release-smoke/bin/python --index-url https://pypi.org/simple dist/*.whl
.public-release-smoke/bin/python -c 'from importlib.metadata import distributions, version; import synth_optimizers._synth_optimizers; assert version("synth-containers") == "0.4.2"; assert not any("tblite" in d.metadata["Name"].lower() for d in distributions())'
.public-release-smoke/bin/synth-optimizers --help

- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: optimizer-wheel
name: optimizer-wheel-${{ matrix.target }}
path: dist/*.whl
if-no-files-found: error
retention-days: 7

source:
name: Build source distribution
needs: validate
needs:
- validate
- test
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
Expand All @@ -115,6 +184,8 @@ jobs:
retention-days: 7

publish:
# Candidate pushes exercise the real build gates but cannot publish.
if: github.ref_type == 'tag' || github.event_name == 'workflow_dispatch'
name: Publish ${{ needs.validate.outputs.version }}
needs:
- validate
Expand Down
27 changes: 26 additions & 1 deletion ACCEPTANCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,31 @@

Date: 2026-05-20

> **Historical record — do not run the paths in this document.** This audit was
> written on 2026-05-20 against the then-current monorepo layout and is preserved
> unedited as evidence. Rewriting its paths would falsify what was actually run,
> so read it as a record, not as instructions:
>
> - Source paths carry the `packages/synth-optimizers/` and
> `packages/synth-containers/` monorepo prefixes (26 and 5 occurrences). This
> repository is now a standalone checkout: drop the
> `packages/synth-optimizers/` prefix, and Containers lives in its own
> repository.
> - Cookbook paths (`cookbooks/optimizers/gepa/…`) are **not in this
> repository**. They live in the separate public repo
> [`synth-laboratories/synth-cookbooks-public`](https://github.com/synth-laboratories/synth-cookbooks-public);
> see `RELEASE.md` for how they are invoked now.
> - `code_review_container` exists on no ref of that public repo, so every
> `code-review` row below is unreproducible by an outside reader. The public
> GEPA cookbooks on `main` today are `banking77_container`,
> `hotpotqa_container`, `minigrid_container`, `crafter_container`,
> `tblite_container`, and `healthbench_groq`.
> - Evidence roots under `/tmp/…` and `/var/folders/…` were ephemeral workspaces
> on the machine that ran the audit. They are cited as run identifiers, not as
> artifacts anyone can open.
>
> For the current release acceptance, see `RELEASE.md`.

Scope: public `synth-optimizers` GEPA v1 vertical slice in
`synth-cookbooks-public`, including Banking77 plus public-safe TBLite,
code-review, and Crafter fixtures. This document records validation evidence;
Expand Down Expand Up @@ -81,7 +106,7 @@ package, `synth-containers` contract additions, and GEPA cookbooks under
| Fresh readwrite run writes required artifacts. | PROVED | Current Banking77, TBLite, code-review, and Crafter fresh directories under `/tmp/synth-gepa-status-20260520` each contain `result_manifest.json`, `events.jsonl`, `events.normalized.jsonl`, `cache_profile.json`, `best_candidate.json`, `candidate_registry.json`, `frontier.json`, and `workspace.sqlite` |
| Immediate cached rerun makes no new policy/proposer/rollout external cache writes. | PROVED | Final cached cache profiles: Banking77 `45 hits, 0 misses, 0 writes`; TBLite `15 hits, 0 misses, 0 writes`; code-review `18 hits, 0 misses, 0 writes`; Crafter `18 hits, 0 misses, 0 writes` |
| Readonly replay succeeds when fully cached. | PROVED | Final readonly cache profiles: Banking77 `45 hits, 0 misses, 0 writes`; TBLite `15 hits, 0 misses, 0 writes`; code-review `18 hits, 0 misses, 0 writes`; Crafter `18 hits, 0 misses, 0 writes` |
| `events compare` reports normalized parity between original, cached, and readonly runs. | PROVED | Banking77, TBLite, code-review, and Crafter fresh-vs-cached and fresh-vs-readonly compare commands returned `normalized event feeds match` |
| `events compare` reports normalized parity between original, cached, and readonly runs. | **SUPERSEDED — do not carry forward** | Historical: Banking77, TBLite, code-review, and Crafter compare commands returned `normalized event feeds match`. This row predates the worker pool, budget forecasts, and child resource refs, and the claim no longer holds as stated: `events compare` is byte equality, and a replay legitimately emits 28 fewer `partial: true` worker-pool progress records because it executes no rollout (240 fresh vs 211 cached/readonly at `c21d6fe`). See `RELEASE.md` for the property that actually holds — byte-identical 199-event feeds once runtime telemetry is excluded. |
| Optimizer state machine records run lifecycle from created to terminal state. | PROVED | Current `workspace.sqlite` files under `/tmp/synth-gepa-status-20260520` have `optimizer_state_history` rows: Banking77 40, TBLite 19, code-review 19, Crafter 19; manifests end in `completed` |
| Rollout observations are captured as sensor frames. | PROVED | Current `workspace.sqlite` files under `/tmp/synth-gepa-status-20260520` have `sensor_frames` rows: Banking77 40, TBLite 11, code-review 14, Crafter 14, with rollout jobs persisted 1:1 |
| Candidate payloads, candidate deltas, acceptance decisions, frontier cells, and plan links are first-class workspace rows. | PROVED | Final current-schema rerun under `/tmp/synth-gepa-final-current-20260520` completed Banking77, TBLite, code-review, and Crafter fresh/cached/readonly runs. Fresh workspaces contain candidate graph rows: Banking77 `candidate_payloads=5`, `candidate_deltas=4`, `acceptance_decisions=5`, `frontier_cells=5`, `plan_links=63`; TBLite `2/1/2/1/18`; code-review `2/1/2/1/21`; Crafter `2/1/2/1/21`. Each fresh run returned `projection_status_counts={fresh: 21}`, `invariant_status_counts={pass: 2}`, zero invariant violations, cached writes `0`, readonly writes `0`, and normalized event comparisons true. |
Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 10 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ members = [
resolver = "2"

[workspace.package]
version = "0.2.14"
version = "0.2.22"
edition = "2021"
license = "Apache-2.0"
authors = ["Synth Laboratories <josh@usesynth.ai>"]
repository = "https://github.com/synth-laboratories/synth-cookbooks-public"
repository = "https://github.com/synth-laboratories/optimizers"

[workspace.dependencies]
anyhow = "1.0"
Expand All @@ -32,3 +32,11 @@ thiserror = "1.0"
time = { version = "0.3", features = ["formatting", "macros", "parsing"] }
toml = "0.8"
uuid = { version = "1.10", features = ["v4"] }

# Several constructors and snapshot builders take eight or more distinct domain
# values. Bundling them into parameter structs would only move the arity into a
# literal at every call site, and the alternative -- an attribute per function --
# grows source files that the file-size ratchet in
# `synth_optimizer_platform/tests/file_size_cap.rs` allows only to shrink.
[workspace.lints.clippy]
too_many_arguments = "allow"
Loading
Loading