docs: Reconcile Fly Machines tutorial + fly-reconcile example (#868) - #872
Merged
Conversation
Adds examples/fly-reconcile — one app + two machines whose op reconciles against a *running* mudflaps (Build → Apply only, no boot/teardown), so re-runs show the stateless reconcile flyApply does: create → no-op → in-place update → owned-only prune, with a machine created outside chant surviving the prune (no managed-by marker). Plus tutorials/fly-machines-reconcile.mdx and a compile test. Registered in the Fly tutorials sidebar group after local-fly. Scope note: the example is machines-only. Adding a Volume with a mount hits a mudflaps fidelity gap — a mounted machine reads back config.mounts=null, so it perpetually re-applies against the emulator (INTENTIUS/mudflaps#59). The volume+mount enrichment is deferred to that fix; machines alone give a clean offline no-op. Verified: docs build clean; the full reconcile sequence (create/no-op/update/ prune/foreign-survives) runs green against ghcr.io/intentius/mudflaps:0.4.0; examples compile tests pass.
…s mounts (#868, #59) mudflaps 0.4.1 (INTENTIUS/mudflaps#60) persists machine config.mounts, so a mounting machine no-ops on re-apply. Enrich the reconcile example/tutorial: - bump SPRITZER... no: bump MUDFLAPS_IMAGE to 0.4.1. - add a Volume + a web mount back to fly-reconcile/src/infra.ts; the compile test asserts the volume create body + web's mount. - tutorial + README show the volume in create/no-op output and the image 0.4.1. Verified end-to-end against ghcr.io/intentius/mudflaps:0.4.1: create (app + volume + web + worker) → re-apply is a clean no-op for ALL resources, including the mounted web (previously it re-applied forever). Docs build clean; compile tests pass.
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.
Closes #868.
Adds the fly-reconcile example + the Reconcile Fly Machines tutorial — chant's differentiator on Fly, a stateless reconcile with no state file.
What
examples/fly-reconcile— one app, a volume, and two machines (webmounts the volume), op isBuild → Applyagainst a running mudflaps (no boot/teardown), so state persists across runs.tutorials/fly-machines-reconcile.mdx— walks the reconcile: create → no-op re-apply → in-place update → owned-only prune, and a machine created outside chant (nomanaged-bymarker) surviving the prune.Emulator fix landed alongside
Building this surfaced a real mudflaps gap: a mounted machine read back
config.mounts: null, so it re-applied forever. Fixed in mudflaps 0.4.1 (INTENTIUS/mudflaps#60, closes mudflaps#59) —MachineConfignow persists/echoes mounts. This PR bumpsMUDFLAPS_IMAGEto 0.4.1.Verified end-to-end
Against
ghcr.io/intentius/mudflaps:0.4.1: create (app + volume + web + worker) → re-apply is a clean no-op for all resources, including the mountedweb(previously perpetual "updated") → edit image → update → remove worker → prune → an unmanagedlegacymachine survives. Docs build clean; compile tests pass.Second of the Fly tutorial batch under #736 (after #867).
🤖 Generated with Claude Code