A fast iteration loop for isolated environments
You clone, install, and run code the way a real user would — inside a self-contained Incus container defined by a single profile.
So the real question is how fast you can iterate inside one.
launch, update, status, list, destroy.update is a first-class, released lifecycle commandThe function exists at current HEAD and the README lists it alongside launch, status, list, and destroy.
Status: Shipped and released (v0.3.1)
Which raises the question it was built to answer.
def update livesdef updateupdate, every code change forced a full teardown-and-rebuildTo see a one-line change, you tore the whole environment down and built it back — slow enough to discourage testing.
The fix was to stop destroying the box on every iteration.
update in one cross-cutting commitCommit 1c0338a spanned code, profiles, docs, and E2E tests — a sizeable, whole-feature landing, not a sketch.
Here is exactly what it does when you run it.
update <id> re-runs your profile’s commands in place — it never destroys the containerIt first checks the environment is still Running, then executes the profile’s declarative update.cmds inside it.
Does fresh code actually go live without a rebuild? A test proves it.
test_update_picks_up_new_code pushes a mutation after launch, runs update, and verifies the new version is live — no rebuild.
Fast iteration only counts if “ready” can be trusted, though.
update on the same containerCommit e1017a4 (2026-04-07) added host-side access-port verification: ready is true only when in-container checks AND host-side access checks pass.
Together these close the loop: launch once, iterate fast, trust ready.
verify_timeout (default 30s).ready is true only when in-container AND host access checks pass.In-place updates re-run your declarative commands without destroying the container — and host-side verification means the “ready” you iterate against can be trusted end-to-end.
Repository examined: microsoft/amplifier-bundle-digital-twin-universe (local clone at HEAD 2087575). Note: the task named robotdad/* as source, but the actual git remote is microsoft/* and the update work is by DavidKoleczek — zero commits by ‘robotdad’ exist.
Feature status: Shipped and released (tag v0.3.1).
Commands run to verify every claim:
git show -s --format='%H | %an | %ad | %s' 1c0338a — update commit (DavidKoleczek, Mon Apr 6 2026)git show 1c0338a --shortstat --numstat --format='' — 17 files, 665 insertions, 117 deletions; engine.py +81, cli.py +36, profile.py +17, test +167git show 1c0338a -- .../engine.py .../cli.py .../profile.py — Running guard, update.cmds, --skip-readinessgit show -s --format='%H | %an | %ad | %s' e1017a4 — host-side access verification (Tue Apr 7 2026)grep -rn '99.1.0' tests/ — UPDATED_CORE_VERSION='99.1.0', test_update_picks_up_new_codegrep -n 'def update' .../engine.py .../cli.py ; git tag ; git log --oneline -1 — engine.py:1347, cli.py:261, v0.3.1, HEAD 2087575git log --format='%an' --all | sort | uniq -c | sort -rn — contributor countsGaps: No benchmark/timing numbers exist in the repo to quantify “slow” teardown-and-rebuild — treated as motivation, not a measured metric. PR numbers for 1c0338a and e1017a4 are not embedded in their commit subjects, so they are left unstated. “Patches” is a paraphrase: the mechanism is re-running declarative reinstall/restart commands, not a source patch.
Primary contributor: DavidKoleczek (38 commits across all branches; author of the update command, host-side readiness verification, and the declarative readiness system).