Skip to content
LACE
  • v0.1 Current
  • Python
  • TypeScript Soon

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

terminalbash
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.pyBuilderPublisher).
  • 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 immutable Release row, and activates the sidecar (blue-green).
  • Streams later (APB-023) will add live log streaming during the push.

Direct deploy — lace-app deploy

terminalbash
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

terminalbash
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.