Skip to content

feat(api)!: send problem bodies and MergeConflict for merge and note-write failures - #670

Merged
ThomasK33 merged 6 commits into
mainfrom
issue352-merge-notes-problems
Nov 4, 2026
Merged

ThomasK33 merged 6 commits into
mainfrom
issue352-merge-notes-problems

Conversation

@ThomasK33

@ThomasK33 ThomasK33 commented Nov 4, 2026 •

Copy link
Copy Markdown
Member

Merge and note-write failures now use the bodies upstream documents: upstream's MergeConflict for merge file conflicts, and the plain problem body for every other failure. This is part 3, the last part, of item 3 of #352 (scope: issuecomment-6628583093).

Why

Upstream's spec documents a plain ProblemDetails body for every merge and note-write failure, with these exceptions:

  1. A merge 409 for file conflicts, or for "an automatic stale-target retry that could not absorb concurrent target/repository movement", is MergeConflict (application/json): error, conflict_type (merge_conflict, target_moved or repo_changed), conflict_paths and merge_base_sha, with no result. "A problem body reports any other conflict."
  2. The notes 409 guard body (NotesWriteRefGuardProblemDetails), which open.storage already sends.

open.storage sent the result envelope (with conflict_paths for conflicts) on every merge failure and the note envelope on every note-write failure. SDK 0.1.0 turned all of them into RefUpdateError "409: request failed". With a MergeConflict body it gives MergeConflictError.

What changes

  1. Merge: wmFail is gone. File conflicts write MergeConflict with conflict_type: merge_conflict. A lost CAS on the target ("moved concurrently") writes a 409 conflict problem body: upstream's target_moved and repo_changed report a failed automatic retry, and open.storage does not retry (Codex round 4). A non-fast-forward ff_only merge and unrelated histories answer 412 precondition_failed (they were 409), because upstream's merge 412 names both. The 400s use writeInvalid, the 404s branch_not_found, and the 403s, 429 and 500 the generic codes.
  2. Notes: every failure is the plain problem body: 400 bad_request, 403, 404 (ref_not_found for an object_ref that does not resolve), 409 conflict (note exists, lost notes CAS), 429. The lost notes CAS now carries problem members, which the 2026-10-27 comment on api: problem-details later tiers (specific codes, instance, result envelope, git/LFS writers, problem+json) — held on SDK trigger #352 left open until G1.
  3. Unchanged: the merge and notes guard bodies (ref_guard_failed). fix(api)!: answer stale commit and notes guards with 409 ref_guard_failed #661 moved the body forms' stale guard from 412 to that 409, so wrefNoteFail lost its last caller, and I deleted it.
  4. Tests: TestLostCASBodies forces a lost CAS with a RefStore decorator for both merge paths (fast-forward and merge commit) and for a note write. The merge and notes tests assert the new shapes. The 429 row-cap test now expects the problem body on merge too.
  5. Docs: http-api.md (Errors, merge row, notes), and the RFC 9457 row of wire-compatibility.md.
  6. Review fixes: single-field 400s on merge and on note-write bodies name the field in invalid_params (Codex round 1), a note on an absent full object id answers 404 ref_not_found (Codex round 1), the 412 above (the advisor), the lost-CAS problem body above and invalid_params on the conditional author 400 (Codex round 4).
  7. Follow-ups from the feat(api)!: send problem bodies for commit-write failures upstream documents as ProblemDetails #669 advisor: §3 of streaming-commit-protocols.md now names the 502 envelope that upstream documents and these handlers never send, and the wcResolveRepo comment says problem-body errors instead of envelope errors.

Validation

  • go build ./..., golangci-lint run (2.15.0): 0 issues. Docs gate: 0 broken links.
  • go test ./internal/api passes.
  • Race lanes on the top of this stack: see the comment below.

Dogfood

I used the verify-openstorage harness on a node built from main with part 2 (74c96847) and on this change (66870438). Each run passed 21 checks.

Request Before After
merge with a file conflict (409) envelope + conflict_paths MergeConflict: conflict_type: merge_conflict, conflict_paths: [README.md], merge_base_sha
merge ff_only, not a fast-forward 409 envelope 412 problem body, precondition_failed
merge, unknown source (404) envelope problem body, branch_not_found
merge, strategy rebase (400) envelope problem body, bad_request
note add on an existing note (409), note without text (400), delete of a missing note (404) note envelope problem body
note body form, stale expected_notes_ref_sha (409) note envelope + ref_guard_failed unchanged
  • The refused merges did not move main.
  • SDK 0.1.0 Go: the conflicting merge changed from RefUpdateError "409: request failed" to MergeConflictError with the message. The ff_only merge that is not a fast-forward became APIError 412 precondition_failed. The existing note became ConflictError conflict, and the missing note NotFoundError not_found.

