lab: services.optimizer must land on vein.services (runs never saw it) - #1614
Merged
Conversation
createVein SPREADS the caller's services into a fresh effective bag
(standardServices + artifacts + caller's), so createLabVein's
post-construction `services.optimizer = …` mutated an object no run ever
read again — its comment ("mutate the SAME object createVein holds by
reference") described behavior a vein refactor removed. Every consumer of
services.optimizer was silently broken at run time: harvey/evolve-loop
(seen live: "requires a services.optimizer capability") and eval/optimize
(gitsee-optimize / concepts-optimize would hit the same wall).
Inject on vein.services (the effective bag) instead, keeping the caller's
bag consistent too. evolve-smoke gains the end-to-end regression check:
boot the real lab vein (offline, dummy key for construction-only provider
checks), publish a probe step + workflow, and assert a RUN sees
ctx.services.optimizer — plus an explicit exit, since the booted vein's
live handles otherwise keep the smoke process alive forever.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…in the harness
Two generations zeroed out when the author's schema-mode final turn
degenerated to a literal {"candidate": "placeholder", ...} — the harness
graded a ghost workflow while the author's real publishes (v5, v6) sat
unmeasured. candeval now runs the harness-pinned input.candidateName, and
vpin/vactive resolve the version to grade (the echoed pin when it exists,
else the candidate's active version — the author's own last publish, since
generations run sequentially). The result step reports the resolved
version so a garbage echo can't poison the briefing lineage or the
EXPLOIT anchor. Also bump the briefing's approach-summary excerpt 400 →
1200 chars: it is the only channel telling the EXPLORE directive what has
already been tried.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The UI always loaded the active version; agent-evolved workflows (harvey-produce-ai v1…v7) had no way to show how their structure changed across generations. /workflows/:name/flow now takes ?version=, and a topbar dropdown pins the canvas to any published version. Historical views are read-only (Publish/Run/add-step/edge edits gated off, badge shown) — Publish builds on active and Run runs it, so editing the past would mislead. The pin self-invalidates on workflow switch and resets when a run is selected (run events overlay the active structure). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First live run of harvey-evolve v3 died immediately with
harvey/evolve-loop requires a services.optimizer capability.Root cause:
createVeinbuilds its effective services bag by spreading the caller's bag into a fresh object ({ ...standardServices, artifacts, ...opts.services }).createLabVeininjected the optimizer after construction by mutating its local bag — whose comment ("mutate the SAME object createVein holds by reference") described behavior a vein refactor removed. Runs read the effective bag, soservices.optimizerwas silently missing for every consumer:harvey/evolve-loop(seen live) andeval/optimize(gitsee-optimize / concepts-optimize would hit the same wall).Fix: inject on
vein.services— the effective bagcreateVeinreturns — and keep the caller's bag consistent as well.Regression check added to evolve-smoke (end to end, offline): boot the real
createLabVeininto a temp workspace (dummyANTHROPIC_API_KEYfor the construction-only provider check; nothing calls an LLM), publish a probe step + one-step workflow, run it, and assert the run'sctx.services.optimizeris present. Plus an explicitprocess.exit— the booted vein's live handles otherwise keep the smoke alive forever.npx tsc --noEmitclean; full evolve-smoke passes including the new check.🤖 Generated with Claude Code