docs: the migration guide promised silence where v3 now returns 422 - #182
Merged
Conversation
raspbeguy
force-pushed
the
docs/close-two-gaps
branch
from
August 13, 2026 13:02
a09df59 to
907e6d9
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.
Two doc gaps, one of which was worse than a gap.
The migration guide gave advice that rc3 reversed
docs/migration-v2-to-v3.mdcarried a section titled "Removed request fields are ignored, not rejected", telling an upgrading operator that a stalemacormac_aliaseswould be dropped in silence and answer 200. rc3's unknown-field rejection inverted exactly that. A migration guide is the one document where being wrong costs someone an outage, so this was not a missing paragraph but a misleading one.Measured against the installed rc3, the section was wrong on two of its four claims:
The rewrite says what happens now, and the news is good: the silent-failure hazard the section warned about is gone. Both quoted error bodies are copied from a device rather than composed:
The
network/interfaces.namecase flips from the guide's "sharpest silent case" to a loud failure, which is the outcome an IaC client wants: in v2 it created an interface under a generated name that the client then read as drift and duplicated.It also now states the part that is easy to get wrong in the other direction.
id,managedandruntimestay accepted and ignored because every apply is a read-modify-write, and areadOnlyfield that still exists in the model behaves the same way, which is whyipaddris accepted rather than refused. Only names the resource does not model at all are rejected. Verified on a device, including that a full read PUT back returns 200 and that swappingnameforidmakes the create succeed.versioning.md overstated what the clear-on-omit flag restricts
It read as though explicit JSON null were only accepted for fields carrying
x-uapi-clear-on-omit. The server accepts null for any modeled field and clears the option, flagged or not, which is what makes a read-modify-write work when the read answered null. The flag marks where clearing is safe, not where it is possible, and its real value is that a defaulted field is never marked, so a client honouring the flag cannot enter the non-converging diff loop the same paragraph describes.Does this change the wire surface? No. Documentation only; both passages now describe behaviour that already shipped in rc3.
Was it verified against a real device, or only by CI? On the device running rc3 from the published APK. Every status code and both error bodies in the rewritten section were taken from it.
make lint, which includeslint-doc-refs, and 1230 unit tests pass.Was LuCI checked? Not applicable. No uci semantics are involved.