Refs #352

BREAKING CHANGE: merge failures no longer carry the result envelope. File conflicts answer 409 with upstream's MergeConflict body (error, conflict_type, conflict_paths, merge_base_sha), and every other merge failure answers the plain problem body. A non-fast-forward ff_only merge and a merge of unrelated histories answer 412 precondition_failed instead of 409. Note-write failures answer the plain problem body instead of the note envelope, except the 409 guard body. SDK 1.17.1 Go reads the note envelope only for application/json (util.go:154), so it now reports these note-write failures as a generic APIError instead of a RefUpdateError. I did not check the 1.17.1 TypeScript and Python clients.


Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high

…write failures

Upstream documents a plain ProblemDetails body for every merge and note
write failure, except merge's 409 MergeConflict for file conflicts and a
target that moved (application/json: error, conflict_type,
conflict_paths, merge_base_sha). Merge now sends exactly that: file
conflicts as merge_conflict, a lost CAS as target_moved, and the plain
problem body (code conflict) for other conflicts. Note writes send the
plain problem body, including a lost notes CAS (409 conflict). The body
forms' stale-guard 412 keeps the note envelope.

_Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high_

Change-Id: I55afa498cac0f62f128e8217e8b42ec64c3e34f7
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

Validation evidence for this head (0becf9b2):

