Collapse hidden GitHub comments in detail views - #818
Conversation
roborev: Combined Review (
|
roborev: Combined Review (
|
e779c97 to
1966f34
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
This comment has been minimized.
This comment has been minimized.
A parent PR ETag does not cover inline review-comment moderation, so conditional detail refreshes must reconcile review threads under the same quota and snapshot rules as conversation comments. Provider publication is irreversible. Follow-up thread ingestion now reconciles asynchronously on failure without replacing a published or partially-published result and inviting duplicate reviews. Triage decision for roborev-ci #818 (comment): user: not an issue — GitHub is authoritative, and the non-atomic edit/visibility edge case is not worth additional complexity. Validation: focused moderation/publish API tests; full internal/github and internal/server/pullapi suites; golangci-lint. The full internal/server suite reached an unrelated quick-exit timing flake, which passed when rerun alone. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
roborev: Combined Review (
|
A parent PR ETag does not cover inline review-comment moderation, so conditional detail refreshes must reconcile review threads under the same quota and snapshot rules as conversation comments. Provider publication is irreversible. Follow-up thread ingestion now reconciles asynchronously on failure without replacing a published or partially-published result and inviting duplicate reviews. Triage decision for roborev-ci #818 (comment): user: not an issue — GitHub is authoritative, and the non-atomic edit/visibility edge case is not worth additional complexity. Validation: focused moderation/publish API tests; full internal/github and internal/server/pullapi suites; golangci-lint. The full internal/server suite reached an unrelated quick-exit timing flake, which passed when rerun alone. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
fda0e13 to
c1e89be
Compare
roborev: Combined Review (
|
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Bulk sync could publish a complete conversation-comment snapshot without current inline review threads, then mark the pull request detail as fresh. That left hidden review replies stale until another detail refresh. Load the initial conversation-comment and review-thread connections in one GitHub GraphQL snapshot. Keep later conversation pages on GraphQL so comment content and moderation share one authority, and leave detail stale whenever either discussion family is incomplete. GitHub's live API accepted the production page-size query and returned both connections for PR #830. This verifies the schema and query-complexity limit beyond local stubs. Triage finding fixed: #818 (comment) Generated with Codex Co-authored-by: Codex <noreply@openai.com>
roborev: Combined Review (
|
A parent PR ETag does not cover inline review-comment moderation, so conditional detail refreshes must reconcile review threads under the same quota and snapshot rules as conversation comments. Provider publication is irreversible. Follow-up thread ingestion now reconciles asynchronously on failure without replacing a published or partially-published result and inviting duplicate reviews. Triage decision for roborev-ci #818 (comment): user: not an issue — GitHub is authoritative, and the non-atomic edit/visibility edge case is not worth additional complexity. Validation: focused moderation/publish API tests; full internal/github and internal/server/pullapi suites; golangci-lint. The full internal/server suite reached an unrelated quick-exit timing flake, which passed when rerun alone. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
09b96a6 to
42c3e86
Compare
Bulk sync could publish a complete conversation-comment snapshot without current inline review threads, then mark the pull request detail as fresh. That left hidden review replies stale until another detail refresh. Load the initial conversation-comment and review-thread connections in one GitHub GraphQL snapshot. Keep later conversation pages on GraphQL so comment content and moderation share one authority, and leave detail stale whenever either discussion family is incomplete. GitHub's live API accepted the production page-size query and returned both connections for PR #830. This verifies the schema and query-complexity limit beyond local stubs. Triage finding fixed: #818 (comment) Generated with Codex Co-authored-by: Codex <noreply@openai.com>
Inline review replies were synchronized without contributing their provider timestamps to last_activity_at. A newer reply could therefore leave dashboard ordering and warm refresh scheduling anchored to older activity. Use GitHub's GraphQL creation and update times in both bulk and detail-thread snapshots, without inventing local timestamps. The combined GraphQL fixture now crosses synchronization, SQLite, and the pull-detail API, including incomplete-thread preservation. Live GitHub validation confirmed that both review-thread query forms return the timestamps. This fixes local roborev job 10346 and #818 (comment). Validation: full internal/github and internal/server packages; focused combined GraphQL/API regressions; gated live GitHub GraphQL test; golangci-lint. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
roborev: Combined Review (
|
GitHub-hidden discussion comments were previously indistinguishable from ordinary comments after sync, so PR and issue detail views could expose text the provider intentionally minimized. Preserve the GraphQL moderation state across the REST-shaped sync pipeline and keep REST refreshes from discarding it until an authoritative GraphQL snapshot changes the state.\n\nDefault hidden comments to a compact closed-eye notice with the provider reason while retaining an explicit path to inspect the original content. The hook-enforced frontend check also normalizes two pre-existing line wraps required by the current formatter. Generated with Codex (gpt-5.6-sol) Co-authored-by: Codex <noreply@openai.com>
Incomplete GraphQL comment pages only describe the comments they observed. Treating that partial visibility map as authoritative during REST completion could silently expose previously minimized comments outside the page.\n\nRecord visible observations explicitly and merge partial moderation state over the stored snapshot so GitHub can still clear stale hidden metadata without discarding state it did not return. Generated with Codex (gpt-5.6-sol) Co-authored-by: Codex <noreply@openai.com>
GitHub's GraphQL comment pages can be incomplete, while REST detail and edit responses omit the provider's minimized state. Without carrying the complete moderation map through REST replacement and mutation persistence, hidden comments could reappear in PR and issue details.\n\nHydrate later GraphQL comment pages before REST completion, preserve confirmed hidden metadata during edits, and cover both synchronization paths through provider and HTTP-level regression tests. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
REST detail refreshes can return comment bodies without GitHub's minimized metadata, so stored state alone can expose comments that were hidden or fail to notice newly minimized comments. Re-observe per-item moderation state through GraphQL when available and preserve stored state only when that observation is unavailable.\n\nApply the same provider-hidden notice and reveal gate to threaded replies so an expanded review thread cannot bypass the root comment's privacy treatment. Add GraphQL, REST detail, and visible-root/hidden-reply regression coverage. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
GitHub review-thread GraphQL omitted moderation fields, while the diff-thread API and review-publish re-ingestion dropped metadata even after sync observed it. That allowed minimized inline comments to appear in diff cards or become visible again after publishing a review. Carry moderation state through initial and paginated provider reads, both persisted thread representations, and the generated API contract. Diff cards now default hidden comments to a collapsed notice with an explicit reveal action. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
Parent ETags do not cover comment moderation changes, so conditional detail refreshes now re-observe visibility when the routed credential has GraphQL capacity and apply observations under the parent revision guard. Use the shared GraphQL admission policy for optional visibility reads, and commit review-thread rows with their timeline events atomically so the two privacy representations cannot diverge. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
The moderation pagination changes used a manual map copy and fatal test assertions inside HTTP handler goroutines, which the repository lint policy rejects. Keep the same test behavior while making handler failures non-fatal and using the standard map-copy primitive so the normal CI gate can complete. Validation: golangci-lint run; focused GraphQL visibility tests. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
A parent PR ETag does not cover inline review-comment moderation, so conditional detail refreshes must reconcile review threads under the same quota and snapshot rules as conversation comments. Provider publication is irreversible. Follow-up thread ingestion now reconciles asynchronously on failure without replacing a published or partially-published result and inviting duplicate reviews. Triage decision for roborev-ci #818 (comment): user: not an issue — GitHub is authoritative, and the non-atomic edit/visibility edge case is not worth additional complexity. Validation: focused moderation/publish API tests; full internal/github and internal/server/pullapi suites; golangci-lint. The full internal/server suite reached an unrelated quick-exit timing flake, which passed when rerun alone. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
A published response alone did not prove that the background sync repaired a failed follow-up thread ingestion. That gap allowed the reconciliation call to disappear while the regression test still passed.\n\nExercise a transient failure and require the hidden review comment to return through the pull-detail API with matching thread and timeline metadata, while confirming the provider review is published only once.\n\nValidation: focused reconciliation test; full internal/server package; golangci-lint; context-sync structural check. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
GitHub can return conversation-comment IDs that do not safely match through the legacy databaseId field. When moderation and REST comments use different identifiers, a minimized comment can appear visible. Prefer fullDatabaseId for both comment records and visibility maps. The gated live check now executes the production initial-thread and paginated-comment queries against a real GitHub review thread, so schema support is verified by GitHub rather than inferred from stubs. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
Bulk sync could publish a complete conversation-comment snapshot without current inline review threads, then mark the pull request detail as fresh. That left hidden review replies stale until another detail refresh. Load the initial conversation-comment and review-thread connections in one GitHub GraphQL snapshot. Keep later conversation pages on GraphQL so comment content and moderation share one authority, and leave detail stale whenever either discussion family is incomplete. GitHub's live API accepted the production page-size query and returned both connections for PR #830. This verifies the schema and query-complexity limit beyond local stubs. Triage finding fixed: #818 (comment) Generated with Codex Co-authored-by: Codex <noreply@openai.com>
Inline review replies were synchronized without contributing their provider timestamps to last_activity_at. A newer reply could therefore leave dashboard ordering and warm refresh scheduling anchored to older activity. Use GitHub's GraphQL creation and update times in both bulk and detail-thread snapshots, without inventing local timestamps. The combined GraphQL fixture now crosses synchronization, SQLite, and the pull-detail API, including incomplete-thread preservation. Live GitHub validation confirmed that both review-thread query forms return the timestamps. This fixes local roborev job 10346 and #818 (comment). Validation: full internal/github and internal/server packages; focused combined GraphQL/API regressions; gated live GitHub GraphQL test; golangci-lint. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
The frontend refactor moved runtime ownership and generated API contracts into the new application package. Direct component rendering no longer supplies the required Effect runtime, and regenerating the old UI schema leaves the compiled frontend unaware of review-thread moderation metadata. Keep the privacy regressions on the shared application-runtime harness and move the generated contract change to the artifact the frontend now compiles. Validation: focused frontend tests; frontend formatting, lint, Svelte checks, and Effect diagnostics; full internal/github and internal/server tests; live GitHub GraphQL validation; golangci-lint; context-sync structural check. Generated with Codex Co-authored-by: Codex <noreply@openai.com>
42c3e86 to
58c5b9f
Compare
roborev: Combined Review (
|

GitHub-hidden comments previously appeared like ordinary discussion content in PR and issue details.
generated by a clanker