feat: sync the public Lexicons with upstream main #215

Merged
Grandiras merged 3 commits from issue-210-lexicon-sync into main 2026-10-05 13:22:04 +00:00
Owner

Closes #210.

Syncs the SDK with bluesky-social/atproto main at a7c8604d (2026-10-02); the vendored snapshot and its README pin are refreshed. site.standard.* is unchanged (all 8 record CIDs match).

Added

  • Feed. since on GetTimelineAsync/GetListFeedAsync, with FeedResponse.StartCursor (returned by those two only); sort on GetQuotesAsync; FeedViewPost.OpThreadPostIndex/OpThreadPostCount (upstream #5493, #5552, #5540).
  • tools.ozone.inbox as OzoneClient.Inbox: AppealActionedSubjectAsync and its views, including the closed AppealAction union (#5459).
  • Ozone queues. RecommendedLabels on the queue view and on create/update; ConflictingQueue is documented on UpdateQueueAsync (#5459).
  • Ozone report stats. The new historical fields; live stats are a LiveStats : QueueStats now that upstream's liveStats has diverged (#5362, #5459).

Breaking

The new optional parameters sit before limit, as CONTRIBUTING's parameter order asks, so positional limit/cursor arguments must be named. GetLiveStatsResponse.Stats is typed LiveStats. Both are listed in the new docs/migrating-to-0.8.md.

Not included

app.bsky.notification.getGroupedNotifications is marked "UNSTABLE – DO NOT USE THIS ENDPOINT WHILE THIS NOTE IS HERE" in its own Lexicon, so it is not modelled; the drift README records why.

Hardening

Upstream #5584 rejects MSTs that reference one node twice. A new test, PartialMerkleSearchTreeTests.Load_SameNodeReferencedTwice_ThrowsFormatException, shows that the SDK's key-range checks already reject this. #5582 and #5583 need no change.

Build has 0 warnings, including the doc samples; 4971 unit tests pass and the drift test is green.

🤖 Generated with Claude Code

Closes #210. Syncs the SDK with bluesky-social/atproto `main` at `a7c8604d` (2026-10-02); the vendored snapshot and its README pin are refreshed. `site.standard.*` is unchanged (all 8 record CIDs match). ## Added - **Feed.** `since` on `GetTimelineAsync`/`GetListFeedAsync`, with `FeedResponse.StartCursor` (returned by those two only); `sort` on `GetQuotesAsync`; `FeedViewPost.OpThreadPostIndex`/`OpThreadPostCount` (upstream #5493, #5552, #5540). - **`tools.ozone.inbox`** as `OzoneClient.Inbox`: `AppealActionedSubjectAsync` and its views, including the closed `AppealAction` union (#5459). - **Ozone queues.** `RecommendedLabels` on the queue view and on create/update; `ConflictingQueue` is documented on `UpdateQueueAsync` (#5459). - **Ozone report stats.** The new historical fields; live stats are a `LiveStats : QueueStats` now that upstream's `liveStats` has diverged (#5362, #5459). ## Breaking The new optional parameters sit before `limit`, as CONTRIBUTING's parameter order asks, so positional `limit`/`cursor` arguments must be named. `GetLiveStatsResponse.Stats` is typed `LiveStats`. Both are listed in the new `docs/migrating-to-0.8.md`. ## Not included `app.bsky.notification.getGroupedNotifications` is marked "UNSTABLE – DO NOT USE THIS ENDPOINT WHILE THIS NOTE IS HERE" in its own Lexicon, so it is not modelled; the drift README records why. ## Hardening Upstream #5584 rejects MSTs that reference one node twice. A new test, `PartialMerkleSearchTreeTests.Load_SameNodeReferencedTwice_ThrowsFormatException`, shows that the SDK's key-range checks already reject this. #5582 and #5583 need no change. Build has 0 warnings, including the doc samples; 4971 unit tests pass and the drift test is green. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
docs: start the 0.8 migration guide with the Lexicon parameter changes
All checks were successful
CI / pds-integration (pull_request) Successful in 27s
CI / build-and-test (pull_request) Successful in 56s
c34cfc971a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator

🤖 Reviewing this PR — the review will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the review runs.

🤖 Reviewing this PR — the review will link the full session transcript. <!-- opencode-run:review --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/opencode-bot/src/branch/opencode-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-2026-10-05T13-14-55-433Z.md) — updating every ~5 minutes while the review runs.
Collaborator

🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 Reviewing this PR — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/741); the reply will link the full session transcript. <!-- claude-run:pr_review --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-741.md) — updating every ~5 minutes while the task runs.
claude-reviewer approved these changes 2026-10-05 13:15:43 +00:00
Dismissed
claude-reviewer left a comment