Head Check Result
500f6f0f (this change before the rebases onto #666, #669 and #667) go test -race -count=1 -tags=openstorage_viewcheck ./internal/api/... ./internal/auth/... ./cmd/... pass
a94c6451 and 4343a41a (item 1, stacked on this) same, plus ./internal/githttp on PostgreSQL and on the local backend pass
0becf9b2 go build ./..., golangci-lint run ./internal/api/... (0 issues), docs gate (0 broken links), go test ./internal/api ./internal/auth -count=1 pass

Each rebase added exactly the diff of the PR it rebased onto (I compared the changed lines). The first go test ./internal/api run on 0becf9b2 hit the 10-minute default timeout while the host load average was about 160. The rerun passed in 219 s.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-04T19:05:01.581908Z 47d3e84 Manual request
🔒 Security Review ✅ Completed 2026-11-04T19:05:55.682031Z 47d3e84 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0becf9b2c0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

}
if err := wmValidateMergeRequest(&req); err != nil {
wmFail(w, http.StatusBadRequest, "invalid", err.Error(), req.TargetBranch, "")
writeInvalid(w, err.Error(), err)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve field metadata for merge validation errors

When a merge body fails a field-specific check such as a missing strategy or malformed expected_target_sha, wmValidateMergeRequest returns an ordinary error, so writeInvalid cannot derive any invalid_params. These newly introduced problem responses therefore omit the field information required for nameable body-validation failures; return fieldError values or explicitly supply the affected field.

Useful? React with 👍 / 👎.

Comment thread internal/api/handlers_write_refs.go Outdated
}
if objectSHA == "" {
wrefNoteFail(w, http.StatusBadRequest, "object_ref is required", objectSHA, targetRef, "", ref.ZeroSHA)
writeErr(w, http.StatusBadRequest, "object_ref is required")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add invalid_params to note body validation failures

For a POST /repos/notes body with no object_ref, this now emits a problem body through writeErr, but it lacks invalid_params even though the failing required field is known. The same omission affects the adjacent checks for action, note, expected_notes_ref_sha, and author; body-form failures should use the field-aware validation writer, while query-form DELETE validation can remain unannotated.

Useful? React with 👍 / 👎.

Comment thread internal/api/handlers_write_refs.go Outdated
if _, err := wrefGit(ctx, repoPath, nil, nil,
"rev-parse", "--verify", "--quiet", "--end-of-options", objectSHA+"^{object}"); err != nil {
wrefNoteFail(w, http.StatusNotFound, "object not found: "+objectSHA, objectSHA, targetRef, old, oldOrZero)
writeErr(w, http.StatusNotFound, "object not found: "+objectSHA)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Emit ref_not_found for an absent full object SHA

When object_ref is a syntactically valid 40-hex SHA that is absent from the repository, execution reaches this branch and writeErr assigns the generic not_found code. Non-SHA object references already receive ref_not_found, so clients see different machine-readable codes for the same unresolved object_ref; use the specific ref_not_found problem here as well.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 0becf9b2c0

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

Codex review on #670: merge and note-write failures are problem bodies
now, so their single-field body checks name the field in invalid_params,
as the other ValidationProblemDetails routes do. DELETE query parameters
stay unnamed. A note on an absent full object id answers 404
ref_not_found, as an unresolvable revision does.

Change-Id: Iaed09b92ae880f9864661b550e7c4a44353f0014
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

Codex round 1 had three P2 findings (medium severity). I fixed all three in 7b17d77, a new commit (no force-push):

  1. Merge 400s from single-field checks now name the field in invalid_params: source_ref (or source_branch when the request sent the deprecated member), target_branch, strategy, expected_target_sha, expected_source_sha, and author.name / author.email / committer.*. squash with ff_only is a rule across fields, so it names none. Messages are unchanged.
  2. Note-write 400s from body members name the member the request sent (object_ref or sha, notes_ref or ref, expected_notes_ref_sha or expected_ref_sha, action, note, author.*). DELETE query parameters, and a DELETE field the body did not carry, name none.
  3. A note on an absent full 40-hex object id answers 404 ref_not_found, as an unresolvable revision does.

wcValidateBranchParam and wcValidateAuthor now return fieldErrors with the same messages. commit-pack and diff-commit send their 400s in the result envelope, which has no invalid_params, so their bodies do not change.

Tests: new rows in TestInvalidParamsOnValidators (merge, note DELETE body, query and empty forms) and the TestWriteRefsNotes "invalid input" subtest now checks each invalid_params item and the 404 code. go test ./internal/api -count=1 passes, golangci-lint reports 0 issues.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Chef's kiss.

Reviewed commit: 7b17d77897

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 7b17d77897

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

The #670 advisor found that upstream's merge 412 names both refusals
("a merge with no common ancestor" and a target that is not a
fast-forward under ff_only) with precondition_failed. open.storage
answered 409 conflict. The body stays the plain problem body.

Change-Id: I02a046aa1b8d76c07e3976eedff589feffbde454
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

The independent advisor on 7b17d77 found that two merge refusals used the wrong status. Upstream's merge 412 says storage returns precondition_failed for "a merge with no common ancestor between source and target" and for a target "that moved off a fast-forward under the ff_only strategy". open.storage answered both with 409 conflict.

6687043 (new commit, no force-push) answers both with 412 precondition_failed, still as the plain problem body. This PR already changes these two bodies in a breaking release, so I fixed the status here instead of breaking clients a second time later. http-api.md (merge row, status table) follows. go test ./internal/api -count=1 passes, and golangci-lint reports 0 issues.

Two smaller advisor notes are now in the PR body: target_moved on every lost target CAS, and repo_changed, which open.storage never sends.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: 66870438e9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 66870438e9

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@ThomasK33
ThomasK33 enabled auto-merge November 4, 2026 18:31
…problems

Change-Id: I15ea29c14f9a3ad55b629b72ab62853bc467a640
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

#668 landed while this PR waited, so I merged origin/main (50b4071) into this branch as 4b98ea4 (no force-push). Resolutions:

  1. internal/api/handlers_write_merge.go: fix(api): send target_branch and every RefUpdateResult member in commit-write results #668 gave the merge failure envelope its own short result type (wmFailResult). This PR removes the merge envelope, so I kept this PR's side, and wmFailBody and wmFailResult are gone.
  2. docs/reference/http-api.md: I kept this PR's conventions paragraph and added fix(api): send target_branch and every RefUpdateResult member in commit-write results #668's sentences on the commit-write RefUpdateResult members.
  3. .agents/skills/verify-openstorage/features/token-scopes.md: fix(api): send target_branch and every RefUpdateResult member in commit-write results #668's line said merge failures use a result envelope. It now names the commit routes and the notes stale-guard 409.

Validation on 4b98ea4: go build ./..., go vet ./internal/api, go test ./internal/api -count=1 (pass), golangci-lint run ./internal/api/... (0 issues), docs gate (0 broken links).

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 4b98ea48f2

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4b98ea48f2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 722 to 724
if req.Author == nil {
wmFail(w, http.StatusBadRequest, "invalid", "author is required when the merge creates a commit", req.TargetBranch, targetSHA)
writeErr(w, http.StatusBadRequest, "author is required when the merge creates a commit")
return

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include author in conditional merge validation errors

When a non-fast-forward merge or squash needs to create a commit and the request omits author, this branch now emits a ValidationProblemDetails body without invalid_params, although the missing request-body field is known and the API conventions require nameable required fields to be identified. Use writeInvalidField for author so clients receive the same field metadata as for the other merge validation failures.

Useful? React with 👍 / 👎.

Comment on lines 688 to 690
if !won {
wmFail(w, http.StatusConflict, "conflict", "ref "+targetRef+" moved concurrently", req.TargetBranch, targetSHA)
wmFailConflict(w, "target_moved", "ref "+targetRef+" moved concurrently", nil, "")
return

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reserve target_moved for failed stale-target retries

When another writer wins the first target CAS, this path immediately returns an application/json MergeConflict with conflict_type: target_moved, but the upstream operation contract in docs/upstream/openapi.yaml:7721 reserves that shape for an automatic stale-target retry that could not absorb the movement and says other conflicts use a problem body. This handler performs no retry, so a routine lost CAS is misclassified and SDKs surface a MergeConflictError; either retry before using target_moved or return the ordinary 409 problem body here and in the merge-commit lost-CAS path.

Useful? React with 👍 / 👎.

Codex round 4 on #670: upstream sends MergeConflict with target_moved
only after an automatic stale-target retry fails, and a problem body for
any other conflict. open.storage does not retry, so a lost target CAS is
now a 409 conflict problem body. The conditional author 400 names author
in invalid_params.

Change-Id: I049c985ca5c85f1ecde64d86f6954a4b185f5afd
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

Codex round 4 had two P2 findings (medium severity). I fixed both in 2583a82, a new commit (no force-push):

  1. A merge whose target moved now answers a 409 conflict problem body, not MergeConflict with target_moved. Upstream sends MergeConflict for "an automatic stale-target retry that could not absorb concurrent target/repository movement", and "a problem body reports any other conflict". open.storage does not retry, so target_moved claimed a retry that never happened. This PR is already breaking, so I fixed it now instead of breaking clients a second time later. MergeConflict is now only for file conflicts. TestLostCASBodies, http-api.md (merge row) and the RFC 9457 row of wire-compatibility.md follow.
  2. The 400 for a merge that creates a commit without author now names author in invalid_params.

go test ./internal/api -count=1 passes, and golangci-lint reports 0 issues.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 2583a82683

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2583a82683

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/reference/http-api.md Outdated
`commit-pack`, `diff-commit` and `restore-commit` return the richer `result` envelope
on the statuses that the
[streaming protocols](../explanation/streaming-commit-protocols.md) list, a merge
`409` for file conflicts or a target that moved returns upstream's `MergeConflict`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Describe moved-target merges as problem bodies

When a merge loses either target-ref CAS, the handler now calls writeErr and returns a problem body without conflict_type; only file conflicts return MergeConflict. This convention instead tells API consumers that a moved target returns MergeConflict, contradicting both the implementation and the detailed merge table and potentially causing clients to parse the wrong response shape.

Useful? React with 👍 / 👎.

…tions too

Codex round 5 on #670: the http-api conventions paragraph still said a
moved target returns MergeConflict.

Change-Id: Ibfc8b3d7af8e5d8021edc16cd2bcb896a821f959
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33

Copy link
Copy Markdown
Member Author

Codex round 5 found one stale sentence: the http-api.md conventions paragraph still said a moved target returns MergeConflict. 47d3e84 fixes it (docs only). The merge row and the RFC 9457 row already said 409 conflict problem body. Docs gate: 0 broken links. This is the last review round for this PR.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

Reviewed commit: 47d3e847b9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 47d3e847b9

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@ThomasK33
ThomasK33 added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit 3c4b2b5 Nov 4, 2026
9 checks passed
@ThomasK33
ThomasK33 deleted the issue352-merge-notes-problems branch November 4, 2026 19:54
ThomasK33 added a commit that referenced this pull request Nov 12, 2026
…tus comment, and the 429 in the preview caveat

Change-Id: If41a01c5adaf3135d96afc0d695d444c2d697adf
Signed-off-by: Thomas Kosiewski <tk@coder.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant