Re-pin vendored Interchange to the workflow.json retirement, rebased - #87
Closed
TheGreatAxios wants to merge 6 commits into
Closed
Re-pin vendored Interchange to the workflow.json retirement, rebased#87TheGreatAxios wants to merge 6 commits into
TheGreatAxios wants to merge 6 commits into
Conversation
Upstream's 45 commits since 59f5e7b9 retire the on-disk workflow.json: a deployed workflow's definition is evaluated from its own source closure and re-verified in-child against the approved wire hash, source-ref becomes the only deploy lineage, childWorkflow becomes an owned inline import resolved in memory, and run grants derive from a persisted grant-walk snapshot. Re-applies every workbench-local delta on the new trees, none of which upstream subsumed: the inference.usage forward, the terminal-anchor ownsWorkflowRunRepo gate, the hasConversationText mail drop, and the hub-api needs-you approval route carve-out. Their tests stay green. apps/sidecar keeps its old row: the execution host has not been converted off the retired lineage yet.
Upstream deleted the live-config wrap (wrapHarnessAsSingleStepWorkflow) along with the rest of the live-authored deploy chain. The wrap was a thin adapter over buildSingleStepAgentDefinition, which survives, so the launch now passes the resolved fields directly: the folded run's id, its system prompt, and its catalog-resolved inference preferences. Tools stay empty here — a folded launch pins its tools as packages, not factories.
Records the CL-6324 pin delta, the deltas that survived it, and why the app-side conversion is one migration rather than a per-tree bump: workbench has no code-sourced deploy front, and the retired live-authored chain is what every folded run launches through.
The CL-6325 action-handler adapters and the CL-6326 onBodyFailure edge re-apply onto the 4ed8baf4 trees unchanged; their tests stay green, so only the recorded tree hashes move.
Records that the #58 workflow-host adapters and the #68 onTrigger onBodyFailure edge re-apply onto the 4ed8baf4 trees unchanged, and why the four open conversion sites can only be taken in one order: no source closure exists to stage or lift bodies from until the folded run itself deploys from a real source package.
…Failure is read Records that the code-sourced deploy enumerates inline onTrigger bodies unconditionally, so one launch front serves both a single-step agent and a section definition, and that onBodyFailure reaches the runtime only because the child re-evaluates the closure -- the inert projector drops it.
This was referenced Aug 20, 2026
Contributor
Author
|
Superseded — the repo is pinned to |
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.
Supersedes the held #59: same re-pin (
59f5e7b9→4ed8baf4, theworkflow.jsonretirement), now rebased onto post-mergemainwith thevendored deltas that landed today re-applied onto the re-vendored trees.
The app-side deploy conversion is not here — see "What remains", which
now carries the ordering proof rather than a scoping guess.
What this lands
main(133 commits since Re-pin vendored Interchange to the workflow.json retirement #59's base). Four conflicts,all resolved by keeping the re-vendored trees and folding main's own
vendor deltas back on top:
vendor/intx/workflow-host/src/index.ts(adapter exports beside the renamed spawners),
VENDORED.md,scripts/checks/kill-dates.txt,docs/revendor-inventory.md.adapters/{action-invoker,effect-ledger,run-blobs}.tsand theresolveActionHandler/effects/invokeActionwiring inchild/run-child.tsre-diff onto4ed8baf4without conflict, stilltypecheck against the re-pinned tree, and their 14 tests pass.
onTrigger.onBodyFailureedge re-applied. Upstream's486a6b1breshaped
runtime/run.tsacross the re-pin; the delta re-applies onto thenew drive loop and
planOnTriggerResumeunchanged, 4 tests pass.vendor/intx/workflowandvendor/intx/workflow-host;check:killdatesis green, and bothVENDORED-FROMdelta lines carry the re-applied sub-deltas.re-pin" — they are re-applied — and
docs/revendor-inventory.mdgains theordering proof below.
What remains, and why it could not be forced
The conversion is one chain, and step 3 is the only one that touches the
sites the typecheck is red on:
packages/folded-runs'deployAtHeadmust become a code-sourced deploy.deployWorkflowFromSourcetakes aWorkflowDefinitionSource— aregistrypin, an assettarballselected byname@range, or an assetsourcetree at acommitSha. Greppingapps/,packages/,workflows/,scripts/fordeployWorkflowFromSourcereturns zerohits: workbench has no code-sourced deploy caller at all. This is a new
pipeline (definition asset, seeded source tarball, registry config,
attachment resolver, asset service), not a call-site rename.
by
systemPrompt,trigger.to, the resolved inference chain, and the@corbits/mcp-toolscredential bindings folded in at launch. The varyinghalf has to move into deploy-time config the entry module reads — a
change to the folded-run contract, not a port.
SpawnTimeEnvdropsreferencedDefinitionHashesand gainsclosurePackageDir; the newcreateInMemorySpawnChild/createInMemorySpawnSuspendableChildtake abodies: ReadonlyMap<string, WorkflowDefinition>lifted from there-evaluated closure. There is no closure dir to stage and no bodies map
to lift until step 1 ships one. Swapping the spawners first would mean
re-deriving bodies from the retired in-memory definition — the fallback
shim recreating the deleted front, which is ruled out.
So the spawn swap was deliberately not landed half-way.
Section deploys (CL-6329 / Phase 1.3's prerequisite)
Checked against the re-vendored trees: section deploy works on the new
rails, natively, and the launch API needs no single-step/section branch.
deployCodeSourcedWorkflow(hub-sessions/src/session-service.ts:745)calls
enumerateInertOnTriggerBodies(projection)on EVERY code-sourceddeploy, pins each body step's source through the same operator-approval
gate as the top-level steps, recomputes each body's wire hash, and ships
them as
referencedDefinitions. No caller opt-in, no second entry point;a definition with no inline section enumerates zero bodies.
package's entry module evaluates to. A converted
deployAtHeadexposing a"this one is a section" flag would model a distinction the platform does
not have.
Two seam corrections against the new pin:
workflow-deploy/src/orchestrator.ts:1020no longer exists (the file went1094 → 319 lines;
createWorkflowDeployOrchestratoris deleted, and bodyenumeration moved into
hub-sessionsplus the pureinert-ontrigger-bodies.ts).workflow/src/ontrigger-bodies.ts:43(
onTriggerBodyRef) is intact and is now the single owner of the<workflowId>__<stepId>scheme.One finding Phase 1.3 should know:
onBodyFailureis dropped by the inertprojector —
projectOnTrigger(live-inert-projector.ts:376) is an explicitwhitelist and
InertOnTriggerhas no such field. It still works on the newrails, because the child re-evaluates the closure to a LIVE definition and the
runtime reads the policy off that (
run-child.ts:645-649); being outside theprojection also means it can never cause a re-verify divergence. But it is
sound only on a path whose executable definition is re-evaluated from
source. Any path that ships the projection as executable would silently take
the default
"end"— a section dying on its first failed turn, with noerror.
State of the build
folded-runs: 38 pass / 0 fail.chat: 548 pass / 0 fail.apps/sidecar: 121 pass, 3 fail — all three the deletedcreateWorkflowSpawnChildexport, the visible tail of the chain above.bun run typecheck: red at exactly the four mapped sites(
folded-runs' twodeploySingleStepAtHeadreferences and their cascade,and the sidecar's
projection.definition/ spawn-adapter /referencedDefinitionHashes/workflowDefinitionRepoIdsites). Onefurther error,
vendor/intx/inference/src/providers/google-genai-files.tsUint8Array→BodyInit, is byte-identical tomainand predates thisbranch.
check:killdatesgreen.Draft until the folded-run source-package decision (step 1/2) is made.