✅ Verdict: approve — no blocking issues found.

This sync looks correct and complete. I could not grep the repo for other positional callers of the changed methods, because the shell tool failed twice. The PR reports a 0-warning build including the doc samples, which would catch any remaining positional callers.

  • The new parameters match the vendored Lexicons: since, startCursor, sort, opThreadPost*, recommendedLabels, the tools.ozone.inbox models and the new report-stat fields.
  • Parameters are inserted before limit, as CONTRIBUTING asks. The internal callers (EnumerateTimelineAsync and the Blazor FeedView) are updated.
  • AppealAction is marked as a closed union, matching "closed": true. OpenUnionTests is updated to expect it.
  • LiveStats : QueueStats keeps source compatibility for readers. The PublicAPI.Unshipped.txt removals and additions are consistent with the signature changes.
  • The CHANGELOG has a breaking entry with a migration note, and docs/migrating-to-0.8.md is linked from the docs index.
  • The new Load_SameNodeReferencedTwice_ThrowsFormatException test covers the upstream #5584 hardening.

Minor nits:

  • The since guard entries in TypedIdentifierGuardTests are reasonable. The same opaque-string reasoning would apply to a future since elsewhere.
  • Several CHANGELOG bullets slightly exceed the roughly 300-character guideline.

🧠 claude-sonnet-5-5 · ⏱ 0m 31s · 4 turns · tokens: 56.1k in / 1.2k out (+147.5k cache-read)
📜 Full session transcript

✅ **Verdict: approve** — no blocking issues found. This sync looks correct and complete. I could not grep the repo for other positional callers of the changed methods, because the shell tool failed twice. The PR reports a 0-warning build including the doc samples, which would catch any remaining positional callers. - The new parameters match the vendored Lexicons: `since`, `startCursor`, `sort`, `opThreadPost*`, `recommendedLabels`, the `tools.ozone.inbox` models and the new report-stat fields. - Parameters are inserted before `limit`, as CONTRIBUTING asks. The internal callers (`EnumerateTimelineAsync` and the Blazor `FeedView`) are updated. - `AppealAction` is marked as a closed union, matching `"closed": true`. `OpenUnionTests` is updated to expect it. - `LiveStats : QueueStats` keeps source compatibility for readers. The `PublicAPI.Unshipped.txt` removals and additions are consistent with the signature changes. - The CHANGELOG has a breaking entry with a migration note, and `docs/migrating-to-0.8.md` is linked from the docs index. - The new `Load_SameNodeReferencedTwice_ThrowsFormatException` test covers the upstream #5584 hardening. Minor nits: - The `since` guard entries in `TypedIdentifierGuardTests` are reasonable. The same opaque-string reasoning would apply to a future `since` elsewhere. - Several CHANGELOG bullets slightly exceed the roughly 300-character guideline. --- 🧠 claude-sonnet-5-5 · ⏱ 0m 31s · 4 turns · tokens: 56.1k in / 1.2k out (+147.5k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-741.md) <!-- claude-verdict:approve --> <!-- claude-reviewed-head:c34cfc971a07592ca7391aaa4f58c984d5cf9209 -->
opencode-reviewer approved these changes 2026-10-05 13:17:45 +00:00
Dismissed
opencode-reviewer left a comment

