Repository navigation
Description
Update 4.0.0-rc.9 is latest
I have tentative plans to release
go-yaml v4.0.0 on Wednesday, November 4, 2026.
Before then, I would appreciate help testing the newly published
v4.0.0-rc.7 against projects that already use a v4 release candidate.
November 4 is the planned date; reported problems will inform release
readiness.
Testing rc.7
From your project's Go module directory:
go get go.yaml.in/yaml/v4@v4.0.0-rc.7Please run your normal tests and relevant YAML parsing and serialization
checks.
Pay particular attention to custom marshalers and unmarshalers, formatting,
error handling, and existing regression cases.
If your module has a replace directive for go-yaml, ensure it actually
selects rc.7 for this test.
For a module replacement, go list -m -json go.yaml.in/yaml/v4 shows the
required version and any replacement.
Report results here
Please report problems in comments on this issue, so we can track them
together before the release.
Include:
- Your project and the revision tested.
- Your Go version and confirmation that the test used rc.7.
- The failing command, output, and expected behavior.
- A small reproducer or a link to an existing report, if possible.
A comment confirming successful testing is also helpful.
Please describe which tests you ran; a successful test run is evidence for
that workload rather than a guarantee of complete compatibility.
Results by Tuesday, November 3, 2026 would be appreciated, but later
reports are welcome.
Downstream outreach
These 22 projects were selected because they directly depend on a go-yaml
v4 release candidate and each has over 1,000 GitHub stars.
Notification links will be added as the notices are filed.
Test results will be updated manually from comments on this issue.
No response means testing has not been confirmed.
| Project | Notification | Test result |
|---|---|---|
| Gardener | Issue #16181 | √ |
| Actionlint | Issue #765 | √ |
| Terramate | Issue #2397 | Awaiting results |
| Dasel | Issue #568 | √ TomWright/dasel#569 fix submitted |
| Cog | Issue #3212 | Awaiting results |
| Updatecli | Issue #11150 | √ |
| Gitea | Issue #40145 | √ |
| Docker Compose | Issue #14432 | √ |
| AdGuard Home | Issue #8683 | Closed by downstream |
| Authelia | Issue #13659 | √ |
| Grafana Loki | Issue #26037 | Awaiting results |
| yq | Issue #2955 | √ mikefarah/yq#2956 fix submitted |
| Talos | Issue #14805 | √ |
| OSV-Scanner | Issue #3195 | √ |
| Atlantis | Issue #7038 | √ runatlantis/atlantis#7042 fixes issues |
| ko | Issue #1781 | √ ko-build/ko#1781 (comment) |
| evcc | Issue #35660 | √ afaict |
| Incus | Issue #4309 | √ afaict |
| Apache Dubbo-go | Issue #3785 | √ afaict |
| DDEV | Issue #9034 | √ ddev/ddev#9035 |
| Apptainer | Issue #3897 | √ |
| doco-cd | Issue #2131 | √ |
Thanks for helping test the release!
-- Ingy döt Net
Activity
Crowley723 commentedon Oct 31, 2026
Project: https://github.com/authelia/authelia
PR: authelia/authelia#13660
Test Run: https://buildkite.com/authelia/authelia/builds/60768/canvas
5 failing unit tests, related to changed error codes and does not affect the application at all (all integration/e2e testing passes).
Errors:
james-d-elliott commentedon Oct 31, 2026
Nice work.
The changes to comment parsing are the ones that are most likely to catch users out I think.
password: "abc"#commentabcfound a comment without preceding whitespacegroups: [a, b]#x[a, b]found a comment without preceding whitespacea: |#c(block scalar header)aisxfound a comment without preceding whitespaceingydotnet commentedon Nov 1, 2026
@james-d-elliott
These aren't changes to comment handling. They are fixes to disallow invalid YAML.
No changes to comment handling were planned for v4.
We decided to leave v3 comment processing alone and make all the changes we want in the Comment-Model plugin API. (forthcoming).
https://play.yaml.com/?show=gdhflLnJPpxHUrsS#cGFzc3dvcmQ6ICJhYmMiI2NvbW1lbnQ=
https://play.yaml.com/?show=gdhflLnJPpxHUrsS#Z3JvdXBzOiBbYSwgYl0jeA==
https://play.yaml.com/?show=gdhflLnJPpxHUrsS#YTogfCNj
We're not protecting spec invalid YAML. (although we could via a plugin if it was prevalent enough)
james-d-elliott commentedon Nov 1, 2026
You sir mistake me haha (I think?). I agree with the change, and the invalid YAML being unsupported and this is entirely defensible, just noting that it's the likely thing that will cause the most issues (in my opinion of course) so that everyone else who looks here can be aware and can prepare themselves and possibly their users. I did note the responsible commits also restored disabled checks.
silverwind commentedon Nov 1, 2026
Tested rc.7 with go1.27.3 in three Gitea projects. Build and vet pass in all three. Two behavior changes show up in tests:
https://github.com/go-gitea/gitea at da7b81d4079dca56ee7e9485f2ae287fafc249ab (previously on
v4.0.0-rc.6.0.20261013184558-04dd63131525): one golden-file test fails because the keyonis now emitted as"on":instead of'on':. Equivalent YAML, we'll update the fixture. Everything else passes.https://gitea.com/gitea/runner at a46d3f3edac73acc1ad0e5c02fd005f88d5d3bf4 (same pseudo-version): two tests fail because the document
:is now accepted. The tests used it as invalid input.yaml.Unmarshal([]byte(":"), &v)behaves the same way. We assume this is the intended empty-key fix and will adjust our tests. Could you confirm?https://gitea.com/gitea/actionslib at de5ccd9d3196420f9ef5044598ad40dde8d66664 (previously on
v4.0.0-rc.6): all tests pass.Written by Claude (Opus 5.5).
SilentNul commentedon Nov 1, 2026
Hi @ingydotnet — thanks for the rc.7 heads-up in apache/dubbo-go#3785. We
tested
go.yaml.in/yaml/v4@v4.0.0-rc.7there and hit one compile-timeregression that blocks part of our tree. Reporting it here before the Nov 4
tag, as requested.
Reproducer
A module that only uses the public API, no dubbo-go involved:
The same file compiles cleanly if you pin rc.6 instead
(
go get go.yaml.in/yaml/v4@v4.0.0-rc.6 && go build .→ exit 0, no output),so it is the rc.7 change and nothing else.
Confirmed the version actually in use:
What changed
In rc.6,
yaml.Dumperwas an exported type alias (yaml.go:555):so it inherited every method of the internal type, including
SetIndentandSetCompactSeqIndent.In rc.7 it became a wrapper struct that forwards only two methods
(
yaml.go:855-884):The internal methods were renamed to
SetLegacyEncoderIndent/SetLegacyEncoderCompactSeqIndent; the wrapper does not expose either.Impact
github.com/pb33f/libopenapi v0.38.7(widely used for OpenAPIparsing/rendering) does exactly this in
(*Document).RenderWithIndention(
datamodel/high/v3/document.go:175-182):Bisected locally: the depending module builds cleanly on rc.6 and fails on
rc.7 — it is purely the
Dumperchange, not a libopenapi upgrade. This breakstools/protoc-gen-triple-openapiin apache/dubbo-go (a separate module from themain one).
Suggestion
Any of these keeps v4.0.0 source-compatible:
SetIndent/SetCompactSeqIndentas forwarding methods on theDumperwrapper, deprecated and removed in v5, ortype Dumper = libyaml.Dumperfor this release and introduce thewrapper in a later minor, or
notes —
Encoder.SetIndentis the replacement, butNewDumperusers haveno drop-in path today.
What still works
The main dubbo-go module builds and its YAML-consuming packages pass on rc.7
(details in apache/dubbo-go#3785); only that OpenAPI codegen tool submodule is
blocked. Happy to re-test as soon as a follow-up rc lands.
Environment
main@ 555a9baccoVeille commentedon Nov 1, 2026
hi @SilentNul
This one is on me. I made the change here
I noticed that Dumper was exposing way to much method inherited from v3 Encoder.
SetIndent was providing no way to report the i valid number of indentation (<= 0 and >9). It was either silent or panicking. Not a sane design for a brand new API.
So I wiped down the methods on Dumper (and Loader). It's a choice we did on purpose. This should have never reached an -rc, but we preferred to remove it as if it was an -alpha.
There is a solution anyway.
You can use yaml.WithIdent
WithIdent is the solution for passing the number of ident with the v4
SilentNul commentedon Nov 1, 2026
Thanks, @ccoVeille! Confirmed on rc.7 — the option path works as expected:
NewDumper(&buf, yaml.WithV3Defaults(), yaml.WithIndent(2))produces the expected 2-space indentation. BothWithIndent(0)andWithIndent(99)returnyaml: indent must be between 2 and 9 spaces— unlike the directDumper.SetIndentpath, which silently ignored out-of-range values (verified on rc.6:SetIndent(0)andSetIndent(99)both still emitted 2-space output, no error).One note for downstream users:
WithIndentexists in rc.6 as well and carries the same range check, so libraries currently callingDumper.SetIndentcan switch to the option and stay compatible with both rc.6 and rc.7, without version-specific code.On our side the main module builds and its YAML-consuming packages pass on rc.7 (apache/dubbo-go#3785, bump in #3786); only one codegen submodule stays on rc.6 until pb33f/libopenapi adopts the option.
Thanks for the quick response!
kimdre commentedon Nov 1, 2026
Hi, I'm the maintainer of doco-cd. I did not encounter any issues/regressions in my tests with v4.0.0-rc.7.
Request: kimdre/doco-cd#2131
10e14d3449da9ae1272e59bd8d56618e82e471f8(main)go.yaml.in/yaml/v4 v4.0.0-rc.7(already on main via fix(deps): update module go.yaml.in/yaml/v4 to v4.0.0-rc.7 kimdre/doco-cd#2133)All my tests passed:
go vet ./...(including e2e tag): passThanks for the heads-up and for the release candidates!
gibmat commentedon Nov 1, 2026
Chiming in from the Debian side, currently there are eleven packages in unstable that have a dependency on go.yaml.in/yaml/v4.
Seven build fine with rc.7:
Four don't build with rc.7:
dasel and yq are mentioned above in the "downstream outreach" list, and I've commented on those two specific issues.
ingydotnet commentedon Nov 1, 2026
@gibmat @SilentNul https://github.com/pb33f/libopenapi/blob/main/go.mod#L7 has forked this project.
Note: We see merit in @pb33f's changes and will likely adopt them, but nothing was reported by them here.
fix(deps): update go.yaml.in/yaml/v4 to v4.0.0-rc.7
ccoVeille commentedon Nov 1, 2026
@gibmat
Can you share the URL of the CI that fails for this?
golang-github-pb33f-libopenapi
golang-github-pb33f-libopenapi-validator
Because I don't understand what could fail if they are using a fork of our code, that wasn't updated for weeks.
Some pointers would help us.
jamengual commentedon Nov 1, 2026
Tested v4.0.0-rc.7 in runatlantis/atlantis (runatlantis/atlantis#7042), revision c9f261f, Go 1.27.3 on darwin/amd64 plus Linux CI. Full suite passes.
Behavior changes we saw, none of them blockers:
":"now decodes to{null: null}; rc.6 returneddid not find expected key. That's correct under YAML 1.2 (an implicit block mapping entry may have an empty key). Three of our tests used:as their "invalid YAML" input, and we switched them toa: b: c."? [foo]\n: bar\n<<: {}\n"intoanynow returnscannot use '[]interface {}{"foo"}' as a map key; try decoding into yaml.Nodeinstead of the recovered panic texthash of unhashable type. Nicer.yaml: line 1: mapping values are not allowed in this contextandgo-yaml load error in constructor at L1.C3: .... Is that intended for v4.0.0?Thanks for the heads-up!
rfay commentedon Nov 1, 2026
passed all tests on all platforms.
[-]v4.0.0 planned for November 4: please test rc.7[/-][+]v4.0.0 planned for November 4: please test rc.8[/+][-]v4.0.0 planned for November 4: please test rc.8[/-][+]v4.0.0 planned for November 4: please test rc.7[/+]ndeloof commentedon Nov 2, 2026
Report:
Node.Decodeno longer applies the default alias/depth limits (v4.0.0-rc.5 → rc.8)While testing rc.8 in compose-go (compose-spec/compose-go#981), our loader tests stopped returning: a document of deeply nested aliases (
TestAliasBombPrevented) is now expanded without limit instead of being rejected with "excessive aliasing". It passes with rc.4 and hangs with rc.6, rc.7 and rc.8.The cause, as far as we can tell, is that
Node.Decodebuilds its constructor fromDefaultOptions, which has noAliasCheck/DepthCheck, whileNode.Load(throughApplyOptions),Unmarshaland the decoder apply them. OurUnmarshalYAMLimplementation expands the aliases by decoding a node, so it lost the limits.Our workaround is to call
Node.Loadinstead, one line inloader/reset.goL80-L84.Is this change of behavior known and intended for
Node.Decode? If it is, we will keep the workaround. If not, other callers decoding nodes fromUnmarshalYAMLare likely exposed too.Restore default limits for Node.Decode
Ly-Joey commentedon Nov 2, 2026
Hello from osv-scanner!
Our tests at google/osv-scanner#3198 pass with no issues :D
imharjot commentedon Nov 3, 2026
I tested
v4.0.0-rc.9against the yq compatibility branch in mikefarah/yq#2956 atd84b917c9146874b6ca1933300382add1f44aee4, using Go 1.26.4 on macOS arm64. I ran the same revision with rc.7 as a control. The only dependency change wasgo get go.yaml.in/yaml/v4@v4.0.0-rc.9, andgo list -m go.yaml.in/yaml/v4confirmed each selected version.Both builds passed, and
bash scripts/acceptance.shpassed all 173 CLI checks on each version. I also reran the YAML parse and format, anchor and alias, cross-document alias cycle, and decoder anchor-reset tests with-race. Those passed on both versions.go test -race -count=1 -json ./...had the same result on each version: 521 tests passed andTestJSONScenariosfailed. Itsbad jsoncase expectedjson: string of object unexpected end of JSON inputand gotinvalid character 'b' after object key:value pairon both rc.7 and rc.9. I didn't see a new failure from upgrading to rc.9 in this workload.gibmat commentedon Nov 3, 2026
@ccoVeille I performed a local rebuild of those Debian packages with an updated go-yaml v4, so no public CI links to point to, sorry.
Both packages are a bit out of date, so maybe current versions build properly. :)
https://tracker.debian.org/pkg/golang-github-pb33f-libopenapi
https://tracker.debian.org/pkg/golang-github-pb33f-libopenapi-validator
acumino commentedon Nov 3, 2026
Hi, @ingydotnet
I ran the Gardener test with
v4.0.0-rc.7. All tests passed with no issues 😄.ndeloof commentedon Nov 3, 2026
Tested
v4.0.0-rc.9downstream, and it looks good.Thanks for the quick fix in #475: the
Node.Decodedefault limits are back and nothing else regressed on our side.ccoVeille commentedon Nov 3, 2026
@gibmat
We know pb33f forked our lib, and no recents commit we made landed on that fork.
We have a ticket to include the commit pb33f made on their fork
maybe they will switch back to our lib at some point.
But all these are out of our control.
So for now, I'll say we are good.
Shanmukh-l33t commentedon Nov 9, 2026
Report for rhysd/actionlint as requested in the release notice — tested against the final v4.0.0: PASS, no blocking problems.
rhysd/actionlint@011a6d1(main), migration branch https://github.com/Shanmukh-l33t/actionlint/tree/bump-go-yaml-v4.0.0, commitdef8b7e87188481eedd1dc5cd9ce8258fa765c3bgo get go.yaml.in/yaml/v4@v4.0.0 && go mod tidy && go build ./... && go vet ./... && go test -p 2 ./...scripts/packages that already fail on pristine main in my environment (a golden playground-URL encoding and a network-dependent test) — identical failure set before and after the bump, so unrelated to v4.0.0.API changes I had to migrate (from v4.0.0-rc.3):
*yaml.ParserErrorno longer exists;*yaml.TypeErrorremains only as a deprecated alias whoseErrorsfield is now[]string, andyaml.Unmarshalnever returns it — the decoder reports*yaml.LoadErrors(multiple*LoadErrorwithMessage+Mark) or a bare*LoadErrorfor single syntax errors.2:7→2:8);0:0and drop theyaml:prefix;yaml: construct errors: line 4: …; line 5: …, instead of newline-joinedyaml: unmarshal errors:;cannot construct !!int …instead ofcannot unmarshal !!int ….No failures, so no reproducer needed. Follow-up tracked in rhysd/actionlint#765 (my full test report) and the rc.6 migration rhysd/actionlint#735.