feat(provision): compose→artifacts + bundleFrom + provision lib (deploy slice 2, path A) - #65
Merged
Merged
Conversation
…rovision (deploy slice 2, path A) Slice 2 foundation of the agent-deployment ADR (#63), path A (extend the artifacts prefix; the runtime restores it into ~ at boot): - studio-compose: Bundle::artifact_objects(ns, name) — pure {path->bytes} → (artifacts/{ns}/{name}/{path}, bytes) mapping + artifacts_prefix(). Unit-tested (2 new). - oabctl manifest: new optional Spec.bundleFrom (mirrors bootstrapFrom; propagated through OABFleet expand). Legacy manifests unchanged (default None). - oabctl studio_api (additive, config-free): bundle_from_uri(), push_bundle() (put each object to the control-plane bucket), and provision() = push bundle then apply the manifest at its chosen image tag. Reuses parse_manifests + apply_manifests. Tests for bundle_from_uri + bundleFrom manifest round-trip. Deferred (next increments): oab-mcp deploy_provision tool + src-tauri command + Compose-tab Deploy button + create-wizard bundle support; and the openab image boot step that syncs bundleFrom prefix into ~ (cross-repo). Verified: cargo test -p studio-compose (19); cargo check -p oabctl (+ --tests). Full oabctl test + src-tauri build run under CI. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ack ②)
Wire the compose library to a one-click ECS deploy, end to end:
- oabctl studio_api: load_manifest() reads the stored desired manifest
(manifests/{ns}/{name}.yaml); redeploy() loads it, repoints image +
bundleFrom, pushes the bundle, and applies — networking/resources/secrets
ride along from the stored manifest, so a redeploy needs no infra input.
- studio-cp: provision_from_library() — compose template⊕overlay, then
redeploy; returns a ProvisionOutcome (image/digest/objects/action).
- oab-mcp: new deploy_provision tool (thin dispatch into studio-cp).
- src-tauri: deploy_provision command bridging to the sidecar tool.
- console: Deploy form on the Compose tab (revealed after preview) —
namespace/name/image tag → compose→push→apply, with result status.
The agent must already be created (redeploy reuses its stored manifest);
net-new agent networking-from-bootstrap is a follow-up, as is the openab
image-side bundle consumption (still under discussion).
Verified: cargo check -p oabctl / -p studio-cp / -p oab-mcp; console tsc +
65 vitest + vite build. Full workspace test + src-tauri build run under CI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brettchien
force-pushed
the
feat/deploy-slice2-ecs-provision
branch
from
August 16, 2026 15:07
e01d3a0 to
d20a6e0
Compare
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.
Slice 2 foundation of the accepted agent-deployment ADR (#63), transport path A (Brett's call, 2026-08-16): extend the existing
artifacts/{ns}/{name}/prefix to carry the whole composed bundle; the runtime restores that prefix into~at first boot. Stacked on #64 (Slice 1) — review that first.What's here (all additive, backward-compatible)
studio-compose—Bundle::artifact_objects(ns, name): pure{path → bytes}→(artifacts/{ns}/{name}/{path}, bytes)upload set, plusartifacts_prefix(). Deterministic (sorted), unit-tested — the S3 key layout is verifiable without touching S3.oabctlmanifest — new optionalSpec.bundleFrom(ans3://…/artifacts/{ns}/{name}/prefix), mirroring the existingbootstrapFrom; propagated throughOABFleetexpand().configFromstays the single-file config the container reads directly. Manifests withoutbundleFromdefault toNone, so every existing deployment is unchanged.oabctl::studio_api(the Studio-facing, config-free, additive-only surface) —bundle_from_uri(bucket, ns, name)→ the trailing-slash prefix URI.push_bundle(...)— put each bundle object to the control-plane bucket (idempotent overwrites → re-provision replaces the prior bundle).provision(...)— push the bundle, then apply the manifest at its chosen image tag. Reusesparse_manifests+apply_manifests; bundle-first so the file carrier exists before ECS pulls the task up.bundle_from_urishape +bundleFrommanifest round-trip (present →Some, absent →None).Deferred — next increments
oab-mcpdeploy_provisiontool →src-tauricommand → Deploy button on the Compose preview (needs a decision on where runtime/networking params come from for a Studio-initiated deploy — the overlay's runtime section is the likely home).createwizard: upload the full bundle + emitbundleFrom(today it uploads onlyconfig.toml).openabimage (cross-repo, needs Falcon): boot step thats3 syncs thebundleFromprefix into~on first seed (bundle seeds only when state is absent;pre_seedruntime state wins thereafter). Until this lands, Studio can push the bundle + roll the service, but the agent won't restore persona/skills from it yet.Verification
cargo test -p studio-compose→ 19 passedcargo check -p oabctl+cargo check -p oabctl --testsclean (full test +src-tauribuild run under CI; the AWS-SDK test-profile codegen OOMs my constrained box, so CI is the gate there)🤖 Generated with Claude Code