✅ Verdict: approve — no blocking issues found.

Good to merge. This is a careful sync and I found no correctness or API problems.

What I checked:

  • Snapshot fidelity. The pinned commit exists upstream (a7c8604d876a…, "Version packages (#5566)", 2026-10-02) and I diffed the vendored files against it byte-for-byte: getTimeline, getListFeed, getQuotes, feed/defs, queue/{create,update}Queue, queue/defs, report/defs, and the new tools.ozone.inbox/{defs,appealActionedSubject} and getGroupedNotifications all match exactly. The only vendored tree differences from upstream are the documented ones (site.standard files fetched from the network; com.germnetwork.* and the internal snapshot file unused by the SDK).
  • Inbox model. The closed AppealAction union's JsonDerivedType discriminators correctly expand the Lexicon's local refs (#actionRef/#labelRef/#takedownRef) to tools.ozone.inbox.appealActionedSubject#…; SubjectView/EnforcementView/AppealView/ActionView required fields match the Lexicon exactly and resolve by convention in the drift test; reusing the open ModerationSubject union is right since the subject union is open and has a documented unknown-variant fallback.
  • Breaking change handling. PublicAPI.Shipped baselines unchanged with correct Unshipped add/remove entries; the FeedView.razor positional call was fixed; all other call sites I grepped (samples, integration tests, docs) already use named arguments. since is correctly exempted in the typed-identifier guard.
  • Stats split. LiveStats reads correctly: it inherits exactly the counts liveStats shares with queueStats and declares the ten new live-only fields, so the drift tests hold (GetProperties includes inherited names).
  • Docs. docs/migrating-to-0.8.md lines up with the actual signatures, and the changelog/index links are correct.

Minor, non-blocking: a few XML doc comments now trail upstream's reworded semantics — HistoricalStats.ActionedCount/AvgHandlingTimeSec/ActionRate (upstream now describes them as closure-breakdown counts and assignment-to-close handling time, not creation-to-close), and the comments LiveStats inherits from QueueStats (e.g. InboundCount's "last 24 hours" — live stats are now the current UTC day, per the updated GetLiveStatsAsync summary). Worth a follow-up wording pass whenever convenient; the JSON names are all correct.


⏱ 2m 50s · 41 steps · $0.0981 · tokens: 184.2k in / 3.7k out (+2089.5k cache-read) · Go: 5h 1% · wk 1% · mo 91%
📜 Full session transcript

