lace-app-sdk
Publishing, releases & rollback
Seal, push, and version your app. Releases are immutable, content-addressed, and one rollback away.
Lifecycle
write_app_manifest() → lace-app test → lace-app push (or deploy) → Release sealed
│ │ │
manifest JSON proof lanes OK image pinned in LaceApp.yaml
+ uploaded → CI verifies → activated
│
lace-app releases list
lace-app releases rollback
Push through CI — lace-app push
lace-app push --app-id acme.field_intake
# → tars app/, uploads to CI, CI runs proof lanes, seals image, creates Release row
lace-app status acme.field_intake
lace-app releases list acme.field_intake
lace-app open acme.field_intake # browser → /apps/acme.field_intake/
- Uploads the app repo to the builder service (
src/lace/builder/service.py→BuilderPublisher). - CI runs the full proof harness in a throwaway environment.
- On green, the publisher builds the sidecar image, pins its digest in
LaceApp.yaml, creates an immutableReleaserow, and activates the sidecar (blue-green). - Streams later (APB-023) will add live log streaming during the push.
Direct deploy — lace-app deploy
lace-app deploy --dir ./field_intake --cloud
# → proof lanes locally → seal → upload/register/activate (no CI, AFV-016)
Seal + upload/register/activate with no CI (AFV-016). Still runs proof lanes locally before sealing. Useful for air-gapped or operator-driven deploys. Requires a tenant with deploy scope and a reachable sidecar registry.
Releases are immutable
- Each release has an
rel_*id, a pinned image digest, a manifest snapshot, and a created-at. lace-app releases list <app_id>— table of releases.lace-app status <app_id>— app + latest-release health (sidecar/health/ready, route reachability, migration state).lace-app logs <app_id> --lines 200— tail sidecar logs.
Rollback
lace-app releases rollback acme.field_intake rel_0Ck8aX9q
# → re-activates that Release's image + manifest; one-command undo
Rollback re-activates an older release's image and manifest — not a git revert. The deactivated release stays addressable.
In the API, this is POST /v1/apps/{app_id}/releases/{release_id}/rollback (see REST API).
Secrets & config at deploy time
Set app-scoped secrets with lace-app secrets set <app_id> <key> <value> (server-side, never checked into the repo). They resolve in the sidecar via get_secret() (routes & UI). Non-secret config lives in LaceApp.yaml → env_vars.
Versioning
LaceAppManifest.version is informational (semver). The platform versions releases by rel_* id and image digest — two releases can share the same manifest version and still be distinct.
Pin version when you want human-readable release notes; rely on rel_* for rollback.
Next: CLI reference or back to testing.