✅ **Verdict: approve** — no blocking issues found. Good to merge. This is a careful sync and I found no correctness or API problems. What I checked: - **Snapshot fidelity.** The pinned commit exists upstream (`a7c8604d876a…`, "Version packages (#5566)", 2026-10-02) and I diffed the vendored files against it byte-for-byte: `getTimeline`, `getListFeed`, `getQuotes`, `feed/defs`, `queue/{create,update}Queue`, `queue/defs`, `report/defs`, and the new `tools.ozone.inbox/{defs,appealActionedSubject}` and `getGroupedNotifications` all match exactly. The only vendored tree differences from upstream are the documented ones (site.standard files fetched from the network; `com.germnetwork.*` and the internal snapshot file unused by the SDK). - **Inbox model.** The closed `AppealAction` union's `JsonDerivedType` discriminators correctly expand the Lexicon's local refs (`#actionRef`/`#labelRef`/`#takedownRef`) to `tools.ozone.inbox.appealActionedSubject#…`; `SubjectView`/`EnforcementView`/`AppealView`/`ActionView` required fields match the Lexicon exactly and resolve by convention in the drift test; reusing the open `ModerationSubject` union is right since the subject union is open and has a documented unknown-variant fallback. - **Breaking change handling.** `PublicAPI.Shipped` baselines unchanged with correct `Unshipped` add/remove entries; the `FeedView.razor` positional call was fixed; all other call sites I grepped (samples, integration tests, docs) already use named arguments. `since` is correctly exempted in the typed-identifier guard. - **Stats split.** `LiveStats` reads correctly: it inherits exactly the counts liveStats shares with `queueStats` and declares the ten new live-only fields, so the drift tests hold (`GetProperties` includes inherited names). - **Docs.** `docs/migrating-to-0.8.md` lines up with the actual signatures, and the changelog/index links are correct. Minor, non-blocking: a few XML doc comments now trail upstream's reworded semantics — `HistoricalStats.ActionedCount`/`AvgHandlingTimeSec`/`ActionRate` (upstream now describes them as closure-breakdown counts and assignment-to-close handling time, not creation-to-close), and the comments `LiveStats` inherits from `QueueStats` (e.g. `InboundCount`'s "last 24 hours" — live stats are now the current UTC day, per the updated `GetLiveStatsAsync` summary). Worth a follow-up wording pass whenever convenient; the JSON names are all correct. --- ⏱ 2m 50s · 41 steps · $0.0981 · tokens: 184.2k in / 3.7k out (+2089.5k cache-read) · Go: 5h 1% · wk 1% · mo 91% 📜 [Full session transcript](https://git.grandiras.net/Grandiras/opencode-bot/src/branch/opencode-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-2026-10-05T13-14-55-433Z.md) <!-- opencode-reviewed-head:c34cfc971a07592ca7391aaa4f58c984d5cf9209 --> <!-- opencode-verdict:approve -->
docs: match the report statistics docs to upstream's semantics; tighten changelog bullets
All checks were successful
CI / pds-integration (pull_request) Successful in 25s
CI / build-and-test (pull_request) Successful in 55s
Sync Closures to GitHub / sync-closure (pull_request) Successful in 6s
f81a2496b0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator

🤖 Reviewing this PR — the review will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the review runs.

🤖 Reviewing this PR — the review will link the full session transcript. <!-- opencode-run:review --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/opencode-bot/src/branch/opencode-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-2026-10-05T13-19-48-701Z.md) — updating every ~5 minutes while the review runs.
Collaborator

🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 Reviewing this PR — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/742); the reply will link the full session transcript. <!-- claude-run:pr_review --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-742.md) — updating every ~5 minutes while the task runs.
claude-reviewer left a comment

✅ Verdict: approve — no blocking issues found.

This is a re-review. My earlier pass raised no blocking issues, only minor nits, so there is nothing to confirm as resolved. I re-read the diff but did not run the build or the tests.

  • The Lexicon additions line up with the vendored schemas. That covers since, startCursor, sort, opThreadPost*, recommendedLabels, the inbox models with the closed AppealAction union, and the new historical and live stats.
  • The new parameters sit before limit, as CONTRIBUTING asks. The internal callers (EnumerateTimelineAsync and the Blazor FeedView) are updated.
  • PublicAPI.Unshipped.txt lists the added and removed signatures, the CHANGELOG has a breaking entry with a migration note, and docs/migrating-to-0.8.md is linked from docs/index.md.
  • The same-node-twice MST test covers the upstream #5584 hardening.

Minor, non-blocking: some CHANGELOG bullets run past the roughly 300-character guideline.


🧠 claude-sonnet-5-5 · ⏱ 0m 4s · 2 turns · tokens: 56.2k in / 455 out (+12.2k cache-read)
📜 Full session transcript

✅ **Verdict: approve** — no blocking issues found. This is a re-review. My earlier pass raised no blocking issues, only minor nits, so there is nothing to confirm as resolved. I re-read the diff but did not run the build or the tests. - The Lexicon additions line up with the vendored schemas. That covers `since`, `startCursor`, `sort`, `opThreadPost*`, `recommendedLabels`, the inbox models with the closed `AppealAction` union, and the new historical and live stats. - The new parameters sit before `limit`, as CONTRIBUTING asks. The internal callers (`EnumerateTimelineAsync` and the Blazor `FeedView`) are updated. - `PublicAPI.Unshipped.txt` lists the added and removed signatures, the CHANGELOG has a breaking entry with a migration note, and `docs/migrating-to-0.8.md` is linked from `docs/index.md`. - The same-node-twice MST test covers the upstream #5584 hardening. Minor, non-blocking: some CHANGELOG bullets run past the roughly 300-character guideline. --- 🧠 claude-sonnet-5-5 · ⏱ 0m 4s · 2 turns · tokens: 56.2k in / 455 out (+12.2k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-742.md) <!-- claude-verdict:approve --> <!-- claude-reviewed-head:f81a2496b0d4d4e0fe2dd8cb967241a9d5ef7f80 -->
opencode-reviewer left a comment

✅ Verdict: approve — no blocking issues found.

Re-review: the wording drift I flagged last pass is resolved — HistoricalStats.ActionedCount, ActionRate and AvgHandlingTimeSec now describe the upstream closure-breakdown / assignment-to-close semantics, and the remaining "last 24 hours" on QueueStats.InboundCount matches the queueStats Lexicon verbatim, so it is correct as-is.

Also re-checked the mechanics that the new commits touch: XrpcParams.Add drops null values, so the optional since/sort/recommendedLabels parameters never emit empty query entries or bake empty strings into JSON; the internal EnumerateTimelineAsync and Blazor FeedView call sites pass arguments positionally correctly for the new signatures; the closed AppealAction union ([AtProtoUnion(Closed = true)]) matches the two pre-existing closed unions' pattern; and ModerationSubject is an open union with an UnknownModerationSubject fallback, which is the right reuse for appealActionedSubject's open subject union. PublicAPI Unshipped add/remove entries stay consistent with the shipped baseline.

No blocking issues — good to merge.


⏱ 1m 35s · 14 steps · $0.0235 · tokens: 54.3k in / 1.3k out (+468.6k cache-read) · Go: 5h 2% · wk 1% · mo 91%
📜 Full session transcript

✅ **Verdict: approve** — no blocking issues found. Re-review: the wording drift I flagged last pass is resolved — `HistoricalStats.ActionedCount`, `ActionRate` and `AvgHandlingTimeSec` now describe the upstream closure-breakdown / assignment-to-close semantics, and the remaining "last 24 hours" on `QueueStats.InboundCount` matches the `queueStats` Lexicon verbatim, so it is correct as-is. Also re-checked the mechanics that the new commits touch: `XrpcParams.Add` drops null values, so the optional `since`/`sort`/`recommendedLabels` parameters never emit empty query entries or bake empty strings into JSON; the internal `EnumerateTimelineAsync` and Blazor `FeedView` call sites pass arguments positionally correctly for the new signatures; the closed `AppealAction` union (`[AtProtoUnion(Closed = true)]`) matches the two pre-existing closed unions' pattern; and `ModerationSubject` is an open union with an `UnknownModerationSubject` fallback, which is the right reuse for `appealActionedSubject`'s open subject union. PublicAPI `Unshipped` add/remove entries stay consistent with the shipped baseline. No blocking issues — good to merge. --- ⏱ 1m 35s · 14 steps · $0.0235 · tokens: 54.3k in / 1.3k out (+468.6k cache-read) · Go: 5h 2% · wk 1% · mo 91% 📜 [Full session transcript](https://git.grandiras.net/Grandiras/opencode-bot/src/branch/opencode-logs/transcripts/Grandiras/ATProto.NET/pr-215/run-2026-10-05T13-19-48-701Z.md) <!-- opencode-reviewed-head:f81a2496b0d4d4e0fe2dd8cb967241a9d5ef7f80 --> <!-- opencode-verdict:approve -->
Grandiras deleted branch issue-210-lexicon-sync 2026-10-05 13:22:05 +00:00
Sign in to join this conversation.
No description provided.